Created
April 26, 2026 20:48
-
-
Save mattleibow/dca1b06a9a6db5f85b179fd5ded121d4 to your computer and use it in GitHub Desktop.
Skia update review: mono/skia PR #184 (chrome/m133 → chrome/m147)
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <title>Skia Review — PR #184 (m147)</title> | |
| <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> | |
| <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet"> | |
| <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css"> | |
| <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/github.min.css"> | |
| <style> | |
| :root { | |
| --viewer-bg: #f6f8fa; | |
| --viewer-card-border: #d0d7de; | |
| --viewer-muted: #57606a; | |
| --viewer-surface: #ffffff; | |
| --viewer-soft: #f3f4f6; | |
| } | |
| body { | |
| background: var(--viewer-bg); | |
| color: #1f2328; | |
| } | |
| .page-shell { | |
| max-width: 1600px; | |
| } | |
| .sticky-report-header { | |
| position: sticky; | |
| top: 0; | |
| z-index: 1030; | |
| backdrop-filter: blur(10px); | |
| background: rgba(255, 255, 255, 0.94); | |
| border-bottom: 1px solid var(--viewer-card-border); | |
| } | |
| .header-link { | |
| text-decoration: none; | |
| } | |
| .header-link:hover { | |
| text-decoration: underline; | |
| } | |
| .summary-card, | |
| .surface-card, | |
| .section-panel { | |
| border: 1px solid var(--viewer-card-border); | |
| box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04); | |
| } | |
| .section-panel .card-header, | |
| .surface-card .card-header { | |
| background: linear-gradient(180deg, #fff, #fafbfc); | |
| border-bottom: 1px solid var(--viewer-card-border); | |
| } | |
| .meta-label { | |
| color: var(--viewer-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.04em; | |
| font-size: 0.72rem; | |
| font-weight: 600; | |
| } | |
| .summary-text { | |
| white-space: pre-wrap; | |
| } | |
| .recommendation-list .list-group-item, | |
| .mini-list .list-group-item { | |
| border-left: 0; | |
| border-right: 0; | |
| } | |
| .recommendation-list .list-group-item:first-child, | |
| .mini-list .list-group-item:first-child { | |
| border-top: 0; | |
| } | |
| .recommendation-list .list-group-item:last-child, | |
| .mini-list .list-group-item:last-child { | |
| border-bottom: 0; | |
| } | |
| .nav-tabs .nav-link { | |
| color: #495057; | |
| font-weight: 600; | |
| border-top-left-radius: 0.85rem; | |
| border-top-right-radius: 0.85rem; | |
| } | |
| .nav-tabs .nav-link.active { | |
| color: #0d6efd; | |
| background-color: #fff; | |
| border-color: var(--viewer-card-border) var(--viewer-card-border) #fff; | |
| } | |
| .tab-content > .tab-pane { | |
| background: #fff; | |
| border: 1px solid var(--viewer-card-border); | |
| border-top: 0; | |
| border-bottom-left-radius: 1rem; | |
| border-bottom-right-radius: 1rem; | |
| padding: 1.25rem; | |
| } | |
| .mono { | |
| font-family: ui-monospace, SFMono-Regular, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; | |
| } | |
| .diff-host { | |
| border: 1px solid var(--viewer-card-border); | |
| border-radius: 0.75rem; | |
| overflow: hidden; | |
| background: #fff; | |
| } | |
| .diff-placeholder { | |
| color: var(--viewer-muted); | |
| background: var(--viewer-soft); | |
| border: 1px dashed var(--viewer-card-border); | |
| border-radius: 0.75rem; | |
| padding: 1rem; | |
| } | |
| .accordion-button:not(.collapsed) { | |
| background: #f6f8fa; | |
| color: inherit; | |
| box-shadow: none; | |
| } | |
| .accordion-button:focus { | |
| box-shadow: none; | |
| border-color: rgba(13, 110, 253, 0.25); | |
| } | |
| .group-empty { | |
| color: var(--viewer-muted); | |
| font-style: italic; | |
| padding: 1rem 0.25rem 0.25rem; | |
| } | |
| .table > :not(caption) > * > * { | |
| vertical-align: middle; | |
| } | |
| .badge-soft { | |
| background: #eef2ff; | |
| color: #334155; | |
| } | |
| .stats-grid { | |
| display: grid; | |
| gap: 0.75rem; | |
| grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); | |
| } | |
| .stats-tile { | |
| background: var(--viewer-surface); | |
| border: 1px solid var(--viewer-card-border); | |
| border-radius: 0.85rem; | |
| padding: 0.85rem 1rem; | |
| } | |
| .stats-value { | |
| font-size: 1.5rem; | |
| font-weight: 700; | |
| line-height: 1.1; | |
| } | |
| .summary-meta { | |
| color: var(--viewer-muted); | |
| font-size: 0.9rem; | |
| } | |
| .checked-files { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 0.5rem; | |
| } | |
| .file-chip { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 0.4rem; | |
| background: #f6f8fa; | |
| border: 1px solid var(--viewer-card-border); | |
| border-radius: 999px; | |
| padding: 0.35rem 0.7rem; | |
| font-size: 0.85rem; | |
| } | |
| .empty-state { | |
| text-align: center; | |
| color: var(--viewer-muted); | |
| border: 1px dashed var(--viewer-card-border); | |
| border-radius: 0.85rem; | |
| background: #fbfcfd; | |
| padding: 2rem 1rem; | |
| } | |
| .d2h-file-header { | |
| display: none; | |
| } | |
| .d2h-code-side-linenumber, | |
| .d2h-code-linenumber { | |
| font-size: 0.8rem; | |
| } | |
| .d2h-wrapper { | |
| margin: 0; | |
| } | |
| .file-item-header:hover { | |
| background-color: #f6f8fa; | |
| } | |
| .diff-chevron { | |
| transition: transform 0.15s; | |
| width: 1rem; | |
| text-align: center; | |
| } | |
| .viewed-check:checked + label, | |
| .file-item-header:has(.viewed-check:checked) .mono { | |
| text-decoration: line-through; | |
| opacity: 0.5; | |
| } | |
| .related-files { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 0.35rem; | |
| margin-top: 0.4rem; | |
| } | |
| .related-link { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 0.3rem; | |
| background: #eef2ff; | |
| border: 1px solid #c7d2fe; | |
| border-radius: 999px; | |
| padding: 0.2rem 0.6rem; | |
| font-size: 0.78rem; | |
| color: #3730a3; | |
| text-decoration: none; | |
| cursor: pointer; | |
| transition: background 0.15s, border-color 0.15s; | |
| } | |
| .related-link:hover { | |
| background: #c7d2fe; | |
| border-color: #818cf8; | |
| color: #312e81; | |
| } | |
| .related-link .rel-type { | |
| font-weight: 600; | |
| font-size: 0.7rem; | |
| text-transform: uppercase; | |
| letter-spacing: 0.03em; | |
| color: #6366f1; | |
| } | |
| @keyframes highlight-pulse { | |
| 0% { background-color: #fef08a; } | |
| 100% { background-color: transparent; } | |
| } | |
| .highlight-target { | |
| animation: highlight-pulse 1.5s ease-out; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="sticky-report-header"> | |
| <div class="container-fluid page-shell py-3"> | |
| <div class="d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-3"> | |
| <div class="min-w-0"> | |
| <div class="d-flex flex-wrap align-items-center gap-2 mb-2"> | |
| <span class="badge text-bg-dark"> | |
| <i class="bi bi-clipboard-data me-1"></i> | |
| Skia Review Report | |
| </span> | |
| <span id="headerRiskBadge" class="badge"></span> | |
| <span id="headerRepoBadge" class="badge text-bg-light border"></span> | |
| </div> | |
| <div class="d-flex flex-wrap align-items-center gap-2"> | |
| <h1 class="h4 mb-0 me-2" id="headerTitle">PR Review</h1> | |
| <span class="text-body-secondary fw-semibold" id="milestoneArrow"></span> | |
| </div> | |
| <div class="small text-body-secondary mt-1" id="headerMetaLine"></div> | |
| </div> | |
| <div class="d-flex flex-wrap justify-content-lg-end gap-2" id="headerLinks"></div> | |
| </div> | |
| </div> | |
| </div> | |
| <main class="container-fluid page-shell py-4"> | |
| <section class="card summary-card mb-4"> | |
| <div class="card-body"> | |
| <div class="d-flex flex-column flex-xl-row justify-content-between gap-3"> | |
| <div class="flex-grow-1"> | |
| <div class="d-flex align-items-center gap-2 mb-2"> | |
| <i class="bi bi-journal-text text-primary"></i> | |
| <h2 class="h5 mb-0">Executive Summary</h2> | |
| </div> | |
| <p id="executiveSummary" class="summary-text mb-0"></p> | |
| </div> | |
| <div class="summary-meta text-xl-end"> | |
| <div><span class="meta-label me-1">Analyzed</span><span id="analyzedAt">—</span></div> | |
| <div><span class="meta-label me-1">PR Head</span><span id="shaPrHead" class="mono">—</span></div> | |
| <div><span class="meta-label me-1">Base</span><span id="shaBase" class="mono">—</span></div> | |
| <div><span class="meta-label me-1">Upstream</span><span id="shaUpstream" class="mono">—</span></div> | |
| </div> | |
| </div> | |
| <div class="mt-4"> | |
| <div class="d-flex align-items-center gap-2 mb-2"> | |
| <i class="bi bi-lightbulb text-warning"></i> | |
| <h3 class="h6 mb-0">Recommendations</h3> | |
| </div> | |
| <div id="topRecommendations"></div> | |
| </div> | |
| </div> | |
| </section> | |
| <section> | |
| <ul class="nav nav-tabs" id="reportTabs" role="tablist"></ul> | |
| <div class="tab-content" id="reportTabContent"></div> | |
| </section> | |
| </main> | |
| <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui-slim.min.js"></script> | |
| <script>const DATA = {"meta": {"skiaPrNumber": 184, "skiasharpPrNumber": 3702, "oldUpstreamBranch": "chrome/m133", "upstreamBranch": "chrome/m147", "shas": {"prHead": "9e2235e920cec88b4757f4ba69fcff4782c28e07", "base": "b9b89f23a5723523a166e477b37f29e094cbaa7f", "upstream": "f8cd2da0256752afb0059bf17e4bf2bec422967e"}, "analyzedAt": "2026-04-26T20:33:11.282110+00:00", "schemaVersion": "1.0", "repo": "mono/skia"}, "summary": "Skia upstream merge from chrome/m133 to chrome/m147. Major changes: SkPath made immutable with new SkPathBuilder for construction, SkSpan migration across font/glyph APIs, gradient shader namespace move (SkGradientShader → SkGradient/SkShaders), encoder ICC profile removal, pathops extracted as separate build target, C++20 adoption. The C API shim layer introduces sk_pathbuilder_t and migrates 28 path mutation functions from sk_path to sk_pathbuilder. The companion PR (SkiaSharp #3702) adds SKPathBuilder wrapper with lazy-flush pattern preserving SKPath's existing API. Generated files match independently — PASS. 6 DEPS updates include freetype and libjpeg-turbo (security-sensitive). Overall a large but well-structured update.", "recommendations": ["Review SKPathBuilder default parameters — should use overloads per ABI convention", "Verify native Xcode projects compile sk_pathbuilder files via wildcard includes", "Review freetype and libjpeg-turbo updates for security CVE fixes", "Verify C# encoder option structs match native after ICC field removal", "Test SKPath lazy-builder flush semantics under high-frequency mutation workloads"], "generatedFiles": {"status": "PASS", "summary": "All 4 generated binding files (SkiaApi, Skottie, SceneGraph, Resources) match after independent regeneration. HarfBuzz excluded per standard practice.", "recommendations": ["No action needed — generated files are in sync with C API headers"], "checked": ["binding/SkiaSharp/SkiaApi.generated.cs", "binding/SkiaSharp.Skottie/SkottieApi.generated.cs", "binding/SkiaSharp.SceneGraph/SceneGraphApi.generated.cs", "binding/SkiaSharp.Resources/ResourcesApi.generated.cs"]}, "upstreamIntegrity": {"status": "REVIEW_REQUIRED", "summary": "33 upstream integrity items: 16 added fork patches (mostly build fixes and GPU guards), 6 removed patches (all verified against upstream/chrome/m147), and 11 changed patches (Fuchsia removal, C++20 migration, pathops extraction, WASM threading). Key additions: SkPixmap bugfixes, D3D/GL header guards. All removed patches verified as resolved upstream or replaced by interop layer.", "recommendations": ["Verify SkPixmap.cpp argument-order and color-channel fixes are correct vs upstream", "Confirm gn/skia/BUILD.gn pathops extraction doesn't miss edge cases", "Check C++20/c++2a Tizen workaround in gn/toolchain/BUILD.gn remains needed"], "added": [{"path": "gn/shared_sources.gni", "diff": "diff --git a/gn/shared_sources.gni b/gn/shared_sources.gni\nindex d69ef1d52d..941f51e89a 100644\n--- a/gn/shared_sources.gni\n+++ b/gn/shared_sources.gni\n@@ -21,6 +21,7 @@ import(\"svg.gni\")\n import(\"utils.gni\")\n import(\"xml.gni\")\n import(\"xps.gni\")\n+\n skia_opts = {\n hsw_sources = hsw\n skx_sources = skx", "summary": "Adds a blank line after the last import statement (before the skia_opts block). Whitespace-only formatting change with no functional impact."}, {"path": "include/gpu/ganesh/d3d/GrD3DTypes.h", "diff": "diff --git a/include/gpu/ganesh/d3d/GrD3DTypes.h b/include/gpu/ganesh/d3d/GrD3DTypes.h\nindex 3e6fbcd719..7c6c591a91 100644\n--- a/include/gpu/ganesh/d3d/GrD3DTypes.h\n+++ b/include/gpu/ganesh/d3d/GrD3DTypes.h\n@@ -216,14 +216,16 @@ struct GrD3DTextureResourceInfo {\n , fSampleQualityPattern(info.fSampleQualityPattern)\n , fProtected(info.fProtected) {}\n \n-#if defined(GPU_TEST_UTILS)\n+ // mono/skia: upstream gated this behind GPU_TEST_UTILS in m147, but\n+ // GrD3DBackendSurfaceInfo::operator== (also ungated for production\n+ // equal()) calls it. Under is_official_build=true GPU_TEST_UTILS isn't\n+ // defined, so keep the operator available.\n bool operator==(const GrD3DTextureResourceInfo& that) const {\n return fResource == that.fResource && fResourceState == that.fResourceState &&\n fFormat == that.fFormat && fSampleCount == that.fSampleCount &&\n fLevelCount == that.fLevelCount &&\n fSampleQualityPattern == that.fSampleQualityPattern && fProtected == that.fProtected;\n }\n-#endif\n };\n \n struct GrD3DFenceInfo {", "summary": "Removes the #if defined(GPU_TEST_UTILS) guard around GrD3DTextureResourceInfo::operator==. Comment explains that upstream m147 gated this behind GPU_TEST_UTILS, but GrD3DBackendSurfaceInfo::operator== (a production code path for equal()) calls it. Under is_official_build=true (SkiaSharp's release config), GPU_TEST_UTILS is not defined, so the operator must remain unconditionally available to avoid linker errors.", "relatedFiles": [{"path": "include/private/gpu/ganesh/GrD3DTypesMinimal.h", "relationship": "related"}, {"path": "src/gpu/ganesh/d3d/GrD3DTypesMinimal.cpp", "relationship": "related"}]}, {"path": "include/gpu/ganesh/gl/GrGLFunctions.h", "diff": "diff --git a/include/gpu/ganesh/gl/GrGLFunctions.h b/include/gpu/ganesh/gl/GrGLFunctions.h\nindex cc118ac2fa..0a62f7d8ce 100644\n--- a/include/gpu/ganesh/gl/GrGLFunctions.h\n+++ b/include/gpu/ganesh/gl/GrGLFunctions.h\n@@ -13,7 +13,16 @@\n #include \"include/private/base/SkTLogic.h\"\n \n #if defined(__EMSCRIPTEN__)\n-#include <emscripten/version.h>\n+// mono/skia: <emscripten/version.h> was introduced by Emscripten\n+// PR #25933 and only ships on emcc that defines the version macros\n+// inside the header. Older Emscripten (e.g. the 2.0.6 / 2.0.23\n+// toolchains SkiaSharp keeps in its WASM matrix for .NET 6/7\n+// compat) still passes -D__EMSCRIPTEN_major__/_minor__/_tiny__ on\n+// the command line and ships no such header. Probe with\n+// __has_include so both eras compile.\n+# if __has_include(<emscripten/version.h>)\n+# include <emscripten/version.h>\n+# endif\n #endif\n \n extern \"C\" {", "summary": "Wraps #include <emscripten/version.h> with __has_include guard. Older Emscripten toolchains (2.0.6/2.0.23) in SkiaSharp's WASM build matrix do not ship this header — they pass __EMSCRIPTEN_major__/_minor__/_tiny__ via -D flags on the command line. The __has_include probe allows both old and new Emscripten versions to compile.", "relatedFiles": [{"path": "src/gpu/ganesh/gl/GrGLGpu.cpp", "relationship": "related"}]}, {"path": "include/private/gpu/ganesh/GrD3DTypesMinimal.h", "diff": "diff --git a/include/private/gpu/ganesh/GrD3DTypesMinimal.h b/include/private/gpu/ganesh/GrD3DTypesMinimal.h\nindex 84db9c1567..11521feac1 100644\n--- a/include/private/gpu/ganesh/GrD3DTypesMinimal.h\n+++ b/include/private/gpu/ganesh/GrD3DTypesMinimal.h\n@@ -48,9 +48,11 @@ struct GrD3DBackendSurfaceInfo {\n GrD3DTextureResourceInfo snapTextureResourceInfo() const;\n \n bool isProtected() const;\n-#if defined(GPU_TEST_UTILS)\n+ // mono/skia: upstream gated operator== behind GPU_TEST_UTILS in m147, but\n+ // GrD3DBackendSurface.cpp::equal() — a production virtual override — still\n+ // calls it. Builds with is_official_build=true (our release config) don't\n+ // define GPU_TEST_UTILS, so keep the declaration unconditional.\n bool operator==(const GrD3DBackendSurfaceInfo& that) const;\n-#endif\n \n private:\n std::unique_ptr<GrD3DTextureResourceInfo> fTextureResourceInfo;", "summary": "Removes the #if defined(GPU_TEST_UTILS) guard around the GrD3DBackendSurfaceInfo::operator== declaration. Comment explains the same production-code linker issue as GrD3DTypes.h: the equal() virtual override in GrD3DBackendSurface.cpp calls this operator, and is_official_build=true doesn't define GPU_TEST_UTILS.", "relatedFiles": [{"path": "include/gpu/ganesh/d3d/GrD3DTypes.h", "relationship": "related"}, {"path": "src/gpu/ganesh/d3d/GrD3DTypesMinimal.cpp", "relationship": "related"}]}, {"path": "infra/bots/assets/provisioning_profile_ios/VERSION", "diff": "diff --git a/infra/bots/assets/provisioning_profile_ios/VERSION b/infra/bots/assets/provisioning_profile_ios/VERSION\nnew file mode 100644\nindex 0000000000..ca7bf83ac5\n--- /dev/null\n+++ b/infra/bots/assets/provisioning_profile_ios/VERSION\n@@ -0,0 +1 @@\n+13\n\\ No newline at end of file", "summary": "New file containing the version number '13' for the iOS provisioning profile asset. This file was deleted upstream between m133 and m147; the fork re-adds it as a retained infra artifact."}, {"path": "infra/bots/recipe_modules/build/docker.py", "diff": "diff --git a/infra/bots/recipe_modules/build/docker.py b/infra/bots/recipe_modules/build/docker.py\nindex 3bbcd64880..6004b2199b 100644\n--- a/infra/bots/recipe_modules/build/docker.py\n+++ b/infra/bots/recipe_modules/build/docker.py\n@@ -35,6 +35,10 @@ def compile_fn(api, checkout_root, out_dir):\n image_name = 'gcc-debian11'\n elif target_arch == 'x86':\n image_name = 'gcc-debian11-x86'\n+ elif os == 'Ubuntu18':\n+ # The Docker image contains GCC, but if we're building using Clang the CIPD\n+ # package will be provided as part of the task and mounted to the container.\n+ image_name = 'gcc-ubuntu18'\n \n if not image_name:\n raise Exception('Not implemented: ' + api.vars.builder_name)", "summary": "Adds an 'Ubuntu18' case to the Docker compile function, mapping it to the 'gcc-ubuntu18' Docker image. This is a retained fork infrastructure patch for building with Ubuntu 18 Docker containers.", "relatedFiles": [{"path": "infra/bots/recipe_modules/build/examples/full.expected/Build-Ubuntu18-Clang-x86_64-Release-Docker.json", "relationship": "related"}, {"path": "infra/bots/recipe_modules/build/resources/docker-compile.sh", "relationship": "related"}]}, {"path": "infra/bots/recipe_modules/build/examples/full.expected/Build-Ubuntu18-Clang-x86_64-Release-Docker.json", "diff": "diff --git a/infra/bots/recipe_modules/build/examples/full.expected/Build-Ubuntu18-Clang-x86_64-Release-Docker.json b/infra/bots/recipe_modules/build/examples/full.expected/Build-Ubuntu18-Clang-x86_64-Release-Docker.json\nnew file mode 100644\nindex 0000000000..bb789c77a1\n--- /dev/null\n+++ b/infra/bots/recipe_modules/build/examples/full.expected/Build-Ubuntu18-Clang-x86_64-Release-Docker.json\n@@ -0,0 +1,133 @@\n+[\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"[START_DIR]/cache/work/skia/infra/bots/assets/clang_linux/VERSION\",\n+ \"/path/to/tmp/\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Get clang_linux VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [],\n+ \"name\": \"Docker setup\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"python3\",\n+ \"RECIPE_MODULE[skia::docker]/resources/get_uid_gid.py\"\n+ ],\n+ \"name\": \"Docker setup.Get uid and gid\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_NEST_LEVEL@1@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"ensure-directory\",\n+ \"--mode\",\n+ \"0o777\",\n+ \"[START_DIR]/cache/work/skia/out/Build-Ubuntu18-Clang-x86_64-Release-Docker/Release\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Docker setup.mkdirs out_dir\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_NEST_LEVEL@1@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"chmod\",\n+ \"777\",\n+ \"[START_DIR]/cache/work/skia/out/Build-Ubuntu18-Clang-x86_64-Release-Docker/Release\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Docker setup.chmod 777 [START_DIR]/cache/work/skia/out/Build-Ubuntu18-Clang-x86_64-Release-Docker/Release\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_NEST_LEVEL@1@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"chmod\",\n+ \"755\",\n+ \"[START_DIR]\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Docker setup.chmod 755 [START_DIR]\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_NEST_LEVEL@1@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"chmod\",\n+ \"0755\",\n+ \"RECIPE_MODULE[skia::build]/resources/docker-compile.sh\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Docker setup.chmod 0755 RECIPE_MODULE[skia::build]/resources/docker-compile.sh\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_NEST_LEVEL@1@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"docker\",\n+ \"run\",\n+ \"--shm-size=2gb\",\n+ \"--rm\",\n+ \"--user\",\n+ \"13:17\",\n+ \"--mount\",\n+ \"type=bind,source=[START_DIR],target=/SRC\",\n+ \"--mount\",\n+ \"type=bind,source=[START_DIR]/cache/work/skia/out/Build-Ubuntu18-Clang-x86_64-Release-Docker/Release,target=/OUT\",\n+ \"-e\",\n+ \"CCACHE_COMPILERCHECK=content\",\n+ \"-e\",\n+ \"CCACHE_DIR=/SRC/cache/ccache\",\n+ \"-e\",\n+ \"CCACHE_MAXFILES=0\",\n+ \"-e\",\n+ \"CCACHE_MAXSIZE=75G\",\n+ \"gcr.io/skia-public/clang-ubuntu18@sha256:c46fdae57032646419baf125310c94363b5cb0e722ffcc63686468f485608aaa\",\n+ \"/SRC/../RECIPE_MODULE[skia::build]/resources/docker-compile.sh\",\n+ \"cc=\\\"/SRC/clang_linux/bin/clang\\\" cc_wrapper=\\\"/SRC/ccache_linux/bin/ccache\\\" cxx=\\\"/SRC/clang_linux/bin/clang++\\\" extra_cflags=[\\\"-B/SRC/clang_linux/bin\\\", \\\"-DPLACEHOLDER_clang_linux_version=42\\\", \\\"-DREBUILD_IF_CHANGED_docker_image=gcr.io/skia-public/clang-ubuntu18@sha256:c46fdae57032646419baf125310c94363b5cb0e722ffcc63686468f485608aaa\\\"] extra_ldflags=[\\\"-B/SRC/clang_linux/bin\\\", \\\"-fuse-ld=lld\\\", \\\"-L/SRC/clang_linux/lib\\\"] is_debug=false link_pool_depth=2 skia_use_client_icu=true skia_use_libgrapheme=true target_cpu=\\\"x86_64\\\" werror=true\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"DOCKER_CONFIG\": \"[HOME]/chrome-bot/.docker\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"name\": \"Run build script in Docker\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"python3\",\n+ \"RECIPE_MODULE[skia::build]/resources/copy_build_products.py\",\n+ \"[START_DIR]/cache/work/skia/out/Build-Ubuntu18-Clang-x86_64-Release-Docker/Release\",\n+ \"[START_DIR]/[SWARM_OUT_DIR]/out/Release\",\n+ \"dm,dm.exe,dm.app,nanobench.app,get_images_from_skps,get_images_from_skps.exe,nanobench,nanobench.exe,*.so,*.dll,*.dylib,skottie_tool,lib/*.so,run_testlab\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"copy build products\"\n+ },\n+ {\n+ \"name\": \"$result\"\n+ }\n+]\n\\ No newline at end of file", "summary": "New recipe test expectation file for an Ubuntu18 Clang x86_64 Docker release build. Contains the expected step sequence including clang version detection, Docker container setup, build invocation, and artifact copying.", "relatedFiles": [{"path": "infra/bots/recipe_modules/build/docker.py", "relationship": "related"}]}, {"path": "infra/bots/recipe_modules/build/resources/docker-compile.sh", "diff": "diff --git a/infra/bots/recipe_modules/build/resources/docker-compile.sh b/infra/bots/recipe_modules/build/resources/docker-compile.sh\nindex c7d35236dc..d03fa0da13 100755\n--- a/infra/bots/recipe_modules/build/resources/docker-compile.sh\n+++ b/infra/bots/recipe_modules/build/resources/docker-compile.sh\n@@ -16,6 +16,8 @@ export PATH=\"/SRC/cipd_bin_packages/cpython3/bin:/SRC/recipe_bundle/depot_tools:\n \n env\n \n+env\n+\n cd /SRC/skia\n ./bin/fetch-ninja\n ./bin/fetch-gn", "summary": "Adds a duplicate 'env' command call in the docker compile script. This appears to be a retained fork infrastructure artifact (extra debugging output).", "relatedFiles": [{"path": "infra/bots/recipe_modules/build/docker.py", "relationship": "related"}]}, {"path": "infra/bots/recipe_modules/flavor/examples/full.expected/Perf-ChromeOS-Clang-Sparky360-GPU-MaliT860-arm-Release-All.json", "diff": "diff --git a/infra/bots/recipe_modules/flavor/examples/full.expected/Perf-ChromeOS-Clang-Sparky360-GPU-MaliT860-arm-Release-All.json b/infra/bots/recipe_modules/flavor/examples/full.expected/Perf-ChromeOS-Clang-Sparky360-GPU-MaliT860-arm-Release-All.json\nnew file mode 100644\nindex 0000000000..9d6c676cbc\n--- /dev/null\n+++ b/infra/bots/recipe_modules/flavor/examples/full.expected/Perf-ChromeOS-Clang-Sparky360-GPU-MaliT860-arm-Release-All.json\n@@ -0,0 +1,692 @@\n+[\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"/tmp/ssh_machine.json\",\n+ \"/path/to/tmp/\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"read ssh_machine.json\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@ssh_machine.json@{@@@\",\n+ \"@@@STEP_LOG_LINE@ssh_machine.json@ \\\"user_ip\\\": \\\"foo@127.0.0.1\\\"@@@\",\n+ \"@@@STEP_LOG_LINE@ssh_machine.json@}@@@\",\n+ \"@@@STEP_LOG_END@ssh_machine.json@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"scp\",\n+ \"file.txt\",\n+ \"foo@127.0.0.1:file.txt\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"scp file.txt foo@127.0.0.1:file.txt\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"cat\",\n+ \"file.txt\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"read file.txt\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"rm\",\n+ \"-f\",\n+ \"file.txt\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"rm file.txt\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"rmtree\",\n+ \"results_dir\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"rmtree results_dir\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"ensure-directory\",\n+ \"--mode\",\n+ \"0o777\",\n+ \"results_dir\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"makedirs results_dir\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"rm\",\n+ \"-rf\",\n+ \"device_results_dir\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"rm device_results_dir\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"mkdir\",\n+ \"-p\",\n+ \"device_results_dir\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"mkdir device_results_dir\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"mkdir\",\n+ \"-p\",\n+ \"[HOME]/chronos/user/resources\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"mkdir .[HOME]/chronos/user/resources\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"rm\",\n+ \"-rf\",\n+ \"[HOME]/chronos/user/bin\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"rm .[HOME]/chronos/user/bin\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"mkdir\",\n+ \"-p\",\n+ \"[HOME]/chronos/user/bin\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"mkdir .[HOME]/chronos/user/bin\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"scp\",\n+ \"[START_DIR]/build/nanobench\",\n+ \"foo@127.0.0.1:.[HOME]/chronos/user/bin/nanobench\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"scp [START_DIR]/build/nanobench foo@127.0.0.1:.[HOME]/chronos/user/bin/nanobench\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"chmod\",\n+ \"+x\",\n+ \"[HOME]/chronos/user/bin/nanobench\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"make nanobench executable\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"sudo\",\n+ \"mount\",\n+ \"-i\",\n+ \"-o\",\n+ \"remount,exec\",\n+ \"[HOME]/chronos\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"remount .[HOME]/chronos/user/ as exec\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"python3\",\n+ \"RECIPE_MODULE[skia::flavor]/resources/scp.py\",\n+ \"[START_DIR]/skia/resources\",\n+ \"foo@127.0.0.1:.[HOME]/chronos/user/resources\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"scp -r [START_DIR]/skia/resources foo@127.0.0.1:.[HOME]/chronos/user/resources\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"[START_DIR]/skia/infra/bots/assets/skp/VERSION\",\n+ \"/path/to/tmp/\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Get skp VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"42\",\n+ \"[START_DIR]/tmp/SKP_VERSION\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"write SKP_VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@SKP_VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@SKP_VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"cat\",\n+ \"[HOME]/chronos/user/SKP_VERSION\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"read .[HOME]/chronos/user/SKP_VERSION\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"rm\",\n+ \"-f\",\n+ \"[HOME]/chronos/user/SKP_VERSION\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"rm .[HOME]/chronos/user/SKP_VERSION\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"rm\",\n+ \"-rf\",\n+ \"[HOME]/chronos/user/skps\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"rm .[HOME]/chronos/user/skps\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"mkdir\",\n+ \"-p\",\n+ \"[HOME]/chronos/user/skps\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"mkdir .[HOME]/chronos/user/skps\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"python3\",\n+ \"RECIPE_MODULE[skia::flavor]/resources/scp.py\",\n+ \"[START_DIR]/skp\",\n+ \"foo@127.0.0.1:.[HOME]/chronos/user/skps\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"scp -r [START_DIR]/skp foo@127.0.0.1:.[HOME]/chronos/user/skps\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"scp\",\n+ \"[START_DIR]/tmp/SKP_VERSION\",\n+ \"foo@127.0.0.1:.[HOME]/chronos/user/SKP_VERSION\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"scp [START_DIR]/tmp/SKP_VERSION foo@127.0.0.1:.[HOME]/chronos/user/SKP_VERSION\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"[START_DIR]/skia/infra/bots/assets/skimage/VERSION\",\n+ \"/path/to/tmp/\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Get skimage VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"42\",\n+ \"[START_DIR]/tmp/SK_IMAGE_VERSION\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"write SK_IMAGE_VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@SK_IMAGE_VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@SK_IMAGE_VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"cat\",\n+ \"[HOME]/chronos/user/SK_IMAGE_VERSION\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"read .[HOME]/chronos/user/SK_IMAGE_VERSION\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"rm\",\n+ \"-f\",\n+ \"[HOME]/chronos/user/SK_IMAGE_VERSION\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"rm .[HOME]/chronos/user/SK_IMAGE_VERSION\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"rm\",\n+ \"-rf\",\n+ \"[HOME]/chronos/user/images\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"rm .[HOME]/chronos/user/images\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"mkdir\",\n+ \"-p\",\n+ \"[HOME]/chronos/user/images\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"mkdir .[HOME]/chronos/user/images\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"python3\",\n+ \"RECIPE_MODULE[skia::flavor]/resources/scp.py\",\n+ \"[START_DIR]/skimage\",\n+ \"foo@127.0.0.1:.[HOME]/chronos/user/images\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"scp -r [START_DIR]/skimage foo@127.0.0.1:.[HOME]/chronos/user/images\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"scp\",\n+ \"[START_DIR]/tmp/SK_IMAGE_VERSION\",\n+ \"foo@127.0.0.1:.[HOME]/chronos/user/SK_IMAGE_VERSION\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"scp [START_DIR]/tmp/SK_IMAGE_VERSION foo@127.0.0.1:.[HOME]/chronos/user/SK_IMAGE_VERSION\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"[START_DIR]/skia/infra/bots/assets/svg/VERSION\",\n+ \"/path/to/tmp/\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Get svg VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"42\",\n+ \"[START_DIR]/tmp/SVG_VERSION\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"write SVG_VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@SVG_VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@SVG_VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"cat\",\n+ \"[HOME]/chronos/user/SVG_VERSION\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"read .[HOME]/chronos/user/SVG_VERSION\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"rm\",\n+ \"-f\",\n+ \"[HOME]/chronos/user/SVG_VERSION\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"rm .[HOME]/chronos/user/SVG_VERSION\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"rm\",\n+ \"-rf\",\n+ \"[HOME]/chronos/user/svgs\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"rm .[HOME]/chronos/user/svgs\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"mkdir\",\n+ \"-p\",\n+ \"[HOME]/chronos/user/svgs\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"mkdir .[HOME]/chronos/user/svgs\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"python3\",\n+ \"RECIPE_MODULE[skia::flavor]/resources/scp.py\",\n+ \"[START_DIR]/svg\",\n+ \"foo@127.0.0.1:.[HOME]/chronos/user/svgs\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"scp -r [START_DIR]/svg foo@127.0.0.1:.[HOME]/chronos/user/svgs\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"scp\",\n+ \"[START_DIR]/tmp/SVG_VERSION\",\n+ \"foo@127.0.0.1:.[HOME]/chronos/user/SVG_VERSION\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"scp [START_DIR]/tmp/SVG_VERSION foo@127.0.0.1:.[HOME]/chronos/user/SVG_VERSION\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"ssh\",\n+ \"-oConnectTimeout=15\",\n+ \"-oBatchMode=yes\",\n+ \"-t\",\n+ \"-t\",\n+ \"foo@127.0.0.1\",\n+ \"[HOME]/chronos/user/bin/nanobench\",\n+ \"--some-flag\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\"\n+ },\n+ \"infra_step\": true,\n+ \"name\": \"nanobench\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"python3\",\n+ \"RECIPE_MODULE[skia::flavor]/resources/scp.py\",\n+ \"foo@127.0.0.1:.[HOME]/chronos/user/perf\",\n+ \"[START_DIR]/[SWARM_OUT_DIR]\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"scp -r foo@127.0.0.1:.[HOME]/chronos/user/perf [START_DIR]/[SWARM_OUT_DIR]\"\n+ },\n+ {\n+ \"name\": \"$result\"\n+ }\n+]\n\\ No newline at end of file", "summary": "New recipe test expectation file for a ChromeOS ARM Sparky360 performance test configuration. Contains the full expected step sequence for SSH-based remote device testing (scp, ssh, nanobench). This file was removed upstream between m133 and m147; the fork retains it."}, {"path": "infra/bots/recipe_modules/flavor/examples/full.expected/Test-Ubuntu18-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-Valgrind_AbandonGpuContext_SK_CPU_LIMIT_SSE41.json", "diff": "diff --git a/infra/bots/recipe_modules/flavor/examples/full.expected/Test-Ubuntu18-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-Valgrind_AbandonGpuContext_SK_CPU_LIMIT_SSE41.json b/infra/bots/recipe_modules/flavor/examples/full.expected/Test-Ubuntu18-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-Valgrind_AbandonGpuContext_SK_CPU_LIMIT_SSE41.json\nnew file mode 100644\nindex 0000000000..2d3f8de7aa\n--- /dev/null\n+++ b/infra/bots/recipe_modules/flavor/examples/full.expected/Test-Ubuntu18-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-Valgrind_AbandonGpuContext_SK_CPU_LIMIT_SSE41.json\n@@ -0,0 +1,219 @@\n+[\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"file.txt\",\n+ \"/path/to/tmp/\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"read file.txt\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_END@file.txt@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"remove\",\n+ \"file.txt\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"remove file.txt\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"rmtree\",\n+ \"results_dir\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"rmtree results_dir\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"ensure-directory\",\n+ \"--mode\",\n+ \"0o777\",\n+ \"results_dir\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"makedirs results_dir\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"rmtree\",\n+ \"device_results_dir\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"rmtree device_results_dir\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"ensure-directory\",\n+ \"--mode\",\n+ \"0o777\",\n+ \"device_results_dir\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"makedirs device_results_dir\"\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"[START_DIR]/skia/infra/bots/assets/skp/VERSION\",\n+ \"/path/to/tmp/\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Get skp VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"42\",\n+ \"[START_DIR]/tmp/SKP_VERSION\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"write SKP_VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@SKP_VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@SKP_VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"[START_DIR]/skia/infra/bots/assets/skimage/VERSION\",\n+ \"/path/to/tmp/\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Get skimage VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"42\",\n+ \"[START_DIR]/tmp/SK_IMAGE_VERSION\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"write SK_IMAGE_VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@SK_IMAGE_VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@SK_IMAGE_VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"[START_DIR]/skia/infra/bots/assets/svg/VERSION\",\n+ \"/path/to/tmp/\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"Get svg VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"vpython3\",\n+ \"-u\",\n+ \"RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py\",\n+ \"--json-output\",\n+ \"/path/to/tmp/json\",\n+ \"copy\",\n+ \"42\",\n+ \"[START_DIR]/tmp/SVG_VERSION\"\n+ ],\n+ \"infra_step\": true,\n+ \"name\": \"write SVG_VERSION\",\n+ \"~followup_annotations\": [\n+ \"@@@STEP_LOG_LINE@SVG_VERSION@42@@@\",\n+ \"@@@STEP_LOG_END@SVG_VERSION@@@\"\n+ ]\n+ },\n+ {\n+ \"cmd\": [\n+ \"[START_DIR]/valgrind/bin/valgrind\",\n+ \"--gen-suppressions=all\",\n+ \"--leak-check=full\",\n+ \"--track-origins=yes\",\n+ \"--error-exitcode=1\",\n+ \"--num-callers=40\",\n+ \"--vex-guest-max-insns=25\",\n+ \"--suppressions=[START_DIR]/skia/tools/valgrind.supp\",\n+ \"[START_DIR]/build/dm\",\n+ \"--some-flag\"\n+ ],\n+ \"env\": {\n+ \"CHROME_HEADLESS\": \"1\",\n+ \"PATH\": \"<PATH>:RECIPE_REPO[depot_tools]\",\n+ \"VALGRIND_LIB\": \"[START_DIR]/valgrind/lib/valgrind\"\n+ },\n+ \"name\": \"dm\"\n+ },\n+ {\n+ \"name\": \"$result\"\n+ }\n+]\n\\ No newline at end of file", "summary": "New recipe test expectation file for a Valgrind-instrumented Ubuntu18 GPU test configuration with Quadro P400. Contains expected step sequence including asset versioning and Valgrind invocation. This file was removed upstream; the fork retains it."}, {"path": "infra/skcq.json", "diff": "diff --git a/infra/skcq.json b/infra/skcq.json\ndeleted file mode 100644\nindex ad724f080d..0000000000\n--- a/infra/skcq.json\n+++ /dev/null\n@@ -1,8 +0,0 @@\n-{\n- \"visibility_type\": \"public\",\n- \"tasks_json_path\": \"infra/bots/tasks.json\",\n- \"committer_list\": \"project-skia-committers\",\n- \"dry_run_access_list\": \"project-skia-tryjob-access\",\n- \"tree_status_url\": \"https://tree-status.skia.org/current\",\n- \"authors_path\": \"AUTHORS\"\n-}", "summary": "This file is being DELETED (the diff shows removal of all content). The upstream CQ configuration file (referencing tasks.json, committer lists, and tree status) is dropped. Upstream removed this between m133 and m147.", "relatedFiles": [{"path": "infra/bots/tasks.json", "relationship": "related"}]}, {"path": "src/core/SkPixmap.cpp", "diff": "diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp\nindex 80a08dcb64..d7050da023 100644\n--- a/src/core/SkPixmap.cpp\n+++ b/src/core/SkPixmap.cpp\n@@ -255,6 +255,9 @@ SkColor SkPixmap::getColor(int x, int y) const {\n return toColor(SkSwizzle_RGBA_to_PMColor(value));\n }\n case kSRGBA_8888_SkColorType: {\n+ // [mono/skia fork patch] Fix google/skia bug in m147: SkColorSetARGB argument\n+ // order was (r,g,b,a) but the correct signature is (a,r,g,b). This swapped R\n+ // and A channels, making opaque red appear as blue. Fixed to (a,r,g,b).\n uint32_t value = *this->addr32(x, y);\n float r = ((value >> 0) & 0xff) * (1/255.0f),\n g = ((value >> 8) & 0xff) * (1/255.0f),\n@@ -277,7 +280,7 @@ SkColor SkPixmap::getColor(int x, int y) const {\n g *= 255.0f;\n b *= 255.0f;\n a *= 255.0f;\n- return SkColorSetARGB(r, g, b, a);\n+ return SkColorSetARGB(a, r, g, b);\n }\n case kRGB_101010x_SkColorType: {\n uint32_t value = *this->addr32(x, y);\n@@ -299,19 +302,27 @@ SkColor SkPixmap::getColor(int x, int y) const {\n }\n case kRGBA_1010102_SkColorType:\n case kBGRA_1010102_SkColorType: {\n+ // [mono/skia fork patch] Fix google/skia bug in m147: this case was refactored\n+ // to always use BGRA bit extraction order, dropping the conditional swap that\n+ // existed in m133. In m133, bits 0-9 were read as 'r' with std::swap(r,b) for\n+ // BGRA. In m147, bits 0-9 are unconditionally read as 'b', which is wrong for\n+ // kRGBA_1010102. Fix: read as RGBA and swap for BGRA, matching m133 behavior.\n uint32_t value = *this->addr32(x, y);\n- float b = ((value >> 0) & 0x3ff) * (1/1023.0f),\n+ float r = ((value >> 0) & 0x3ff) * (1/1023.0f),\n g = ((value >> 10) & 0x3ff) * (1/1023.0f),\n- r = ((value >> 20) & 0x3ff) * (1/1023.0f),\n+ b = ((value >> 20) & 0x3ff) * (1/1023.0f),\n a = ((value >> 30) & 0x3 ) * (1/ 3.0f);\n+ if (this->colorType() == kBGRA_1010102_SkColorType) {\n+ std::swap(r, b);\n+ }\n if (a != 0 && needsUnpremul) {\n r = SkTPin(r/a, 0.0f, 1.0f);\n g = SkTPin(g/a, 0.0f, 1.0f);\n b = SkTPin(b/a, 0.0f, 1.0f);\n }\n- b *= 255.0f;\n- g *= 255.0f;\n r *= 255.0f;\n+ g *= 255.0f;\n+ b *= 255.0f;\n a *= 255.0f;\n return SkColorSetARGB(a, r, g, b);\n }\n@@ -320,13 +331,18 @@ SkColor SkPixmap::getColor(int x, int y) const {\n return 0;\n }\n case kRGBA_10x6_SkColorType: {\n+ // [mono/skia fork patch] Fix google/skia bug in m147: the scaling factor\n+ // (1/1023.0f) produces float [0,1] but SkColorSetARGB expects uint8 [0,255].\n+ // m133 correctly scaled by 255. Fixed to (255/1023.0f).\n uint64_t value = *this->addr64(x, y);\n- return SkColorSetARGB(((value >> 54) & 0x3ff) * (1/1023.0f),\n- ((value >> 6) & 0x3ff) * (1/1023.0f),\n- ((value >> 22) & 0x3ff) * (1/1023.0f),\n- ((value >> 38) & 0x3ff) * (1/1023.0f));\n+ return SkColorSetARGB(((value >> 54) & 0x3ff) * (255/1023.0f),\n+ ((value >> 6) & 0x3ff) * (255/1023.0f),\n+ ((value >> 22) & 0x3ff) * (255/1023.0f),\n+ ((value >> 38) & 0x3ff) * (255/1023.0f));\n }\n case kR16G16B16A16_unorm_SkColorType: {\n+ // [mono/skia fork patch] Fix google/skia bug in m147: SkColorSetARGB argument\n+ // order was (r,g,b,a) but the correct signature is (a,r,g,b). Fixed.\n uint64_t value = *this->addr64(x, y);\n float r = ((value >> 0) & 0xffff) * (1/65535.0f),\n g = ((value >> 16) & 0xffff) * (1/65535.0f),\n@@ -341,7 +357,7 @@ SkColor SkPixmap::getColor(int x, int y) const {\n g *= 255.0f;\n b *= 255.0f;\n a *= 255.0f;\n- return SkColorSetARGB(r, g, b, a);\n+ return SkColorSetARGB(a, r, g, b);\n }\n case kRGB_F16F16F16x_SkColorType: {\n const uint64_t* addr =", "summary": "Fixes three bugs in upstream m147's SkPixmap::getColor() implementation: (1) For kSRGBA_8888 and kR16G16B16A16_unorm color types, corrects SkColorSetARGB argument order from (r,g,b,a) to the correct (a,r,g,b) — the upstream code swapped R and A channels. (2) For kRGBA_1010102/kBGRA_1010102, restores the m133 conditional swap logic: reads bits 0-9 as R (not B), and swaps r/b only for BGRA — upstream m147 unconditionally read as BGRA which was wrong for RGBA. (3) For kRGBA_10x6, changes scaling factor from (1/1023.0f) to (255/1023.0f) because SkColorSetARGB expects uint8 [0-255], not float [0-1]. All patches include explanatory comments."}, {"path": "src/gpu/ganesh/d3d/GrD3DTypesMinimal.cpp", "diff": "diff --git a/src/gpu/ganesh/d3d/GrD3DTypesMinimal.cpp b/src/gpu/ganesh/d3d/GrD3DTypesMinimal.cpp\nindex a8388a80fd..fda52035d7 100644\n--- a/src/gpu/ganesh/d3d/GrD3DTypesMinimal.cpp\n+++ b/src/gpu/ganesh/d3d/GrD3DTypesMinimal.cpp\n@@ -54,7 +54,7 @@ bool GrD3DBackendSurfaceInfo::isProtected() const {\n return fTextureResourceInfo->fProtected == GrProtected::kYes;\n }\n \n-#if defined(GPU_TEST_UTILS)\n+// mono/skia: see GrD3DTypesMinimal.h — ungated so production equal() can link.\n bool GrD3DBackendSurfaceInfo::operator==(const GrD3DBackendSurfaceInfo& that) const {\n GrD3DTextureResourceInfo cpyInfoThis = *fTextureResourceInfo;\n GrD3DTextureResourceInfo cpyInfoThat = *that.fTextureResourceInfo;\n@@ -64,4 +64,3 @@ bool GrD3DBackendSurfaceInfo::operator==(const GrD3DBackendSurfaceInfo& that) co\n cpyInfoThat.fResourceState = D3D12_RESOURCE_STATE_COMMON;\n return cpyInfoThis == cpyInfoThat && fResourceState == that.fResourceState;\n }\n-#endif", "summary": "Removes the #if defined(GPU_TEST_UTILS) / #endif guard around the GrD3DBackendSurfaceInfo::operator== implementation. This is the implementation counterpart to the header changes in GrD3DTypesMinimal.h and GrD3DTypes.h, ensuring the operator links in production (is_official_build=true) builds.", "relatedFiles": [{"path": "include/private/gpu/ganesh/GrD3DTypesMinimal.h", "relationship": "related"}, {"path": "include/gpu/ganesh/d3d/GrD3DTypes.h", "relationship": "related"}]}, {"path": "src/gpu/ganesh/gl/GrGLGpu.cpp", "diff": "diff --git a/src/gpu/ganesh/gl/GrGLGpu.cpp b/src/gpu/ganesh/gl/GrGLGpu.cpp\nindex a080eec57e..d1397c0016 100644\n--- a/src/gpu/ganesh/gl/GrGLGpu.cpp\n+++ b/src/gpu/ganesh/gl/GrGLGpu.cpp\n@@ -80,7 +80,13 @@\n #include <utility>\n \n #if defined(__EMSCRIPTEN__)\n-#include <emscripten/version.h>\n+// mono/skia: see GrGLFunctions.h — guard with __has_include so old\n+// Emscripten (2.0.6 / 2.0.23 in SkiaSharp's WASM matrix) still\n+// builds. Those toolchains pass __EMSCRIPTEN_major__ via -D and\n+// ship no <emscripten/version.h>.\n+# if __has_include(<emscripten/version.h>)\n+# include <emscripten/version.h>\n+# endif\n #endif\n \n namespace skgpu { class MutableTextureState; }", "summary": "Same __has_include guard for <emscripten/version.h> as GrGLFunctions.h. Ensures old Emscripten toolchains (2.0.6/2.0.23) in SkiaSharp's WASM matrix can still compile this file.", "relatedFiles": [{"path": "include/gpu/ganesh/gl/GrGLFunctions.h", "relationship": "related"}]}, {"path": "src/text/gpu/GlyphVector.h", "diff": "diff --git a/src/text/gpu/GlyphVector.h b/src/text/gpu/GlyphVector.h\nindex 35432127f9..003533969a 100644\n--- a/src/text/gpu/GlyphVector.h\n+++ b/src/text/gpu/GlyphVector.h\n@@ -18,6 +18,7 @@\n #include <cstdint>\n #include <functional>\n #include <optional>\n+#include <type_traits>\n \n class SkReadBuffer;\n class SkStrikeClient;\n@@ -68,7 +69,12 @@ concept GlyphType = requires(const T& t) {\n \n std::is_trivially_destructible_v<T>;\n \n- { t.packedID() } -> std::convertible_to<SkPackedGlyphID>;\n+ // mono/skia: replace std::convertible_to (libstdc++ <concepts>, GCC 10.1+ /\n+ // libc++ 13+) with std::is_convertible_v from <type_traits>. SkiaSharp ships\n+ // builds against Tizen Studio's gcc-9.2 stdlib and Emscripten 2.0.6's libc++\n+ // (LLVM 11), neither of which has <concepts>.\n+ { t.packedID() };\n+ requires std::is_convertible_v<decltype(t.packedID()), SkPackedGlyphID>;\n };\n \n template <typename T, template <typename...> class Template>\n@@ -88,7 +94,10 @@ concept BackendData = requires(T& t,\n \n T::FindStrike(cache, spec);\n requires is_specialization_of_v<decltype(T::FindStrike(cache, spec)), sk_sp>;\n- requires std::derived_from<typename decltype(T::FindStrike(cache, spec))::element_type, TextStrikeBase>;\n+ // mono/skia: std::derived_from (libstdc++ <concepts>, GCC 10.1+ /\n+ // libc++ 13+) -> std::is_base_of_v from <type_traits>, with arg order\n+ // swapped (derived_from<D,B> == is_base_of_v<B,D>).\n+ requires std::is_base_of_v<TextStrikeBase, typename decltype(T::FindStrike(cache, spec))::element_type>;\n \n // Must have a makeGlyphFromID that returns a GlyphType\n { t.makeGlyphFromID(id, maskFormat) } -> GlyphType;", "summary": "Replaces C++20 <concepts> library features with C++17-compatible <type_traits> equivalents: (1) Adds #include <type_traits>. (2) Replaces std::convertible_to concept constraint with a requires clause using std::is_convertible_v. (3) Replaces std::derived_from constraint with std::is_base_of_v (with swapped argument order). This allows building against older toolchains (Tizen Studio gcc-9.2, Emscripten 2.0.6/LLVM 11) that lack <concepts> support."}, {"path": "tools/ganesh/gl/win/SkWGL_win.cpp", "diff": "diff --git a/tools/ganesh/gl/win/SkWGL_win.cpp b/tools/ganesh/gl/win/SkWGL_win.cpp\nindex 373ce835dc..0bd8bf3988 100644\n--- a/tools/ganesh/gl/win/SkWGL_win.cpp\n+++ b/tools/ganesh/gl/win/SkWGL_win.cpp\n@@ -6,7 +6,7 @@\n */\n \n #include \"include/core/SkTypes.h\"\n-#if defined(SK_BUILD_FOR_WIN) && !defined(_M_ARM64) && !defined(WINUWP)\n+#if defined(SK_BUILD_FOR_WIN) && !defined(WINUWP)\n \n #include \"tools/ganesh/gl/win/SkWGL.h\"", "summary": "Removes the !defined(_M_ARM64) preprocessor guard from the platform check, changing from `#if defined(SK_BUILD_FOR_WIN) && !defined(_M_ARM64) && !defined(WINUWP)` to `#if defined(SK_BUILD_FOR_WIN) && !defined(WINUWP)`. This enables WGL support on Windows ARM64. Note: the file was moved from tools/gpu/gl/win/ to tools/ganesh/gl/win/ between milestones; the old-path patch is in the 'removed' category.", "relatedFiles": [{"path": "tools/gpu/gl/win/SkWGL_win.cpp", "relationship": "related"}]}], "removed": [{"path": ".gitignore", "diff": "diff --git a/.gitignore b/.gitignore\nindex faa99fda98..8679cf8969 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -12,6 +12,8 @@\n .project\n .recipe_deps/\n .settings/\n+.vs/\n+/_ReSharper.Caches\n .vscode/\n .win_toolchain/\n TAGS", "summary": "The old fork patch added .vs/ and /_ReSharper.Caches entries to .gitignore for Visual Studio / ReSharper IDE support. Verification: upstream m147 .gitignore already contains '.vs/' at line 16. The /_ReSharper.Caches entry was likely deemed unnecessary or is handled by global gitignore. The patch was dropped because upstream adopted the .vs/ entry natively, making the fork patch redundant."}, {"path": "gn/find_msvc.py", "diff": "diff --git a/gn/find_msvc.py b/gn/find_msvc.py\nindex 108d576139..99f39802bf 100755\n--- a/gn/find_msvc.py\n+++ b/gn/find_msvc.py\n@@ -9,7 +9,7 @@ import subprocess\n \n '''\n Look for the first match in the format\n- C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\${RELEASE}\\\\${VERSION}\\\\VC\n+ C:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\${RELEASE}\\\\${VERSION}\\\\VC\\\\Tools\\\\MSVC\n '''\n def find_msvc():\n if sys.platform.startswith('win'):\n@@ -17,7 +17,8 @@ def find_msvc():\n for release in ['2019', '2017']:\n for version in ['Enterprise', 'Professional', 'Community', 'BuildTools', 'Preview']:\n path = os.path.join(default_dir, release, version, 'VC')\n- if os.path.isdir(path):\n+ tools = os.path.join(path, 'Tools', 'MSVC')\n+ if os.path.isdir(tools):\n return path\n \n # Fall back to vswhere.exe to determine non-standard installation paths", "summary": "The old fork patch changed the MSVC search to probe for the deeper VC/Tools/MSVC directory instead of just the VC directory, to avoid false positives from incomplete installations. Updated the docstring to match. Verification: upstream m147 find_msvc.py still uses the simpler `os.path.isdir(path)` check at line 24 (checking just the VC dir), but now also searches 'C:\\Program Files' in addition to 'C:\\Program Files (x86)' and includes VS2022. The fork patch was dropped — upstream's broader search paths (2022, both Program Files dirs) and vswhere.exe fallback make the deeper directory probe less necessary."}, {"path": "include/utils/SkTextUtils.h", "diff": "diff --git a/include/utils/SkTextUtils.h b/include/utils/SkTextUtils.h\nindex 06f83b934f..df4a9727d2 100644\n--- a/include/utils/SkTextUtils.h\n+++ b/include/utils/SkTextUtils.h\n@@ -19,6 +19,7 @@ class SkCanvas;\n class SkFont;\n class SkPaint;\n class SkPath;\n+struct SkPoint;\n \n class SK_API SkTextUtils {\n public:\n@@ -38,6 +39,9 @@ public:\n \n static void GetPath(const void* text, size_t length, SkTextEncoding, SkScalar x, SkScalar y,\n const SkFont&, SkPath*);\n+\n+ static void GetPosPath(const void* text, size_t length, SkTextEncoding, const SkPoint pos[],\n+ const SkFont&, SkPath*);\n };\n \n #endif", "summary": "The old fork patch added a forward declaration of SkPoint and a new GetPosPath() method declaration to SkTextUtils. GetPosPath converts positioned text glyphs to a path (each glyph at its specified position). Verification: upstream m147 SkTextUtils.h exists (43 lines) but does NOT contain GetPosPath or SkPoint — these were mono/skia fork additions. The patch was dropped because the SkiaSharp C API now uses an alternative approach (the new sk_pathbuilder C API) and no longer needs this utility function.", "relatedFiles": [{"path": "src/utils/SkTextUtils.cpp", "relationship": "related"}]}, {"path": "infra/bots/tasks.json", "diff": "diff --git a/infra/bots/tasks.json b/infra/bots/tasks.json\nold mode 100644\nnew mode 100755", "summary": "The old fork patch changed the file mode from 0644 to 0755 (making tasks.json executable). Verification: upstream m147 still has this file. The mode change was cosmetic/accidental and has been dropped as unnecessary.", "relatedFiles": [{"path": "infra/skcq.json", "relationship": "related"}]}, {"path": "src/utils/SkTextUtils.cpp", "diff": "diff --git a/src/utils/SkTextUtils.cpp b/src/utils/SkTextUtils.cpp\nindex f7639b8104..ed05314c51 100644\n--- a/src/utils/SkTextUtils.cpp\n+++ b/src/utils/SkTextUtils.cpp\n@@ -58,3 +58,23 @@ void SkTextUtils::GetPath(const void* text, size_t length, SkTextEncoding encodi\n }, &rec);\n }\n \n+void SkTextUtils::GetPosPath(const void* text, size_t length, SkTextEncoding encoding,\n+ const SkPoint pos[], const SkFont& font, SkPath* path) {\n+ SkAutoToGlyphs ag(font, text, length, encoding);\n+\n+ struct Rec {\n+ SkPath* fDst;\n+ const SkPoint* fPos;\n+ } rec = { path, pos };\n+\n+ path->reset();\n+ font.getPaths(ag.glyphs(), ag.count(), [](const SkPath* src, const SkMatrix& mx, void* ctx) {\n+ Rec* rec = (Rec*)ctx;\n+ if (src) {\n+ SkMatrix m(mx);\n+ m.postTranslate(rec->fPos->fX, rec->fPos->fY);\n+ rec->fDst->addPath(*src, m);\n+ }\n+ rec->fPos += 1;\n+ }, &rec);\n+}", "summary": "The old fork patch added the implementation of SkTextUtils::GetPosPath(), which converted positioned text to an SkPath by iterating glyphs and translating each glyph's path to its specified position. Verification: upstream m147 SkTextUtils.cpp exists (61 lines) but does NOT contain GetPosPath — this was a mono/skia fork addition. Dropped for the same reason as the header: the SkiaSharp C API no longer needs this utility method.", "relatedFiles": [{"path": "include/utils/SkTextUtils.h", "relationship": "related"}]}, {"path": "tools/gpu/gl/win/SkWGL_win.cpp", "diff": "diff --git a/tools/gpu/gl/win/SkWGL_win.cpp b/tools/gpu/gl/win/SkWGL_win.cpp\nindex ac2d700f58..4cb462b992 100644\n--- a/tools/gpu/gl/win/SkWGL_win.cpp\n+++ b/tools/gpu/gl/win/SkWGL_win.cpp\n@@ -6,7 +6,7 @@\n */\n \n #include \"include/core/SkTypes.h\"\n-#if defined(SK_BUILD_FOR_WIN) && !defined(_M_ARM64) && !defined(WINUWP)\n+#if defined(SK_BUILD_FOR_WIN) && !defined(WINUWP)\n \n #include \"tools/gpu/gl/win/SkWGL.h\"", "summary": "The old fork patch removed the !defined(_M_ARM64) guard from this file to enable WGL on Windows ARM64. Verification: upstream m147 still has this file at this path and still includes the _M_ARM64 exclusion (confirmed at line 9). However, upstream also moved/copied this file to tools/ganesh/gl/win/SkWGL_win.cpp. The fork now applies the ARM64 patch to the new ganesh path instead (see 'added' items). The old-path patch is dropped because the fork's version of the patch is now at the new location.", "relatedFiles": [{"path": "tools/ganesh/gl/win/SkWGL_win.cpp", "relationship": "related"}]}], "changed": [{"path": ".disabled.go.mod", "diff": "diff --git a/.disabled.go.mod b/.disabled.go.mod\nindex 900d2f3086..194019273a 100644\n--- a/.disabled.go.mod\n+++ b/.disabled.go.mod\n@@ -1,79 +1,119 @@\n module go.skia.org/skia\n \n-go 1.21\n+go 1.24.2\n \n require (\n-\tcloud.google.com/go/pubsub v1.33.0\n-\tcloud.google.com/go/storage v1.31.0\n+\tcloud.google.com/go/storage v1.55.0\n \tgithub.com/flynn/json5 v0.0.0-20160717195620-7620272ed633\n-\tgithub.com/golang/glog v1.1.2\n-\tgithub.com/google/uuid v1.5.0\n-\tgithub.com/stretchr/testify v1.8.4\n-\tgithub.com/trietmn/go-wiki v1.0.1\n-\tgo.chromium.org/luci v0.0.0-20240206071351-fb32c458db6e // indirect\n-\tgo.skia.org/infra v0.0.0-20250104003448-783200f5fd9e\n-\tgoogle.golang.org/api v0.160.0\n-\tgoogle.golang.org/protobuf v1.32.0\n-)\n-\n-require (\n+\tgithub.com/golang/glog v1.2.5\n+\tgithub.com/google/uuid v1.6.0\n \tgithub.com/shirou/gopsutil v3.21.11+incompatible\n-\tgolang.org/x/exp v0.0.0-20231127185646-65229373498e\n+\tgithub.com/stretchr/testify v1.10.0\n+\tgithub.com/trietmn/go-wiki v1.0.1\n+\tgithub.com/vektra/mockery/v2 v2.52.2\n+\tgo.chromium.org/luci v0.0.0-20251208084510-e9565e513ef0\n+\tgo.skia.org/infra v0.0.0-20260307000600-5997e0271ce7\n+\tgoogle.golang.org/api v0.248.0\n+\tgoogle.golang.org/protobuf v1.36.10\n )\n \n require (\n-\tcloud.google.com/go v0.111.0 // indirect\n-\tcloud.google.com/go/compute v1.23.3 // indirect\n-\tcloud.google.com/go/compute/metadata v0.2.3 // indirect\n-\tcloud.google.com/go/iam v1.1.5 // indirect\n-\tcloud.google.com/go/logging v1.9.0 // indirect\n-\tcloud.google.com/go/longrunning v0.5.4 // indirect\n-\tcloud.google.com/go/secretmanager v1.11.4 // indirect\n+\tcel.dev/expr v0.24.0 // indirect\n+\tcloud.google.com/go v0.121.4 // indirect\n+\tcloud.google.com/go/auth v0.16.5 // indirect\n+\tcloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect\n+\tcloud.google.com/go/bigquery v1.69.0 // indirect\n+\tcloud.google.com/go/compute/metadata v0.8.0 // indirect\n+\tcloud.google.com/go/datastore v1.20.0 // indirect\n+\tcloud.google.com/go/firestore v1.18.0 // indirect\n+\tcloud.google.com/go/iam v1.5.2 // indirect\n+\tcloud.google.com/go/logging v1.13.0 // indirect\n+\tcloud.google.com/go/longrunning v0.6.7 // indirect\n+\tcloud.google.com/go/monitoring v1.24.2 // indirect\n+\tcloud.google.com/go/pubsub v1.50.0 // indirect\n+\tcloud.google.com/go/pubsub/v2 v2.0.0 // indirect\n+\tcloud.google.com/go/secretmanager v1.15.0 // indirect\n+\tgithub.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect\n+\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect\n+\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect\n+\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect\n \tgithub.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098 // indirect\n \tgithub.com/anaskhan96/soup v1.2.5 // indirect\n-\tgithub.com/bazelbuild/remote-apis v0.0.0-20230822133051-6c32c3b917cc // indirect\n-\tgithub.com/bazelbuild/remote-apis-sdks v0.0.0-20231114220034-042d9851eb28 // indirect\n+\tgithub.com/apache/arrow/go/v15 v15.0.2 // indirect\n+\tgithub.com/bazelbuild/remote-apis v0.0.0-20251110153243-3860ca2d3e55 // indirect\n+\tgithub.com/bazelbuild/remote-apis-sdks v0.0.0-20251202150838-a01d8dc79d0d // indirect\n \tgithub.com/beorn7/perks v1.0.1 // indirect\n \tgithub.com/cenkalti/backoff v2.2.1+incompatible // indirect\n-\tgithub.com/cenkalti/backoff/v4 v4.1.3 // indirect\n-\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n+\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n+\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n+\tgithub.com/chigopher/pathlib v0.19.1 // indirect\n+\tgithub.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect\n \tgithub.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22 // indirect\n-\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n+\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n+\tgithub.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect\n+\tgithub.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect\n \tgithub.com/felixge/httpsnoop v1.0.4 // indirect\n \tgithub.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966 // indirect\n+\tgithub.com/fsnotify/fsnotify v1.8.0 // indirect\n \tgithub.com/go-chi/chi/v5 v5.0.8 // indirect\n-\tgithub.com/go-logr/logr v1.4.1 // indirect\n+\tgithub.com/go-jose/go-jose/v4 v4.1.2 // indirect\n+\tgithub.com/go-logr/logr v1.4.3 // indirect\n \tgithub.com/go-logr/stdr v1.2.2 // indirect\n \tgithub.com/go-ole/go-ole v1.2.6 // indirect\n \tgithub.com/go-python/gpython v0.0.3 // indirect\n-\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n-\tgithub.com/golang/mock v1.6.0 // indirect\n-\tgithub.com/golang/protobuf v1.5.3 // indirect\n-\tgithub.com/google/s2a-go v0.1.7 // indirect\n-\tgithub.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect\n-\tgithub.com/googleapis/gax-go/v2 v2.12.0 // indirect\n+\tgithub.com/goccy/go-json v0.10.2 // indirect\n+\tgithub.com/goccy/go-yaml v1.18.0 // indirect\n+\tgithub.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect\n+\tgithub.com/golang/mock v1.7.0-rc.1 // indirect\n+\tgithub.com/golang/protobuf v1.5.4 // indirect\n+\tgithub.com/google/flatbuffers v23.5.26+incompatible // indirect\n+\tgithub.com/google/go-cmp v0.7.0 // indirect\n+\tgithub.com/google/s2a-go v0.1.9 // indirect\n+\tgithub.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect\n+\tgithub.com/googleapis/gax-go/v2 v2.15.0 // indirect\n \tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n-\tgithub.com/hashicorp/go-multierror v1.1.0 // indirect\n+\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n+\tgithub.com/hashicorp/hcl v1.0.0 // indirect\n+\tgithub.com/huandu/xstrings v1.4.0 // indirect\n \tgithub.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect\n+\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n+\tgithub.com/inconshreveable/mousetrap v1.1.0 // indirect\n \tgithub.com/invopop/jsonschema v0.7.0 // indirect\n \tgithub.com/jcgregorio/logger v0.1.3 // indirect\n \tgithub.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900 // indirect\n+\tgithub.com/jinzhu/copier v0.4.0 // indirect\n \tgithub.com/julienschmidt/httprouter v1.3.0 // indirect\n-\tgithub.com/klauspost/compress v1.16.7 // indirect\n-\tgithub.com/kr/text v0.2.0 // indirect\n-\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n+\tgithub.com/klauspost/compress v1.18.0 // indirect\n+\tgithub.com/klauspost/cpuid/v2 v2.2.7 // indirect\n+\tgithub.com/kylelemons/godebug v1.1.0 // indirect\n+\tgithub.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 // indirect\n+\tgithub.com/magiconair/properties v1.8.9 // indirect\n+\tgithub.com/mattn/go-colorable v0.1.14 // indirect\n+\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n \tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n-\tgithub.com/mostynb/zstdpool-syncpool v0.0.12 // indirect\n-\tgithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect\n-\tgithub.com/pborman/uuid v1.2.1 // indirect\n-\tgithub.com/pkg/errors v0.9.1 // indirect\n+\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n+\tgithub.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect\n+\tgithub.com/pelletier/go-toml/v2 v2.2.3 // indirect\n+\tgithub.com/pierrec/lz4/v4 v4.1.18 // indirect\n \tgithub.com/pkg/xattr v0.4.9 // indirect\n-\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n-\tgithub.com/prometheus/client_golang v1.11.1 // indirect\n-\tgithub.com/prometheus/client_model v0.4.0 // indirect\n-\tgithub.com/prometheus/common v0.26.0 // indirect\n-\tgithub.com/prometheus/procfs v0.6.0 // indirect\n-\tgithub.com/stretchr/objx v0.5.0 // indirect\n+\tgithub.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect\n+\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n+\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n+\tgithub.com/prometheus/client_model v0.6.1 // indirect\n+\tgithub.com/prometheus/common v0.53.0 // indirect\n+\tgithub.com/prometheus/procfs v0.14.0 // indirect\n+\tgithub.com/rs/zerolog v1.33.0 // indirect\n+\tgithub.com/sagikazarmark/locafero v0.7.0 // indirect\n+\tgithub.com/sagikazarmark/slog-shim v0.1.0 // indirect\n+\tgithub.com/sourcegraph/conc v0.3.0 // indirect\n+\tgithub.com/spf13/afero v1.12.0 // indirect\n+\tgithub.com/spf13/cast v1.7.1 // indirect\n+\tgithub.com/spf13/cobra v1.8.1 // indirect\n+\tgithub.com/spf13/pflag v1.0.6 // indirect\n+\tgithub.com/spf13/viper v1.19.0 // indirect\n+\tgithub.com/spiffe/go-spiffe/v2 v2.5.0 // indirect\n+\tgithub.com/stretchr/objx v0.5.2 // indirect\n+\tgithub.com/subosito/gotenv v1.6.0 // indirect\n \tgithub.com/texttheater/golang-levenshtein v1.0.1 // indirect\n \tgithub.com/willf/bitset v1.1.11 // indirect\n \tgithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect\n@@ -82,28 +122,40 @@ require (\n \tgithub.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect\n \tgithub.com/yusufpapurcu/wmi v1.2.2 // indirect\n \tgithub.com/zeebo/bencode v1.0.0 // indirect\n+\tgithub.com/zeebo/errs v1.4.0 // indirect\n+\tgithub.com/zeebo/xxh3 v1.0.2 // indirect\n \tgo.opencensus.io v0.24.0 // indirect\n-\tgo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect\n-\tgo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect\n-\tgo.opentelemetry.io/otel v1.22.0 // indirect\n-\tgo.opentelemetry.io/otel/metric v1.22.0 // indirect\n-\tgo.opentelemetry.io/otel/trace v1.22.0 // indirect\n-\tgolang.org/x/crypto v0.20.0 // indirect\n-\tgolang.org/x/net v0.21.0 // indirect\n-\tgolang.org/x/oauth2 v0.16.0 // indirect\n-\tgolang.org/x/sync v0.6.0 // indirect\n-\tgolang.org/x/sys v0.17.0 // indirect\n-\tgolang.org/x/term v0.17.0 // indirect\n-\tgolang.org/x/text v0.14.0 // indirect\n-\tgolang.org/x/time v0.5.0 // indirect\n-\tgoogle.golang.org/appengine v1.6.8 // indirect\n-\tgoogle.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac // indirect\n-\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe // indirect\n-\tgoogle.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac // indirect\n-\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect\n-\tgoogle.golang.org/grpc v1.61.0 // indirect\n-\tgopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect\n+\tgo.opentelemetry.io/auto/sdk v1.1.0 // indirect\n+\tgo.opentelemetry.io/contrib/detectors/gcp v1.37.0 // indirect\n+\tgo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect\n+\tgo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect\n+\tgo.opentelemetry.io/otel v1.37.0 // indirect\n+\tgo.opentelemetry.io/otel/metric v1.37.0 // indirect\n+\tgo.opentelemetry.io/otel/sdk v1.37.0 // indirect\n+\tgo.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect\n+\tgo.opentelemetry.io/otel/trace v1.37.0 // indirect\n+\tgo.uber.org/multierr v1.11.0 // indirect\n+\tgolang.org/x/crypto v0.41.0 // indirect\n+\tgolang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect\n+\tgolang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 // indirect\n+\tgolang.org/x/mod v0.27.0 // indirect\n+\tgolang.org/x/net v0.43.0 // indirect\n+\tgolang.org/x/oauth2 v0.30.0 // indirect\n+\tgolang.org/x/sync v0.16.0 // indirect\n+\tgolang.org/x/sys v0.35.0 // indirect\n+\tgolang.org/x/term v0.34.0 // indirect\n+\tgolang.org/x/text v0.28.0 // indirect\n+\tgolang.org/x/time v0.12.0 // indirect\n+\tgolang.org/x/tools v0.36.0 // indirect\n+\tgolang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect\n+\tgoogle.golang.org/genproto v0.0.0-20250818200422-3122310a409c // indirect\n+\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c // indirect\n+\tgoogle.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c // indirect\n+\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect\n+\tgoogle.golang.org/grpc v1.76.0 // indirect\n+\tgoogle.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 // indirect\n \tgopkg.in/fsnotify.v1 v1.4.7 // indirect\n-\tgopkg.in/yaml.v2 v2.4.0 // indirect\n+\tgopkg.in/ini.v1 v1.67.0 // indirect\n \tgopkg.in/yaml.v3 v3.0.1 // indirect\n+\thonnef.co/go/tools v0.6.1 // indirect\n )", "oldDiff": "diff --git a/.disabled.go.mod b/.disabled.go.mod\nnew file mode 100644\nindex 0000000000..900d2f3086\n--- /dev/null\n+++ b/.disabled.go.mod\n@@ -0,0 +1,109 @@\n+module go.skia.org/skia\n+\n+go 1.21\n+\n+require (\n+\tcloud.google.com/go/pubsub v1.33.0\n+\tcloud.google.com/go/storage v1.31.0\n+\tgithub.com/flynn/json5 v0.0.0-20160717195620-7620272ed633\n+\tgithub.com/golang/glog v1.1.2\n+\tgithub.com/google/uuid v1.5.0\n+\tgithub.com/stretchr/testify v1.8.4\n+\tgithub.com/trietmn/go-wiki v1.0.1\n+\tgo.chromium.org/luci v0.0.0-20240206071351-fb32c458db6e // indirect\n+\tgo.skia.org/infra v0.0.0-20250104003448-783200f5fd9e\n+\tgoogle.golang.org/api v0.160.0\n+\tgoogle.golang.org/protobuf v1.32.0\n+)\n+\n+require (\n+\tgithub.com/shirou/gopsutil v3.21.11+incompatible\n+\tgolang.org/x/exp v0.0.0-20231127185646-65229373498e\n+)\n+\n+require (\n+\tcloud.google.com/go v0.111.0 // indirect\n+\tcloud.google.com/go/compute v1.23.3 // indirect\n+\tcloud.google.com/go/compute/metadata v0.2.3 // indirect\n+\tcloud.google.com/go/iam v1.1.5 // indirect\n+\tcloud.google.com/go/logging v1.9.0 // indirect\n+\tcloud.google.com/go/longrunning v0.5.4 // indirect\n+\tcloud.google.com/go/secretmanager v1.11.4 // indirect\n+\tgithub.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098 // indirect\n+\tgithub.com/anaskhan96/soup v1.2.5 // indirect\n+\tgithub.com/bazelbuild/remote-apis v0.0.0-20230822133051-6c32c3b917cc // indirect\n+\tgithub.com/bazelbuild/remote-apis-sdks v0.0.0-20231114220034-042d9851eb28 // indirect\n+\tgithub.com/beorn7/perks v1.0.1 // indirect\n+\tgithub.com/cenkalti/backoff v2.2.1+incompatible // indirect\n+\tgithub.com/cenkalti/backoff/v4 v4.1.3 // indirect\n+\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n+\tgithub.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22 // indirect\n+\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n+\tgithub.com/felixge/httpsnoop v1.0.4 // indirect\n+\tgithub.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966 // indirect\n+\tgithub.com/go-chi/chi/v5 v5.0.8 // indirect\n+\tgithub.com/go-logr/logr v1.4.1 // indirect\n+\tgithub.com/go-logr/stdr v1.2.2 // indirect\n+\tgithub.com/go-ole/go-ole v1.2.6 // indirect\n+\tgithub.com/go-python/gpython v0.0.3 // indirect\n+\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n+\tgithub.com/golang/mock v1.6.0 // indirect\n+\tgithub.com/golang/protobuf v1.5.3 // indirect\n+\tgithub.com/google/s2a-go v0.1.7 // indirect\n+\tgithub.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect\n+\tgithub.com/googleapis/gax-go/v2 v2.12.0 // indirect\n+\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n+\tgithub.com/hashicorp/go-multierror v1.1.0 // indirect\n+\tgithub.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect\n+\tgithub.com/invopop/jsonschema v0.7.0 // indirect\n+\tgithub.com/jcgregorio/logger v0.1.3 // indirect\n+\tgithub.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900 // indirect\n+\tgithub.com/julienschmidt/httprouter v1.3.0 // indirect\n+\tgithub.com/klauspost/compress v1.16.7 // indirect\n+\tgithub.com/kr/text v0.2.0 // indirect\n+\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n+\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n+\tgithub.com/mostynb/zstdpool-syncpool v0.0.12 // indirect\n+\tgithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect\n+\tgithub.com/pborman/uuid v1.2.1 // indirect\n+\tgithub.com/pkg/errors v0.9.1 // indirect\n+\tgithub.com/pkg/xattr v0.4.9 // indirect\n+\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n+\tgithub.com/prometheus/client_golang v1.11.1 // indirect\n+\tgithub.com/prometheus/client_model v0.4.0 // indirect\n+\tgithub.com/prometheus/common v0.26.0 // indirect\n+\tgithub.com/prometheus/procfs v0.6.0 // indirect\n+\tgithub.com/stretchr/objx v0.5.0 // indirect\n+\tgithub.com/texttheater/golang-levenshtein v1.0.1 // indirect\n+\tgithub.com/willf/bitset v1.1.11 // indirect\n+\tgithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect\n+\tgithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect\n+\tgithub.com/xeipuuv/gojsonschema v1.2.0 // indirect\n+\tgithub.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect\n+\tgithub.com/yusufpapurcu/wmi v1.2.2 // indirect\n+\tgithub.com/zeebo/bencode v1.0.0 // indirect\n+\tgo.opencensus.io v0.24.0 // indirect\n+\tgo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect\n+\tgo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect\n+\tgo.opentelemetry.io/otel v1.22.0 // indirect\n+\tgo.opentelemetry.io/otel/metric v1.22.0 // indirect\n+\tgo.opentelemetry.io/otel/trace v1.22.0 // indirect\n+\tgolang.org/x/crypto v0.20.0 // indirect\n+\tgolang.org/x/net v0.21.0 // indirect\n+\tgolang.org/x/oauth2 v0.16.0 // indirect\n+\tgolang.org/x/sync v0.6.0 // indirect\n+\tgolang.org/x/sys v0.17.0 // indirect\n+\tgolang.org/x/term v0.17.0 // indirect\n+\tgolang.org/x/text v0.14.0 // indirect\n+\tgolang.org/x/time v0.5.0 // indirect\n+\tgoogle.golang.org/appengine v1.6.8 // indirect\n+\tgoogle.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac // indirect\n+\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe // indirect\n+\tgoogle.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac // indirect\n+\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect\n+\tgoogle.golang.org/grpc v1.61.0 // indirect\n+\tgopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect\n+\tgopkg.in/fsnotify.v1 v1.4.7 // indirect\n+\tgopkg.in/yaml.v2 v2.4.0 // indirect\n+\tgopkg.in/yaml.v3 v3.0.1 // indirect\n+)", "newDiff": "diff --git a/.disabled.go.mod b/.disabled.go.mod\nnew file mode 100644\nindex 0000000000..194019273a\n--- /dev/null\n+++ b/.disabled.go.mod\n@@ -0,0 +1,161 @@\n+module go.skia.org/skia\n+\n+go 1.24.2\n+\n+require (\n+\tcloud.google.com/go/storage v1.55.0\n+\tgithub.com/flynn/json5 v0.0.0-20160717195620-7620272ed633\n+\tgithub.com/golang/glog v1.2.5\n+\tgithub.com/google/uuid v1.6.0\n+\tgithub.com/shirou/gopsutil v3.21.11+incompatible\n+\tgithub.com/stretchr/testify v1.10.0\n+\tgithub.com/trietmn/go-wiki v1.0.1\n+\tgithub.com/vektra/mockery/v2 v2.52.2\n+\tgo.chromium.org/luci v0.0.0-20251208084510-e9565e513ef0\n+\tgo.skia.org/infra v0.0.0-20260307000600-5997e0271ce7\n+\tgoogle.golang.org/api v0.248.0\n+\tgoogle.golang.org/protobuf v1.36.10\n+)\n+\n+require (\n+\tcel.dev/expr v0.24.0 // indirect\n+\tcloud.google.com/go v0.121.4 // indirect\n+\tcloud.google.com/go/auth v0.16.5 // indirect\n+\tcloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect\n+\tcloud.google.com/go/bigquery v1.69.0 // indirect\n+\tcloud.google.com/go/compute/metadata v0.8.0 // indirect\n+\tcloud.google.com/go/datastore v1.20.0 // indirect\n+\tcloud.google.com/go/firestore v1.18.0 // indirect\n+\tcloud.google.com/go/iam v1.5.2 // indirect\n+\tcloud.google.com/go/logging v1.13.0 // indirect\n+\tcloud.google.com/go/longrunning v0.6.7 // indirect\n+\tcloud.google.com/go/monitoring v1.24.2 // indirect\n+\tcloud.google.com/go/pubsub v1.50.0 // indirect\n+\tcloud.google.com/go/pubsub/v2 v2.0.0 // indirect\n+\tcloud.google.com/go/secretmanager v1.15.0 // indirect\n+\tgithub.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect\n+\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect\n+\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect\n+\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect\n+\tgithub.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098 // indirect\n+\tgithub.com/anaskhan96/soup v1.2.5 // indirect\n+\tgithub.com/apache/arrow/go/v15 v15.0.2 // indirect\n+\tgithub.com/bazelbuild/remote-apis v0.0.0-20251110153243-3860ca2d3e55 // indirect\n+\tgithub.com/bazelbuild/remote-apis-sdks v0.0.0-20251202150838-a01d8dc79d0d // indirect\n+\tgithub.com/beorn7/perks v1.0.1 // indirect\n+\tgithub.com/cenkalti/backoff v2.2.1+incompatible // indirect\n+\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n+\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n+\tgithub.com/chigopher/pathlib v0.19.1 // indirect\n+\tgithub.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect\n+\tgithub.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22 // indirect\n+\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n+\tgithub.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect\n+\tgithub.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect\n+\tgithub.com/felixge/httpsnoop v1.0.4 // indirect\n+\tgithub.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966 // indirect\n+\tgithub.com/fsnotify/fsnotify v1.8.0 // indirect\n+\tgithub.com/go-chi/chi/v5 v5.0.8 // indirect\n+\tgithub.com/go-jose/go-jose/v4 v4.1.2 // indirect\n+\tgithub.com/go-logr/logr v1.4.3 // indirect\n+\tgithub.com/go-logr/stdr v1.2.2 // indirect\n+\tgithub.com/go-ole/go-ole v1.2.6 // indirect\n+\tgithub.com/go-python/gpython v0.0.3 // indirect\n+\tgithub.com/goccy/go-json v0.10.2 // indirect\n+\tgithub.com/goccy/go-yaml v1.18.0 // indirect\n+\tgithub.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect\n+\tgithub.com/golang/mock v1.7.0-rc.1 // indirect\n+\tgithub.com/golang/protobuf v1.5.4 // indirect\n+\tgithub.com/google/flatbuffers v23.5.26+incompatible // indirect\n+\tgithub.com/google/go-cmp v0.7.0 // indirect\n+\tgithub.com/google/s2a-go v0.1.9 // indirect\n+\tgithub.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect\n+\tgithub.com/googleapis/gax-go/v2 v2.15.0 // indirect\n+\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n+\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n+\tgithub.com/hashicorp/hcl v1.0.0 // indirect\n+\tgithub.com/huandu/xstrings v1.4.0 // indirect\n+\tgithub.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect\n+\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n+\tgithub.com/inconshreveable/mousetrap v1.1.0 // indirect\n+\tgithub.com/invopop/jsonschema v0.7.0 // indirect\n+\tgithub.com/jcgregorio/logger v0.1.3 // indirect\n+\tgithub.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900 // indirect\n+\tgithub.com/jinzhu/copier v0.4.0 // indirect\n+\tgithub.com/julienschmidt/httprouter v1.3.0 // indirect\n+\tgithub.com/klauspost/compress v1.18.0 // indirect\n+\tgithub.com/klauspost/cpuid/v2 v2.2.7 // indirect\n+\tgithub.com/kylelemons/godebug v1.1.0 // indirect\n+\tgithub.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 // indirect\n+\tgithub.com/magiconair/properties v1.8.9 // indirect\n+\tgithub.com/mattn/go-colorable v0.1.14 // indirect\n+\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n+\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n+\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n+\tgithub.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect\n+\tgithub.com/pelletier/go-toml/v2 v2.2.3 // indirect\n+\tgithub.com/pierrec/lz4/v4 v4.1.18 // indirect\n+\tgithub.com/pkg/xattr v0.4.9 // indirect\n+\tgithub.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect\n+\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n+\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n+\tgithub.com/prometheus/client_model v0.6.1 // indirect\n+\tgithub.com/prometheus/common v0.53.0 // indirect\n+\tgithub.com/prometheus/procfs v0.14.0 // indirect\n+\tgithub.com/rs/zerolog v1.33.0 // indirect\n+\tgithub.com/sagikazarmark/locafero v0.7.0 // indirect\n+\tgithub.com/sagikazarmark/slog-shim v0.1.0 // indirect\n+\tgithub.com/sourcegraph/conc v0.3.0 // indirect\n+\tgithub.com/spf13/afero v1.12.0 // indirect\n+\tgithub.com/spf13/cast v1.7.1 // indirect\n+\tgithub.com/spf13/cobra v1.8.1 // indirect\n+\tgithub.com/spf13/pflag v1.0.6 // indirect\n+\tgithub.com/spf13/viper v1.19.0 // indirect\n+\tgithub.com/spiffe/go-spiffe/v2 v2.5.0 // indirect\n+\tgithub.com/stretchr/objx v0.5.2 // indirect\n+\tgithub.com/subosito/gotenv v1.6.0 // indirect\n+\tgithub.com/texttheater/golang-levenshtein v1.0.1 // indirect\n+\tgithub.com/willf/bitset v1.1.11 // indirect\n+\tgithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect\n+\tgithub.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect\n+\tgithub.com/xeipuuv/gojsonschema v1.2.0 // indirect\n+\tgithub.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect\n+\tgithub.com/yusufpapurcu/wmi v1.2.2 // indirect\n+\tgithub.com/zeebo/bencode v1.0.0 // indirect\n+\tgithub.com/zeebo/errs v1.4.0 // indirect\n+\tgithub.com/zeebo/xxh3 v1.0.2 // indirect\n+\tgo.opencensus.io v0.24.0 // indirect\n+\tgo.opentelemetry.io/auto/sdk v1.1.0 // indirect\n+\tgo.opentelemetry.io/contrib/detectors/gcp v1.37.0 // indirect\n+\tgo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect\n+\tgo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect\n+\tgo.opentelemetry.io/otel v1.37.0 // indirect\n+\tgo.opentelemetry.io/otel/metric v1.37.0 // indirect\n+\tgo.opentelemetry.io/otel/sdk v1.37.0 // indirect\n+\tgo.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect\n+\tgo.opentelemetry.io/otel/trace v1.37.0 // indirect\n+\tgo.uber.org/multierr v1.11.0 // indirect\n+\tgolang.org/x/crypto v0.41.0 // indirect\n+\tgolang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect\n+\tgolang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 // indirect\n+\tgolang.org/x/mod v0.27.0 // indirect\n+\tgolang.org/x/net v0.43.0 // indirect\n+\tgolang.org/x/oauth2 v0.30.0 // indirect\n+\tgolang.org/x/sync v0.16.0 // indirect\n+\tgolang.org/x/sys v0.35.0 // indirect\n+\tgolang.org/x/term v0.34.0 // indirect\n+\tgolang.org/x/text v0.28.0 // indirect\n+\tgolang.org/x/time v0.12.0 // indirect\n+\tgolang.org/x/tools v0.36.0 // indirect\n+\tgolang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect\n+\tgoogle.golang.org/genproto v0.0.0-20250818200422-3122310a409c // indirect\n+\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c // indirect\n+\tgoogle.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c // indirect\n+\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect\n+\tgoogle.golang.org/grpc v1.76.0 // indirect\n+\tgoogle.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 // indirect\n+\tgopkg.in/fsnotify.v1 v1.4.7 // indirect\n+\tgopkg.in/ini.v1 v1.67.0 // indirect\n+\tgopkg.in/yaml.v3 v3.0.1 // indirect\n+\thonnef.co/go/tools v0.6.1 // indirect\n+)", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,85 +1,125 @@\n diff --git a/.disabled.go.mod b/.disabled.go.mod\n new file mode 100644\n-index 0000000000..900d2f3086\n+index 0000000000..194019273a\n --- /dev/null\n +++ b/.disabled.go.mod\n-@@ -0,0 +1,109 @@\n+@@ -0,0 +1,161 @@\n +module go.skia.org/skia\n +\n-+go 1.21\n++go 1.24.2\n +\n +require (\n-+\tcloud.google.com/go/pubsub v1.33.0\n-+\tcloud.google.com/go/storage v1.31.0\n++\tcloud.google.com/go/storage v1.55.0\n +\tgithub.com/flynn/json5 v0.0.0-20160717195620-7620272ed633\n-+\tgithub.com/golang/glog v1.1.2\n-+\tgithub.com/google/uuid v1.5.0\n-+\tgithub.com/stretchr/testify v1.8.4\n-+\tgithub.com/trietmn/go-wiki v1.0.1\n-+\tgo.chromium.org/luci v0.0.0-20240206071351-fb32c458db6e // indirect\n-+\tgo.skia.org/infra v0.0.0-20250104003448-783200f5fd9e\n-+\tgoogle.golang.org/api v0.160.0\n-+\tgoogle.golang.org/protobuf v1.32.0\n-+)\n-+\n-+require (\n++\tgithub.com/golang/glog v1.2.5\n++\tgithub.com/google/uuid v1.6.0\n +\tgithub.com/shirou/gopsutil v3.21.11+incompatible\n-+\tgolang.org/x/exp v0.0.0-20231127185646-65229373498e\n++\tgithub.com/stretchr/testify v1.10.0\n++\tgithub.com/trietmn/go-wiki v1.0.1\n++\tgithub.com/vektra/mockery/v2 v2.52.2\n++\tgo.chromium.org/luci v0.0.0-20251208084510-e9565e513ef0\n++\tgo.skia.org/infra v0.0.0-20260307000600-5997e0271ce7\n++\tgoogle.golang.org/api v0.248.0\n++\tgoogle.golang.org/protobuf v1.36.10\n +)\n +\n +require (\n-+\tcloud.google.com/go v0.111.0 // indirect\n-+\tcloud.google.com/go/compute v1.23.3 // indirect\n-+\tcloud.google.com/go/compute/metadata v0.2.3 // indirect\n-+\tcloud.google.com/go/iam v1.1.5 // indirect\n-+\tcloud.google.com/go/logging v1.9.0 // indirect\n-+\tcloud.google.com/go/longrunning v0.5.4 // indirect\n-+\tcloud.google.com/go/secretmanager v1.11.4 // indirect\n++\tcel.dev/expr v0.24.0 // indirect\n++\tcloud.google.com/go v0.121.4 // indirect\n++\tcloud.google.com/go/auth v0.16.5 // indirect\n++\tcloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect\n++\tcloud.google.com/go/bigquery v1.69.0 // indirect\n++\tcloud.google.com/go/compute/metadata v0.8.0 // indirect\n++\tcloud.google.com/go/datastore v1.20.0 // indirect\n++\tcloud.google.com/go/firestore v1.18.0 // indirect\n++\tcloud.google.com/go/iam v1.5.2 // indirect\n++\tcloud.google.com/go/logging v1.13.0 // indirect\n++\tcloud.google.com/go/longrunning v0.6.7 // indirect\n++\tcloud.google.com/go/monitoring v1.24.2 // indirect\n++\tcloud.google.com/go/pubsub v1.50.0 // indirect\n++\tcloud.google.com/go/pubsub/v2 v2.0.0 // indirect\n++\tcloud.google.com/go/secretmanager v1.15.0 // indirect\n++\tgithub.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect\n++\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect\n++\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect\n++\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect\n +\tgithub.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098 // indirect\n +\tgithub.com/anaskhan96/soup v1.2.5 // indirect\n-+\tgithub.com/bazelbuild/remote-apis v0.0.0-20230822133051-6c32c3b917cc // indirect\n-+\tgithub.com/bazelbuild/remote-apis-sdks v0.0.0-20231114220034-042d9851eb28 // indirect\n++\tgithub.com/apache/arrow/go/v15 v15.0.2 // indirect\n++\tgithub.com/bazelbuild/remote-apis v0.0.0-20251110153243-3860ca2d3e55 // indirect\n++\tgithub.com/bazelbuild/remote-apis-sdks v0.0.0-20251202150838-a01d8dc79d0d // indirect\n +\tgithub.com/beorn7/perks v1.0.1 // indirect\n +\tgithub.com/cenkalti/backoff v2.2.1+incompatible // indirect\n-+\tgithub.com/cenkalti/backoff/v4 v4.1.3 // indirect\n-+\tgithub.com/cespare/xxhash/v2 v2.2.0 // indirect\n++\tgithub.com/cenkalti/backoff/v4 v4.3.0 // indirect\n++\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n++\tgithub.com/chigopher/pathlib v0.19.1 // indirect\n++\tgithub.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect\n +\tgithub.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22 // indirect\n-+\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n++\tgithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect\n++\tgithub.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect\n++\tgithub.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect\n +\tgithub.com/felixge/httpsnoop v1.0.4 // indirect\n +\tgithub.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966 // indirect\n++\tgithub.com/fsnotify/fsnotify v1.8.0 // indirect\n +\tgithub.com/go-chi/chi/v5 v5.0.8 // indirect\n-+\tgithub.com/go-logr/logr v1.4.1 // indirect\n++\tgithub.com/go-jose/go-jose/v4 v4.1.2 // indirect\n++\tgithub.com/go-logr/logr v1.4.3 // indirect\n +\tgithub.com/go-logr/stdr v1.2.2 // indirect\n +\tgithub.com/go-ole/go-ole v1.2.6 // indirect\n +\tgithub.com/go-python/gpython v0.0.3 // indirect\n-+\tgithub.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect\n-+\tgithub.com/golang/mock v1.6.0 // indirect\n-+\tgithub.com/golang/protobuf v1.5.3 // indirect\n-+\tgithub.com/google/s2a-go v0.1.7 // indirect\n-+\tgithub.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect\n-+\tgithub.com/googleapis/gax-go/v2 v2.12.0 // indirect\n++\tgithub.com/goccy/go-json v0.10.2 // indirect\n++\tgithub.com/goccy/go-yaml v1.18.0 // indirect\n++\tgithub.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect\n++\tgithub.com/golang/mock v1.7.0-rc.1 // indirect\n++\tgithub.com/golang/protobuf v1.5.4 // indirect\n++\tgithub.com/google/flatbuffers v23.5.26+incompatible // indirect\n++\tgithub.com/google/go-cmp v0.7.0 // indirect\n++\tgithub.com/google/s2a-go v0.1.9 // indirect\n++\tgithub.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect\n++\tgithub.com/googleapis/gax-go/v2 v2.15.0 // indirect\n +\tgithub.com/hashicorp/errwrap v1.1.0 // indirect\n-+\tgithub.com/hashicorp/go-multierror v1.1.0 // indirect\n++\tgithub.com/hashicorp/go-multierror v1.1.1 // indirect\n++\tgithub.com/hashicorp/hcl v1.0.0 // indirect\n++\tgithub.com/huandu/xstrings v1.4.0 // indirect\n +\tgithub.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect\n++\tgithub.com/iancoleman/strcase v0.3.0 // indirect\n++\tgithub.com/inconshreveable/mousetrap v1.1.0 // indirect\n +\tgithub.com/invopop/jsonschema v0.7.0 // indirect\n +\tgithub.com/jcgregorio/logger v0.1.3 // indirect\n +\tgithub.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900 // indirect\n++\tgithub.com/jinzhu/copier v0.4.0 // indirect\n +\tgithub.com/julienschmidt/httprouter v1.3.0 // indirect\n-+\tgithub.com/klauspost/compress v1.16.7 // indirect\n-+\tgithub.com/kr/text v0.2.0 // indirect\n-+\tgithub.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect\n++\tgithub.com/klauspost/compress v1.18.0 // indirect\n++\tgithub.com/klauspost/cpuid/v2 v2.2.7 // indirect\n++\tgithub.com/kylelemons/godebug v1.1.0 // indirect\n++\tgithub.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 // indirect\n++\tgithub.com/magiconair/properties v1.8.9 // indirect\n++\tgithub.com/mattn/go-colorable v0.1.14 // indirect\n++\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n +\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n-+\tgithub.com/mostynb/zstdpool-syncpool v0.0.12 // indirect\n-+\tgithub.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect\n-+\tgithub.com/pborman/uuid v1.2.1 // indirect\n-+\tgithub.com/pkg/errors v0.9.1 // indirect\n++\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n++\tgithub.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect\n++\tgithub.com/pelletier/go-toml/v2 v2.2.3 // indirect\n++\tgithub.com/pierrec/lz4/v4 v4.1.18 // indirect\n +\tgithub.com/pkg/xattr v0.4.9 // indirect\n-+\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n-+\tgithub.com/prometheus/client_golang v1.11.1 // indirect\n-+\tgithub.com/prometheus/client_model v0.4.0 // indirect\n-+\tgithub.com/prometheus/common v0.26.0 // indirect\n-+\tgithub.com/prometheus/procfs v0.6.0 // indirect\n-+\tgithub.com/stretchr/objx v0.5.0 // indirect\n++\tgithub.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect\n++\tgithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect\n++\tgithub.com/prometheus/client_golang v1.19.0 // indirect\n++\tgithub.com/prometheus/client_model v0.6.1 // indirect\n++\tgithub.com/prometheus/common v0.53.0 // indirect\n++\tgithub.com/prometheus/procfs v0.14.0 // indirect\n++\tgithub.com/rs/zerolog v1.33.0 // indirect\n++\tgithub.com/sagikazarmark/locafero v0.7.0 // indirect\n++\tgithub.com/sagikazarmark/slog-shim v0.1.0 // indirect\n++\tgithub.com/sourcegraph/conc v0.3.0 // indirect\n++\tgithub.com/spf13/afero v1.12.0 // indirect\n++\tgithub.com/spf13/cast v1.7.1 // indirect\n++\tgithub.com/spf13/cobra v1.8.1 // indirect\n++\tgithub.com/spf13/pflag v1.0.6 // indirect\n++\tgithub.com/spf13/viper v1.19.0 // indirect\n++\tgithub.com/spiffe/go-spiffe/v2 v2.5.0 // indirect\n++\tgithub.com/stretchr/objx v0.5.2 // indirect\n++\tgithub.com/subosito/gotenv v1.6.0 // indirect\n +\tgithub.com/texttheater/golang-levenshtein v1.0.1 // indirect\n +\tgithub.com/willf/bitset v1.1.11 // indirect\n +\tgithub.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect\n@@ -88,28 +128,40 @@ index 0000000000..900d2f3086\n +\tgithub.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect\n +\tgithub.com/yusufpapurcu/wmi v1.2.2 // indirect\n +\tgithub.com/zeebo/bencode v1.0.0 // indirect\n++\tgithub.com/zeebo/errs v1.4.0 // indirect\n++\tgithub.com/zeebo/xxh3 v1.0.2 // indirect\n +\tgo.opencensus.io v0.24.0 // indirect\n-+\tgo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect\n-+\tgo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect\n-+\tgo.opentelemetry.io/otel v1.22.0 // indirect\n-+\tgo.opentelemetry.io/otel/metric v1.22.0 // indirect\n-+\tgo.opentelemetry.io/otel/trace v1.22.0 // indirect\n-+\tgolang.org/x/crypto v0.20.0 // indirect\n-+\tgolang.org/x/net v0.21.0 // indirect\n-+\tgolang.org/x/oauth2 v0.16.0 // indirect\n-+\tgolang.org/x/sync v0.6.0 // indirect\n-+\tgolang.org/x/sys v0.17.0 // indirect\n-+\tgolang.org/x/term v0.17.0 // indirect\n-+\tgolang.org/x/text v0.14.0 // indirect\n-+\tgolang.org/x/time v0.5.0 // indirect\n-+\tgoogle.golang.org/appengine v1.6.8 // indirect\n-+\tgoogle.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac // indirect\n-+\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe // indirect\n-+\tgoogle.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac // indirect\n-+\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect\n-+\tgoogle.golang.org/grpc v1.61.0 // indirect\n-+\tgopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect\n++\tgo.opentelemetry.io/auto/sdk v1.1.0 // indirect\n++\tgo.opentelemetry.io/contrib/detectors/gcp v1.37.0 // indirect\n++\tgo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect\n++\tgo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect\n++\tgo.opentelemetry.io/otel v1.37.0 // indirect\n++\tgo.opentelemetry.io/otel/metric v1.37.0 // indirect\n++\tgo.opentelemetry.io/otel/sdk v1.37.0 // indirect\n++\tgo.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect\n++\tgo.opentelemetry.io/otel/trace v1.37.0 // indirect\n++\tgo.uber.org/multierr v1.11.0 // indirect\n++\tgolang.org/x/crypto v0.41.0 // indirect\n++\tgolang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect\n++\tgolang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 // indirect\n++\tgolang.org/x/mod v0.27.0 // indirect\n++\tgolang.org/x/net v0.43.0 // indirect\n++\tgolang.org/x/oauth2 v0.30.0 // indirect\n++\tgolang.org/x/sync v0.16.0 // indirect\n++\tgolang.org/x/sys v0.35.0 // indirect\n++\tgolang.org/x/term v0.34.0 // indirect\n++\tgolang.org/x/text v0.28.0 // indirect\n++\tgolang.org/x/time v0.12.0 // indirect\n++\tgolang.org/x/tools v0.36.0 // indirect\n++\tgolang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect\n++\tgoogle.golang.org/genproto v0.0.0-20250818200422-3122310a409c // indirect\n++\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c // indirect\n++\tgoogle.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c // indirect\n++\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect\n++\tgoogle.golang.org/grpc v1.76.0 // indirect\n++\tgoogle.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 // indirect\n +\tgopkg.in/fsnotify.v1 v1.4.7 // indirect\n-+\tgopkg.in/yaml.v2 v2.4.0 // indirect\n++\tgopkg.in/ini.v1 v1.67.0 // indirect\n +\tgopkg.in/yaml.v3 v3.0.1 // indirect\n++\thonnef.co/go/tools v0.6.1 // indirect\n +)\n\\ No newline at end of file", "summary": "Updates Go module definition from go 1.21 to go 1.24.2. Bumps numerous Google Cloud, gRPC, protobuf, and other Go dependencies to newer versions (e.g., cloud.google.com/go/storage from v1.31.0 to v1.55.0). Reflects upstream's infrastructure tooling updates between m133 and m147.", "relatedFiles": [{"path": ".disabled.go.sum", "relationship": "related"}]}, {"path": ".disabled.go.sum", "diff": "diff --git a/.disabled.go.sum b/.disabled.go.sum\nindex c0102bb428..2a682f5661 100644\n--- a/.disabled.go.sum\n+++ b/.disabled.go.sum\n@@ -1,108 +1,142 @@\n+cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=\n+cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=\n cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\n-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\n-cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM=\n-cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU=\n-cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk=\n-cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=\n-cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=\n-cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=\n-cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI=\n-cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8=\n-cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM=\n-cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI=\n-cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw=\n-cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE=\n-cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg=\n-cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI=\n-cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g=\n-cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc=\n-cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k=\n-cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w=\n-cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI=\n-cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0=\n+cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs=\n+cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s=\n+cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI=\n+cloud.google.com/go/auth v0.16.5/go.mod h1:utzRfHMP+Vv0mpOkTRQoWD2q3BatTOoWbA7gCc2dUhQ=\n+cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=\n+cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=\n+cloud.google.com/go/bigquery v1.69.0 h1:rZvHnjSUs5sHK3F9awiuFk2PeOaB8suqNuim21GbaTc=\n+cloud.google.com/go/bigquery v1.69.0/go.mod h1:TdGLquA3h/mGg+McX+GsqG9afAzTAcldMjqhdjHTLew=\n+cloud.google.com/go/cloudtasks v1.13.6 h1:Fwan19UiNoFD+3KY0MnNHE5DyixOxNzS1mZ4ChOdpy0=\n+cloud.google.com/go/cloudtasks v1.13.6/go.mod h1:/IDaQqGKMixD+ayM43CfsvWF2k36GeomEuy9gL4gLmU=\n+cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA=\n+cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw=\n+cloud.google.com/go/datacatalog v1.26.0 h1:eFgygb3DTufTWWUB8ARk+dSuXz+aefNJXTlkWlQcWwE=\n+cloud.google.com/go/datacatalog v1.26.0/go.mod h1:bLN2HLBAwB3kLTFT5ZKLHVPj/weNz6bR0c7nYp0LE14=\n+cloud.google.com/go/datastore v1.20.0 h1:NNpXoyEqIJmZFc0ACcwBEaXnmscUpcG4NkKnbCePmiM=\n+cloud.google.com/go/datastore v1.20.0/go.mod h1:uFo3e+aEpRfHgtp5pp0+6M0o147KoPaYNaPAKpfh8Ew=\n+cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s=\n+cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU=\n+cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8=\n+cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE=\n+cloud.google.com/go/kms v1.22.0 h1:dBRIj7+GDeeEvatJeTB19oYZNV0aj6wEqSIT/7gLqtk=\n+cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8=\n+cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc=\n+cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA=\n+cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE=\n+cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY=\n+cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM=\n+cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U=\n+cloud.google.com/go/pubsub v1.50.0 h1:hnYpOIxVlgVD1Z8LN7est4DQZK3K6tvZNurZjIVjUe0=\n+cloud.google.com/go/pubsub v1.50.0/go.mod h1:Di2Y+nqXBpIS+dXUEJPQzLh8PbIQZMLE9IVUFhf2zmM=\n+cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0=\n+cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E=\n+cloud.google.com/go/secretmanager v1.15.0 h1:RtkCMgTpaBMbzozcRUGfZe46jb9a3qh5EdEtVRUATF8=\n+cloud.google.com/go/secretmanager v1.15.0/go.mod h1:1hQSAhKK7FldiYw//wbR/XPfPc08eQ81oBsnRUHEvUc=\n+cloud.google.com/go/spanner v1.84.1 h1:ShH4Y3YeDtmHa55dFiSS3YtQ0dmCuP0okfAoHp/d68w=\n+cloud.google.com/go/spanner v1.84.1/go.mod h1:3GMEIjOcXINJSvb42H3M6TdlGCDzaCFpiiNQpjHPlCM=\n+cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2znf0=\n+cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY=\n+cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4=\n+cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI=\n github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\n+github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs=\n+github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=\n+github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3 h1:2afWGsMzkIcN8Qm4mgPJKZWyroE5QBszMiDMYEBrnfw=\n+github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0=\n github.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098 h1:a7+Y8VlXRC2VX5ue6tpCutr4PsrkRkWWVZv4zqfaHuc=\n github.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098/go.mod h1:idZL3yvz4kzx1dsBOAC+oYv6L92P1oFEhUXUB1A/lwQ=\n-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\n-github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\n-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\n-github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\n-github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\n github.com/anaskhan96/soup v1.2.5 h1:V/FHiusdTrPrdF4iA1YkVxsOpdNcgvqT1hG+YtcZ5hM=\n github.com/anaskhan96/soup v1.2.5/go.mod h1:6YnEp9A2yywlYdM4EgDz9NEHclocMepEtku7wg6Cq3s=\n-github.com/bazelbuild/remote-apis v0.0.0-20230822133051-6c32c3b917cc h1:TPwjNpCdoO7TcTPPMHEkrrlSwd8g2XVf3qflmnivvsU=\n-github.com/bazelbuild/remote-apis v0.0.0-20230822133051-6c32c3b917cc/go.mod h1:ry8Y6CkQqCVcYsjPOlLXDX2iRVjOnjogdNwhvHmRcz8=\n-github.com/bazelbuild/remote-apis-sdks v0.0.0-20231114220034-042d9851eb28 h1:/7itEMv7uUfXNXKUq9R8fGYF4Kb+ouOsVYsxSEsKmaw=\n-github.com/bazelbuild/remote-apis-sdks v0.0.0-20231114220034-042d9851eb28/go.mod h1:E6OuuTP51pswhFFf0TwNQeYQjJ6+xt3nnx4QSzYpvbg=\n-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\n-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\n+github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE=\n+github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA=\n+github.com/bazelbuild/remote-apis v0.0.0-20251110153243-3860ca2d3e55 h1:nD+YlIEH8YSXHW6reGLoi7DG0X1KaKRKO83VZ1nPjvE=\n+github.com/bazelbuild/remote-apis v0.0.0-20251110153243-3860ca2d3e55/go.mod h1:/xo1pn3QkEL2JXrLeK30jvjVR/zXM9H8EqcWb/l5/A0=\n+github.com/bazelbuild/remote-apis-sdks v0.0.0-20251202150838-a01d8dc79d0d h1:+WoAGv9vXGDsbHRzIov0tnyzHmxwT73pMSmvolL22V0=\n+github.com/bazelbuild/remote-apis-sdks v0.0.0-20251202150838-a01d8dc79d0d/go.mod h1:sMJ2QK7QssHpNpvbTBmneBJvc+fBHoi26eVoxNwiqIE=\n github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\n github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\n github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=\n github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=\n-github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=\n-github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=\n+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\n+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\n github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\n-github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\n-github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\n-github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\n+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\n+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\n+github.com/chigopher/pathlib v0.19.1 h1:RoLlUJc0CqBGwq239cilyhxPNLXTK+HXoASGyGznx5A=\n+github.com/chigopher/pathlib v0.19.1/go.mod h1:tzC1dZLW8o33UQpWkNkhvPwL5n4yyFRFm/jL1YGWFvY=\n github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\n github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\n-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\n-github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY=\n-github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\n-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\n+github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls=\n+github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=\n+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\n+github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\n github.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22 h1:m+Fkk9QEMuV6Z1ithqqYogOHV7Pl6rMKe34NBTJTS/c=\n github.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22/go.mod h1:jXqs4TJbb7Xtl0FwUgBaOXty8edb/61H37U4D9E5EQE=\n github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\n github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\n+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\n github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\n github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\n-github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\n-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\n+github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=\n+github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA=\n+github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=\n+github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw=\n+github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=\n+github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=\n github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\n-github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=\n-github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=\n+github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=\n+github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=\n github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=\n github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\n github.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966 h1:P/Czr+qFBdKELw4nys0x2e5nkT9niVq/2FS63ArJzm4=\n github.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966/go.mod h1:5OPf/2cFhfql2NdV8pCcv9fZJ0e0LC//L+72iX1cqDM=\n github.com/flynn/json5 v0.0.0-20160717195620-7620272ed633 h1:xJMmr4GMYIbALX5edyoDIOQpc2bOQTeJiWMeCl9lX/8=\n github.com/flynn/json5 v0.0.0-20160717195620-7620272ed633/go.mod h1:NJDK3/o7abx6PP54EOe0G0n0RLmhCo9xv61gUYpI0EY=\n-github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=\n-github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=\n+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=\n+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=\n+github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=\n+github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\n github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=\n github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=\n-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\n-github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\n-github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\n-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\n-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\n-github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\n+github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI=\n+github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo=\n github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\n-github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\n-github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\n+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\n+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\n github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\n github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\n github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=\n github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\n github.com/go-python/gpython v0.0.3 h1:QNFZ0h540Lajx7Pi/os06XzzdYUQG+2sV7IvPo/Mvmg=\n github.com/go-python/gpython v0.0.3/go.mod h1:bmk0l57W/7Cs67MMnz4U28SoYyvz5NTMYyJvUqytJhs=\n-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\n-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\n+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=\n+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\n+github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=\n+github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\n+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\n github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\n-github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=\n-github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=\n+github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=\n+github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\n github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\n-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\n-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\n+github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=\n+github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=\n github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\n-github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\n-github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\n+github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U=\n+github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs=\n github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\n github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\n@@ -110,154 +144,159 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU\n github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\n github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\n github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\n-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\n github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\n-github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\n-github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\n-github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\n-github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\n+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\n+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\n+github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg=\n+github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=\n github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\n github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\n github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\n github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\n-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\n-github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\n+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\n+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\n github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=\n github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=\n-github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=\n-github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=\n-github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n+github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=\n+github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=\n github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n-github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=\n-github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n-github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=\n-github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=\n-github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=\n-github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=\n+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\n+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n+github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=\n+github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=\n+github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo=\n+github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=\n github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\n-github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=\n-github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=\n github.com/gopherjs/gopherwasm v1.0.0/go.mod h1:SkZ8z7CWBz5VXbhJel8TxCmAcsQqzgWGR/8nMhyhZSI=\n github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\n github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\n github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\n-github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\n-github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\n+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\n+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\n+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=\n+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\n+github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=\n+github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=\n github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk=\n github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=\n+github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\n+github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\n+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=\n+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\n github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So=\n github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0=\n github.com/jcgregorio/logger v0.1.3 h1:KKKWn4Q0bPpGtLFWEF3Pkv0VtX8Oru3cK0OH0ZozYik=\n github.com/jcgregorio/logger v0.1.3/go.mod h1:bluD21Aj6/H3hUey6bnsZsIUf/IzO880aQ5iwBWWEy4=\n github.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900 h1:H8hiPQr5PtkrB5z3Do/9iR5tEwuAFNim68cqcoAlHeY=\n github.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900/go.mod h1:YT3uVwwZ2P4vmZcM3xICUNJ6dqBwoiSgVAqxHu3rcoo=\n-github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\n-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\n-github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\n-github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\n-github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\n-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\n-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\n+github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=\n+github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=\n github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=\n github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\n-github.com/klauspost/compress v1.14.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=\n-github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=\n-github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=\n-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\n-github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\n-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\n-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\n-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\n-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\n+github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=\n+github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=\n+github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=\n+github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\n+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\n+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\n github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\n github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\n github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=\n github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=\n+github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE=\n+github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk=\n+github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=\n+github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=\n+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\n+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=\n+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=\n+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\n+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\n+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\n+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\n github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=\n-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\n-github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\n-github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\n+github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=\n+github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=\n github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\n github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\n-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\n-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\n-github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\n-github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\n-github.com/mostynb/zstdpool-syncpool v0.0.12 h1:vE8zD0+YdQD9Rca0TAGNexUCOCt1IQbdqRUHJoxxERA=\n-github.com/mostynb/zstdpool-syncpool v0.0.12/go.mod h1:0YkM6gUZnyeFvLbBRiUYI4PxSiCSI36YNDY/b5iAI04=\n-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\n-github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\n-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=\n-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\n+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\n+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\n github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=\n github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=\n-github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw=\n-github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=\n+github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=\n+github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=\n github.com/peterh/liner v1.1.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=\n-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\n+github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=\n+github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=\n github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE=\n github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU=\n-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\n+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=\n+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=\n github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\n-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\n-github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\n-github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\n-github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s=\n-github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\n-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\n-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\n+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\n+github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\n+github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\n github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n-github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n-github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=\n-github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=\n-github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\n-github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\n-github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=\n-github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\n-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\n-github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\n-github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\n-github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=\n-github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\n+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=\n+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=\n+github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE=\n+github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U=\n+github.com/prometheus/procfs v0.14.0 h1:Lw4VdGGoKEZilJsayHf0B+9YgLGREba2C6xr+Fdfq6s=\n+github.com/prometheus/procfs v0.14.0/go.mod h1:XL+Iwz8k8ZabyZfMFHPiilCniixqQarAy5Mu67pHlNQ=\n github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac h1:kYPjbEN6YPYWWHI6ky1J813KzIq/8+Wg4TO4xU7A/KU=\n github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=\n+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=\n+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=\n+github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=\n+github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=\n+github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=\n+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\n+github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=\n+github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=\n+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=\n+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=\n github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=\n github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=\n-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\n-github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\n-github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\n-github.com/smarty/assertions v1.15.1 h1:812oFiXI+G55vxsFf+8bIZ1ux30qtkdqzKbEFwyX3Tk=\n-github.com/smarty/assertions v1.15.1/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec=\n-github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY=\n-github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60=\n+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=\n+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=\n+github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=\n+github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=\n+github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=\n+github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=\n+github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=\n+github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=\n+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\n+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=\n+github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\n+github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=\n+github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=\n+github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=\n+github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=\n github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\n-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\n github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\n-github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\n github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\n-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\n+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\n+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\n github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\n github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\n-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\n-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\n github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\n github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\n github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\n github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\n-github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\n-github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\n+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=\n+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\n+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=\n+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=\n github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U=\n github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8=\n github.com/trietmn/go-wiki v1.0.1 h1:OnKPSfE/XtWH9ybRxD7UcNv4bLzv8WcTWxwMcIDsFyg=\n github.com/trietmn/go-wiki v1.0.1/go.mod h1:HxeEu4ttJvFkRXY+XQu+ATZEh1S7J75+HRUoiZauzk8=\n+github.com/vektra/mockery/v2 v2.52.2 h1:8QfPKUIrq8P3Cs7G79Iu4Byd5wdhGCE0quIS27x7rQo=\n+github.com/vektra/mockery/v2 v2.52.2/go.mod h1:zGDY/f6bip0Yh13GQ5j7xa43fuEoYBa4ICHEaihisHw=\n github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE=\n github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=\n github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=\n@@ -268,171 +307,155 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17\n github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\n github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=\n github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=\n-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\n-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\n-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\n+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\n github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=\n github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=\n+github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=\n+github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=\n github.com/zeebo/bencode v1.0.0 h1:zgop0Wu1nu4IexAZeCZ5qbsjU4O1vMrfCrVgUjbHVuA=\n github.com/zeebo/bencode v1.0.0/go.mod h1:Ct7CkrWIQuLWAy9M3atFHYq4kG9Ao/SsY5cdtCXmp9Y=\n-go.chromium.org/luci v0.0.0-20240206071351-fb32c458db6e h1:JJNTpSU1X9ClKbBtSk4dw6TH9w4hbDkQIpPhPEGp6lw=\n-go.chromium.org/luci v0.0.0-20240206071351-fb32c458db6e/go.mod h1:Pxji2l9vIPcilS+otwL6AZLNbNxGTzhuXSf1h53SX64=\n+github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=\n+github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=\n+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=\n+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=\n+go.chromium.org/luci v0.0.0-20251208084510-e9565e513ef0 h1:ryxGOup980iMtRFc2KrxmpCg38LTyYtAkOWt9q6CKhU=\n+go.chromium.org/luci v0.0.0-20251208084510-e9565e513ef0/go.mod h1:NcnYARnYxsMM0ooU4Wy8+FpPe6tXmXUB9fgqQdEe0Qw=\n+go.einride.tech/aip v0.73.0 h1:bPo4oqBo2ZQeBKo4ZzLb1kxYXTY1ysJhpvQyfuGzvps=\n+go.einride.tech/aip v0.73.0/go.mod h1:Mj7rFbmXEgw0dq1dqJ7JGMvYCZZVxmGOR3S4ZcV5LvQ=\n go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=\n go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=\n-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs=\n-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ=\n-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08=\n-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw=\n-go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y=\n-go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI=\n-go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg=\n-go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY=\n-go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\n-go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\n-go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0=\n-go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo=\n-go.skia.org/infra v0.0.0-20250104003448-783200f5fd9e h1:YvLzsqydWr99JTzsjmHR/fxa3H8EalrQj0FWNWFyI1A=\n-go.skia.org/infra v0.0.0-20250104003448-783200f5fd9e/go.mod h1:AIyC3mAtE7moB4ippEhflqgrOKPYmqIWJn0Y8APBGzM=\n-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\n+go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=\n+go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=\n+go.opentelemetry.io/contrib/detectors/gcp v1.37.0 h1:B+WbN9RPsvobe6q4vP6KgM8/9plR/HNjgGBrfcOlweA=\n+go.opentelemetry.io/contrib/detectors/gcp v1.37.0/go.mod h1:K5zQ3TT7p2ru9Qkzk0bKtCql0RGkPj9pRjpXgZJZ+rU=\n+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw=\n+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ=\n+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=\n+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=\n+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=\n+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=\n+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY=\n+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw=\n+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=\n+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=\n+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=\n+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=\n+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=\n+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=\n+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=\n+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=\n+go.skia.org/infra v0.0.0-20260307000600-5997e0271ce7 h1:SxYJzhHpr5JgVBKzkSSd5SlzdDawed9XqDvGgVD8pZo=\n+go.skia.org/infra v0.0.0-20260307000600-5997e0271ce7/go.mod h1:oSiwDAML1gKAVkA+pjJ1HN+BAdIvR3ktUOa2Uel9Ev0=\n+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\n+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\n+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\n+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\n golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\n golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\n golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\n-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\n-golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=\n-golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=\n+golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=\n+golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=\n golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\n-golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No=\n-golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\n+golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs=\n+golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo=\n+golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ=\n+golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=\n golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\n golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\n golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\n-golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\n-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\n-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\n-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\n-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\n+golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\n+golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=\n+golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=\n golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\n golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\n-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\n-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\n golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\n-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\n-golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\n-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\n-golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\n-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\n-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=\n-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\n+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\n+golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=\n+golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=\n golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\n-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\n-golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ=\n-golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=\n+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=\n+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=\n golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=\n-golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\n+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\n+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\n golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-golang.org/x/sys v0.0.0-20210507014357-30e306a8bba5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=\n-golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\n+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=\n+golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\n golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\n-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\n-golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=\n-golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\n+golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=\n+golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=\n golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\n-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\n golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\n-golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=\n-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=\n-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\n-golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=\n-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=\n+golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=\n+golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=\n+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=\n+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=\n golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\n golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\n golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\n golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\n golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\n golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\n-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\n-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\n-golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\n-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\n+golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\n+golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=\n+golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=\n+golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=\n+golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=\n golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n-golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=\n-golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\n-google.golang.org/api v0.160.0 h1:SEspjXHVqE1m5a1fRy8JFB+5jSu+V0GEDKDghF3ttO4=\n-google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw=\n+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=\n+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=\n+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=\n+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=\n+google.golang.org/api v0.248.0 h1:hUotakSkcwGdYUqzCRc5yGYsg4wXxpkKlW5ryVqvC1Y=\n+google.golang.org/api v0.248.0/go.mod h1:yAFUAF56Li7IuIQbTFoLwXTCI6XCFKueOlS7S9e4F9k=\n google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\n google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\n-google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=\n-google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=\n google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\n google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\n google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\n-google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\n-google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg=\n-google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k=\n-google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe h1:0poefMBYvYbs7g5UkjS6HcxBPaTRAmznle9jnxYoAI8=\n-google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA=\n-google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac h1:QXtV4qU5zS94SeHJhPqxJQF0XyxssnVrEZOUgp1+NuY=\n-google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ=\n-google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac h1:nUQEQmH/csSvFECKYRv6HWEyypysidKl2I6Qpsglq/0=\n-google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA=\n+google.golang.org/genproto v0.0.0-20250818200422-3122310a409c h1:ZERoum3uuqL0PRSc6SXielu26FN96T4BUGaaW0oL+c8=\n+google.golang.org/genproto v0.0.0-20250818200422-3122310a409c/go.mod h1:Q8kep885BJnK3Jt6QZXIFeLHSzoAQtlI1CCloQigiyU=\n+google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c h1:AtEkQdl5b6zsybXcbz00j1LwNodDuH6hVifIaNqk7NQ=\n+google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c/go.mod h1:ea2MjsO70ssTfCjiwHgI0ZFqcw45Ksuk2ckf9G468GA=\n+google.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c h1:CMCT63H4Rl6uNNT10m3hkjCR3JgAv4E9ZuVTeO+Sz98=\n+google.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c/go.mod h1:1kGGe25NDrNJYgta9Rp2QLLXWS1FLVMMXNvihbhK0iE=\n+google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c h1:qXWI/sQtv5UKboZ/zUk7h+mrf/lXORyI+n9DKDAusdg=\n+google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo=\n google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\n google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\n google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\n google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\n google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\n-google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\n-google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\n-google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0=\n-google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=\n+google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=\n+google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=\n+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 h1:6Al3kEFFP9VJhRz3DID6quisgPnTeZVr4lep9kkxdPA=\n+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0/go.mod h1:QLvsjh0OIR0TYBeiu2bkWGTJBUNQ64st52iWj/yA93I=\n google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\n google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\n google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\n@@ -442,28 +465,21 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2\n google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\n-google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\n-google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\n-google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\n-google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\n-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\n+google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=\n+google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\n gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=\n-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\n+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\n gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=\n gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\n+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=\n+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\n gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI=\n gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=\n-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\n-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\n gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\n gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n+honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI=\n+honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4=", "oldDiff": "diff --git a/.disabled.go.sum b/.disabled.go.sum\nnew file mode 100644\nindex 0000000000..c0102bb428\n--- /dev/null\n+++ b/.disabled.go.sum\n@@ -0,0 +1,469 @@\n+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\n+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\n+cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM=\n+cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU=\n+cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk=\n+cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=\n+cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=\n+cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=\n+cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI=\n+cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8=\n+cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM=\n+cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI=\n+cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw=\n+cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE=\n+cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg=\n+cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI=\n+cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g=\n+cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc=\n+cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k=\n+cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w=\n+cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI=\n+cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0=\n+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\n+github.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098 h1:a7+Y8VlXRC2VX5ue6tpCutr4PsrkRkWWVZv4zqfaHuc=\n+github.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098/go.mod h1:idZL3yvz4kzx1dsBOAC+oYv6L92P1oFEhUXUB1A/lwQ=\n+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\n+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\n+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\n+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\n+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\n+github.com/anaskhan96/soup v1.2.5 h1:V/FHiusdTrPrdF4iA1YkVxsOpdNcgvqT1hG+YtcZ5hM=\n+github.com/anaskhan96/soup v1.2.5/go.mod h1:6YnEp9A2yywlYdM4EgDz9NEHclocMepEtku7wg6Cq3s=\n+github.com/bazelbuild/remote-apis v0.0.0-20230822133051-6c32c3b917cc h1:TPwjNpCdoO7TcTPPMHEkrrlSwd8g2XVf3qflmnivvsU=\n+github.com/bazelbuild/remote-apis v0.0.0-20230822133051-6c32c3b917cc/go.mod h1:ry8Y6CkQqCVcYsjPOlLXDX2iRVjOnjogdNwhvHmRcz8=\n+github.com/bazelbuild/remote-apis-sdks v0.0.0-20231114220034-042d9851eb28 h1:/7itEMv7uUfXNXKUq9R8fGYF4Kb+ouOsVYsxSEsKmaw=\n+github.com/bazelbuild/remote-apis-sdks v0.0.0-20231114220034-042d9851eb28/go.mod h1:E6OuuTP51pswhFFf0TwNQeYQjJ6+xt3nnx4QSzYpvbg=\n+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\n+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\n+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\n+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\n+github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=\n+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=\n+github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=\n+github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=\n+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\n+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\n+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\n+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\n+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\n+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\n+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\n+github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY=\n+github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\n+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\n+github.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22 h1:m+Fkk9QEMuV6Z1ithqqYogOHV7Pl6rMKe34NBTJTS/c=\n+github.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22/go.mod h1:jXqs4TJbb7Xtl0FwUgBaOXty8edb/61H37U4D9E5EQE=\n+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\n+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\n+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\n+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\n+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\n+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\n+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\n+github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=\n+github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=\n+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=\n+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\n+github.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966 h1:P/Czr+qFBdKELw4nys0x2e5nkT9niVq/2FS63ArJzm4=\n+github.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966/go.mod h1:5OPf/2cFhfql2NdV8pCcv9fZJ0e0LC//L+72iX1cqDM=\n+github.com/flynn/json5 v0.0.0-20160717195620-7620272ed633 h1:xJMmr4GMYIbALX5edyoDIOQpc2bOQTeJiWMeCl9lX/8=\n+github.com/flynn/json5 v0.0.0-20160717195620-7620272ed633/go.mod h1:NJDK3/o7abx6PP54EOe0G0n0RLmhCo9xv61gUYpI0EY=\n+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=\n+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=\n+github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=\n+github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=\n+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\n+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\n+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\n+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\n+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\n+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\n+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\n+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\n+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\n+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\n+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\n+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=\n+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\n+github.com/go-python/gpython v0.0.3 h1:QNFZ0h540Lajx7Pi/os06XzzdYUQG+2sV7IvPo/Mvmg=\n+github.com/go-python/gpython v0.0.3/go.mod h1:bmk0l57W/7Cs67MMnz4U28SoYyvz5NTMYyJvUqytJhs=\n+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\n+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\n+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\n+github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=\n+github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=\n+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\n+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\n+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\n+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\n+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\n+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\n+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\n+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\n+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\n+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\n+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\n+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\n+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\n+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\n+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\n+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\n+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\n+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\n+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\n+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\n+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\n+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\n+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\n+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\n+github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=\n+github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=\n+github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=\n+github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=\n+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n+github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=\n+github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n+github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=\n+github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=\n+github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=\n+github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=\n+github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\n+github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=\n+github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=\n+github.com/gopherjs/gopherwasm v1.0.0/go.mod h1:SkZ8z7CWBz5VXbhJel8TxCmAcsQqzgWGR/8nMhyhZSI=\n+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\n+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\n+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\n+github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\n+github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\n+github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk=\n+github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=\n+github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So=\n+github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0=\n+github.com/jcgregorio/logger v0.1.3 h1:KKKWn4Q0bPpGtLFWEF3Pkv0VtX8Oru3cK0OH0ZozYik=\n+github.com/jcgregorio/logger v0.1.3/go.mod h1:bluD21Aj6/H3hUey6bnsZsIUf/IzO880aQ5iwBWWEy4=\n+github.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900 h1:H8hiPQr5PtkrB5z3Do/9iR5tEwuAFNim68cqcoAlHeY=\n+github.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900/go.mod h1:YT3uVwwZ2P4vmZcM3xICUNJ6dqBwoiSgVAqxHu3rcoo=\n+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\n+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\n+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\n+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\n+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\n+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\n+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\n+github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=\n+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\n+github.com/klauspost/compress v1.14.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=\n+github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=\n+github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=\n+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\n+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\n+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\n+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\n+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\n+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\n+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\n+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\n+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=\n+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=\n+github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=\n+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\n+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\n+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\n+github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\n+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\n+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\n+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\n+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\n+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\n+github.com/mostynb/zstdpool-syncpool v0.0.12 h1:vE8zD0+YdQD9Rca0TAGNexUCOCt1IQbdqRUHJoxxERA=\n+github.com/mostynb/zstdpool-syncpool v0.0.12/go.mod h1:0YkM6gUZnyeFvLbBRiUYI4PxSiCSI36YNDY/b5iAI04=\n+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\n+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\n+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=\n+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\n+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=\n+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=\n+github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw=\n+github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=\n+github.com/peterh/liner v1.1.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=\n+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\n+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n+github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE=\n+github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU=\n+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\n+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\n+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\n+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\n+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\n+github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s=\n+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\n+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\n+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n+github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=\n+github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=\n+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\n+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\n+github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=\n+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\n+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\n+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\n+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\n+github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=\n+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\n+github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac h1:kYPjbEN6YPYWWHI6ky1J813KzIq/8+Wg4TO4xU7A/KU=\n+github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=\n+github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=\n+github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=\n+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\n+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\n+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\n+github.com/smarty/assertions v1.15.1 h1:812oFiXI+G55vxsFf+8bIZ1ux30qtkdqzKbEFwyX3Tk=\n+github.com/smarty/assertions v1.15.1/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec=\n+github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY=\n+github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60=\n+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\n+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\n+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\n+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\n+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\n+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\n+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\n+github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\n+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\n+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\n+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\n+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\n+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\n+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\n+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\n+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\n+github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U=\n+github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8=\n+github.com/trietmn/go-wiki v1.0.1 h1:OnKPSfE/XtWH9ybRxD7UcNv4bLzv8WcTWxwMcIDsFyg=\n+github.com/trietmn/go-wiki v1.0.1/go.mod h1:HxeEu4ttJvFkRXY+XQu+ATZEh1S7J75+HRUoiZauzk8=\n+github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE=\n+github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=\n+github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=\n+github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\n+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\n+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\n+github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\n+github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\n+github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=\n+github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=\n+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\n+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\n+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\n+github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=\n+github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=\n+github.com/zeebo/bencode v1.0.0 h1:zgop0Wu1nu4IexAZeCZ5qbsjU4O1vMrfCrVgUjbHVuA=\n+github.com/zeebo/bencode v1.0.0/go.mod h1:Ct7CkrWIQuLWAy9M3atFHYq4kG9Ao/SsY5cdtCXmp9Y=\n+go.chromium.org/luci v0.0.0-20240206071351-fb32c458db6e h1:JJNTpSU1X9ClKbBtSk4dw6TH9w4hbDkQIpPhPEGp6lw=\n+go.chromium.org/luci v0.0.0-20240206071351-fb32c458db6e/go.mod h1:Pxji2l9vIPcilS+otwL6AZLNbNxGTzhuXSf1h53SX64=\n+go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=\n+go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=\n+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs=\n+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ=\n+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08=\n+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw=\n+go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y=\n+go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI=\n+go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg=\n+go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY=\n+go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\n+go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\n+go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0=\n+go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo=\n+go.skia.org/infra v0.0.0-20250104003448-783200f5fd9e h1:YvLzsqydWr99JTzsjmHR/fxa3H8EalrQj0FWNWFyI1A=\n+go.skia.org/infra v0.0.0-20250104003448-783200f5fd9e/go.mod h1:AIyC3mAtE7moB4ippEhflqgrOKPYmqIWJn0Y8APBGzM=\n+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\n+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\n+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\n+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\n+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\n+golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=\n+golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=\n+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\n+golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No=\n+golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\n+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\n+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\n+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\n+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\n+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\n+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\n+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\n+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\n+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\n+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\n+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\n+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\n+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\n+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\n+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\n+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\n+golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\n+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\n+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=\n+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\n+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\n+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\n+golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ=\n+golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=\n+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=\n+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\n+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20210507014357-30e306a8bba5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=\n+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\n+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\n+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\n+golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=\n+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\n+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\n+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\n+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\n+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=\n+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=\n+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\n+golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=\n+golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=\n+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\n+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\n+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\n+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\n+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\n+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\n+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\n+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\n+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\n+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\n+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=\n+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\n+google.golang.org/api v0.160.0 h1:SEspjXHVqE1m5a1fRy8JFB+5jSu+V0GEDKDghF3ttO4=\n+google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw=\n+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\n+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\n+google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=\n+google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=\n+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\n+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\n+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\n+google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\n+google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg=\n+google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k=\n+google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe h1:0poefMBYvYbs7g5UkjS6HcxBPaTRAmznle9jnxYoAI8=\n+google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA=\n+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac h1:QXtV4qU5zS94SeHJhPqxJQF0XyxssnVrEZOUgp1+NuY=\n+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ=\n+google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac h1:nUQEQmH/csSvFECKYRv6HWEyypysidKl2I6Qpsglq/0=\n+google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA=\n+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\n+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\n+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\n+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\n+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\n+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\n+google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\n+google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0=\n+google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=\n+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\n+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\n+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\n+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\n+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\n+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\n+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\n+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\n+google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\n+google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\n+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\n+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=\n+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n+gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=\n+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\n+gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI=\n+gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=\n+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\n+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\n+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\n+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=", "newDiff": "diff --git a/.disabled.go.sum b/.disabled.go.sum\nnew file mode 100644\nindex 0000000000..2a682f5661\n--- /dev/null\n+++ b/.disabled.go.sum\n@@ -0,0 +1,485 @@\n+cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=\n+cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=\n+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\n+cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs=\n+cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s=\n+cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI=\n+cloud.google.com/go/auth v0.16.5/go.mod h1:utzRfHMP+Vv0mpOkTRQoWD2q3BatTOoWbA7gCc2dUhQ=\n+cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=\n+cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=\n+cloud.google.com/go/bigquery v1.69.0 h1:rZvHnjSUs5sHK3F9awiuFk2PeOaB8suqNuim21GbaTc=\n+cloud.google.com/go/bigquery v1.69.0/go.mod h1:TdGLquA3h/mGg+McX+GsqG9afAzTAcldMjqhdjHTLew=\n+cloud.google.com/go/cloudtasks v1.13.6 h1:Fwan19UiNoFD+3KY0MnNHE5DyixOxNzS1mZ4ChOdpy0=\n+cloud.google.com/go/cloudtasks v1.13.6/go.mod h1:/IDaQqGKMixD+ayM43CfsvWF2k36GeomEuy9gL4gLmU=\n+cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA=\n+cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw=\n+cloud.google.com/go/datacatalog v1.26.0 h1:eFgygb3DTufTWWUB8ARk+dSuXz+aefNJXTlkWlQcWwE=\n+cloud.google.com/go/datacatalog v1.26.0/go.mod h1:bLN2HLBAwB3kLTFT5ZKLHVPj/weNz6bR0c7nYp0LE14=\n+cloud.google.com/go/datastore v1.20.0 h1:NNpXoyEqIJmZFc0ACcwBEaXnmscUpcG4NkKnbCePmiM=\n+cloud.google.com/go/datastore v1.20.0/go.mod h1:uFo3e+aEpRfHgtp5pp0+6M0o147KoPaYNaPAKpfh8Ew=\n+cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s=\n+cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU=\n+cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8=\n+cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE=\n+cloud.google.com/go/kms v1.22.0 h1:dBRIj7+GDeeEvatJeTB19oYZNV0aj6wEqSIT/7gLqtk=\n+cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8=\n+cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc=\n+cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA=\n+cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE=\n+cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY=\n+cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM=\n+cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U=\n+cloud.google.com/go/pubsub v1.50.0 h1:hnYpOIxVlgVD1Z8LN7est4DQZK3K6tvZNurZjIVjUe0=\n+cloud.google.com/go/pubsub v1.50.0/go.mod h1:Di2Y+nqXBpIS+dXUEJPQzLh8PbIQZMLE9IVUFhf2zmM=\n+cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0=\n+cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E=\n+cloud.google.com/go/secretmanager v1.15.0 h1:RtkCMgTpaBMbzozcRUGfZe46jb9a3qh5EdEtVRUATF8=\n+cloud.google.com/go/secretmanager v1.15.0/go.mod h1:1hQSAhKK7FldiYw//wbR/XPfPc08eQ81oBsnRUHEvUc=\n+cloud.google.com/go/spanner v1.84.1 h1:ShH4Y3YeDtmHa55dFiSS3YtQ0dmCuP0okfAoHp/d68w=\n+cloud.google.com/go/spanner v1.84.1/go.mod h1:3GMEIjOcXINJSvb42H3M6TdlGCDzaCFpiiNQpjHPlCM=\n+cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2znf0=\n+cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY=\n+cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4=\n+cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI=\n+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\n+github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs=\n+github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=\n+github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3 h1:2afWGsMzkIcN8Qm4mgPJKZWyroE5QBszMiDMYEBrnfw=\n+github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI=\n+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0=\n+github.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098 h1:a7+Y8VlXRC2VX5ue6tpCutr4PsrkRkWWVZv4zqfaHuc=\n+github.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098/go.mod h1:idZL3yvz4kzx1dsBOAC+oYv6L92P1oFEhUXUB1A/lwQ=\n+github.com/anaskhan96/soup v1.2.5 h1:V/FHiusdTrPrdF4iA1YkVxsOpdNcgvqT1hG+YtcZ5hM=\n+github.com/anaskhan96/soup v1.2.5/go.mod h1:6YnEp9A2yywlYdM4EgDz9NEHclocMepEtku7wg6Cq3s=\n+github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE=\n+github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA=\n+github.com/bazelbuild/remote-apis v0.0.0-20251110153243-3860ca2d3e55 h1:nD+YlIEH8YSXHW6reGLoi7DG0X1KaKRKO83VZ1nPjvE=\n+github.com/bazelbuild/remote-apis v0.0.0-20251110153243-3860ca2d3e55/go.mod h1:/xo1pn3QkEL2JXrLeK30jvjVR/zXM9H8EqcWb/l5/A0=\n+github.com/bazelbuild/remote-apis-sdks v0.0.0-20251202150838-a01d8dc79d0d h1:+WoAGv9vXGDsbHRzIov0tnyzHmxwT73pMSmvolL22V0=\n+github.com/bazelbuild/remote-apis-sdks v0.0.0-20251202150838-a01d8dc79d0d/go.mod h1:sMJ2QK7QssHpNpvbTBmneBJvc+fBHoi26eVoxNwiqIE=\n+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\n+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\n+github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=\n+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=\n+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\n+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\n+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\n+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\n+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\n+github.com/chigopher/pathlib v0.19.1 h1:RoLlUJc0CqBGwq239cilyhxPNLXTK+HXoASGyGznx5A=\n+github.com/chigopher/pathlib v0.19.1/go.mod h1:tzC1dZLW8o33UQpWkNkhvPwL5n4yyFRFm/jL1YGWFvY=\n+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\n+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\n+github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls=\n+github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=\n+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\n+github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\n+github.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22 h1:m+Fkk9QEMuV6Z1ithqqYogOHV7Pl6rMKe34NBTJTS/c=\n+github.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22/go.mod h1:jXqs4TJbb7Xtl0FwUgBaOXty8edb/61H37U4D9E5EQE=\n+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\n+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\n+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\n+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\n+github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=\n+github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA=\n+github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=\n+github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw=\n+github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=\n+github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=\n+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\n+github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=\n+github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=\n+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=\n+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\n+github.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966 h1:P/Czr+qFBdKELw4nys0x2e5nkT9niVq/2FS63ArJzm4=\n+github.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966/go.mod h1:5OPf/2cFhfql2NdV8pCcv9fZJ0e0LC//L+72iX1cqDM=\n+github.com/flynn/json5 v0.0.0-20160717195620-7620272ed633 h1:xJMmr4GMYIbALX5edyoDIOQpc2bOQTeJiWMeCl9lX/8=\n+github.com/flynn/json5 v0.0.0-20160717195620-7620272ed633/go.mod h1:NJDK3/o7abx6PP54EOe0G0n0RLmhCo9xv61gUYpI0EY=\n+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=\n+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=\n+github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=\n+github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\n+github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=\n+github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=\n+github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI=\n+github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo=\n+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\n+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\n+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\n+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\n+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\n+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=\n+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\n+github.com/go-python/gpython v0.0.3 h1:QNFZ0h540Lajx7Pi/os06XzzdYUQG+2sV7IvPo/Mvmg=\n+github.com/go-python/gpython v0.0.3/go.mod h1:bmk0l57W/7Cs67MMnz4U28SoYyvz5NTMYyJvUqytJhs=\n+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=\n+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\n+github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=\n+github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\n+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\n+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\n+github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=\n+github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\n+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\n+github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=\n+github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=\n+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\n+github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U=\n+github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs=\n+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\n+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\n+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\n+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\n+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\n+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\n+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\n+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\n+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\n+github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg=\n+github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=\n+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\n+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\n+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\n+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\n+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\n+github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=\n+github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=\n+github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=\n+github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=\n+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\n+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n+github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=\n+github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=\n+github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo=\n+github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=\n+github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\n+github.com/gopherjs/gopherwasm v1.0.0/go.mod h1:SkZ8z7CWBz5VXbhJel8TxCmAcsQqzgWGR/8nMhyhZSI=\n+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\n+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\n+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\n+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\n+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\n+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=\n+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\n+github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=\n+github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=\n+github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk=\n+github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=\n+github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\n+github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\n+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=\n+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\n+github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So=\n+github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0=\n+github.com/jcgregorio/logger v0.1.3 h1:KKKWn4Q0bPpGtLFWEF3Pkv0VtX8Oru3cK0OH0ZozYik=\n+github.com/jcgregorio/logger v0.1.3/go.mod h1:bluD21Aj6/H3hUey6bnsZsIUf/IzO880aQ5iwBWWEy4=\n+github.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900 h1:H8hiPQr5PtkrB5z3Do/9iR5tEwuAFNim68cqcoAlHeY=\n+github.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900/go.mod h1:YT3uVwwZ2P4vmZcM3xICUNJ6dqBwoiSgVAqxHu3rcoo=\n+github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=\n+github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=\n+github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=\n+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\n+github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=\n+github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=\n+github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=\n+github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\n+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\n+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\n+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\n+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\n+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=\n+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=\n+github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE=\n+github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk=\n+github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=\n+github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=\n+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\n+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=\n+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=\n+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\n+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\n+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\n+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\n+github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=\n+github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=\n+github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=\n+github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\n+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\n+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\n+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\n+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=\n+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=\n+github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=\n+github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=\n+github.com/peterh/liner v1.1.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=\n+github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=\n+github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=\n+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n+github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE=\n+github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU=\n+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=\n+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=\n+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\n+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\n+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\n+github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\n+github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\n+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=\n+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=\n+github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE=\n+github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U=\n+github.com/prometheus/procfs v0.14.0 h1:Lw4VdGGoKEZilJsayHf0B+9YgLGREba2C6xr+Fdfq6s=\n+github.com/prometheus/procfs v0.14.0/go.mod h1:XL+Iwz8k8ZabyZfMFHPiilCniixqQarAy5Mu67pHlNQ=\n+github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac h1:kYPjbEN6YPYWWHI6ky1J813KzIq/8+Wg4TO4xU7A/KU=\n+github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=\n+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=\n+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=\n+github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=\n+github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=\n+github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=\n+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\n+github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=\n+github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=\n+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=\n+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=\n+github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=\n+github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=\n+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=\n+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=\n+github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=\n+github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=\n+github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=\n+github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=\n+github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=\n+github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=\n+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\n+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=\n+github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\n+github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=\n+github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=\n+github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=\n+github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=\n+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\n+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\n+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\n+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\n+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\n+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\n+github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\n+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\n+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\n+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\n+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\n+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=\n+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\n+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=\n+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=\n+github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U=\n+github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8=\n+github.com/trietmn/go-wiki v1.0.1 h1:OnKPSfE/XtWH9ybRxD7UcNv4bLzv8WcTWxwMcIDsFyg=\n+github.com/trietmn/go-wiki v1.0.1/go.mod h1:HxeEu4ttJvFkRXY+XQu+ATZEh1S7J75+HRUoiZauzk8=\n+github.com/vektra/mockery/v2 v2.52.2 h1:8QfPKUIrq8P3Cs7G79Iu4Byd5wdhGCE0quIS27x7rQo=\n+github.com/vektra/mockery/v2 v2.52.2/go.mod h1:zGDY/f6bip0Yh13GQ5j7xa43fuEoYBa4ICHEaihisHw=\n+github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE=\n+github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=\n+github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=\n+github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=\n+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\n+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=\n+github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\n+github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\n+github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=\n+github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=\n+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\n+github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=\n+github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=\n+github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=\n+github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=\n+github.com/zeebo/bencode v1.0.0 h1:zgop0Wu1nu4IexAZeCZ5qbsjU4O1vMrfCrVgUjbHVuA=\n+github.com/zeebo/bencode v1.0.0/go.mod h1:Ct7CkrWIQuLWAy9M3atFHYq4kG9Ao/SsY5cdtCXmp9Y=\n+github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=\n+github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=\n+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=\n+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=\n+go.chromium.org/luci v0.0.0-20251208084510-e9565e513ef0 h1:ryxGOup980iMtRFc2KrxmpCg38LTyYtAkOWt9q6CKhU=\n+go.chromium.org/luci v0.0.0-20251208084510-e9565e513ef0/go.mod h1:NcnYARnYxsMM0ooU4Wy8+FpPe6tXmXUB9fgqQdEe0Qw=\n+go.einride.tech/aip v0.73.0 h1:bPo4oqBo2ZQeBKo4ZzLb1kxYXTY1ysJhpvQyfuGzvps=\n+go.einride.tech/aip v0.73.0/go.mod h1:Mj7rFbmXEgw0dq1dqJ7JGMvYCZZVxmGOR3S4ZcV5LvQ=\n+go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=\n+go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=\n+go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=\n+go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=\n+go.opentelemetry.io/contrib/detectors/gcp v1.37.0 h1:B+WbN9RPsvobe6q4vP6KgM8/9plR/HNjgGBrfcOlweA=\n+go.opentelemetry.io/contrib/detectors/gcp v1.37.0/go.mod h1:K5zQ3TT7p2ru9Qkzk0bKtCql0RGkPj9pRjpXgZJZ+rU=\n+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw=\n+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ=\n+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=\n+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=\n+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=\n+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=\n+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY=\n+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw=\n+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=\n+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=\n+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=\n+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=\n+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=\n+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=\n+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=\n+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=\n+go.skia.org/infra v0.0.0-20260307000600-5997e0271ce7 h1:SxYJzhHpr5JgVBKzkSSd5SlzdDawed9XqDvGgVD8pZo=\n+go.skia.org/infra v0.0.0-20260307000600-5997e0271ce7/go.mod h1:oSiwDAML1gKAVkA+pjJ1HN+BAdIvR3ktUOa2Uel9Ev0=\n+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\n+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\n+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\n+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\n+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\n+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\n+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\n+golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=\n+golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=\n+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\n+golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs=\n+golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo=\n+golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ=\n+golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=\n+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\n+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\n+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\n+golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\n+golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=\n+golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=\n+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\n+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\n+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\n+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\n+golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=\n+golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=\n+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\n+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=\n+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=\n+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\n+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\n+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n+golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=\n+golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\n+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\n+golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=\n+golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=\n+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\n+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\n+golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=\n+golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=\n+golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=\n+golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=\n+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\n+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\n+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\n+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\n+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\n+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\n+golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\n+golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=\n+golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=\n+golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=\n+golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=\n+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=\n+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=\n+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=\n+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=\n+google.golang.org/api v0.248.0 h1:hUotakSkcwGdYUqzCRc5yGYsg4wXxpkKlW5ryVqvC1Y=\n+google.golang.org/api v0.248.0/go.mod h1:yAFUAF56Li7IuIQbTFoLwXTCI6XCFKueOlS7S9e4F9k=\n+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\n+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\n+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\n+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\n+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\n+google.golang.org/genproto v0.0.0-20250818200422-3122310a409c h1:ZERoum3uuqL0PRSc6SXielu26FN96T4BUGaaW0oL+c8=\n+google.golang.org/genproto v0.0.0-20250818200422-3122310a409c/go.mod h1:Q8kep885BJnK3Jt6QZXIFeLHSzoAQtlI1CCloQigiyU=\n+google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c h1:AtEkQdl5b6zsybXcbz00j1LwNodDuH6hVifIaNqk7NQ=\n+google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c/go.mod h1:ea2MjsO70ssTfCjiwHgI0ZFqcw45Ksuk2ckf9G468GA=\n+google.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c h1:CMCT63H4Rl6uNNT10m3hkjCR3JgAv4E9ZuVTeO+Sz98=\n+google.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c/go.mod h1:1kGGe25NDrNJYgta9Rp2QLLXWS1FLVMMXNvihbhK0iE=\n+google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c h1:qXWI/sQtv5UKboZ/zUk7h+mrf/lXORyI+n9DKDAusdg=\n+google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo=\n+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\n+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\n+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\n+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\n+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\n+google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=\n+google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=\n+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 h1:6Al3kEFFP9VJhRz3DID6quisgPnTeZVr4lep9kkxdPA=\n+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0/go.mod h1:QLvsjh0OIR0TYBeiu2bkWGTJBUNQ64st52iWj/yA93I=\n+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\n+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\n+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\n+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\n+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\n+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\n+google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=\n+google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\n+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\n+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\n+gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=\n+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\n+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=\n+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\n+gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI=\n+gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=\n+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\n+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n+honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI=\n+honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4=", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,114 +1,148 @@\n diff --git a/.disabled.go.sum b/.disabled.go.sum\n new file mode 100644\n-index 0000000000..c0102bb428\n+index 0000000000..2a682f5661\n --- /dev/null\n +++ b/.disabled.go.sum\n-@@ -0,0 +1,469 @@\n+@@ -0,0 +1,485 @@\n++cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=\n++cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=\n +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\n-+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\n-+cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM=\n-+cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU=\n-+cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk=\n-+cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=\n-+cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=\n-+cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=\n-+cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI=\n-+cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8=\n-+cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM=\n-+cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI=\n-+cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw=\n-+cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE=\n-+cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg=\n-+cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI=\n-+cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g=\n-+cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc=\n-+cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k=\n-+cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w=\n-+cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI=\n-+cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0=\n++cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs=\n++cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s=\n++cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI=\n++cloud.google.com/go/auth v0.16.5/go.mod h1:utzRfHMP+Vv0mpOkTRQoWD2q3BatTOoWbA7gCc2dUhQ=\n++cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=\n++cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=\n++cloud.google.com/go/bigquery v1.69.0 h1:rZvHnjSUs5sHK3F9awiuFk2PeOaB8suqNuim21GbaTc=\n++cloud.google.com/go/bigquery v1.69.0/go.mod h1:TdGLquA3h/mGg+McX+GsqG9afAzTAcldMjqhdjHTLew=\n++cloud.google.com/go/cloudtasks v1.13.6 h1:Fwan19UiNoFD+3KY0MnNHE5DyixOxNzS1mZ4ChOdpy0=\n++cloud.google.com/go/cloudtasks v1.13.6/go.mod h1:/IDaQqGKMixD+ayM43CfsvWF2k36GeomEuy9gL4gLmU=\n++cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA=\n++cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw=\n++cloud.google.com/go/datacatalog v1.26.0 h1:eFgygb3DTufTWWUB8ARk+dSuXz+aefNJXTlkWlQcWwE=\n++cloud.google.com/go/datacatalog v1.26.0/go.mod h1:bLN2HLBAwB3kLTFT5ZKLHVPj/weNz6bR0c7nYp0LE14=\n++cloud.google.com/go/datastore v1.20.0 h1:NNpXoyEqIJmZFc0ACcwBEaXnmscUpcG4NkKnbCePmiM=\n++cloud.google.com/go/datastore v1.20.0/go.mod h1:uFo3e+aEpRfHgtp5pp0+6M0o147KoPaYNaPAKpfh8Ew=\n++cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s=\n++cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU=\n++cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8=\n++cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE=\n++cloud.google.com/go/kms v1.22.0 h1:dBRIj7+GDeeEvatJeTB19oYZNV0aj6wEqSIT/7gLqtk=\n++cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8=\n++cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc=\n++cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA=\n++cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE=\n++cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY=\n++cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM=\n++cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U=\n++cloud.google.com/go/pubsub v1.50.0 h1:hnYpOIxVlgVD1Z8LN7est4DQZK3K6tvZNurZjIVjUe0=\n++cloud.google.com/go/pubsub v1.50.0/go.mod h1:Di2Y+nqXBpIS+dXUEJPQzLh8PbIQZMLE9IVUFhf2zmM=\n++cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0=\n++cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E=\n++cloud.google.com/go/secretmanager v1.15.0 h1:RtkCMgTpaBMbzozcRUGfZe46jb9a3qh5EdEtVRUATF8=\n++cloud.google.com/go/secretmanager v1.15.0/go.mod h1:1hQSAhKK7FldiYw//wbR/XPfPc08eQ81oBsnRUHEvUc=\n++cloud.google.com/go/spanner v1.84.1 h1:ShH4Y3YeDtmHa55dFiSS3YtQ0dmCuP0okfAoHp/d68w=\n++cloud.google.com/go/spanner v1.84.1/go.mod h1:3GMEIjOcXINJSvb42H3M6TdlGCDzaCFpiiNQpjHPlCM=\n++cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2znf0=\n++cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY=\n++cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4=\n++cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI=\n +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\n++github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs=\n++github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=\n++github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3 h1:2afWGsMzkIcN8Qm4mgPJKZWyroE5QBszMiDMYEBrnfw=\n++github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0=\n++github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4=\n++github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw=\n++github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU=\n++github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0=\n++github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk=\n++github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM=\n++github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI=\n++github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0=\n +github.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098 h1:a7+Y8VlXRC2VX5ue6tpCutr4PsrkRkWWVZv4zqfaHuc=\n +github.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098/go.mod h1:idZL3yvz4kzx1dsBOAC+oYv6L92P1oFEhUXUB1A/lwQ=\n-+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\n-+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\n-+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\n-+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\n-+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=\n +github.com/anaskhan96/soup v1.2.5 h1:V/FHiusdTrPrdF4iA1YkVxsOpdNcgvqT1hG+YtcZ5hM=\n +github.com/anaskhan96/soup v1.2.5/go.mod h1:6YnEp9A2yywlYdM4EgDz9NEHclocMepEtku7wg6Cq3s=\n-+github.com/bazelbuild/remote-apis v0.0.0-20230822133051-6c32c3b917cc h1:TPwjNpCdoO7TcTPPMHEkrrlSwd8g2XVf3qflmnivvsU=\n-+github.com/bazelbuild/remote-apis v0.0.0-20230822133051-6c32c3b917cc/go.mod h1:ry8Y6CkQqCVcYsjPOlLXDX2iRVjOnjogdNwhvHmRcz8=\n-+github.com/bazelbuild/remote-apis-sdks v0.0.0-20231114220034-042d9851eb28 h1:/7itEMv7uUfXNXKUq9R8fGYF4Kb+ouOsVYsxSEsKmaw=\n-+github.com/bazelbuild/remote-apis-sdks v0.0.0-20231114220034-042d9851eb28/go.mod h1:E6OuuTP51pswhFFf0TwNQeYQjJ6+xt3nnx4QSzYpvbg=\n-+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\n-+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\n++github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE=\n++github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA=\n++github.com/bazelbuild/remote-apis v0.0.0-20251110153243-3860ca2d3e55 h1:nD+YlIEH8YSXHW6reGLoi7DG0X1KaKRKO83VZ1nPjvE=\n++github.com/bazelbuild/remote-apis v0.0.0-20251110153243-3860ca2d3e55/go.mod h1:/xo1pn3QkEL2JXrLeK30jvjVR/zXM9H8EqcWb/l5/A0=\n++github.com/bazelbuild/remote-apis-sdks v0.0.0-20251202150838-a01d8dc79d0d h1:+WoAGv9vXGDsbHRzIov0tnyzHmxwT73pMSmvolL22V0=\n++github.com/bazelbuild/remote-apis-sdks v0.0.0-20251202150838-a01d8dc79d0d/go.mod h1:sMJ2QK7QssHpNpvbTBmneBJvc+fBHoi26eVoxNwiqIE=\n +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\n +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\n +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=\n +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=\n-+github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=\n-+github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=\n++github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\n++github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\n +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\n-+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\n-+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=\n-+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\n++github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\n++github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\n++github.com/chigopher/pathlib v0.19.1 h1:RoLlUJc0CqBGwq239cilyhxPNLXTK+HXoASGyGznx5A=\n++github.com/chigopher/pathlib v0.19.1/go.mod h1:tzC1dZLW8o33UQpWkNkhvPwL5n4yyFRFm/jL1YGWFvY=\n +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\n +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\n-+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=\n-+github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY=\n-+github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=\n-+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\n++github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls=\n++github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=\n++github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=\n++github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=\n +github.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22 h1:m+Fkk9QEMuV6Z1ithqqYogOHV7Pl6rMKe34NBTJTS/c=\n +github.com/danjacques/gofslock v0.0.0-20240212154529-d899e02bfe22/go.mod h1:jXqs4TJbb7Xtl0FwUgBaOXty8edb/61H37U4D9E5EQE=\n +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n-+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\n +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n++github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\n++github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\n +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\n +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\n +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\n-+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\n-+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=\n++github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=\n++github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA=\n++github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=\n++github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw=\n++github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=\n++github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=\n +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\n-+github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=\n-+github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=\n++github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=\n++github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=\n +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=\n +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\n +github.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966 h1:P/Czr+qFBdKELw4nys0x2e5nkT9niVq/2FS63ArJzm4=\n +github.com/fiorix/go-web v1.0.1-0.20150221144011-5b593f1e8966/go.mod h1:5OPf/2cFhfql2NdV8pCcv9fZJ0e0LC//L+72iX1cqDM=\n +github.com/flynn/json5 v0.0.0-20160717195620-7620272ed633 h1:xJMmr4GMYIbALX5edyoDIOQpc2bOQTeJiWMeCl9lX/8=\n +github.com/flynn/json5 v0.0.0-20160717195620-7620272ed633/go.mod h1:NJDK3/o7abx6PP54EOe0G0n0RLmhCo9xv61gUYpI0EY=\n-+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=\n-+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=\n++github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=\n++github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=\n++github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=\n++github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\n +github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=\n +github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=\n-+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\n-+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\n-+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\n-+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\n-+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\n-+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\n++github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI=\n++github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo=\n +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\n-+github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=\n-+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\n++github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\n++github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\n +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\n +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\n +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=\n +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=\n +github.com/go-python/gpython v0.0.3 h1:QNFZ0h540Lajx7Pi/os06XzzdYUQG+2sV7IvPo/Mvmg=\n +github.com/go-python/gpython v0.0.3/go.mod h1:bmk0l57W/7Cs67MMnz4U28SoYyvz5NTMYyJvUqytJhs=\n-+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\n-+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\n++github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=\n++github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\n++github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=\n++github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\n++github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\n +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\n-+github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=\n-+github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=\n++github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=\n++github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=\n +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\n-+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=\n-+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\n++github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=\n++github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=\n +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\n-+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\n-+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\n++github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U=\n++github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs=\n +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n-+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\n +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\n +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\n@@ -116,154 +150,159 @@ index 0000000000..c0102bb428\n +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\n +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\n +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\n-+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\n +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\n-+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\n-+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\n-+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=\n-+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\n++github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\n++github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\n++github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg=\n++github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=\n +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\n +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\n +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\n +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n-+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n-+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\n-+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=\n-+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=\n-+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\n++github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\n++github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\n +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=\n +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=\n-+github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=\n-+github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=\n-+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n++github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=\n++github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=\n +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n-+github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=\n-+github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n-+github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=\n-+github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=\n-+github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=\n-+github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=\n++github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\n++github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\n++github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=\n++github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=\n++github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo=\n++github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=\n +github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=\n-+github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=\n-+github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=\n +github.com/gopherjs/gopherwasm v1.0.0/go.mod h1:SkZ8z7CWBz5VXbhJel8TxCmAcsQqzgWGR/8nMhyhZSI=\n +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\n +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\n +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\n-+github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=\n-+github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=\n++github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\n++github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\n++github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=\n++github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\n++github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=\n++github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=\n +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk=\n +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=\n++github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=\n++github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=\n++github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=\n++github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\n +github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So=\n +github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0=\n +github.com/jcgregorio/logger v0.1.3 h1:KKKWn4Q0bPpGtLFWEF3Pkv0VtX8Oru3cK0OH0ZozYik=\n +github.com/jcgregorio/logger v0.1.3/go.mod h1:bluD21Aj6/H3hUey6bnsZsIUf/IzO880aQ5iwBWWEy4=\n +github.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900 h1:H8hiPQr5PtkrB5z3Do/9iR5tEwuAFNim68cqcoAlHeY=\n +github.com/jcgregorio/slog v0.0.0-20190423190439-e6f2d537f900/go.mod h1:YT3uVwwZ2P4vmZcM3xICUNJ6dqBwoiSgVAqxHu3rcoo=\n-+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=\n-+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\n-+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\n-+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\n-+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=\n-+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=\n-+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\n++github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=\n++github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=\n +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=\n +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=\n-+github.com/klauspost/compress v1.14.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=\n-+github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=\n-+github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=\n-+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\n-+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\n-+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\n-+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\n-+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\n-+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\n++github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=\n++github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=\n++github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=\n++github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=\n++github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\n++github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\n +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\n +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\n +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=\n +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=\n++github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE=\n++github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk=\n++github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=\n++github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=\n++github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=\n++github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=\n++github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=\n++github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=\n++github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\n++github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\n++github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\n +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=\n-+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\n-+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=\n-+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=\n++github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=\n++github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=\n +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\n +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\n-+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\n-+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\n-+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\n-+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\n-+github.com/mostynb/zstdpool-syncpool v0.0.12 h1:vE8zD0+YdQD9Rca0TAGNexUCOCt1IQbdqRUHJoxxERA=\n-+github.com/mostynb/zstdpool-syncpool v0.0.12/go.mod h1:0YkM6gUZnyeFvLbBRiUYI4PxSiCSI36YNDY/b5iAI04=\n-+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\n-+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\n-+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=\n-+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=\n++github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\n++github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\n +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=\n +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=\n-+github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw=\n-+github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=\n++github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=\n++github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=\n +github.com/peterh/liner v1.1.0/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=\n-+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n-+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n-+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\n++github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=\n++github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=\n +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\n +github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE=\n +github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU=\n-+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\n++github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=\n++github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=\n +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\n-+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\n-+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\n-+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=\n-+github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s=\n-+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=\n-+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\n-+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n++github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\n++github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\n++github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=\n++github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=\n +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n-+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\n-+github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=\n-+github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=\n-+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\n-+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=\n-+github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=\n-+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=\n-+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\n-+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\n-+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=\n-+github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=\n-+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=\n++github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=\n++github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=\n++github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE=\n++github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U=\n++github.com/prometheus/procfs v0.14.0 h1:Lw4VdGGoKEZilJsayHf0B+9YgLGREba2C6xr+Fdfq6s=\n++github.com/prometheus/procfs v0.14.0/go.mod h1:XL+Iwz8k8ZabyZfMFHPiilCniixqQarAy5Mu67pHlNQ=\n +github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac h1:kYPjbEN6YPYWWHI6ky1J813KzIq/8+Wg4TO4xU7A/KU=\n +github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=\n++github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=\n++github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=\n++github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=\n++github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=\n++github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=\n++github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\n++github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=\n++github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=\n++github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=\n++github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=\n +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=\n +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=\n-+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\n-+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\n-+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=\n-+github.com/smarty/assertions v1.15.1 h1:812oFiXI+G55vxsFf+8bIZ1ux30qtkdqzKbEFwyX3Tk=\n-+github.com/smarty/assertions v1.15.1/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec=\n-+github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY=\n-+github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60=\n++github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=\n++github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=\n++github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=\n++github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=\n++github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=\n++github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=\n++github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=\n++github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=\n++github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\n++github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=\n++github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\n++github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=\n++github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=\n++github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=\n++github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=\n +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\n-+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\n +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\n-+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=\n +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\n-+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\n++github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=\n++github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\n +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\n +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\n-+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\n-+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\n +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\n +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\n +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\n +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\n-+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\n-+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\n++github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=\n++github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\n++github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=\n++github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=\n +github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U=\n +github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8=\n +github.com/trietmn/go-wiki v1.0.1 h1:OnKPSfE/XtWH9ybRxD7UcNv4bLzv8WcTWxwMcIDsFyg=\n +github.com/trietmn/go-wiki v1.0.1/go.mod h1:HxeEu4ttJvFkRXY+XQu+ATZEh1S7J75+HRUoiZauzk8=\n++github.com/vektra/mockery/v2 v2.52.2 h1:8QfPKUIrq8P3Cs7G79Iu4Byd5wdhGCE0quIS27x7rQo=\n++github.com/vektra/mockery/v2 v2.52.2/go.mod h1:zGDY/f6bip0Yh13GQ5j7xa43fuEoYBa4ICHEaihisHw=\n +github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE=\n +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=\n +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=\n@@ -274,171 +313,155 @@ index 0000000000..c0102bb428\n +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=\n +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=\n +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=\n-+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\n-+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\n-+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\n++github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\n +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=\n +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=\n++github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=\n++github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=\n +github.com/zeebo/bencode v1.0.0 h1:zgop0Wu1nu4IexAZeCZ5qbsjU4O1vMrfCrVgUjbHVuA=\n +github.com/zeebo/bencode v1.0.0/go.mod h1:Ct7CkrWIQuLWAy9M3atFHYq4kG9Ao/SsY5cdtCXmp9Y=\n-+go.chromium.org/luci v0.0.0-20240206071351-fb32c458db6e h1:JJNTpSU1X9ClKbBtSk4dw6TH9w4hbDkQIpPhPEGp6lw=\n-+go.chromium.org/luci v0.0.0-20240206071351-fb32c458db6e/go.mod h1:Pxji2l9vIPcilS+otwL6AZLNbNxGTzhuXSf1h53SX64=\n++github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=\n++github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=\n++github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=\n++github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=\n++go.chromium.org/luci v0.0.0-20251208084510-e9565e513ef0 h1:ryxGOup980iMtRFc2KrxmpCg38LTyYtAkOWt9q6CKhU=\n++go.chromium.org/luci v0.0.0-20251208084510-e9565e513ef0/go.mod h1:NcnYARnYxsMM0ooU4Wy8+FpPe6tXmXUB9fgqQdEe0Qw=\n++go.einride.tech/aip v0.73.0 h1:bPo4oqBo2ZQeBKo4ZzLb1kxYXTY1ysJhpvQyfuGzvps=\n++go.einride.tech/aip v0.73.0/go.mod h1:Mj7rFbmXEgw0dq1dqJ7JGMvYCZZVxmGOR3S4ZcV5LvQ=\n +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=\n +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=\n-+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs=\n-+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ=\n-+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08=\n-+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw=\n-+go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y=\n-+go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI=\n-+go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg=\n-+go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY=\n-+go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=\n-+go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=\n-+go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0=\n-+go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo=\n-+go.skia.org/infra v0.0.0-20250104003448-783200f5fd9e h1:YvLzsqydWr99JTzsjmHR/fxa3H8EalrQj0FWNWFyI1A=\n-+go.skia.org/infra v0.0.0-20250104003448-783200f5fd9e/go.mod h1:AIyC3mAtE7moB4ippEhflqgrOKPYmqIWJn0Y8APBGzM=\n-+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\n++go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=\n++go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=\n++go.opentelemetry.io/contrib/detectors/gcp v1.37.0 h1:B+WbN9RPsvobe6q4vP6KgM8/9plR/HNjgGBrfcOlweA=\n++go.opentelemetry.io/contrib/detectors/gcp v1.37.0/go.mod h1:K5zQ3TT7p2ru9Qkzk0bKtCql0RGkPj9pRjpXgZJZ+rU=\n++go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw=\n++go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ=\n++go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=\n++go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=\n++go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=\n++go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=\n++go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY=\n++go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw=\n++go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=\n++go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=\n++go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=\n++go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=\n++go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=\n++go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=\n++go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=\n++go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=\n++go.skia.org/infra v0.0.0-20260307000600-5997e0271ce7 h1:SxYJzhHpr5JgVBKzkSSd5SlzdDawed9XqDvGgVD8pZo=\n++go.skia.org/infra v0.0.0-20260307000600-5997e0271ce7/go.mod h1:oSiwDAML1gKAVkA+pjJ1HN+BAdIvR3ktUOa2Uel9Ev0=\n++go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\n++go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\n++go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\n++go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\n +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\n +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\n +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\n-+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\n-+golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=\n-+golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=\n++golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=\n++golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=\n +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\n-+golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No=\n-+golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=\n++golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs=\n++golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo=\n++golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ=\n++golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=\n +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\n +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\n +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\n-+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=\n-+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\n-+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\n-+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\n-+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\n++golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=\n++golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=\n++golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=\n +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n-+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n-+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\n +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\n +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\n-+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\n-+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=\n-+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\n +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\n-+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\n-+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=\n-+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\n-+golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\n-+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\n-+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=\n-+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=\n++golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\n++golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=\n++golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=\n +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\n-+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=\n-+golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ=\n-+golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=\n++golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=\n++golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=\n +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\n-+golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=\n-+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=\n++golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=\n++golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\n +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n-+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n-+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\n +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\n-+golang.org/x/sys v0.0.0-20210507014357-30e306a8bba5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n++golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n +golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n++golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n-+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=\n-+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\n++golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n++golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n++golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\n++golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=\n++golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\n +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\n-+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\n-+golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=\n-+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=\n++golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=\n++golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=\n +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\n-+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\n +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n-+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\n +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\n-+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=\n-+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=\n-+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\n-+golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=\n-+golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=\n++golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=\n++golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=\n++golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=\n++golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=\n +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\n +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\n +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\n +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\n +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\n +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\n-+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\n-+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=\n-+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\n-+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\n++golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=\n++golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=\n++golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=\n++golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=\n++golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=\n +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\n-+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=\n-+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\n-+google.golang.org/api v0.160.0 h1:SEspjXHVqE1m5a1fRy8JFB+5jSu+V0GEDKDghF3ttO4=\n-+google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw=\n++golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=\n++golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=\n++gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=\n++gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=\n++google.golang.org/api v0.248.0 h1:hUotakSkcwGdYUqzCRc5yGYsg4wXxpkKlW5ryVqvC1Y=\n++google.golang.org/api v0.248.0/go.mod h1:yAFUAF56Li7IuIQbTFoLwXTCI6XCFKueOlS7S9e4F9k=\n +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\n +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\n-+google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=\n-+google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=\n +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\n +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\n +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\n-+google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=\n-+google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg=\n-+google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k=\n-+google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe h1:0poefMBYvYbs7g5UkjS6HcxBPaTRAmznle9jnxYoAI8=\n-+google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA=\n-+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac h1:QXtV4qU5zS94SeHJhPqxJQF0XyxssnVrEZOUgp1+NuY=\n-+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ=\n-+google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac h1:nUQEQmH/csSvFECKYRv6HWEyypysidKl2I6Qpsglq/0=\n-+google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA=\n++google.golang.org/genproto v0.0.0-20250818200422-3122310a409c h1:ZERoum3uuqL0PRSc6SXielu26FN96T4BUGaaW0oL+c8=\n++google.golang.org/genproto v0.0.0-20250818200422-3122310a409c/go.mod h1:Q8kep885BJnK3Jt6QZXIFeLHSzoAQtlI1CCloQigiyU=\n++google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c h1:AtEkQdl5b6zsybXcbz00j1LwNodDuH6hVifIaNqk7NQ=\n++google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c/go.mod h1:ea2MjsO70ssTfCjiwHgI0ZFqcw45Ksuk2ckf9G468GA=\n++google.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c h1:CMCT63H4Rl6uNNT10m3hkjCR3JgAv4E9ZuVTeO+Sz98=\n++google.golang.org/genproto/googleapis/bytestream v0.0.0-20250818200422-3122310a409c/go.mod h1:1kGGe25NDrNJYgta9Rp2QLLXWS1FLVMMXNvihbhK0iE=\n++google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c h1:qXWI/sQtv5UKboZ/zUk7h+mrf/lXORyI+n9DKDAusdg=\n++google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo=\n +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\n +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\n +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\n +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\n +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\n-+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=\n-+google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=\n-+google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0=\n-+google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=\n++google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=\n++google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=\n++google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 h1:6Al3kEFFP9VJhRz3DID6quisgPnTeZVr4lep9kkxdPA=\n++google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0/go.mod h1:QLvsjh0OIR0TYBeiu2bkWGTJBUNQ64st52iWj/yA93I=\n +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\n +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\n +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\n@@ -448,28 +471,21 @@ index 0000000000..c0102bb428\n +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\n +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\n-+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\n-+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\n-+google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=\n-+google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=\n-+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\n++google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=\n++google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\n +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n-+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n-+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=\n-+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\n++gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\n++gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\n +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=\n +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\n++gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=\n++gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\n +gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI=\n +gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=\n-+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n-+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\n-+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\n +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\n +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n-+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n\\ No newline at end of file\n++honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n++honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI=\n++honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4=\n\\ No newline at end of file", "summary": "Updated Go module checksums corresponding to the dependency bumps in .disabled.go.mod. Large changeset reflecting the Go ecosystem version updates. No fork-specific modifications.", "relatedFiles": [{"path": ".disabled.go.mod", "relationship": "related"}]}, {"path": "BUILD.gn", "diff": "diff --git a/BUILD.gn b/BUILD.gn\nindex f12d99d1bd..737f4ca480 100644\n--- a/BUILD.gn\n+++ b/BUILD.gn\n@@ -4,25 +4,18 @@\n # found in the LICENSE file.\n \n import(\"gn/codec.gni\")\n-import(\"gn/fuchsia_defines.gni\")\n+import(\"gn/pathops.gni\")\n+import(\"gn/rust.gni\")\n import(\"gn/shared_sources.gni\")\n import(\"gn/skia.gni\")\n import(\"gn/toolchain/wasm.gni\")\n \n-if (is_fuchsia) {\n- import(\"//build/fuchsia/sdk.gni\")\n- import(\"build/fuchsia/fuchsia_download_sdk.gni\")\n-}\n-\n-if (skia_use_dawn) {\n- import(\"//third_party/externals/dawn/scripts/dawn_features.gni\")\n-}\n-\n if (defined(skia_settings)) {\n import(skia_settings)\n }\n \n import(\"gn/ios.gni\")\n+import(\"third_party/dawn/args.gni\")\n \n # Skia public API, generally provided by :skia.\n config(\"skia_public\") {\n@@ -36,7 +29,7 @@ config(\"skia_public\") {\n if (is_component_build) {\n defines += [ \"SKIA_DLL\" ]\n }\n- if (is_fuchsia || is_linux) {\n+ if (is_linux) {\n defines += [ \"SK_R32_SHIFT=16\" ]\n }\n if (skia_enable_optimize_size) {\n@@ -45,9 +38,6 @@ config(\"skia_public\") {\n if (skia_enable_precompile) {\n defines += [ \"SK_ENABLE_PRECOMPILE\" ]\n }\n- if (is_fuchsia) {\n- defines += fuchsia_defines\n- }\n if (is_wasm) {\n defines += wasm_defines\n }\n@@ -70,9 +60,15 @@ config(\"skia_public\") {\n if (skia_use_perfetto) {\n defines += [ \"SK_USE_PERFETTO\" ]\n }\n+ if (!skia_disable_tracing && skia_enable_pipeline_label_tracing) {\n+ defines += [ \"SK_TRACE_GRAPHITE_PIPELINE_USE\" ]\n+ }\n if (skia_use_safe_libcxx) {\n defines += [ \"_LIBCPP_ENABLE_ASSERTIONS=1\" ]\n }\n+ if (skia_build_fuzzers) {\n+ defines += [ \"SK_BUILD_FOR_FUZZER\" ]\n+ }\n \n # Some older versions of the Clang toolchain change the visibility of\n # symbols decorated with API_AVAILABLE macro to be visible. Users of such\n@@ -97,7 +93,7 @@ config(\"skia_private\") {\n \"SK_GAMMA_CONTRAST=0.0\",\n ]\n }\n- if (is_skia_dev_build && !is_wasm) {\n+ if (is_skia_dev_build && !is_canvaskit) {\n defines += [\n \"SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1\",\n \"GPU_TEST_UTILS=1\",\n@@ -108,9 +104,6 @@ config(\"skia_private\") {\n if (skia_use_gl && skia_use_angle) {\n defines += [ \"SK_ANGLE\" ]\n }\n- if (skia_use_vma) {\n- defines += [ \"SK_USE_VMA\" ]\n- }\n if (skia_enable_winuwp) {\n defines += [ \"SK_WINUWP\" ]\n }\n@@ -121,6 +114,14 @@ config(\"skia_private\") {\n defines += [ \"SK_PRINT_NATIVE_SHADERS\" ]\n }\n \n+ if (skia_dump_tasks) {\n+ defines += [ \"SK_DUMP_TASKS\" ]\n+ }\n+\n+ if (skia_use_partition_alloc) {\n+ defines += [ \"SK_USE_PARTITION_ALLOC\" ]\n+ }\n+\n # Temporary staging flag:\n defines += [ \"SK_ENABLE_AVX512_OPTS\" ]\n }\n@@ -223,6 +224,7 @@ template(\"optional\") {\n }\n all_dependent_configs = [ \":\" + target_name + \"_public\" ]\n }\n+\n if (defined(invoker.sources_for_tests) && skia_enable_tools) {\n skia_source_set(target_name + \"_tests\") {\n visibility = [ \":*\" ]\n@@ -265,6 +267,7 @@ template(\"optional\") {\n [\n \"configs\",\n \"public\",\n+ \"public_configs\",\n \"public_defines\",\n \"public_deps\",\n \"deps\",\n@@ -281,7 +284,8 @@ template(\"optional\") {\n sources = invoker.sources_when_disabled\n }\n }\n- if (defined(invoker.sources_for_tests)) {\n+\n+ if (defined(invoker.sources_for_tests) && skia_enable_tools) {\n skia_source_set(target_name + \"_tests\") {\n visibility = [ \":*\" ]\n }\n@@ -304,13 +308,19 @@ optional(\"android_utils\") {\n ]\n }\n \n+optional(\"fontmgr_android_parser\") {\n+ enabled = skia_use_expat\n+\n+ deps = [ \"//third_party/expat\" ]\n+ sources = skia_ports_fontmgr_android_parser_sources\n+}\n+\n optional(\"fontmgr_android\") {\n enabled = skia_enable_fontmgr_android\n \n deps = [\n- \":typeface_freetype\",\n+ \":fontmgr_android_parser\",\n \":typeface_proxy\",\n- \"//third_party/expat\",\n ]\n public_defines = [ \"SK_FONTMGR_ANDROID_AVAILABLE\" ]\n public = skia_ports_fontmgr_android_public\n@@ -324,10 +334,13 @@ optional(\"fontmgr_android_ndk\") {\n enabled = skia_enable_fontmgr_android_ndk\n \n deps = [\n- \":typeface_freetype\",\n+ \":fontmgr_android_parser\",\n \":typeface_proxy\",\n ]\n libs = [ \"android\" ]\n+ if (defined(ndk_api) && ndk_api >= 31) {\n+ libs += [ \"icu\" ]\n+ }\n public_defines = [ \"SK_FONTMGR_ANDROID_NDK_AVAILABLE\" ]\n public = skia_ports_fontmgr_android_ndk_public\n sources = skia_ports_fontmgr_android_ndk_sources\n@@ -387,10 +400,7 @@ optional(\"fontmgr_fontconfig\") {\n # The public header includes fontconfig.h and uses FcConfig*\n public_deps = [ \"//third_party:fontconfig\" ]\n public = skia_ports_fontmgr_fontconfig_public\n- deps = [\n- \":typeface_freetype\",\n- \":typeface_proxy\",\n- ]\n+ deps = [ \":typeface_proxy\" ]\n sources = skia_ports_fontmgr_fontconfig_sources\n sources_for_tests = [ \"tests/FontMgrFontConfigTest.cpp\" ]\n }\n@@ -408,10 +418,7 @@ skia_source_set(\"fontscanner_tests\") {\n optional(\"fontmgr_FontConfigInterface\") {\n enabled = skia_enable_fontmgr_FontConfigInterface\n public_defines = [ \"SK_FONTMGR_FCI_AVAILABLE\" ]\n- deps = [\n- \":typeface_freetype\",\n- \"//third_party:fontconfig\",\n- ]\n+ deps = [ \"//third_party:fontconfig\" ]\n public = skia_ports_fci_public\n sources = skia_ports_fci_sources\n sources_for_tests = [ \"tests/FCITest.cpp\" ]\n@@ -426,20 +433,6 @@ optional(\"fontmgr_fontations_empty\") {\n sources = skia_ports_fontmgr_fontations_sources\n }\n \n-optional(\"fontmgr_fuchsia\") {\n- enabled = skia_enable_fontmgr_fuchsia\n- public_defines = [ \"SK_FONTMGR_FUCHSIA_AVAILABLE\" ]\n- deps = []\n-\n- if (is_fuchsia && using_fuchsia_sdk) {\n- deps += [ \"//build/fuchsia/fidl:fuchsia.fonts\" ]\n- } else {\n- deps = [ \"//sdk/fidl/fuchsia.fonts\" ]\n- }\n- public = skia_ports_fontmgr_fuchsia_public\n- sources = skia_ports_fontmgr_fuchsia_sources\n-}\n-\n optional(\"fontmgr_mac_ct\") {\n enabled = skia_use_fonthost_mac\n \n@@ -567,9 +560,7 @@ if (skia_compile_modules || skia_compile_sksl_tests) {\n \"src/sksl/sksl_frag.sksl\",\n \"src/sksl/sksl_gpu.sksl\",\n \"src/sksl/sksl_graphite_frag.sksl\",\n- \"src/sksl/sksl_graphite_frag_es2.sksl\",\n \"src/sksl/sksl_graphite_vert.sksl\",\n- \"src/sksl/sksl_graphite_vert_es2.sksl\",\n \"src/sksl/sksl_public.sksl\",\n \"src/sksl/sksl_rt_shader.sksl\",\n \"src/sksl/sksl_shared.sksl\",\n@@ -747,7 +738,7 @@ if (skia_compile_sksl_tests) {\n include_dirs = [ \".\" ]\n deps = [\n \":run_sksllex\",\n- \"//third_party/externals/dawn/src/tint/api:api\",\n+ \"//third_party/dawn:tint\",\n \"//third_party/externals/spirv-tools:spvtools\",\n \"//third_party/externals/spirv-tools:spvtools_val\",\n \"//third_party/spirv-cross:spirv_cross\",\n@@ -906,30 +897,7 @@ optional(\"gpu_shared\") {\n \n if (skia_use_dawn) {\n public_defines += [ \"SK_DAWN\" ]\n-\n- # When building for WASM, the WebGPU headers are provided by Emscripten. For native builds we\n- # have to depend on Dawn directly.\n- if (!skia_use_webgpu) {\n- public_deps += [\n- \"//third_party/externals/dawn/include/dawn:cpp_headers\",\n- \"//third_party/externals/dawn/src/dawn:cpp\",\n- \"//third_party/externals/dawn/src/dawn:proc\",\n- ]\n-\n- if (dawn_enable_d3d12 || dawn_enable_d3d11 || dawn_enable_desktop_gl ||\n- dawn_enable_metal || dawn_enable_opengles || dawn_enable_vulkan) {\n- public_deps += [ \"//third_party/externals/dawn/src/dawn/native\" ]\n- }\n- if (dawn_enable_d3d12) {\n- libs += [\n- \"d3d12.lib\",\n- \"dxgi.lib\",\n- \"d3dcompiler.lib\",\n- ]\n- } else if (dawn_enable_metal) {\n- frameworks += [ \"Metal.framework\" ]\n- }\n- }\n+ public_deps += [ \"//third_party/dawn\" ]\n }\n \n if (skia_use_direct3d) {\n@@ -946,6 +914,11 @@ optional(\"gpu_shared\") {\n }\n if (skia_use_vma) {\n sources += skia_vma_sources\n+ # Upstream removed SK_USE_VMA from the GN build in m147 (moved to Bazel\n+ # only). SkiaSharp still uses GN and needs this define so that GrVkGpu.cpp\n+ # compiles the VMA fallback that auto-creates a memory allocator when\n+ # fMemoryAllocator is null.\n+ public_defines += [ \"SK_USE_VMA\" ]\n public_deps += [ \"src/gpu/vk/vulkanmemoryallocator\" ]\n }\n }\n@@ -982,6 +955,7 @@ optional(\"gpu\") {\n frameworks = []\n \n if (is_android) {\n+ public += skia_gpu_android_private_hdrs\n sources += skia_gpu_android_private\n \n # this lib is required to link against AHardwareBuffer\n@@ -1043,13 +1017,6 @@ optional(\"gpu\") {\n public += skia_gpu_vk_public\n sources += skia_gpu_vk_private\n configs += [ \":use_skia_vulkan_headers\" ]\n- if (is_fuchsia) {\n- if (using_fuchsia_sdk) {\n- public_deps += [ \"$fuchsia_sdk_root/pkg:vulkan\" ]\n- } else {\n- public_deps += [ \"//src/graphics/lib/vulkan\" ]\n- }\n- }\n if (is_android) {\n sources += skia_gpu_vk_android_private\n }\n@@ -1058,7 +1025,8 @@ optional(\"gpu\") {\n if (skia_use_direct3d) {\n public_defines += [ \"SK_DIRECT3D\" ]\n deps += [ \"//third_party/d3d12allocator\" ]\n- sources += skia_direct3d_sources\n+ public += skia_ganesh_d3d_public\n+ sources += skia_ganesh_d3d_private\n if (skia_enable_direct3d_debug_layer) {\n public_defines += [ \"SK_ENABLE_D3D_DEBUG_LAYER\" ]\n }\n@@ -1097,21 +1065,6 @@ optional(\"vello\") {\n public_deps = [ \"//third_party/vello\" ]\n }\n \n-optional(\"heif\") {\n- enabled = skia_use_libheif\n- public_defines = [ \"SK_HAS_HEIF_LIBRARY\" ]\n-\n- # This HEIF decoding functionality is a part of the Android Framework.\n- # https://android.googlesource.com/platform/frameworks/av/+/master/media/libheif/include/HeifDecoderAPI.h\n- # There isn't a way to compile that library outside of it, so we just link against\n- # the library. This feature is not supported on other platforms (and we haven't\n- # yet tried something like https://github.com/strukturag/libheif/tree/master/libheif).\n- # The dependency for Android is set in gn_to_bp.py.\n- deps = []\n-\n- sources = [ \"src/codec/SkHeifCodec.cpp\" ]\n-}\n-\n optional(\"avif\") {\n enabled = skia_use_libavif\n public_defines = [ \"SK_CODEC_DECODES_AVIF\" ]\n@@ -1204,6 +1157,7 @@ optional(\"graphite\") {\n libs = []\n frameworks = []\n public_defines = []\n+ public_configs = []\n \n enabled = skia_enable_graphite\n deps = [\n@@ -1243,6 +1197,19 @@ optional(\"graphite\") {\n public += skia_graphite_vk_public\n sources += skia_graphite_vk_sources\n configs += [ \":use_skia_vulkan_headers\" ]\n+ if (skia_enable_precompile) {\n+ public += skia_graphite_vk_precompile_public\n+ sources += skia_graphite_vk_precompile_sources\n+ }\n+ if (is_debug) {\n+ sources += skia_sksl_validate_spirv_sources\n+ deps += [\n+ \"//third_party/externals/spirv-tools:spvtools\",\n+\n+ #spvtools depends on this but doesn't deps it in.\n+ \"//third_party/externals/spirv-tools:spvtools_val\",\n+ ]\n+ }\n }\n if (skia_enable_precompile) {\n public += skia_graphite_precompile_public\n@@ -1253,12 +1220,31 @@ optional(\"graphite\") {\n }\n }\n \n+skia_source_set(\"pathops\") {\n+ configs = skia_library_configs\n+ public = skia_pathops_public\n+ sources = skia_pathops_sources\n+ deps = [ \":core\" ]\n+}\n+\n+skia_source_set(\"clipstack_utils\") {\n+ configs = skia_library_configs\n+ sources = skia_clipstack_utils_sources\n+ deps = [\n+ \":core\",\n+ \":pathops\",\n+ ]\n+}\n+\n optional(\"pdf\") {\n- enabled = skia_use_zlib && skia_enable_pdf && skia_use_libjpeg_turbo_decode &&\n- skia_use_libjpeg_turbo_encode\n+ enabled = skia_use_zlib && skia_enable_pdf\n public_defines = [ \"SK_SUPPORT_PDF\" ]\n \n- deps = [ \"//third_party/zlib\" ]\n+ deps = [\n+ \":clipstack_utils\",\n+ \":pathops\",\n+ \"//third_party/zlib\",\n+ ]\n public = skia_pdf_public\n sources = skia_pdf_sources\n sources_when_disabled = [ \"src/pdf/SkDocument_PDF_None.cpp\" ]\n@@ -1266,19 +1252,35 @@ optional(\"pdf\") {\n deps += [ \"//third_party/harfbuzz\" ]\n defines = [ \"SK_PDF_USE_HARFBUZZ_SUBSET\" ]\n }\n- deps += [\n+}\n+\n+optional(\"pdf_jpeg_helpers\") {\n+ enabled = skia_use_zlib && skia_enable_pdf && skia_use_libjpeg_turbo_decode &&\n+ skia_use_libjpeg_turbo_encode\n+ deps = [\n \":jpeg_decode\",\n \":jpeg_encode\",\n+ \":pdf\",\n ]\n+ public = skia_pdf_jpeg_public\n }\n \n optional(\"xps\") {\n enabled = skia_use_xps && is_win\n public_defines = [ \"SK_SUPPORT_XPS\" ]\n+ deps = [\n+ \":clipstack_utils\",\n+ \":pathops\",\n+ ]\n public = skia_xps_public\n sources = skia_xps_sources\n }\n \n+optional(\"png_decode_common\") {\n+ enabled = skia_use_libpng_decode || skia_use_rust_png_decode\n+ sources = skia_codec_png_base\n+}\n+\n optional(\"png_decode_libpng\") {\n enabled = skia_use_libpng_decode\n public_defines = [\n@@ -1286,22 +1288,36 @@ optional(\"png_decode_libpng\") {\n \"SK_CODEC_DECODES_PNG\",\n \"SK_CODEC_DECODES_PNG_WITH_LIBPNG\",\n ]\n+ sources_for_tests = [ \"tests/PngGainmapTest.cpp\" ]\n+\n+ deps = [\n+ \":png_decode_common\",\n+ \"//third_party/libpng\",\n+ ]\n+ sources = [ \"src/codec/SkIcoCodec.cpp\" ] + skia_codec_libpng_srcs\n+\n+ # Export this so fiddles could decode png using libpng\n+ public = skia_codec_libpng_public\n+}\n \n- deps = [ \"//third_party/libpng\" ]\n- sources = [ \"src/codec/SkIcoCodec.cpp\" ] + skia_codec_png_base +\n- skia_codec_libpng_srcs\n+optional(\"png_encode_common\") {\n+ enabled = skia_use_libpng_encode || skia_use_rust_png_encode\n+ sources = skia_encode_png_base\n }\n \n-optional(\"png_encode\") {\n+optional(\"png_encode_libpng\") {\n enabled = skia_use_libpng_encode && !skia_use_ndk_images\n public_defines = [\n \"SK_CODEC_ENCODES_PNG\",\n \"SK_CODEC_ENCODES_PNG_WITH_LIBPNG\",\n ]\n \n- public = skia_encode_png_public\n- deps = [ \"//third_party/libpng\" ]\n- sources = skia_encode_png_srcs\n+ public = skia_encode_libpng_public\n+ deps = [\n+ \":png_encode_common\",\n+ \"//third_party/libpng\",\n+ ]\n+ sources = skia_encode_libpng_srcs\n }\n \n optional(\"raw\") {\n@@ -1331,11 +1347,12 @@ optional(\"typeface_freetype\") {\n }\n \n bazel_args = []\n-if (is_mac && target_cpu == \"arm64\") {\n- # TODO: Normally the target toolchain would be specified with `--platforms` but that doesn't\n- # work. When building and running on an arm64 mac, setting `--host_platform` seems to do the\n- # right thing but may not be the right build configuration in the long run.\n- bazel_args += [ \"--host_platform=//bazel/platform:mac_arm64_hermetic\" ]\n+if (is_mac) {\n+ if (target_cpu == \"arm64\") {\n+ bazel_args += [ \"--platforms=//bazel/platform:mac_arm64_hermetic\" ]\n+ } else {\n+ bazel_args += [ \"--platforms=//bazel/platform:mac_x64_hermetic\" ]\n+ }\n }\n if (is_debug) {\n bazel_args += [ \"--compilation_mode=dbg\" ]\n@@ -1343,48 +1360,194 @@ if (is_debug) {\n bazel_args += [ \"--compilation_mode=opt\" ]\n }\n \n-if (skia_use_fontations) {\n- action(\"fontations_rust_side_bazel_build\") {\n- script = \"gn/bazel_build.py\"\n- sources = [\n- \"src/ports/fontations/BUILD.bazel\",\n- \"src/ports/fontations/src/ffi.rs\",\n- ]\n- outputs = [ \"$root_out_dir/libbridge_rust_side.a\" ]\n- args =\n- [\n- \"//src/ports/fontations:bridge_rust_side\",\n- rebase_path(\"//bazel-bin/src/ports/fontations/libbridge_rust_side.a\",\n- root_build_dir),\n- ] + bazel_args\n- }\n-\n- # We only use Bazel to get the generated `.cc` and `.h` file and then compile\n- # them on GN/ninja side using `skia_source_set` below. This ensures that the\n- # same C++ stdlib and compiler is used throughout the build (in some scenarios\n- # Bazel may end up using different ones).\n- action(\"fontations_ffi_bazel_build\") {\n- script = \"gn/bazel_build.py\"\n- sources = [\n- \"src/ports/fontations/BUILD.bazel\",\n- \"src/ports/fontations/src/ffi.rs\",\n+# Unified Rust Bazel Build Action\n+# This single action builds all Rust targets to avoid duplicate symbol issues\n+# from having multiple copies of the Rust standard library.\n+\n+if (skia_use_fontations || skia_use_rust_png_decode ||\n+ skia_use_rust_png_encode || skia_use_rust_bmp_decode || skia_use_rust_icc) {\n+ # Collect all Rust targets, sources, outputs based on what's enabled\n+ _rust_targets = []\n+ _rust_sources = []\n+ _rust_outputs = []\n+ _rust_output_mappings = []\n+\n+ # Add cxx dependency if any feature that needs it is enabled\n+ _needs_cxx =\n+ skia_use_fontations || skia_use_rust_png_decode ||\n+ skia_use_rust_png_encode || skia_use_rust_bmp_decode || skia_use_rust_icc\n+ if (_needs_cxx) {\n+ _rust_targets += [ \"@crates//:cxx_cc\" ]\n+ _rust_sources += [\n+ \"MODULE.bazel\",\n+ \"MODULE.bazel.lock\",\n+ \"bazel/external/cxx/BUILD.bazel\",\n+ \"bazel/external/cxx/BUILD.bazel.skia\",\n ]\n- outputs = [\n+ _rust_outputs += [\n+ \"$root_out_dir/libcxx_cc.a\",\n+ \"$root_out_dir/third_party/rust/cxx/v1/cxx.h\",\n+ ]\n+ _rust_output_mappings += [\n+ rebase_path(\n+ \"//bazel-bin/external/rules_rust++crate+crates__cxx-1.0.168/libcxx_cc.a\",\n+ root_build_dir) + \"=libcxx_cc.a\",\n+ rebase_path(\n+ \"//bazel-bin/external/rules_rust++crate+crates__cxx-1.0.168/_virtual_includes/cxx_cc/third_party/rust/cxx/v1/cxx.h\",\n+ root_build_dir) + \"=third_party/rust/cxx/v1/cxx.h\",\n+ ]\n+ }\n+\n+ if (skia_use_fontations) {\n+ _rust_targets += [\n+ \"//src/ports/fontations:bridge_rust_side\",\n+ \"//src/ports/fontations:fontations_ffi\",\n+ ]\n+ _rust_sources += [ \"src/ports/fontations/BUILD.bazel\" ]\n+ _rust_sources += skia_ports_fontations_bridge_rust_side_sources\n+ _rust_outputs += [\n+ \"$root_out_dir/libbridge_rust_side.a\",\n \"$root_out_dir/src/ports/fontations/src/ffi.rs.h\",\n \"$root_out_dir/src/ports/fontations/src/ffi.rs.cc\",\n ]\n- args = [\n- \"//src/ports/fontations:fontations_ffi\",\n+ _rust_output_mappings += [\n+ rebase_path(\"//bazel-bin/src/ports/fontations/libbridge_rust_side.a\",\n+ root_build_dir),\n+ rebase_path(\"//bazel-bin/src/ports/fontations/src/ffi.rs.h\",\n+ root_build_dir) + \"=src/ports/fontations/src/ffi.rs.h\",\n+ rebase_path(\"//bazel-bin/src/ports/fontations/src/ffi.rs.cc\",\n+ root_build_dir) + \"=src/ports/fontations/src/ffi.rs.cc\",\n+ ]\n+ }\n+\n+ if (skia_use_rust_png_decode || skia_use_rust_png_encode) {\n+ _rust_targets += [ \"//rust/png:ffi_rs\" ]\n+ _rust_sources += [\n+ \"rust/png/BUILD.bazel\",\n+ \"rust/png/FFI.h\",\n+ \"rust/png/FFI.rs\",\n+ ]\n+ _rust_outputs += [\n+ \"$root_out_dir/librust_png_ffi_rs.a\",\n+ \"$root_out_dir/rust/png/FFI.rs.h\",\n+ \"$root_out_dir/rust/png/FFI.rs.cc\",\n+ ]\n+ _rust_output_mappings += [\n+ rebase_path(\"//bazel-bin/rust/png/libffi_rs.a\", root_build_dir) +\n+ \"=librust_png_ffi_rs.a\",\n+ rebase_path(\"//bazel-bin/rust/png/FFI.rs.h\", root_build_dir) +\n+ \"=rust/png/FFI.rs.h\",\n+ rebase_path(\"//bazel-bin/rust/png/FFI.rs.cc\", root_build_dir) +\n+ \"=rust/png/FFI.rs.cc\",\n+ ]\n+ }\n+\n+ if (skia_use_rust_bmp_decode) {\n+ _rust_targets += [ \"//experimental/rust_bmp/ffi:ffi_rs\" ]\n+ _rust_sources += [\n+ \"experimental/rust_bmp/ffi/BUILD.bazel\",\n+ \"experimental/rust_bmp/ffi/FFI.rs\",\n+ ]\n+ _rust_outputs += [\n+ \"$root_out_dir/librust_bmp_ffi_rs.a\",\n+ \"$root_out_dir/experimental/rust_bmp/ffi/FFI.rs.h\",\n+ \"$root_out_dir/experimental/rust_bmp/ffi/FFI.rs.cc\",\n+ ]\n+ _rust_output_mappings += [\n+ rebase_path(\"//bazel-bin/experimental/rust_bmp/ffi/libffi_rs.a\",\n+ root_build_dir) + \"=librust_bmp_ffi_rs.a\",\n+ rebase_path(\"//bazel-bin/experimental/rust_bmp/ffi/FFI.rs.h\",\n+ root_build_dir) + \"=experimental/rust_bmp/ffi/FFI.rs.h\",\n+ rebase_path(\"//bazel-bin/experimental/rust_bmp/ffi/FFI.rs.cc\",\n+ root_build_dir) + \"=experimental/rust_bmp/ffi/FFI.rs.cc\",\n+ ]\n+ }\n+\n+ if (skia_use_rust_icc) {\n+ _rust_targets += [ \"//rust/icc:ffi_rs\" ]\n+ _rust_sources += [\n+ \"rust/icc/BUILD.bazel\",\n+ \"rust/icc/FFI.h\",\n+ \"rust/icc/FFI.rs\",\n+ ]\n+ _rust_outputs += [\n+ \"$root_out_dir/librust_icc_ffi_rs.a\",\n+ \"$root_out_dir/rust/icc/FFI.rs.h\",\n+ \"$root_out_dir/rust/icc/FFI.rs.cc\",\n+ ]\n+ _rust_output_mappings += [\n+ rebase_path(\"//bazel-bin/rust/icc/libffi_rs.a\", root_build_dir) +\n+ \"=librust_icc_ffi_rs.a\",\n+ rebase_path(\"//bazel-bin/rust/icc/FFI.rs.h\", root_build_dir) +\n+ \"=rust/icc/FFI.rs.h\",\n+ rebase_path(\"//bazel-bin/rust/icc/FFI.rs.cc\", root_build_dir) +\n+ \"=rust/icc/FFI.rs.cc\",\n+ ]\n+ }\n+\n+ # Single unified action that builds all Rust FFI library targets\n+ action(\"rust_all_ffi_bazel_build\") {\n+ script = \"gn/bazel_build.py\"\n+ sources = _rust_sources\n+ outputs = _rust_outputs\n+ args = _rust_targets + _rust_output_mappings + bazel_args\n+ }\n+\n+ # This group collects all Rust static libraries that should be linked together.\n+ group(\"rust_ffi_libs\") {\n+ deps = [ \":rust_all_ffi_bazel_build\" ]\n+\n+ # Collect all the Rust .a files based on what's enabled\n+ _all_rust_libs = []\n+ if (_needs_cxx) {\n+ _all_rust_libs += [ \"$root_out_dir/libcxx_cc.a\" ]\n+ }\n+ if (skia_use_fontations) {\n+ _all_rust_libs += [ \"$root_out_dir/libbridge_rust_side.a\" ]\n+ }\n+ if (skia_use_rust_png_decode || skia_use_rust_png_encode) {\n+ _all_rust_libs += [ \"$root_out_dir/librust_png_ffi_rs.a\" ]\n+ }\n+ if (skia_use_rust_bmp_decode) {\n+ _all_rust_libs += [ \"$root_out_dir/librust_bmp_ffi_rs.a\" ]\n+ }\n+ if (skia_use_rust_icc) {\n+ _all_rust_libs += [ \"$root_out_dir/librust_icc_ffi_rs.a\" ]\n+ }\n+\n+ public_configs = [ \":rust_ffi_libs_config\" ]\n+ all_dependent_configs = [ \":rust_ffi_libs_config\" ]\n+ }\n+\n+ config(\"rust_ffi_libs_config\") {\n+ _all_rust_libs = []\n+ if (_needs_cxx) {\n+ _all_rust_libs += [ \"$root_out_dir/libcxx_cc.a\" ]\n+ }\n+ if (skia_use_fontations) {\n+ _all_rust_libs += [ \"$root_out_dir/libbridge_rust_side.a\" ]\n+ }\n+ if (skia_use_rust_png_decode || skia_use_rust_png_encode) {\n+ _all_rust_libs += [ \"$root_out_dir/librust_png_ffi_rs.a\" ]\n+ }\n+ if (skia_use_rust_bmp_decode) {\n+ _all_rust_libs += [ \"$root_out_dir/librust_bmp_ffi_rs.a\" ]\n+ }\n+ if (skia_use_rust_icc) {\n+ _all_rust_libs += [ \"$root_out_dir/librust_icc_ffi_rs.a\" ]\n+ }\n+ libs = _all_rust_libs\n \n- # we want the header to not simply be copied into the output directory,\n- # but in the same path as the Bazel build uses.\n- rebase_path(\"//bazel-bin/src/ports/fontations/src/ffi.rs.h\",\n- root_build_dir) + \"=src/ports/fontations/src/ffi.rs.h\",\n- rebase_path(\"//bazel-bin/src/ports/fontations/src/ffi.rs.cc\",\n- root_build_dir) +\n- \"=src/ports/fontations/src/ffi.rs.cc\",\n- ] + bazel_args\n+ # Allow multiple definitions because Bazel's rust_static_library includes\n+ # transitive C++ dependencies, which can lead to duplicate symbols when\n+ # linking multiple Rust libraries together.\n+ if (!is_mac) {\n+ ldflags = [ \"-Wl,--allow-multiple-definition\" ]\n+ }\n }\n+}\n+\n+if (skia_use_fontations) {\n config(\"fontations_ffi_public_config\") {\n include_dirs = [\n # This is where `src/ports/fontations/src/ffi.rs.h` was put by Bazel\n@@ -1400,12 +1563,12 @@ if (skia_use_fontations) {\n }\n skia_source_set(\"fontations_ffi\") {\n deps = [\n- \":fontations_ffi_bazel_build\",\n- \":fontations_rust_side_bazel_build\",\n+ \":rust_all_ffi_bazel_build\",\n+ \":rust_ffi_libs\",\n ]\n public = [ \"${root_out_dir}/src/ports/fontations/src/ffi.rs.h\" ]\n sources = [ \"${root_out_dir}/src/ports/fontations/src/ffi.rs.cc\" ]\n- libs = [ \"$root_out_dir/libbridge_rust_side.a\" ]\n+ libs = [ \"c++\" ]\n public_configs = [ \":fontations_ffi_public_config\" ]\n configs = [ \":fontations_ffi_private_config\" ]\n }\n@@ -1415,6 +1578,14 @@ optional(\"typeface_fontations\") {\n public_defines = [ \"SK_TYPEFACE_FACTORY_FONTATIONS\" ]\n enabled = skia_use_fontations\n public_deps = [ \":fontations_ffi\" ]\n+ deps = []\n+ if (skia_use_rust_png_decode) {\n+ deps += [ \":png_decode_rust\" ]\n+ } else if (skia_use_libpng_decode) {\n+ deps += [ \":png_decode_libpng\" ]\n+ } else {\n+ assert(!enabled, \"Fontations requires a PNG decoder\")\n+ }\n sources = skia_ports_typeface_fontations_sources\n sources_for_tests = [\n \"tests/FontationsTest.cpp\",\n@@ -1424,112 +1595,133 @@ optional(\"typeface_fontations\") {\n }\n \n if (skia_use_rust_png_decode || skia_use_rust_png_encode) {\n- # We only use Bazel to get the generated `.cc` and `.h` file and then compile\n- # them on GN/ninja side using `skia_source_set` below. This ensures that the\n- # same C++ stdlib and compiler is used throughout the build (in some scenarios\n- # Bazel may end up using different ones).\n- action(\"rust_png_ffi_bazel_build\") {\n- script = \"gn/bazel_build.py\"\n- sources = [\n- \"experimental/rust_png/ffi/BUILD.bazel\",\n- \"experimental/rust_png/ffi/FFI.h\",\n- \"experimental/rust_png/ffi/FFI.rs\",\n- ]\n- outputs = [\n- \"$root_out_dir/librust_png_ffi_rs.a\",\n- \"$root_out_dir/experimental/rust_png/ffi/FFI.rs.h\",\n- \"$root_out_dir/experimental/rust_png/ffi/FFI.rs.cc\",\n- ]\n- args =\n- [\n- \"//experimental/rust_png/ffi:*\",\n-\n- rebase_path(\"//bazel-bin/experimental/rust_png/ffi/libffi_rs.a\",\n- root_build_dir) + \"=librust_png_ffi_rs.a\",\n-\n- # we want the `cxx`-generated headers to not simply be copied into\n- # the output directory, but in the same path as the Bazel build\n- # uses.\n- rebase_path(\"//bazel-bin/experimental/rust_png/ffi/FFI.rs.h\",\n- root_build_dir) + \"=experimental/rust_png/ffi/FFI.rs.h\",\n- rebase_path(\"//bazel-bin/experimental/rust_png/ffi/FFI.rs.cc\",\n- root_build_dir) + \"=experimental/rust_png/ffi/FFI.rs.cc\",\n- ] + bazel_args\n- }\n- action(\"rust_png_cxx_core_bazel_build\") {\n- script = \"gn/bazel_build.py\"\n- sources = [\n- \"WORKSPACE.bazel\",\n- \"bazel/external/cxx/BUILD.bazel\",\n- \"bazel/external/cxx/BUILD.bazel.skia\",\n- ]\n- outputs = [\n- \"$root_out_dir/librust_png_cxx_core_lib.a\",\n- \"$root_out_dir/third_party/rust/cxx/v1/cxx.h\",\n- ]\n- args = [\n- \"@cxx//:core-lib\",\n-\n- rebase_path(\"//bazel-bin/external/cxx/libcore-lib.a\",\n- root_build_dir) + \"=librust_png_cxx_core_lib.a\",\n-\n- # we want the `cxx.h` header to not simply be copied into the\n- # output directory, but in the same path as the Bazel build uses.\n- rebase_path(\n- \"//bazel-bin/external/cxx/_virtual_includes/core-lib/third_party/rust/cxx/v1/cxx.h\",\n- root_build_dir) + \"=third_party/rust/cxx/v1/cxx.h\",\n- ] + bazel_args\n- }\n- config(\"rust_png_cxx_bridge_public_config\") {\n- include_dirs = [\n- # This is where `experimental/rust_png/ffi/FFI.rs.h` and\n- # `third_party/rust/cxx/v1/cxx.h` were put by Bazel\n- \"$root_out_dir\",\n- ]\n- }\n config(\"rust_png_cxx_bridge_private_config\") {\n include_dirs = [\n # This entry is needed so that `FFI.rs.cc` can resolve\n- # `#include \"experimental/rust_png/ffi/FFI.h\"`\n+ # `#include \"rust/png/FFI.h\"`\n \".\",\n ]\n }\n skia_source_set(\"rust_png_cxx_bridge\") {\n- deps = [ \":rust_png_ffi_bazel_build\" ]\n- public = [ \"${root_out_dir}/experimental/rust_png/ffi/FFI.rs.h\" ]\n- sources = [ \"${root_out_dir}/experimental/rust_png/ffi/FFI.rs.cc\" ]\n- libs = [ \"$root_out_dir/librust_png_ffi_rs.a\" ]\n- public_configs = [ \":rust_png_cxx_bridge_public_config\" ]\n+ deps = [ \":rust_all_ffi_bazel_build\" ]\n+ public = [ \"${root_out_dir}/rust/png/FFI.rs.h\" ]\n+ sources = [ \"${root_out_dir}/rust/png/FFI.rs.cc\" ]\n+ public_configs = [ \":rust_common_cxx_bridge_public_config\" ]\n configs = [ \":rust_png_cxx_bridge_private_config\" ]\n }\n }\n \n+if (skia_use_rust_icc) {\n+ config(\"rust_icc_cxx_bridge_private_config\") {\n+ include_dirs = [\n+ # This entry is needed so that `FFI.rs.cc` can resolve\n+ # `#include \"rust/icc/FFI.h\"`\n+ \".\",\n+ ]\n+ }\n+ skia_source_set(\"rust_icc_cxx_bridge\") {\n+ deps = [ \":rust_all_ffi_bazel_build\" ]\n+ public = [ \"${root_out_dir}/rust/icc/FFI.rs.h\" ]\n+ sources = [ \"${root_out_dir}/rust/icc/FFI.rs.cc\" ]\n+ public_configs = [ \":rust_common_cxx_bridge_public_config\" ]\n+ configs = [ \":rust_icc_cxx_bridge_private_config\" ]\n+ }\n+}\n+\n+config(\"rust_common_cxx_bridge_public_config\") {\n+ include_dirs = [\n+ # This is where `rust/.../*.rs.h` and\n+ # `third_party/rust/cxx/v1/cxx.h` were put by Bazel\n+ \"$root_out_dir\",\n+ ]\n+}\n+\n+optional(\"rust_common\") {\n+ enabled = skia_use_rust_png_decode || skia_use_rust_png_encode\n+ public = skia_rust_common_ffi_cpp_hdrs\n+ sources = skia_rust_common_ffi_cpp_srcs\n+ public_configs = [ \":rust_common_cxx_bridge_public_config\" ]\n+ deps = [ \":rust_all_ffi_bazel_build\" ]\n+}\n+\n+optional(\"rust_icc\") {\n+ enabled = skia_use_rust_icc\n+ public_defines = [ \"SK_CODEC_COLOR_PROFILE_PARSE_WITH_RUST\" ]\n+ public = skia_rust_icc_ffi_cpp_hdrs + skia_codec_rust_icc_codec_hdrs\n+ sources = skia_rust_icc_ffi_cpp_srcs + skia_codec_rust_icc_codec_srcs\n+ sources_for_tests = [ \"tests/RustIccTest.cpp\" ]\n+ public_configs = [ \":rust_common_cxx_bridge_public_config\" ]\n+ deps = [\n+ \":rust_common\",\n+ \":rust_ffi_libs\",\n+ \":rust_icc_cxx_bridge\",\n+ \"//modules/skcms\",\n+ ]\n+}\n+\n optional(\"png_decode_rust\") {\n public_defines = [ \"SK_CODEC_DECODES_PNG_WITH_RUST\" ]\n enabled = skia_use_rust_png_decode\n public = skia_codec_rust_png_public\n- sources = skia_codec_rust_png + skia_codec_png_base\n+ sources = skia_codec_rust_png\n sources_for_tests = [ \"tests/SkPngRustDecoderTest.cpp\" ]\n \n deps = [\n+ \":png_decode_common\",\n+ \":rust_common\",\n+ \":rust_ffi_libs\",\n \":rust_png_cxx_bridge\",\n- \":rust_png_cxx_core_bazel_build\",\n ]\n- libs = [ \"$root_out_dir/librust_png_cxx_core_lib.a\" ]\n+ libs = [ \"c++\" ]\n }\n \n optional(\"png_encode_rust\") {\n public_defines = [ \"SK_CODEC_ENCODES_PNG_WITH_RUST\" ]\n enabled = skia_use_rust_png_encode\n public = skia_encode_rust_png_public # From `gn/core.gni`\n- sources =\n- skia_encode_rust_png_srcs + skia_encode_png_base # From `gn/core.gni`\n+ sources = skia_encode_rust_png_srcs # From `gn/core.gni`\n sources_for_tests = [ \"tests/SkPngRustEncoderTest.cpp\" ]\n deps = [\n+ \":png_encode_common\",\n+ \":rust_common\",\n+ \":rust_ffi_libs\",\n \":rust_png_cxx_bridge\",\n- \":rust_png_cxx_core_bazel_build\",\n ]\n- libs = [ \"$root_out_dir/librust_png_cxx_core_lib.a\" ]\n+ libs = [ \"c++\" ]\n+}\n+\n+if (skia_use_rust_bmp_decode) {\n+ config(\"rust_bmp_cxx_bridge_public_config\") {\n+ include_dirs = [ \"$root_out_dir\" ]\n+ }\n+ config(\"rust_bmp_cxx_bridge_private_config\") {\n+ include_dirs = [ \".\" ]\n+ }\n+ skia_source_set(\"rust_bmp_cxx_bridge\") {\n+ deps = [ \":rust_all_ffi_bazel_build\" ]\n+ public = [ \"${root_out_dir}/experimental/rust_bmp/ffi/FFI.rs.h\" ]\n+ sources = [ \"${root_out_dir}/experimental/rust_bmp/ffi/FFI.rs.cc\" ]\n+ public_configs = [ \":rust_bmp_cxx_bridge_public_config\" ]\n+ configs = [ \":rust_bmp_cxx_bridge_private_config\" ]\n+ }\n+}\n+\n+optional(\"bmp_decode_rust\") {\n+ public_defines = [ \"SK_CODEC_DECODES_BMP_WITH_RUST\" ]\n+ enabled = skia_use_rust_bmp_decode\n+ public = [ \"experimental/rust_bmp/decoder/SkBmpRustDecoder.h\" ]\n+ sources = [\n+ \"experimental/rust_bmp/decoder/SkBmpRustDecoder.cpp\",\n+ \"experimental/rust_bmp/decoder/SkBmpRustDecoder.h\",\n+ \"experimental/rust_bmp/decoder/impl/SkBmpRustCodec.cpp\",\n+ \"experimental/rust_bmp/decoder/impl/SkBmpRustCodec.h\",\n+ ]\n+ sources_for_tests = [ \"tests/SkBmpRustDecoderTest.cpp\" ]\n+ deps = [\n+ \":rust_bmp_cxx_bridge\",\n+ \":rust_ffi_libs\",\n+ ]\n+ libs = [ \"c++\" ]\n }\n \n optional(\"webp_decode\") {\n@@ -1565,10 +1757,20 @@ optional(\"xml\") {\n public_defines = [ \"SK_XML\" ]\n \n deps = [ \"//third_party/expat\" ]\n- sources = skia_xml_sources + skia_codec_xmp + [\n- \"src/svg/SkSVGCanvas.cpp\",\n- \"src/svg/SkSVGDevice.cpp\",\n- ]\n+ sources = skia_xml_sources\n+ sources += skia_codec_xmp\n+ sources += skia_svg_writer_sources\n+ sources += skia_svg_writer_public\n+\n+ # TODO(lukasza, kjlubick, bungeman): Remove the `deps` below once the legacy\n+ # SVG factories (see `SK_DISABLE_LEGACY_SVG_FACTORIES`) are not supported\n+ # anymore.\n+ if (skia_use_libpng_encode) {\n+ deps += [ \":png_encode_libpng\" ]\n+ }\n+ if (skia_use_rust_png_encode) {\n+ deps += [ \":png_encode_rust\" ]\n+ }\n }\n \n if (skia_enable_ganesh && skia_generate_workarounds) {\n@@ -1597,10 +1799,33 @@ if (skia_enable_ganesh && skia_generate_workarounds) {\n \n import(\"gn/codec.gni\")\n \n-skia_component(\"skia\") {\n+skia_source_set(\"core\") {\n public_configs = [ \":skia_public\" ]\n configs = skia_library_configs\n+ public = skia_core_public\n+ sources = skia_core_sources\n+\n+ # mono/skia: SkiaSharp's C API shims (src/c/gr_context.cpp et al.) are\n+ # compiled into :core via gn/core.gni, but Skia's backend defines live on\n+ # :gpu's all_dependent_configs and therefore don't reach :core. Without\n+ # them, SK_ONLY_DIRECT3D / SK_ONLY_VULKAN / SK_ONLY_METAL collapse to\n+ # stub returns, GPU context factory C entry points never reference\n+ # backend symbols, and the linker strips d3d12/vulkan/metal imports\n+ # from libSkiaSharp. :core's own compile needs the defines; its\n+ # dependents already inherit them from :gpu's chain.\n+ defines = []\n+ if (skia_use_direct3d) {\n+ defines += [ \"SK_DIRECT3D\" ]\n+ }\n+ if (skia_use_vulkan) {\n+ defines += [ \"SK_VULKAN\" ]\n+ configs += [ \":use_skia_vulkan_headers\" ]\n+ }\n+ if (skia_use_metal) {\n+ defines += [ \"SK_METAL\" ]\n+ }\n \n+ # These deps don't belong to :core, but they are currently needed to support (de)serialization.\n public_deps = [\n \":fontmgr_FontConfigInterface\",\n \":fontmgr_android\",\n@@ -1610,15 +1835,26 @@ skia_component(\"skia\") {\n \":fontmgr_custom_empty\",\n \":fontmgr_fontations_empty\",\n \":fontmgr_fontconfig\",\n- \":fontmgr_fuchsia\",\n \":fontmgr_mac_ct\",\n \":fontmgr_win\",\n \":fontmgr_win_gdi\",\n+ \":png_decode_libpng\",\n+ \":png_encode_libpng\",\n+ ]\n+ deps = [ \":typeface_fontations\" ]\n+}\n+\n+skia_component(\"skia\") {\n+ public_configs = [ \":skia_public\" ]\n+ configs = skia_library_configs\n+\n+ public_deps = [\n+ \":core\",\n \":gpu\",\n \":graphite\",\n \":jpeg_encode\",\n \":pdf\",\n- \":png_encode\",\n+ \":pdf_jpeg_helpers\",\n \":webp_encode\",\n \":xps\",\n ]\n@@ -1627,16 +1863,15 @@ skia_component(\"skia\") {\n \":android_utils\",\n \":avif\",\n \":crabbyavif\",\n- \":heif\",\n \":hsw\",\n \":jpeg_decode\",\n \":jpegxl_decode\",\n \":lasx\",\n \":minify_sksl\",\n \":ndk_images\",\n- \":png_decode_libpng\",\n \":png_decode_rust\",\n \":raw\",\n+ \":rust_icc\",\n \":skx\",\n \":typeface_fontations\",\n \":vello\",\n@@ -1646,14 +1881,14 @@ skia_component(\"skia\") {\n \"modules/skcms\",\n ]\n \n- public = skia_core_public\n+ public = []\n public += skia_codec_public\n public += skia_utils_public\n public += skia_effects_public\n public += skia_effects_imagefilter_public\n+ public += skia_android_core_hdrs\n \n sources = []\n- sources += skia_core_sources\n sources += skia_utils_private\n sources += skia_utils_chromium\n sources += skia_effects_sources\n@@ -1666,9 +1901,9 @@ skia_component(\"skia\") {\n sources += skia_sksl_core_module_sources\n sources += skia_sksl_tracing_sources\n sources += skia_ports_sources\n+ sources += skia_android_core_srcs\n sources += [\n \"src/android/SkAndroidFrameworkUtils.cpp\",\n- \"src/android/SkAnimatedImage.cpp\",\n \"src/codec/SkAndroidCodec.cpp\",\n \"src/codec/SkAndroidCodecAdapter.cpp\",\n \"src/codec/SkSampledCodec.cpp\",\n@@ -1678,13 +1913,13 @@ skia_component(\"skia\") {\n \"src/sfnt/SkOTUtils.cpp\",\n ]\n \n+ # TODO(fmalita): remove from skia_utils_private after clients are migrated to\n+ # skia_clipstack_utils_sources\n+ sources -= skia_clipstack_utils_sources\n+\n defines = []\n libs = []\n \n- if (skia_use_vulkan) {\n- configs += [ \":use_skia_vulkan_headers\" ]\n- }\n-\n if (skia_build_for_debugger) {\n defines += [ \"SK_BUILD_FOR_DEBUGGER\" ]\n }\n@@ -1701,8 +1936,8 @@ skia_component(\"skia\") {\n \n if (is_win) {\n sources += skia_ports_windows_sources + [\n- \"src/ports/SkDebug_win.cpp\",\n \"src/ports/SkImageGeneratorWIC.cpp\",\n+ \"src/ports/SkLog_win.cpp\",\n ]\n libs += [\n \"Ole32.lib\",\n@@ -1729,7 +1964,7 @@ skia_component(\"skia\") {\n if (defined(ndk) && ndk != \"\") {\n deps += [ \"//third_party/cpu-features\" ]\n }\n- sources += [ \"src/ports/SkDebug_android.cpp\" ]\n+ sources += [ \"src/ports/SkLog_android.cpp\" ]\n libs += [\n \"EGL\",\n \"GLESv2\",\n@@ -1738,7 +1973,7 @@ skia_component(\"skia\") {\n }\n \n if (is_linux || is_wasm) {\n- sources += [ \"src/ports/SkDebug_stdio.cpp\" ]\n+ sources += [ \"src/ports/SkLog_stdio.cpp\" ]\n if (skia_use_egl) {\n libs += [ \"GLESv2\" ]\n }\n@@ -1747,8 +1982,8 @@ skia_component(\"skia\") {\n if (is_mac) {\n public += [ \"include/ports/SkCFObject.h\" ]\n sources += [\n- \"src/ports/SkDebug_stdio.cpp\",\n \"src/ports/SkImageGeneratorCG.cpp\",\n+ \"src/ports/SkLog_stdio.cpp\",\n ]\n frameworks = [\n \"ApplicationServices.framework\",\n@@ -1759,8 +1994,8 @@ skia_component(\"skia\") {\n if (is_ios) {\n public += [ \"include/ports/SkCFObject.h\" ]\n sources += [\n- \"src/ports/SkDebug_stdio.cpp\",\n \"src/ports/SkImageGeneratorCG.cpp\",\n+ \"src/ports/SkLog_stdio.cpp\",\n ]\n frameworks = [\n \"CoreFoundation.framework\",\n@@ -1769,10 +2004,6 @@ skia_component(\"skia\") {\n ]\n }\n \n- if (is_fuchsia) {\n- sources += [ \"src/ports/SkDebug_stdio.cpp\" ]\n- }\n-\n if (skia_enable_spirv_validation) {\n deps += [ \"//third_party/externals/spirv-tools:spvtools_val\" ]\n defines += [ \"SK_ENABLE_SPIRV_VALIDATION\" ]\n@@ -1788,14 +2019,10 @@ skia_component(\"skia\") {\n defines += [ \"SK_ANDROID_FRAMEWORK_USE_PERFETTO\" ]\n sources += [ \"src/android/SkAndroidFrameworkPerfettoStaticStorage.cpp\" ]\n }\n-\n- if (!skia_enable_ganesh && !skia_enable_graphite) {\n- sources += skia_no_slug_srcs\n- }\n }\n \n # DebugCanvas used in experimental/wasm-skp-debugger\n-if (is_wasm) {\n+if (is_canvaskit) {\n skia_static_library(\"debugcanvas\") {\n public_configs = [ \":skia_public\" ]\n \n@@ -1810,71 +2037,6 @@ if (is_wasm) {\n }\n }\n \n-skia_static_library(\"pathkit\") {\n- check_includes = false\n- public_configs = [ \":skia_public\" ]\n- configs = skia_library_configs\n-\n- deps = [ \":hsw\" ]\n-\n- sources = []\n- sources += skia_pathops_sources\n- sources += skia_pathops_public\n- sources += [\n- \"src/base/SkArenaAlloc.cpp\",\n- \"src/base/SkBezierCurves.cpp\",\n- \"src/base/SkContainers.cpp\",\n- \"src/base/SkCubics.cpp\",\n- \"src/base/SkFloatingPoint.cpp\",\n- \"src/base/SkMalloc.cpp\",\n- \"src/base/SkMathPriv.cpp\",\n- \"src/base/SkQuads.cpp\",\n- \"src/base/SkSafeMath.cpp\",\n- \"src/base/SkSemaphore.cpp\",\n- \"src/base/SkTDArray.cpp\",\n- \"src/base/SkThreadID.cpp\",\n- \"src/base/SkUTF.cpp\",\n- \"src/base/SkUtils.cpp\",\n- \"src/core/SkAnalyticEdge.cpp\",\n- \"src/core/SkContourMeasure.cpp\",\n- \"src/core/SkCubicMap.cpp\",\n- \"src/core/SkEdge.cpp\",\n- \"src/core/SkEdgeBuilder.cpp\",\n- \"src/core/SkEdgeClipper.cpp\",\n- \"src/core/SkGeometry.cpp\",\n- \"src/core/SkIDChangeListener.cpp\",\n- \"src/core/SkLineClipper.cpp\",\n- \"src/core/SkMallocPixelRef.cpp\",\n- \"src/core/SkMatrix.cpp\",\n- \"src/core/SkOpts.cpp\",\n- \"src/core/SkPaint.cpp\",\n- \"src/core/SkPaintPriv.cpp\",\n- \"src/core/SkPath.cpp\",\n- \"src/core/SkPathBuilder.cpp\",\n- \"src/core/SkPathEffect.cpp\",\n- \"src/core/SkPathMeasure.cpp\",\n- \"src/core/SkPathRef.cpp\",\n- \"src/core/SkPathUtils.cpp\",\n- \"src/core/SkPoint.cpp\",\n- \"src/core/SkRRect.cpp\",\n- \"src/core/SkReadBuffer.cpp\",\n- \"src/core/SkRect.cpp\",\n- \"src/core/SkStream.cpp\",\n- \"src/core/SkString.cpp\",\n- \"src/core/SkStringUtils.cpp\",\n- \"src/core/SkStroke.cpp\",\n- \"src/core/SkStrokeRec.cpp\",\n- \"src/core/SkStrokerPriv.cpp\",\n- \"src/effects/SkDashPathEffect.cpp\",\n- \"src/effects/SkTrimPathEffect.cpp\",\n- \"src/ports/SkDebug_stdio.cpp\",\n- \"src/ports/SkMemory_malloc.cpp\",\n- \"src/utils/SkDashPath.cpp\",\n- \"src/utils/SkParse.cpp\",\n- \"src/utils/SkParsePath.cpp\",\n- ]\n-}\n-\n group(\"modules\") {\n deps = [\n \"modules/bentleyottmann\",\n@@ -1884,7 +2046,7 @@ group(\"modules\") {\n \"modules/svg\",\n ]\n \n- if (is_wasm) {\n+ if (is_canvaskit) {\n deps += [ \"modules/canvaskit\" ]\n }\n }\n@@ -1898,52 +2060,99 @@ config(\"vulkan_memory_allocator\") {\n include_dirs = [ \"$skia_vulkan_memory_allocator_dir/include\" ]\n }\n \n-# Targets guarded by skia_enable_tools may use //third_party freely.\n-if (skia_enable_tools) {\n- skia_public_includes = [\n- \"client_utils/android\",\n- \"include/android\",\n- \"include/codec\",\n- \"include/config\",\n- \"include/core\",\n- \"include/docs\",\n- \"include/effects\",\n- \"include/encode\",\n- \"include/gpu\",\n- \"include/pathops\",\n- \"include/ports\",\n- \"include/svg\",\n- \"include/utils\",\n- \"include/utils/mac\",\n- \"modules/skottie/include\",\n- \"modules/skparagraph/include\",\n- \"modules/skshaper/include\",\n- \"modules/svg/include\",\n- ]\n+skia_public_includes = [\n+ \"client_utils/android\",\n+ \"include/android\",\n+ \"include/codec\",\n+ \"include/config\",\n+ \"include/core\",\n+ \"include/docs\",\n+ \"include/effects\",\n+ \"include/encode\",\n+ \"include/gpu\",\n+ \"include/pathops\",\n+ \"include/ports\",\n+ \"include/svg\",\n+ \"include/utils\",\n+ \"include/utils/mac\",\n+ \"modules/skottie/include\",\n+ \"modules/skparagraph/include\",\n+ \"modules/skshaper/include\",\n+ \"modules/svg/include\",\n+]\n \n- # Used by gn_to_bp.py to list our public include dirs.\n- skia_source_set(\"public\") {\n- configs = [ \":skia_public\" ]\n- include_dirs = skia_public_includes\n- }\n+# Used by gn_to_bp.py to list our public include dirs.\n+skia_source_set(\"public\") {\n+ configs = [ \":skia_public\" ]\n+ include_dirs = skia_public_includes\n+}\n \n- config(\"skia.h_config\") {\n- include_dirs = [ \"$target_gen_dir\" ]\n- }\n- action(\"skia.h\") {\n- public_configs = [ \":skia.h_config\" ]\n- skia_h = \"$target_gen_dir/skia.h\"\n- script = \"gn/find_headers.py\"\n+config(\"skia.h_config\") {\n+ include_dirs = [ \"$target_gen_dir\" ]\n+}\n+action(\"skia.h\") {\n+ public_configs = [ \":skia.h_config\" ]\n+ skia_h = \"$target_gen_dir/skia.h\"\n+ script = \"gn/find_headers.py\"\n \n- args = [ rebase_path(\"//bin/gn\") ] + [ rebase_path(\"//\") ] +\n- [ rebase_path(skia_h, root_build_dir) ] +\n- rebase_path(skia_public_includes)\n- depfile = \"$skia_h.deps\"\n- outputs = [ skia_h ]\n- }\n+ args = [ rebase_path(\"//bin/gn\") ] + [ rebase_path(\"//\") ] +\n+ [ rebase_path(skia_h, root_build_dir) ] +\n+ rebase_path(skia_public_includes)\n+ depfile = \"$skia_h.deps\"\n+ outputs = [ skia_h ]\n+}\n \n- if (is_linux && target_cpu == \"x64\") {\n- skia_executable(\"fiddle\") {\n+skia_source_set(\"public_headers_warnings_check\") {\n+ sources = [ \"tools/public_headers_warnings_check.cpp\" ]\n+ configs = [ \":use_skia_vulkan_headers\" ]\n+ if (defined(skia_header_target_default_configs)) {\n+ configs += skia_header_target_default_configs\n+ }\n+ deps = [\n+ \":skia\",\n+ \":skia.h\",\n+ \"modules/skottie\",\n+ \"modules/skshaper\",\n+ ]\n+\n+ if (skia_use_dawn) {\n+ deps += [ \"//third_party/dawn\" ]\n+ }\n+}\n+\n+# TODO: have each optional provide a target with examples and depend on those.\n+if (((skia_enable_fontmgr_fontconfig && skia_use_freetype) ||\n+ skia_use_fonthost_mac || skia_enable_fontmgr_win ||\n+ skia_enable_fontmgr_custom_directory) && skia_enable_ganesh &&\n+ skia_use_libjpeg_turbo_encode && skia_use_libjpeg_turbo_decode &&\n+ (skia_use_libpng_encode && !skia_use_ndk_images) && skia_use_zlib &&\n+ skia_enable_pdf && !skia_use_vulkan) {\n+ skia_executable(\"fiddle_examples\") {\n+ sources = [\n+ \"tools/fiddle/all_examples.cpp\",\n+ \"tools/fiddle/examples.cpp\",\n+ \"tools/fiddle/examples.h\",\n+ ]\n+ if (is_win) {\n+ cflags = [\n+ \"/wd4756\", # Overflow in constant arithmetic\n+ \"/wd4305\", # truncation from 'double' to 'float'\n+ ]\n+ }\n+ deps = [\n+ \":skia\",\n+ \":skia.h\",\n+ ]\n+ if (skia_use_dawn) {\n+ deps += [ \"//third_party/dawn\" ]\n+ }\n+ }\n+}\n+\n+# Targets guarded by skia_enable_tools may use //third_party freely.\n+if (skia_enable_tools) {\n+ if (is_linux && target_cpu == \"x64\" && skia_enable_ganesh) {\n+ skia_executable(\"fiddle\") {\n check_includes = false\n libs = []\n sources = [\n@@ -1970,35 +2179,6 @@ if (skia_enable_tools) {\n }\n }\n \n- config(\"cpp17\") {\n- if (is_win) {\n- cflags_cc = [ \"/std:c++17\" ]\n- } else {\n- cflags_cc = [ \"-std=c++17\" ]\n- }\n- }\n-\n- skia_source_set(\"public_headers_warnings_check\") {\n- sources = [ \"tools/public_headers_warnings_check.cpp\" ]\n- configs = [\n- \":use_skia_vulkan_headers\",\n- \":cpp17\",\n- ]\n- if (defined(skia_header_target_default_configs)) {\n- configs += skia_header_target_default_configs\n- }\n- deps = [\n- \":skia\",\n- \":skia.h\",\n- \"modules/skottie\",\n- \"modules/skshaper\",\n- ]\n-\n- if (skia_use_dawn) {\n- deps += [ \"//third_party/externals/dawn/include/dawn:headers\" ]\n- }\n- }\n-\n template(\"test_lib\") {\n config(target_name + \"_config\") {\n if (defined(invoker.public_defines)) {\n@@ -2101,167 +2281,190 @@ if (skia_enable_tools) {\n }\n }\n \n- test_lib(\"gpu_tool_utils\") {\n- public_defines = []\n-\n- # Bots and even devs may not have Vulkan headers, so put\n- # include/third_party/vulkan on our path so they're always available.\n- all_dependent_configs = [ \":use_skia_vulkan_headers\" ]\n+ if (skia_enable_graphite || skia_enable_ganesh) {\n+ test_lib(\"gpu_tool_utils\") {\n+ public_defines = []\n \n- defines = []\n- if (skia_enable_discrete_gpu) {\n- defines += [ \"SK_ENABLE_DISCRETE_GPU\" ]\n- }\n-\n- deps = [ \":load_dynamic_library\" ]\n- public_deps = []\n- sources = [\n- \"tools/gpu/BackendSurfaceFactory.cpp\",\n- \"tools/gpu/BackendSurfaceFactory.h\",\n- \"tools/gpu/BackendTextureImageFactory.cpp\",\n- \"tools/gpu/BackendTextureImageFactory.h\",\n- \"tools/gpu/ContextType.cpp\",\n- \"tools/gpu/ContextType.h\",\n- \"tools/gpu/FlushFinishTracker.cpp\",\n- \"tools/gpu/FlushFinishTracker.h\",\n- \"tools/gpu/GrContextFactory.cpp\",\n- \"tools/gpu/GrContextFactory.h\",\n- \"tools/gpu/GrTest.cpp\",\n- \"tools/gpu/ManagedBackendTexture.cpp\",\n- \"tools/gpu/ManagedBackendTexture.h\",\n- \"tools/gpu/MemoryCache.cpp\",\n- \"tools/gpu/MemoryCache.h\",\n- \"tools/gpu/ProtectedUtils.cpp\",\n- \"tools/gpu/ProtectedUtils.h\",\n- \"tools/gpu/ProxyUtils.cpp\",\n- \"tools/gpu/ProxyUtils.h\",\n- \"tools/gpu/TestCanvas.cpp\",\n- \"tools/gpu/TestCanvas.h\",\n- \"tools/gpu/TestContext.cpp\",\n- \"tools/gpu/TestOps.cpp\",\n- \"tools/gpu/TestOps.h\",\n- \"tools/gpu/YUVUtils.cpp\",\n- \"tools/gpu/YUVUtils.h\",\n- \"tools/gpu/mock/MockTestContext.cpp\",\n- \"tools/text/gpu/TextBlobTools.cpp\",\n- ]\n-\n- libs = []\n- frameworks = []\n+ # Bots and even devs may not have Vulkan headers, so put\n+ # include/third_party/vulkan on our path so they're always available.\n+ all_dependent_configs = [ \":use_skia_vulkan_headers\" ]\n \n- if (skia_use_gl) {\n- sources += [ \"tools/gpu/gl/GLTestContext.cpp\" ]\n- if (is_ios) {\n- sources += [ \"tools/gpu/gl/iOS/CreatePlatformGLTestContext_iOS.mm\" ]\n- frameworks += [ \"OpenGLES.framework\" ]\n- } else if (is_mac) {\n- sources += [ \"tools/gpu/gl/mac/CreatePlatformGLTestContext_mac.cpp\" ]\n- }\n- if (skia_use_angle) {\n- deps += [ \"//third_party/angle2\" ]\n- sources += [ \"tools/gpu/gl/angle/GLTestContext_angle.cpp\" ]\n+ defines = []\n+ if (skia_enable_discrete_gpu) {\n+ defines += [ \"SK_ENABLE_DISCRETE_GPU\" ]\n }\n- }\n \n- if (skia_use_gl && target_cpu != \"wasm\") {\n- if (is_android || skia_use_egl) {\n- sources += [ \"tools/gpu/gl/egl/CreatePlatformGLTestContext_egl.cpp\" ]\n- libs += [ \"EGL\" ]\n- } else if (is_linux) {\n- sources += [ \"tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp\" ]\n- libs += [\n- \"GLU\",\n- \"GL\",\n- \"X11\",\n- ]\n- } else if (is_win) {\n- sources += [\n- \"tools/gpu/gl/win/CreatePlatformGLTestContext_win.cpp\",\n- \"tools/gpu/gl/win/SkWGL.h\",\n- \"tools/gpu/gl/win/SkWGL_win.cpp\",\n- ]\n- libs += [ \"Gdi32.lib\" ]\n- if (target_cpu != \"arm64\") {\n- libs += [ \"OpenGL32.lib\" ]\n+ deps = [ \":load_dynamic_library\" ]\n+ public_deps = []\n+ sources = [\n+ \"tools/gpu/BackendSurfaceFactory.cpp\",\n+ \"tools/gpu/BackendSurfaceFactory.h\",\n+ \"tools/gpu/BackendTextureImageFactory.cpp\",\n+ \"tools/gpu/BackendTextureImageFactory.h\",\n+ \"tools/gpu/CompressedTexture.cpp\",\n+ \"tools/gpu/CompressedTexture.h\",\n+ \"tools/gpu/ContextType.cpp\",\n+ \"tools/gpu/ContextType.h\",\n+ \"tools/gpu/FlushFinishTracker.cpp\",\n+ \"tools/gpu/FlushFinishTracker.h\",\n+ \"tools/gpu/ManagedBackendTexture.cpp\",\n+ \"tools/gpu/ManagedBackendTexture.h\",\n+ \"tools/gpu/ProtectedUtils.h\",\n+ \"tools/gpu/YUVUtils.cpp\",\n+ \"tools/gpu/YUVUtils.h\",\n+ ]\n+\n+ libs = []\n+ frameworks = []\n+\n+ if (skia_use_gl && !is_canvaskit) {\n+ if (is_android || skia_use_egl) {\n+ sources +=\n+ [ \"tools/ganesh/gl/egl/CreatePlatformGLTestContext_egl.cpp\" ]\n+ libs += [ \"EGL\" ]\n+ } else if (is_linux) {\n+ sources +=\n+ [ \"tools/ganesh/gl/glx/CreatePlatformGLTestContext_glx.cpp\" ]\n+ libs += [\n+ \"GLU\",\n+ \"GL\",\n+ \"X11\",\n+ ]\n+ } else if (is_win) {\n+ sources += [\n+ \"tools/ganesh/gl/win/CreatePlatformGLTestContext_win.cpp\",\n+ \"tools/ganesh/gl/win/SkWGL.h\",\n+ \"tools/ganesh/gl/win/SkWGL_win.cpp\",\n+ ]\n+ libs += [ \"Gdi32.lib\" ]\n+ if (target_cpu != \"arm64\") {\n+ libs += [ \"OpenGL32.lib\" ]\n+ }\n+ } else if (is_wasm) {\n+ # TODO: replace with webgl test context\n+ sources +=\n+ [ \"tools/ganesh/gl/none/CreatePlatformGLTestContext_none.cpp\" ]\n }\n }\n- }\n \n- if (skia_use_vulkan) {\n- sources += [ \"tools/gpu/vk/VkTestContext.h\" ]\n- sources += [ \"tools/gpu/vk/VkTestContext.cpp\" ]\n- sources += [ \"tools/gpu/vk/VkTestHelper.h\" ]\n- sources += [ \"tools/gpu/vk/VkTestHelper.cpp\" ]\n- sources += [ \"tools/gpu/vk/VkTestMemoryAllocator.h\" ]\n- sources += [ \"tools/gpu/vk/VkTestMemoryAllocator.cpp\" ]\n- sources += [ \"tools/gpu/vk/VkTestUtils.h\" ]\n- sources += [ \"tools/gpu/vk/VkTestUtils.cpp\" ]\n- sources += [ \"tools/gpu/vk/VkYcbcrSamplerHelper.h\" ]\n- sources += [ \"tools/gpu/vk/VkYcbcrSamplerHelper.cpp\" ]\n- all_dependent_configs += [ \":vulkan_memory_allocator\" ]\n- }\n- if (skia_use_metal) {\n- sources += [ \"tools/gpu/mtl/MtlTestContext.mm\" ]\n- }\n- if (skia_use_direct3d) {\n- sources += [ \"tools/gpu/d3d/D3DTestContext.cpp\" ]\n- sources += [ \"tools/gpu/d3d/D3DTestUtils.cpp\" ]\n- }\n- if (skia_use_dawn) {\n- public_deps += [ \"//third_party/externals/dawn/include/dawn:headers\" ]\n- if (is_clang) {\n- cflags_cc = [ \"-Wno-microsoft-cast\" ]\n+ if (skia_use_vulkan) {\n+ sources += [ \"tools/gpu/vk/VkTestHelper.h\" ]\n+ sources += [ \"tools/gpu/vk/VkTestHelper.cpp\" ]\n+ sources += [ \"tools/gpu/vk/VkTestMemoryAllocator.h\" ]\n+ sources += [ \"tools/gpu/vk/VkTestMemoryAllocator.cpp\" ]\n+ sources += [ \"tools/gpu/vk/VkTestUtils.h\" ]\n+ sources += [ \"tools/gpu/vk/VkTestUtils.cpp\" ]\n+ sources += [ \"tools/gpu/vk/VkYcbcrSamplerHelper.h\" ]\n+ sources += [ \"tools/gpu/vk/VkYcbcrSamplerHelper.cpp\" ]\n+ all_dependent_configs += [ \":vulkan_memory_allocator\" ]\n }\n- }\n- if (!skia_enable_ganesh) {\n- sources -= [ \"tools/gpu/GrTest.cpp\" ]\n- sources -= [ \"tools/gpu/TestOps.cpp\" ]\n- sources -= [ \"tools/gpu/TestOps.h\" ]\n- } else {\n- sources += [\n- \"tools/gpu/ganesh/AtlasTextOpTools.cpp\",\n- \"tools/gpu/ganesh/AtlasTextOpTools.h\",\n- \"tools/gpu/ganesh/GrAtlasTools.cpp\",\n- \"tools/gpu/ganesh/GrAtlasTools.h\",\n- ]\n- }\n- if (skia_enable_graphite) {\n- sources += [\n- \"tools/graphite/ContextFactory.cpp\",\n- \"tools/graphite/ContextFactory.h\",\n- \"tools/graphite/GraphiteTestContext.cpp\",\n- \"tools/graphite/GraphiteTestContext.h\",\n- \"tools/graphite/GraphiteToolUtils.cpp\",\n- \"tools/graphite/GraphiteToolUtils.h\",\n- \"tools/graphite/ProtectedUtils_Graphite.cpp\",\n- \"tools/graphite/UniqueKeyUtils.cpp\",\n- \"tools/graphite/UniqueKeyUtils.h\",\n- ]\n+\n if (skia_use_dawn) {\n- sources += [\n- \"tools/graphite/dawn/GraphiteDawnTestContext.cpp\",\n- \"tools/graphite/dawn/GraphiteDawnTestContext.h\",\n- ]\n+ public_deps += [ \"//third_party/dawn\" ]\n+ if (is_clang) {\n+ cflags_cc = [ \"-Wno-microsoft-cast\" ]\n+ }\n }\n- if (skia_use_metal) {\n+ if (skia_enable_ganesh) {\n sources += [\n- \"tools/graphite/mtl/GraphiteMtlTestContext.h\",\n- \"tools/graphite/mtl/GraphiteMtlTestContext.mm\",\n+ \"tools/ganesh/AtlasTextOpTools.cpp\",\n+ \"tools/ganesh/AtlasTextOpTools.h\",\n+ \"tools/ganesh/DDLPromiseImageHelper.cpp\",\n+ \"tools/ganesh/DDLPromiseImageHelper.h\",\n+ \"tools/ganesh/DDLTileHelper.cpp\",\n+ \"tools/ganesh/DDLTileHelper.h\",\n+ \"tools/ganesh/GrAtlasTools.cpp\",\n+ \"tools/ganesh/GrAtlasTools.h\",\n+ \"tools/ganesh/GrContextFactory.cpp\",\n+ \"tools/ganesh/GrContextFactory.h\",\n+ \"tools/ganesh/GrTest.cpp\",\n+ \"tools/ganesh/MemoryCache.cpp\",\n+ \"tools/ganesh/MemoryCache.h\",\n+ \"tools/ganesh/ProtectedUtils_Ganesh.cpp\",\n+ \"tools/ganesh/ProxyUtils.cpp\",\n+ \"tools/ganesh/ProxyUtils.h\",\n+ \"tools/ganesh/TestCanvas.cpp\",\n+ \"tools/ganesh/TestCanvas.h\",\n+ \"tools/ganesh/TestContext.cpp\",\n+ \"tools/ganesh/TestOps.cpp\",\n+ \"tools/ganesh/TestOps.h\",\n+ \"tools/ganesh/mock/MockTestContext.cpp\",\n+ \"tools/text/gpu/TextBlobTools.cpp\",\n ]\n+ if (skia_use_gl) {\n+ sources += [ \"tools/ganesh/gl/GLTestContext.cpp\" ]\n+ if (is_ios) {\n+ sources +=\n+ [ \"tools/ganesh/gl/iOS/CreatePlatformGLTestContext_iOS.mm\" ]\n+ frameworks += [ \"OpenGLES.framework\" ]\n+ } else if (is_mac) {\n+ sources +=\n+ [ \"tools/ganesh/gl/mac/CreatePlatformGLTestContext_mac.cpp\" ]\n+ }\n+ if (skia_use_angle) {\n+ deps += [ \"//third_party/angle2\" ]\n+ sources += [ \"tools/ganesh/gl/angle/GLTestContext_angle.cpp\" ]\n+ }\n+ }\n+ if (skia_use_vulkan) {\n+ sources += [ \"tools/ganesh/vk/VkTestContext.h\" ]\n+ sources += [ \"tools/ganesh/vk/VkTestContext.cpp\" ]\n+ }\n+ if (skia_use_metal) {\n+ sources += [ \"tools/ganesh/mtl/MtlTestContext.mm\" ]\n+ }\n+ if (skia_use_direct3d) {\n+ sources += [\n+ \"tools/ganesh/d3d/D3DTestContext.cpp\",\n+ \"tools/ganesh/d3d/D3DTestUtils.cpp\",\n+ ]\n+ }\n }\n- if (skia_use_vulkan) {\n+ if (skia_enable_graphite) {\n sources += [\n- \"tools/graphite/vk/GraphiteVulkanTestContext.cpp\",\n- \"tools/graphite/vk/GraphiteVulkanTestContext.h\",\n+ \"tools/graphite/ContextFactory.cpp\",\n+ \"tools/graphite/ContextFactory.h\",\n+ \"tools/graphite/GraphiteMemoryPipelineStorage.cpp\",\n+ \"tools/graphite/GraphiteMemoryPipelineStorage.h\",\n+ \"tools/graphite/GraphiteTestContext.cpp\",\n+ \"tools/graphite/GraphiteTestContext.h\",\n+ \"tools/graphite/GraphiteToolUtils.cpp\",\n+ \"tools/graphite/GraphiteToolUtils.h\",\n+ \"tools/graphite/PipelineCallbackHandler.cpp\",\n+ \"tools/graphite/PipelineCallbackHandler.h\",\n+ \"tools/graphite/ProtectedUtils_Graphite.cpp\",\n+ \"tools/graphite/UniqueKeyUtils.cpp\",\n+ \"tools/graphite/UniqueKeyUtils.h\",\n ]\n+ if (skia_use_dawn) {\n+ sources += [\n+ \"tools/graphite/dawn/GraphiteDawnTestContext.cpp\",\n+ \"tools/graphite/dawn/GraphiteDawnTestContext.h\",\n+ \"tools/graphite/dawn/GraphiteDawnToggles.cpp\",\n+ \"tools/graphite/dawn/GraphiteDawnToggles.h\",\n+ ]\n+ }\n+ if (skia_use_metal) {\n+ sources += [\n+ \"tools/graphite/mtl/GraphiteMtlTestContext.h\",\n+ \"tools/graphite/mtl/GraphiteMtlTestContext.mm\",\n+ ]\n+ }\n+ if (skia_use_vulkan) {\n+ sources += [\n+ \"tools/graphite/vk/GraphiteVulkanTestContext.cpp\",\n+ \"tools/graphite/vk/GraphiteVulkanTestContext.h\",\n+ ]\n+ }\n+ if (skia_enable_precompile) {\n+ sources += [\n+ \"tools/graphite/precompile/PrecompileEffectFactories.cpp\",\n+ \"tools/graphite/precompile/PrecompileEffectFactories.h\",\n+ ]\n+ }\n }\n- }\n-\n- if (is_fuchsia && using_fuchsia_sdk) {\n- libs +=\n- [ \"${fuchsia_sdk_path}/arch/${target_cpu}/sysroot/lib/libzircon.so\" ]\n- }\n- } # test_lib(\"gpu_tool_utils\")\n+ } # test_lib(\"gpu_tool_utils\")\n+ }\n \n test_lib(\"flags\") {\n sources = [\n@@ -2277,17 +2480,20 @@ if (skia_enable_tools) {\n \"tools/flags/CommonFlagsConfig.h\",\n ]\n deps = [ \":flags\" ]\n- public_deps = [ \":gpu_tool_utils\" ]\n }\n- test_lib(\"common_flags_gpu\") {\n- sources = [ \"tools/flags/CommonFlagsGanesh.cpp\" ]\n- deps = [ \":flags\" ]\n- public_deps = [ \":gpu_tool_utils\" ]\n+ if (skia_enable_ganesh) {\n+ test_lib(\"common_flags_ganesh\") {\n+ sources = [ \"tools/flags/CommonFlagsGanesh.cpp\" ]\n+ deps = [ \":flags\" ]\n+ public_deps = [ \":gpu_tool_utils\" ]\n+ }\n }\n- test_lib(\"common_flags_graphite\") {\n- sources = [ \"tools/flags/CommonFlagsGraphite.cpp\" ]\n- deps = [ \":flags\" ]\n- public_deps = [ \":gpu_tool_utils\" ]\n+ if (skia_enable_graphite) {\n+ test_lib(\"common_flags_graphite\") {\n+ sources = [ \"tools/flags/CommonFlagsGraphite.cpp\" ]\n+ deps = [ \":flags\" ]\n+ public_deps = [ \":gpu_tool_utils\" ]\n+ }\n }\n test_lib(\"common_flags_images\") {\n sources = [ \"tools/flags/CommonFlagsImages.cpp\" ]\n@@ -2318,12 +2524,10 @@ if (skia_enable_tools) {\n sources = [\n \"tools/AndroidSkDebugToStdOut.cpp\",\n \"tools/AutoreleasePool.h\",\n- \"tools/DDLPromiseImageHelper.cpp\",\n- \"tools/DDLPromiseImageHelper.h\",\n- \"tools/DDLTileHelper.cpp\",\n- \"tools/DDLTileHelper.h\",\n \"tools/DecodeUtils.cpp\",\n \"tools/DecodeUtils.h\",\n+ \"tools/DeserialProcsUtils.cpp\",\n+ \"tools/DeserialProcsUtils.h\",\n \"tools/EncodeUtils.cpp\",\n \"tools/EncodeUtils.h\",\n \"tools/GpuToolUtils.h\",\n@@ -2386,7 +2590,7 @@ if (skia_enable_tools) {\n ]\n }\n \n- if (target_cpu != \"wasm\") {\n+ if (!is_canvaskit) {\n sources += [ \"tools/CrashHandler.cpp\" ]\n }\n libs = []\n@@ -2411,10 +2615,10 @@ if (skia_enable_tools) {\n if (skia_enable_svg) {\n deps += [ \"modules/svg\" ]\n }\n- public_deps = [\n- \":gpu_tool_utils\",\n- \"modules/jsonreader\",\n- ]\n+ public_deps = [ \"modules/jsonreader\" ]\n+ if (skia_enable_ganesh || skia_enable_graphite) {\n+ public_deps += [ \":gpu_tool_utils\" ]\n+ }\n }\n \n test_lib(\"etc1\") {\n@@ -2430,6 +2634,12 @@ if (skia_enable_tools) {\n if (!skia_enable_ganesh) {\n sources -= ganesh_gm_sources\n }\n+ if (!skia_enable_graphite) {\n+ sources -= graphite_gm_sources\n+ }\n+ if (!skia_enable_ganesh && !skia_enable_graphite) {\n+ sources -= gpu_gm_sources\n+ }\n if (skia_use_fontations) {\n sources += fontations_gm_sources\n }\n@@ -2449,7 +2659,9 @@ if (skia_enable_tools) {\n sources += [ \"gm/fiddle.cpp\" ]\n deps += [ \":skia.h\" ]\n }\n- public_deps = [ \":gpu_tool_utils\" ]\n+ if (skia_enable_graphite || skia_enable_ganesh) {\n+ public_deps = [ \":gpu_tool_utils\" ]\n+ }\n \n if (skia_use_ffmpeg) {\n deps += [ \"experimental/ffmpeg:video_decoder\" ]\n@@ -2459,109 +2671,127 @@ if (skia_enable_tools) {\n \n test_lib(\"test\") {\n sources = [\n+ \"tests/ComparePixels.cpp\",\n+ \"tests/ComparePixels.h\",\n \"tests/CtsEnforcement.cpp\",\n \"tests/Test.cpp\",\n \"tests/Test.h\",\n \"tests/TestHarness.cpp\",\n \"tests/TestHarness.h\",\n- \"tests/TestUtils.cpp\",\n- \"tests/TestUtils.h\",\n ]\n deps = [\n \":flags\",\n \":skia\",\n \":tool_utils\",\n ]\n- public_deps = [\n- \":gpu_tool_utils\", # Test.h #includes headers from this target.\n- ]\n- }\n-\n- import(\"gn/tests.gni\")\n- test_lib(\"tests\") {\n- sources = tests_sources + pathops_tests_sources\n- frameworks = []\n- if (skia_use_metal) {\n- sources += metal_tests_sources\n- cflags_objcc = [ \"-fobjc-arc\" ]\n- frameworks += [ \"MetalKit.framework\" ]\n- }\n- if (skia_use_jpeg_gainmaps) {\n- sources += jpeg_gainmap_tests_sources\n- }\n- if (skia_use_gl) {\n- sources += gl_tests_sources\n+ if (skia_enable_graphite || skia_enable_ganesh) {\n+ public_deps = [\n+ \":gpu_tool_utils\", # Test.h #includes headers from this target.\n+ ]\n }\n- if (skia_use_vulkan) {\n- sources += skia_gpu_vk_chromium_public\n- sources += skia_gpu_vk_chromium_private\n+ if (skia_enable_ganesh) {\n+ sources += [\n+ \"tests/ganesh/GaneshTestUtils.cpp\",\n+ \"tests/ganesh/GaneshTestUtils.h\",\n+ ]\n }\n- if (skia_enable_graphite) {\n- sources += graphite_tests_sources\n- if (skia_use_dawn) {\n- sources += graphite_dawn_tests_sources\n- }\n+ }\n+\n+ if (skia_enable_graphite || skia_enable_ganesh) {\n+ import(\"gn/tests.gni\")\n+ test_lib(\"tests\") {\n+ sources = tests_sources + pathops_tests_sources\n+ frameworks = []\n if (skia_use_metal) {\n- sources += graphite_metal_tests_sources\n+ cflags_objcc = [ \"-fobjc-arc\" ]\n+ frameworks += [ \"MetalKit.framework\" ]\n }\n- if (skia_use_vulkan) {\n- sources += graphite_vulkan_tests_sources\n+ if (skia_use_jpeg_gainmaps) {\n+ sources += jpeg_gainmap_tests_sources\n }\n+ if (skia_enable_graphite) {\n+ sources += graphite_tests_sources\n+ if (skia_use_dawn) {\n+ sources += graphite_dawn_tests_sources\n+ }\n+ if (skia_use_metal) {\n+ sources += graphite_metal_tests_sources\n+ }\n+ if (skia_use_vulkan) {\n+ sources += graphite_vulkan_tests_sources\n+ }\n+ }\n+ if (skia_enable_ganesh) {\n+ sources += ganesh_tests_sources\n+ if (skia_use_metal) {\n+ sources += ganesh_metal_tests_sources\n+ }\n+ if (skia_use_gl) {\n+ sources += ganesh_gl_tests_sources\n+ }\n+ if (skia_use_vulkan) {\n+ sources += skia_gpu_vk_chromium_public\n+ sources += skia_gpu_vk_chromium_private\n+ }\n+ }\n+ if (skia_enable_precompile) {\n+ sources += precompile_tests_sources\n+ }\n+ deps = [\n+ \":bmp_decode_rust_tests\",\n+ \":flags\",\n+ \":fontmgr_FontConfigInterface_tests\",\n+ \":fontmgr_android_tests\",\n+ \":fontmgr_fontconfig_tests\",\n+ \":fontmgr_mac_ct_tests\",\n+ \":fontscanner_tests\",\n+ \":png_decode_libpng_tests\",\n+ \":png_decode_rust_tests\",\n+ \":png_encode_rust_tests\",\n+ \":rust_icc_tests\",\n+ \":skia\",\n+ \":test\",\n+ \":tool_utils\",\n+ \":typeface_fontations_tests\",\n+ \"modules/bentleyottmann:tests\",\n+ \"modules/skottie:tests\",\n+ \"modules/skparagraph:tests\",\n+ \"modules/sksg:tests\",\n+ \"modules/skshaper\",\n+ \"modules/skshaper:tests\",\n+ \"modules/skunicode:tests\",\n+ \"modules/svg:tests\",\n+ \"//third_party/libpng\",\n+ \"//third_party/libwebp\",\n+ \"//third_party/zlib\",\n+ ]\n }\n- if (!skia_enable_ganesh) {\n- sources -= ganesh_tests_sources\n- }\n- if (skia_enable_precompile) {\n- sources += precompile_tests_sources\n- }\n- deps = [\n- \":flags\",\n- \":fontmgr_FontConfigInterface_tests\",\n- \":fontmgr_android_tests\",\n- \":fontmgr_fontconfig_tests\",\n- \":fontmgr_mac_ct_tests\",\n- \":fontscanner_tests\",\n- \":png_decode_rust_tests\",\n- \":png_encode_rust_tests\",\n- \":skia\",\n- \":test\",\n- \":tool_utils\",\n- \":typeface_fontations_tests\",\n- \"modules/bentleyottmann:tests\",\n- \"modules/skottie:tests\",\n- \"modules/skparagraph:tests\",\n- \"modules/sksg:tests\",\n- \"modules/skshaper\",\n- \"modules/skshaper:tests\",\n- \"modules/skunicode:tests\",\n- \"modules/svg:tests\",\n- \"//third_party/libpng\",\n- \"//third_party/libwebp\",\n- \"//third_party/zlib\",\n- ]\n }\n \n- import(\"gn/bench.gni\")\n- test_lib(\"bench\") {\n- sources = bench_sources\n- if (skia_enable_graphite) {\n- sources += graphite_bench_sources\n- }\n- if (!skia_enable_ganesh) {\n- sources -= ganesh_bench_sources\n+ if (skia_enable_ganesh) {\n+ import(\"gn/bench.gni\")\n+ test_lib(\"bench\") {\n+ sources = bench_sources\n+ if (skia_enable_graphite) {\n+ sources += graphite_bench_sources\n+ }\n+ if (!skia_enable_ganesh) {\n+ sources -= ganesh_bench_sources\n+ }\n+ deps = [\n+ \":flags\",\n+ \":gm\",\n+ \":gpu_tool_utils\",\n+ \":skia\",\n+ \":tool_utils\",\n+ \"modules/skparagraph:bench\",\n+ \"modules/skshaper\",\n+ ]\n }\n- deps = [\n- \":flags\",\n- \":gm\",\n- \":gpu_tool_utils\",\n- \":skia\",\n- \":tool_utils\",\n- \"modules/skparagraph:bench\",\n- \"modules/skshaper\",\n- ]\n }\n \n- if (is_linux || is_mac || skia_enable_optimize_size) {\n+ if ((is_linux || is_mac || skia_enable_optimize_size) &&\n+ skia_enable_tools_that_might_need_ganesh) {\n if (skia_enable_skottie) {\n test_app(\"skottie_tool\") {\n deps = [ \"modules/skottie:tool\" ]\n@@ -2594,49 +2824,60 @@ if (skia_enable_tools) {\n \"//third_party/libpng\",\n ]\n }\n- if (target_cpu != \"wasm\") {\n- test_app(\"convert-to-nia\") {\n- sources = [ \"tools/convert-to-nia.cpp\" ]\n- deps = [ \":skia\" ]\n- }\n- test_app(\"imgcvt\") {\n- sources = [ \"tools/imgcvt.cpp\" ]\n- configs = [ \":use_skia_vulkan_headers\" ]\n- deps = [\n- \":skia\",\n- \"modules/skcms\",\n- ]\n+ if (!is_canvaskit) {\n+ if (skia_enable_tools_that_might_need_ganesh) {\n+ test_app(\"convert-to-nia\") {\n+ sources = [ \"tools/convert-to-nia.cpp\" ]\n+ deps = [ \":skia\" ]\n+ }\n+ test_app(\"imgcvt\") {\n+ sources = [ \"tools/imgcvt.cpp\" ]\n+ configs = [ \":use_skia_vulkan_headers\" ]\n+ deps = [\n+ \":skia\",\n+ \"modules/skcms\",\n+ ]\n+ }\n }\n- test_app(\"dm\") {\n- sources = [\n- \"dm/DM.cpp\",\n- \"dm/DMGpuTestProcs.cpp\",\n- \"dm/DMJsonWriter.cpp\",\n- \"dm/DMJsonWriter.h\",\n- \"dm/DMSrcSink.cpp\",\n- \"dm/DMSrcSink.h\",\n- ]\n- deps = [\n- \":common_flags_config\",\n- \":common_flags_gpu\",\n- \":common_flags_graphite\",\n- \":common_flags_images\",\n- \":compile_all_sksl_tests\",\n- \":flags\",\n- \":gm\",\n- \":gpu_tool_utils\",\n- \":hash_and_encode\",\n- \":skia\",\n- \":tests\",\n- \":tool_utils\",\n- \":trace\",\n- \"modules/skottie\",\n- \"modules/skottie:utils\",\n- \"modules/skshaper\",\n- \"modules/skunicode\",\n- ]\n- if (skia_use_libpng_decode) {\n- deps += [ \"modules/svg\" ]\n+ if (skia_enable_graphite || skia_enable_ganesh) {\n+ test_app(\"dm\") {\n+ sources = [\n+ \"dm/DM.cpp\",\n+ \"dm/DMGpuTestProcs.cpp\",\n+ \"dm/DMJsonWriter.cpp\",\n+ \"dm/DMJsonWriter.h\",\n+ \"dm/DMSrcSink.cpp\",\n+ \"dm/DMSrcSink.h\",\n+ ]\n+ deps = [\n+ \":common_flags_config\",\n+ \":common_flags_images\",\n+ \":compile_all_sksl_tests\",\n+ \":flags\",\n+ \":gm\",\n+ \":gpu_tool_utils\",\n+ \":hash_and_encode\",\n+ \":skia\",\n+ \":tests\",\n+ \":tool_utils\",\n+ \":trace\",\n+ \"modules/skottie\",\n+ \"modules/skottie:utils\",\n+ \"modules/skshaper\",\n+ \"modules/skunicode\",\n+ ]\n+ if (skia_use_libpng_decode) {\n+ deps += [ \"modules/svg\" ]\n+ }\n+ if (skia_enable_graphite) {\n+ deps += [ \":common_flags_graphite\" ]\n+ }\n+ if (skia_enable_ganesh) {\n+ deps += [ \":common_flags_ganesh\" ]\n+ }\n+ if (skia_use_partition_alloc) {\n+ deps += [ \"tools/partition_alloc:test_support\" ]\n+ }\n }\n }\n test_app(\"filterfuzz\") {\n@@ -2649,8 +2890,10 @@ if (skia_enable_tools) {\n }\n \n if (!skia_enable_optimize_size && !skia_use_fontations &&\n- !skia_enable_vello_shaders) {\n+ !skia_use_rust_png_decode && !skia_use_rust_png_encode &&\n+ !skia_use_rust_bmp_decode && !skia_enable_vello_shaders) {\n # optional separate library to dlopen when running CanvasStateTests.\n+ # currently does not link in the presence of rust\n skia_shared_library(\"canvas_state_lib\") {\n sources = [\n \"tests/CanvasStateHelpers.cpp\",\n@@ -2661,7 +2904,7 @@ if (skia_enable_tools) {\n }\n }\n \n- if (!is_win) {\n+ if (!is_win && skia_enable_tools_that_might_need_ganesh) {\n test_app(\"blob_cache_sim\") {\n sources = [ \"tools/blob_cache_sim.cpp\" ]\n deps = [\n@@ -2671,7 +2914,7 @@ if (skia_enable_tools) {\n }\n }\n \n- if (skia_use_libpng_decode) {\n+ if (skia_use_libpng_decode && skia_enable_tools_that_might_need_ganesh) {\n test_app(\"nanobench\") {\n sources = [\n \"bench/nanobench.cpp\",\n@@ -2680,8 +2923,7 @@ if (skia_enable_tools) {\n deps = [\n \":bench\",\n \":common_flags_config\",\n- \":common_flags_gpu\",\n- \":common_flags_graphite\",\n+ \":common_flags_ganesh\",\n \":common_flags_images\",\n \":flags\",\n \":gm\",\n@@ -2694,6 +2936,9 @@ if (skia_enable_tools) {\n \"modules/skunicode\",\n \"modules/svg\",\n ]\n+ if (skia_enable_graphite) {\n+ deps += [ \":common_flags_graphite\" ]\n+ }\n }\n }\n \n@@ -2706,284 +2951,250 @@ if (skia_enable_tools) {\n ]\n }\n \n- if (skia_use_ffmpeg) {\n- test_app(\"skottie2movie\") {\n- sources = [ \"tools/skottie2movie.cpp\" ]\n- deps = [\n- \":flags\",\n- \":gpu_tool_utils\",\n- \":skia\",\n- \"experimental/ffmpeg:video_encoder\",\n- \"modules/skottie\",\n- \"modules/skottie:utils\",\n- ]\n- }\n- }\n-\n- if (skia_use_libpng_decode) {\n- test_app(\"skpbench\") {\n- sources = [\n- \"bench/BigPath.cpp\",\n- \"tools/skpbench/skpbench.cpp\",\n- ]\n- deps = [\n- \":common_flags_config\",\n- \":common_flags_gpu\",\n- \":flags\",\n- \":gpu_tool_utils\",\n- \":skia\",\n- \":tool_utils\",\n- ]\n+ if (skia_enable_tools_that_might_need_ganesh) {\n+ if (skia_use_ffmpeg) {\n+ test_app(\"skottie2movie\") {\n+ sources = [ \"tools/skottie2movie.cpp\" ]\n+ deps = [\n+ \":flags\",\n+ \":gpu_tool_utils\",\n+ \":skia\",\n+ \"experimental/ffmpeg:video_encoder\",\n+ \"modules/skottie\",\n+ \"modules/skottie:utils\",\n+ ]\n+ }\n }\n- }\n \n- if (is_linux && skia_use_icu) {\n- test_app(\"sktexttopdf\") {\n- sources = [ \"tools/using_skia_and_harfbuzz.cpp\" ]\n- deps = [\n- \":skia\",\n- \"modules/skshaper\",\n- ]\n- }\n- }\n-\n- if (is_linux || is_mac) {\n- test_app(\"create_test_font\") {\n- sources = [ \"tools/fonts/create_test_font.cpp\" ]\n- deps = [ \":skia\" ]\n- assert_no_deps = [\n- # tool_utils requires the output of this app.\n- \":tool_utils\",\n- ]\n+ if (skia_use_libpng_decode) {\n+ test_app(\"skpbench\") {\n+ sources = [\n+ \"bench/BigPath.cpp\",\n+ \"tools/skpbench/skpbench.cpp\",\n+ ]\n+ deps = [\n+ \":common_flags_config\",\n+ \":common_flags_ganesh\",\n+ \":flags\",\n+ \":gpu_tool_utils\",\n+ \":skia\",\n+ \":tool_utils\",\n+ ]\n+ }\n }\n- }\n \n- if (skia_use_expat) {\n- test_app(\"create_test_font_color\") {\n- sources = [ \"tools/fonts/create_test_font_color.cpp\" ]\n- deps = [\n- \":flags\",\n- \":skia\",\n- \":tool_utils\",\n- \"//modules/svg\",\n- ]\n+ if (is_linux && skia_use_icu) {\n+ test_app(\"sktexttopdf\") {\n+ sources = [ \"tools/using_skia_and_harfbuzz.cpp\" ]\n+ deps = [\n+ \":skia\",\n+ \"modules/skshaper\",\n+ ]\n+ }\n }\n- }\n-\n- test_app(\"get_images_from_skps\") {\n- sources = [ \"tools/get_images_from_skps.cpp\" ]\n- deps = [\n- \":flags\",\n- \":skia\",\n- ]\n- }\n-\n- test_app(\"fuzz\") {\n- sources = [\n- \"fuzz/Fuzz.cpp\",\n- \"fuzz/Fuzz.h\",\n- \"fuzz/FuzzCanvas.cpp\",\n- \"fuzz/FuzzCommon.cpp\",\n- \"fuzz/FuzzCommon.h\",\n- \"fuzz/FuzzCreateDDL.cpp\",\n- \"fuzz/FuzzCubicRoots.cpp\",\n- \"fuzz/FuzzDDLThreading.cpp\",\n- \"fuzz/FuzzDrawFunctions.cpp\",\n- \"fuzz/FuzzEncoders.cpp\",\n- \"fuzz/FuzzGradients.cpp\",\n- \"fuzz/FuzzMain.cpp\",\n- \"fuzz/FuzzParsePath.cpp\",\n- \"fuzz/FuzzPathMeasure.cpp\",\n- \"fuzz/FuzzPathop.cpp\",\n- \"fuzz/FuzzPolyUtils.cpp\",\n- \"fuzz/FuzzQuadRoots.cpp\",\n- \"fuzz/FuzzRegionOp.cpp\",\n- \"fuzz/FuzzSkParagraph.cpp\",\n- \"fuzz/FuzzTriangulation.cpp\",\n- \"fuzz/oss_fuzz/FuzzAndroidCodec.cpp\",\n- \"fuzz/oss_fuzz/FuzzAnimatedImage.cpp\",\n- \"fuzz/oss_fuzz/FuzzCOLRv1.cpp\",\n- \"fuzz/oss_fuzz/FuzzColorspace.cpp\",\n- \"fuzz/oss_fuzz/FuzzImage.cpp\",\n- \"fuzz/oss_fuzz/FuzzImageFilterDeserialize.cpp\",\n- \"fuzz/oss_fuzz/FuzzIncrementalImage.cpp\",\n- \"fuzz/oss_fuzz/FuzzJSON.cpp\",\n- \"fuzz/oss_fuzz/FuzzParsePath.cpp\",\n- \"fuzz/oss_fuzz/FuzzPathDeserialize.cpp\",\n- \"fuzz/oss_fuzz/FuzzRegionDeserialize.cpp\",\n- \"fuzz/oss_fuzz/FuzzRegionSetPath.cpp\",\n- \"fuzz/oss_fuzz/FuzzSKP.cpp\",\n- \"fuzz/oss_fuzz/FuzzSKSL2GLSL.cpp\",\n- \"fuzz/oss_fuzz/FuzzSKSL2Metal.cpp\",\n- \"fuzz/oss_fuzz/FuzzSKSL2Pipeline.cpp\",\n- \"fuzz/oss_fuzz/FuzzSKSL2SPIRV.cpp\",\n- \"fuzz/oss_fuzz/FuzzSKSL2WGSL.cpp\",\n- \"fuzz/oss_fuzz/FuzzSVG.cpp\",\n- \"fuzz/oss_fuzz/FuzzSkDescriptorDeserialize.cpp\",\n- \"fuzz/oss_fuzz/FuzzSkMeshSpecification.cpp\",\n- \"fuzz/oss_fuzz/FuzzSkParagraph.cpp\",\n- \"fuzz/oss_fuzz/FuzzSkRuntimeBlender.cpp\",\n- \"fuzz/oss_fuzz/FuzzSkRuntimeColorFilter.cpp\",\n- \"fuzz/oss_fuzz/FuzzSkRuntimeEffect.cpp\",\n- \"fuzz/oss_fuzz/FuzzTextBlobDeserialize.cpp\",\n- \"tools/UrlDataManager.cpp\",\n- \"tools/debugger/DebugCanvas.cpp\",\n- \"tools/debugger/DebugLayerManager.cpp\",\n- \"tools/debugger/DrawCommand.cpp\",\n- \"tools/debugger/JsonWriteBuffer.cpp\",\n- \"tools/fonts/FontToolUtils.cpp\",\n- ]\n \n- if (skia_enable_graphite && skia_enable_precompile) {\n- sources += [ \"fuzz/FuzzPrecompile.cpp\" ]\n+ if (is_linux || is_mac) {\n+ test_app(\"create_test_font\") {\n+ sources = [ \"tools/fonts/create_test_font.cpp\" ]\n+ deps = [ \":skia\" ]\n+ assert_no_deps = [\n+ # tool_utils requires the output of this app.\n+ \":tool_utils\",\n+ ]\n+ }\n }\n- deps = [\n- \":flags\",\n- \":gpu_tool_utils\",\n- \":skia\",\n- \"modules/jsonreader\",\n- \"modules/skottie:fuzz\",\n- \"modules/skparagraph\",\n- \"modules/svg\",\n- ]\n- }\n \n- test_app(\"dump_record\") {\n- sources = [ \"tools/dump_record.cpp\" ]\n- deps = [\n- \":flags\",\n- \":skia\",\n- ]\n- }\n-\n- if (skia_use_libpng_decode) {\n- test_app(\"skdiff\") {\n- sources = [\n- \"tools/skdiff/skdiff.cpp\",\n- \"tools/skdiff/skdiff_html.cpp\",\n- \"tools/skdiff/skdiff_main.cpp\",\n- \"tools/skdiff/skdiff_utils.cpp\",\n- ]\n- deps = [ \":skia\" ]\n+ if (skia_use_expat) {\n+ test_app(\"create_test_font_color\") {\n+ sources = [ \"tools/fonts/create_test_font_color.cpp\" ]\n+ deps = [\n+ \":flags\",\n+ \":skia\",\n+ \":tool_utils\",\n+ \"//modules/svg\",\n+ ]\n+ }\n }\n \n- test_app(\"skp_parser\") {\n- sources = [ \"tools/skp_parser.cpp\" ]\n+ test_app(\"get_images_from_skps\") {\n+ sources = [ \"tools/get_images_from_skps.cpp\" ]\n deps = [\n+ \":flags\",\n \":skia\",\n- \":tool_utils\",\n ]\n }\n- }\n \n- if (!is_win) {\n- source_set(\"skqp_lib\") { # Not a skia_source_set\n- check_includes = false\n- testonly = true\n- public_configs = [ \":skia_private\" ]\n+ test_app(\"fuzz\") {\n sources = [\n- \"tools/skqp/src/skqp.cpp\",\n- \"tools/skqp/src/skqp.h\",\n- \"tools/skqp/src/skqp_GpuTestProcs.cpp\",\n- ]\n+ \"fuzz/Fuzz.cpp\",\n+ \"fuzz/Fuzz.h\",\n+ \"fuzz/FuzzCanvas.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.h\",\n+ \"fuzz/FuzzCommon.cpp\",\n+ \"fuzz/FuzzCommon.h\",\n+ \"fuzz/FuzzCreateDDL.cpp\",\n+ \"fuzz/FuzzCubicRoots.cpp\",\n+ \"fuzz/FuzzDDLThreading.cpp\",\n+ \"fuzz/FuzzDrawFunctions.cpp\",\n+ \"fuzz/FuzzEncoders.cpp\",\n+ \"fuzz/FuzzGrStyledShape.cpp\",\n+ \"fuzz/FuzzGradients.cpp\",\n+ \"fuzz/FuzzMain.cpp\",\n+ \"fuzz/FuzzParsePath.cpp\",\n+ \"fuzz/FuzzPathMeasure.cpp\",\n+ \"fuzz/FuzzPathop.cpp\",\n+ \"fuzz/FuzzPolyUtils.cpp\",\n+ \"fuzz/FuzzQuadRoots.cpp\",\n+ \"fuzz/FuzzRegionOp.cpp\",\n+ \"fuzz/FuzzSkParagraph.cpp\",\n+ \"fuzz/FuzzTriangulation.cpp\",\n+ \"fuzz/oss_fuzz/FuzzAndroidCodec.cpp\",\n+ \"fuzz/oss_fuzz/FuzzAnimatedImage.cpp\",\n+ \"fuzz/oss_fuzz/FuzzCOLRv1.cpp\",\n+ \"fuzz/oss_fuzz/FuzzColorspace.cpp\",\n+ \"fuzz/oss_fuzz/FuzzImage.cpp\",\n+ \"fuzz/oss_fuzz/FuzzImageFilterDeserialize.cpp\",\n+ \"fuzz/oss_fuzz/FuzzIncrementalImage.cpp\",\n+ \"fuzz/oss_fuzz/FuzzJSON.cpp\",\n+ \"fuzz/oss_fuzz/FuzzParsePath.cpp\",\n+ \"fuzz/oss_fuzz/FuzzPathDeserialize.cpp\",\n+ \"fuzz/oss_fuzz/FuzzRegionDeserialize.cpp\",\n+ \"fuzz/oss_fuzz/FuzzRegionSetPath.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSKP.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSKSL2GLSL.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSKSL2Metal.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSKSL2Pipeline.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSKSL2SPIRV.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSKSL2WGSL.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSVG.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSkDescriptorDeserialize.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSkMeshSpecification.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSkParagraph.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSkRuntimeBlender.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSkRuntimeColorFilter.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSkRuntimeEffect.cpp\",\n+ \"fuzz/oss_fuzz/FuzzTextBlobDeserialize.cpp\",\n+ \"tools/UrlDataManager.cpp\",\n+ \"tools/debugger/DebugCanvas.cpp\",\n+ \"tools/debugger/DebugLayerManager.cpp\",\n+ \"tools/debugger/DrawCommand.cpp\",\n+ \"tools/debugger/JsonWriteBuffer.cpp\",\n+ \"tools/fonts/FontToolUtils.cpp\",\n+ ]\n+\n+ if (skia_enable_graphite && skia_enable_precompile) {\n+ sources += [ \"fuzz/FuzzPrecompile.cpp\" ]\n+ }\n+ if (skia_use_rust_bmp_decode) {\n+ sources += [ \"fuzz/oss_fuzz/FuzzBMPRustDecoder.cpp\" ]\n+ }\n deps = [\n- \":gm\",\n+ \":flags\",\n+ \":gpu_tool_utils\",\n \":skia\",\n- \":tests\",\n- \":tool_utils\",\n+ \"modules/jsonreader\",\n+ \"modules/skottie:fuzz\",\n+ \"modules/skparagraph\",\n+ \"modules/svg\",\n ]\n- }\n- if (skia_use_libpng_decode) {\n- test_app(\"skqp\") {\n- sources = [ \"tools/skqp/src/skqp_main.cpp\" ]\n- include_dirs = [ \"//\" ]\n- lib_dirs = []\n- deps = [ \":skqp_lib\" ]\n+ if (skia_use_rust_bmp_decode) {\n+ deps += [ \":bmp_decode_rust\" ]\n }\n }\n- }\n- if (is_fuchsia) {\n- # Build a package repository for skqp on Fuchsia.\n- group(\"skqp_repo\") {\n- testonly = true\n- deps = [ \"//build/fuchsia/skqp:skqp_repo\" ]\n- }\n- }\n- if (is_android) {\n- shared_library(\"libskqp_jni\") { # Not a skia_shared_library\n- configs += [ \":skia_private\" ]\n- testonly = true\n- sources = [ \"tools/skqp/src/jni_skqp.cpp\" ]\n+\n+ test_app(\"dump_record\") {\n+ sources = [ \"tools/dump_record.cpp\" ]\n deps = [\n+ \":flags\",\n \":skia\",\n- \":skqp_lib\",\n- \":tool_utils\",\n ]\n- libs = [ \"android\" ]\n }\n- }\n- if (is_android && skia_use_gl) {\n- test_app(\"skottie_android\") {\n- is_shared_library = true\n \n- sources = [ \"platform_tools/android/apps/skottie/skottielib/src/main/cpp/native-lib.cpp\" ]\n- libs = []\n+ if (skia_use_libpng_decode) {\n+ test_app(\"skdiff\") {\n+ sources = [\n+ \"tools/skdiff/skdiff.cpp\",\n+ \"tools/skdiff/skdiff_html.cpp\",\n+ \"tools/skdiff/skdiff_main.cpp\",\n+ \"tools/skdiff/skdiff_utils.cpp\",\n+ ]\n+ deps = [ \":skia\" ]\n+ }\n \n- deps = [\n- \":skia\",\n- \"modules/skottie\",\n- \"modules/skshaper\",\n- \"modules/skunicode\",\n- ]\n+ test_app(\"skp_parser\") {\n+ sources = [ \"tools/skp_parser.cpp\" ]\n+ deps = [\n+ \":skia\",\n+ \":tool_utils\",\n+ ]\n+ }\n }\n \n- test_app(\"jetski\") {\n- is_shared_library = true\n+ if (!is_win) {\n+ source_set(\"skqp_lib\") { # Not a skia_source_set\n+ check_includes = false\n+ testonly = true\n+ public_configs = [ \":skia_private\" ]\n+ sources = [\n+ \"tools/skqp/src/skqp.cpp\",\n+ \"tools/skqp/src/skqp.h\",\n+ \"tools/skqp/src/skqp_GpuTestProcs.cpp\",\n+ ]\n+ deps = [\n+ \":gm\",\n+ \":skia\",\n+ \":tests\",\n+ \":tool_utils\",\n+ ]\n+ }\n+ if (skia_use_libpng_decode) {\n+ test_app(\"skqp\") {\n+ sources = [ \"tools/skqp/src/skqp_main.cpp\" ]\n+ include_dirs = [ \"//\" ]\n+ lib_dirs = []\n+ deps = [ \":skqp_lib\" ]\n+ }\n+ }\n+ }\n+ if (is_android) {\n+ shared_library(\"libskqp_jni\") { # Not a skia_shared_library\n+ configs += [ \":skia_private\" ]\n+ testonly = true\n+ sources = [ \"tools/skqp/src/jni_skqp.cpp\" ]\n+ deps = [\n+ \":skia\",\n+ \":skqp_lib\",\n+ \":tool_utils\",\n+ ]\n+ libs = [ \"android\" ]\n+ }\n+ }\n+ if (is_android && skia_use_gl) {\n+ test_app(\"skottie_android\") {\n+ is_shared_library = true\n \n- sources = [\n- \"modules/jetski/src/Canvas.cpp\",\n- \"modules/jetski/src/ColorFilters.cpp\",\n- \"modules/jetski/src/Gradients.cpp\",\n- \"modules/jetski/src/Image.cpp\",\n- \"modules/jetski/src/ImageFilter.cpp\",\n- \"modules/jetski/src/JetSki.cpp\",\n- \"modules/jetski/src/Matrix.cpp\",\n- \"modules/jetski/src/Paint.cpp\",\n- \"modules/jetski/src/Path.cpp\",\n- \"modules/jetski/src/PathBuilder.cpp\",\n- \"modules/jetski/src/RuntimeShaderBuilder.cpp\",\n- \"modules/jetski/src/Shader.cpp\",\n- \"modules/jetski/src/SkottieAnimation.cpp\",\n- \"modules/jetski/src/Surface.cpp\",\n- \"modules/jetski/src/Surface.h\",\n- \"modules/jetski/src/SurfaceThread.cpp\",\n- \"modules/jetski/src/SurfaceThread.h\",\n- \"modules/jetski/src/Utils.cpp\",\n- ]\n- libs = [\n- \"android\",\n- \"jnigraphics\",\n- ]\n+ sources = [ \"platform_tools/android/apps/skottie/skottielib/src/main/cpp/native-lib.cpp\" ]\n+ libs = []\n \n- deps = [\n- \":skia\",\n- \"modules/skottie:skottie\",\n- \"tools/window:window\",\n- ]\n+ deps = [\n+ \":skia\",\n+ \"modules/skottie\",\n+ \"modules/skshaper\",\n+ \"modules/skunicode\",\n+ ]\n+ }\n }\n- }\n \n- if (is_ios && skia_enable_skottie) {\n- group(\"skottie_ios\") {\n- deps = [ \"tools/skottie_ios_app\" ]\n+ if (is_ios && skia_enable_skottie) {\n+ group(\"skottie_ios\") {\n+ deps = [ \"tools/skottie_ios_app\" ]\n+ }\n }\n }\n \n test_lib(\"sk_app\") {\n- public_deps = [\n- \":gpu_tool_utils\",\n- \":skia\",\n- ]\n+ public_deps = [ \":skia\" ]\n sources = [\n \"tools/sk_app/Application.h\",\n \"tools/sk_app/CommandSet.cpp\",\n@@ -2994,6 +3205,10 @@ if (skia_enable_tools) {\n libs = []\n frameworks = []\n \n+ if (skia_enable_graphite || skia_enable_ganesh) {\n+ public_deps += [ \":gpu_tool_utils\" ]\n+ }\n+\n if (is_android) {\n sources += [\n \"tools/sk_app/android/Window_android.cpp\",\n@@ -3053,32 +3268,9 @@ if (skia_enable_tools) {\n }\n }\n \n- if (!skia_use_vulkan && (is_mac || is_linux || is_win)) {\n- test_app(\"fiddle_examples\") {\n- sources = [\n- \"tools/fiddle/all_examples.cpp\",\n- \"tools/fiddle/examples.cpp\",\n- \"tools/fiddle/examples.h\",\n- ]\n- if (is_win) {\n- cflags = [\n- \"/wd4756\", # Overflow in constant arithmetic\n- \"/wd4305\", # truncation from 'double' to 'float'\n- ]\n- }\n- deps = [\n- \":skia\",\n- \":skia.h\",\n- \"modules/skottie\",\n- \"modules/skparagraph\",\n- \"modules/skshaper\",\n- \"modules/svg\",\n- ]\n- }\n- }\n-\n- # sk_app can work without GL but viewer always runs raster through a GL window context.\n- if (skia_use_gl) {\n+ # viewer requires at least one of Ganesh or Graphite. Raster is presented via Ganesh and\n+ # therefore cannot stand alone.\n+ if (skia_enable_ganesh || skia_enable_graphite) {\n test_app(\"viewer\") {\n is_shared_library = is_android\n sources = [\n@@ -3096,6 +3288,8 @@ if (skia_enable_tools) {\n \"tools/viewer/BisectSlide.cpp\",\n \"tools/viewer/BisectSlide.h\",\n \"tools/viewer/CameraSlide.cpp\",\n+ \"tools/viewer/CaptureSlide.cpp\",\n+ \"tools/viewer/CaptureSlide.h\",\n \"tools/viewer/ChartSlide.cpp\",\n \"tools/viewer/ChineseFlingSlide.cpp\",\n \"tools/viewer/ClickHandlerSlide.cpp\",\n@@ -3105,6 +3299,7 @@ if (skia_enable_tools) {\n \"tools/viewer/CowboySlide.cpp\",\n \"tools/viewer/DegenerateQuadsSlide.cpp\",\n \"tools/viewer/DegenerateTwoPtRadialsSlide.cpp\",\n+ \"tools/viewer/EdgeBuilderVizSlide.cpp\",\n \"tools/viewer/FatBitsSlide.cpp\",\n \"tools/viewer/FilterBoundsSlide.cpp\",\n \"tools/viewer/FitCubicToCircleSlide.cpp\",\n@@ -3137,6 +3332,7 @@ if (skia_enable_tools) {\n \"tools/viewer/PathTextSlide.cpp\",\n \"tools/viewer/ProtectedSlide.cpp\",\n \"tools/viewer/QuadStrokerSlide.cpp\",\n+ \"tools/viewer/RasterPipelineVizSlide.cpp\",\n \"tools/viewer/RectanizerSlide.cpp\",\n \"tools/viewer/RepeatTileSlide.cpp\",\n \"tools/viewer/SBIXSlide.cpp\",\n@@ -3176,16 +3372,15 @@ if (skia_enable_tools) {\n \"tools/viewer/Viewer.cpp\",\n \"tools/viewer/Viewer.h\",\n \"tools/viewer/XferSlide.cpp\",\n+ \"tools/viewer/ZoomInSlide.cpp\",\n+ \"tools/viewer/ZoomInSlide.h\",\n ]\n libs = []\n \n deps = [\n \":common_flags_config\",\n- \":common_flags_gpu\",\n- \":common_flags_graphite\",\n \":flags\",\n \":gm\",\n- \":gpu_tool_utils\",\n \":sk_app\",\n \":skia\",\n \":tool_utils\",\n@@ -3197,7 +3392,7 @@ if (skia_enable_tools) {\n \"modules/skparagraph:slides\",\n \"modules/skresources\",\n \"modules/sksg:slides\",\n- \"modules/skshaper:skshaper\",\n+ \"modules/skshaper\",\n \"modules/skunicode\",\n \"//third_party/delaunator\",\n \"//third_party/imgui\",\n@@ -3218,262 +3413,289 @@ if (skia_enable_tools) {\n \"//third_party/externals/spirv-tools:spvtools_val\",\n ]\n }\n+ if (skia_enable_ganesh) {\n+ deps += [\n+ \":common_flags_ganesh\",\n+ \":gpu_tool_utils\",\n+ ]\n+ }\n+ if (skia_enable_graphite) {\n+ deps += [\n+ \":common_flags_graphite\",\n+ \":gpu_tool_utils\",\n+ ]\n+ }\n }\n }\n \n- if (skia_use_vulkan) {\n- test_app(\"VulkanBasic\") {\n- # Bots and even devs may not have Vulkan headers, so put\n- # include/third_party/vulkan on our path so they're always available.\n- all_dependent_configs = [\n- \":use_skia_vulkan_headers\",\n- \":vulkan_memory_allocator\",\n- ]\n+ if (skia_enable_tools_that_might_need_ganesh) {\n+ if (skia_use_vulkan) {\n+ test_app(\"VulkanBasic\") {\n+ # Bots and even devs may not have Vulkan headers, so put\n+ # include/third_party/vulkan on our path so they're always available.\n+ all_dependent_configs = [\n+ \":use_skia_vulkan_headers\",\n+ \":vulkan_memory_allocator\",\n+ ]\n \n- sources = [ \"example/VulkanBasic.cpp\" ]\n- sources += [ \"tools/gpu/vk/VkTestMemoryAllocator.h\" ]\n- sources += [ \"tools/gpu/vk/VkTestMemoryAllocator.cpp\" ]\n- sources += [ \"tools/gpu/vk/VkTestUtils.h\" ]\n- sources += [ \"tools/gpu/vk/VkTestUtils.cpp\" ]\n- deps = [\n- \":load_dynamic_library\",\n- \":skia\",\n- ]\n+ sources = [ \"example/VulkanBasic.cpp\" ]\n+ sources += [ \"tools/gpu/vk/VkTestMemoryAllocator.h\" ]\n+ sources += [ \"tools/gpu/vk/VkTestMemoryAllocator.cpp\" ]\n+ sources += [ \"tools/gpu/vk/VkTestUtils.h\" ]\n+ sources += [ \"tools/gpu/vk/VkTestUtils.cpp\" ]\n+ deps = [\n+ \":load_dynamic_library\",\n+ \":skia\",\n+ ]\n+ }\n }\n- }\n \n- if (is_ios && skia_use_metal && skia_enable_ganesh) {\n- group(\"minimal_ios_mtl_skia_app\") {\n- deps = [ \"experimental/minimal_ios_mtl_skia_app\" ]\n+ if (is_ios && skia_use_metal && skia_enable_ganesh) {\n+ group(\"minimal_ios_mtl_skia_app\") {\n+ deps = [ \"experimental/minimal_ios_mtl_skia_app\" ]\n+ }\n }\n- }\n \n- if (is_linux || is_win || is_mac) {\n- test_app(\"editor\") {\n- is_shared_library = is_android\n- deps = [ \"modules/skplaintexteditor:editor_app\" ]\n+ if (is_linux || is_win || is_mac) {\n+ test_app(\"editor\") {\n+ is_shared_library = is_android\n+ deps = [ \"modules/skplaintexteditor:editor_app\" ]\n+ }\n+ }\n+\n+ skia_executable(\"image_diff_metric\") {\n+ sources = [ \"tools/image_diff_metric.cpp\" ]\n+ deps = [ \":skia\" ]\n+ }\n+\n+ group(\"modules_testonly\") {\n+ testonly = true\n+ deps = []\n+ if (is_canvaskit) {\n+ deps += [ \"modules/canvaskit:viewer_wasm\" ]\n+ }\n }\n }\n+}\n \n- skia_executable(\"image_diff_metric\") {\n- sources = [ \"tools/image_diff_metric.cpp\" ]\n- deps = [ \":skia\" ]\n+if (skia_build_fuzzers) {\n+ assert(is_clang)\n+ template(\"libfuzzer_app\") {\n+ skia_executable(target_name) {\n+ output_dir = root_build_dir\n+ check_includes = false\n+ forward_variables_from(invoker, \"*\", [ \"is_shared_library\" ])\n+ if (!defined(configs)) {\n+ configs = []\n+ }\n+ configs += [ \":skia_private\" ]\n+ sources += [\n+ \"fuzz/Fuzz.cpp\",\n+ \"fuzz/FuzzCommon.cpp\",\n+ ]\n+ deps += [\n+ \":flags\",\n+ \":skia\",\n+ \":tool_utils\",\n+ ]\n+ defines = [ \"SK_BUILD_FOR_LIBFUZZER\" ]\n+\n+ # oss-fuzz will set this engine itself when building and we don't want a\n+ # conflict (e.g. both libfuzzer and centipede)\n+ if (skia_provide_default_fuzz_engine) {\n+ cflags = [ \"-fsanitize=fuzzer\" ]\n+ ldflags = [ \"-fsanitize=fuzzer\" ]\n+ }\n+ testonly = true\n+ }\n }\n \n- group(\"modules_testonly\") {\n- testonly = true\n+ libfuzzer_app(\"region_deserialize\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzRegionDeserialize.cpp\" ]\n deps = []\n- if (is_wasm) {\n- deps += [ \"modules/canvaskit:viewer_wasm\" ]\n- }\n }\n \n- if (skia_build_fuzzers) {\n- template(\"libfuzzer_app\") {\n- skia_executable(target_name) {\n- output_dir = root_build_dir\n- check_includes = false\n- forward_variables_from(invoker, \"*\", [ \"is_shared_library\" ])\n- if (!defined(configs)) {\n- configs = []\n- }\n- configs += [ \":skia_private\" ]\n- sources += [\n- \"fuzz/Fuzz.cpp\",\n- \"fuzz/FuzzCommon.cpp\",\n- ]\n- deps += [\n- \":flags\",\n- \":gpu_tool_utils\",\n- \":skia\",\n- \":tool_utils\",\n- ]\n- defines = [\n- \"SK_BUILD_FOR_LIBFUZZER\",\n- \"SK_BUILD_FOR_FUZZER\",\n- ]\n- if (skia_use_libfuzzer_defaults) {\n- cflags = [ \"-fsanitize=fuzzer\" ]\n- ldflags = [ \"-fsanitize=fuzzer\" ]\n- }\n- testonly = true\n- }\n- }\n+ libfuzzer_app(\"image_filter_deserialize\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzImageFilterDeserialize.cpp\" ]\n+ deps = [ \"modules/svg\" ]\n+ }\n \n- libfuzzer_app(\"region_deserialize\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzRegionDeserialize.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"region_set_path\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzRegionSetPath.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"image_filter_deserialize\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzImageFilterDeserialize.cpp\" ]\n- deps = [ \"modules/svg\" ]\n- }\n+ libfuzzer_app(\"textblob_deserialize\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzTextBlobDeserialize.cpp\" ]\n+ deps = [ \"modules/svg\" ]\n+ }\n \n- libfuzzer_app(\"region_set_path\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzRegionSetPath.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"path_deserialize\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzPathDeserialize.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"textblob_deserialize\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzTextBlobDeserialize.cpp\" ]\n- deps = [ \"modules/svg\" ]\n- }\n+ libfuzzer_app(\"image_decode\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzImage.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"path_deserialize\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzPathDeserialize.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"animated_image_decode\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzAnimatedImage.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"image_decode\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzImage.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"api_create_ddl\") {\n+ sources = [\n+ \"fuzz/FuzzCreateDDL.cpp\",\n+ \"fuzz/oss_fuzz/FuzzAPICreateDDL.cpp\",\n+ ]\n+ deps = [\n+ \"modules/svg\",\n+ \"//third_party/libpng\",\n+ ]\n+ }\n \n- libfuzzer_app(\"animated_image_decode\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzAnimatedImage.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"api_draw_functions\") {\n+ sources = [\n+ \"fuzz/FuzzDrawFunctions.cpp\",\n+ \"fuzz/oss_fuzz/FuzzDrawFunctions.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"api_create_ddl\") {\n- sources = [\n- \"fuzz/FuzzCreateDDL.cpp\",\n- \"fuzz/oss_fuzz/FuzzAPICreateDDL.cpp\",\n- ]\n- deps = [\n- \"modules/svg\",\n- \"//third_party/libpng\",\n- ]\n- }\n+ libfuzzer_app(\"api_ddl_threading\") {\n+ sources = [\n+ \"fuzz/FuzzDDLThreading.cpp\",\n+ \"fuzz/oss_fuzz/FuzzDDLThreading.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"api_draw_functions\") {\n- sources = [\n- \"fuzz/FuzzDrawFunctions.cpp\",\n- \"fuzz/oss_fuzz/FuzzDrawFunctions.cpp\",\n- ]\n- deps = []\n- }\n+ libfuzzer_app(\"api_gradients\") {\n+ sources = [\n+ \"fuzz/FuzzGradients.cpp\",\n+ \"fuzz/oss_fuzz/FuzzGradients.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"api_ddl_threading\") {\n- sources = [\n- \"fuzz/FuzzDDLThreading.cpp\",\n- \"fuzz/oss_fuzz/FuzzDDLThreading.cpp\",\n- ]\n- deps = []\n- }\n+ libfuzzer_app(\"api_image_filter\") {\n+ sources = [\n+ \"fuzz/FuzzCanvas.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.h\",\n+ \"fuzz/oss_fuzz/FuzzAPIImageFilter.cpp\",\n+ ]\n+ deps = [ \"//third_party/libpng\" ]\n+ }\n \n- libfuzzer_app(\"api_gradients\") {\n- sources = [\n- \"fuzz/FuzzGradients.cpp\",\n- \"fuzz/oss_fuzz/FuzzGradients.cpp\",\n- ]\n- deps = []\n- }\n+ libfuzzer_app(\"api_path_measure\") {\n+ sources = [\n+ \"fuzz/FuzzPathMeasure.cpp\",\n+ \"fuzz/oss_fuzz/FuzzPathMeasure.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"api_image_filter\") {\n- sources = [\n- \"fuzz/FuzzCanvas.cpp\",\n- \"fuzz/oss_fuzz/FuzzAPIImageFilter.cpp\",\n- ]\n- deps = [ \"//third_party/libpng\" ]\n- }\n+ libfuzzer_app(\"api_pathop\") {\n+ sources = [\n+ \"fuzz/FuzzPathop.cpp\",\n+ \"fuzz/oss_fuzz/FuzzPathop.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"api_path_measure\") {\n- sources = [\n- \"fuzz/FuzzPathMeasure.cpp\",\n- \"fuzz/oss_fuzz/FuzzPathMeasure.cpp\",\n- ]\n- deps = []\n- }\n+ libfuzzer_app(\"api_triangulation\") {\n+ sources = [\n+ \"fuzz/FuzzTriangulation.cpp\",\n+ \"fuzz/oss_fuzz/FuzzTriangulation.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"api_pathop\") {\n- sources = [\n- \"fuzz/FuzzPathop.cpp\",\n- \"fuzz/oss_fuzz/FuzzPathop.cpp\",\n- ]\n- deps = []\n- }\n+ libfuzzer_app(\"api_raster_n32_canvas\") {\n+ sources = [\n+ \"fuzz/FuzzCanvas.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.h\",\n+ \"fuzz/oss_fuzz/FuzzRasterN32Canvas.cpp\",\n+ ]\n+ deps = [\n+ \"modules/svg\",\n+ \"//third_party/libpng\",\n+ ]\n+ }\n \n- libfuzzer_app(\"api_triangulation\") {\n- sources = [\n- \"fuzz/FuzzTriangulation.cpp\",\n- \"fuzz/oss_fuzz/FuzzTriangulation.cpp\",\n- ]\n- deps = []\n- }\n+ libfuzzer_app(\"api_regionop\") {\n+ sources = [\n+ \"fuzz/FuzzRegionOp.cpp\",\n+ \"fuzz/oss_fuzz/FuzzRegionOp.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"api_raster_n32_canvas\") {\n+ if (skia_enable_ganesh) {\n+ libfuzzer_app(\"api_mock_gpu_canvas\") {\n sources = [\n \"fuzz/FuzzCanvas.cpp\",\n- \"fuzz/oss_fuzz/FuzzRasterN32Canvas.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.h\",\n+ \"fuzz/oss_fuzz/FuzzMockGPUCanvas.cpp\",\n ]\n deps = [\n+ \":gpu_tool_utils\",\n \"modules/svg\",\n \"//third_party/libpng\",\n ]\n }\n+ }\n \n- libfuzzer_app(\"api_regionop\") {\n+ if (skia_enable_graphite && skia_enable_precompile) {\n+ libfuzzer_app(\"api_precompile\") {\n sources = [\n- \"fuzz/FuzzRegionOp.cpp\",\n- \"fuzz/oss_fuzz/FuzzRegionOp.cpp\",\n+ \"fuzz/FuzzPrecompile.cpp\",\n+ \"fuzz/oss_fuzz/FuzzPrecompile.cpp\",\n ]\n- deps = []\n- }\n-\n- if (skia_enable_ganesh) {\n- libfuzzer_app(\"api_mock_gpu_canvas\") {\n- sources = [\n- \"fuzz/FuzzCanvas.cpp\",\n- \"fuzz/oss_fuzz/FuzzMockGPUCanvas.cpp\",\n- ]\n- deps = [\n- \"modules/svg\",\n- \"//third_party/libpng\",\n- ]\n- }\n- }\n-\n- if (skia_enable_graphite && skia_enable_precompile) {\n- libfuzzer_app(\"api_precompile\") {\n- sources = [\n- \"fuzz/FuzzPrecompile.cpp\",\n- \"fuzz/oss_fuzz/FuzzPrecompile.cpp\",\n- ]\n- deps = []\n- }\n+ deps = [ \":gpu_tool_utils\" ]\n }\n+ }\n \n- libfuzzer_app(\"api_null_canvas\") {\n- sources = [\n- \"fuzz/FuzzCanvas.cpp\",\n- \"fuzz/oss_fuzz/FuzzNullCanvas.cpp\",\n- ]\n- deps = [\n- \"modules/svg\",\n- \"//third_party/libpng\",\n- ]\n- }\n+ libfuzzer_app(\"api_null_canvas\") {\n+ sources = [\n+ \"fuzz/FuzzCanvas.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.h\",\n+ \"fuzz/oss_fuzz/FuzzNullCanvas.cpp\",\n+ ]\n+ deps = [\n+ \"modules/svg\",\n+ \"//third_party/libpng\",\n+ ]\n+ }\n \n- libfuzzer_app(\"api_skparagraph\") {\n- sources = [\n- \"fuzz/FuzzSkParagraph.cpp\",\n- \"fuzz/oss_fuzz/FuzzSkParagraph.cpp\",\n- ]\n- deps = [ \"modules/skparagraph\" ]\n- }\n+ libfuzzer_app(\"api_skparagraph\") {\n+ sources = [\n+ \"fuzz/FuzzSkParagraph.cpp\",\n+ \"fuzz/oss_fuzz/FuzzSkParagraph.cpp\",\n+ ]\n+ deps = [ \"modules/skparagraph\" ]\n+ }\n \n- libfuzzer_app(\"api_svg_canvas\") {\n- sources = [\n- \"fuzz/FuzzCanvas.cpp\",\n- \"fuzz/oss_fuzz/FuzzAPISVGCanvas.cpp\",\n- ]\n- deps = [\n- \"modules/svg\",\n- \"//third_party/libpng\",\n- ]\n- }\n+ libfuzzer_app(\"api_svg_canvas\") {\n+ sources = [\n+ \"fuzz/FuzzCanvas.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.h\",\n+ \"fuzz/oss_fuzz/FuzzAPISVGCanvas.cpp\",\n+ ]\n+ deps = [\n+ \"modules/svg\",\n+ \"//third_party/libpng\",\n+ ]\n+ }\n \n+ if (skia_use_libpng_encode) {\n libfuzzer_app(\"png_encoder\") {\n sources = [\n \"fuzz/FuzzEncoders.cpp\",\n@@ -3481,145 +3703,165 @@ if (skia_enable_tools) {\n ]\n deps = []\n }\n+ }\n \n- libfuzzer_app(\"jpeg_encoder\") {\n+ if (skia_use_rust_png_encode) {\n+ libfuzzer_app(\"png_rust_encoder\") {\n sources = [\n \"fuzz/FuzzEncoders.cpp\",\n- \"fuzz/oss_fuzz/FuzzJPEGEncoder.cpp\",\n+ \"fuzz/oss_fuzz/FuzzPNGRustEncoder.cpp\",\n ]\n deps = []\n }\n+ }\n \n- libfuzzer_app(\"webp_encoder\") {\n- sources = [\n- \"fuzz/FuzzEncoders.cpp\",\n- \"fuzz/oss_fuzz/FuzzWEBPEncoder.cpp\",\n- ]\n- deps = []\n- }\n+ libfuzzer_app(\"jpeg_encoder\") {\n+ sources = [\n+ \"fuzz/FuzzEncoders.cpp\",\n+ \"fuzz/oss_fuzz/FuzzJPEGEncoder.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"skottie_json\") {\n- sources = [ \"modules/skottie/fuzz/FuzzSkottieJSON.cpp\" ]\n- deps = [\n- \"modules/jsonreader\",\n- \"modules/skottie:skottie\",\n- \"modules/svg\",\n- ]\n- }\n+ libfuzzer_app(\"webp_encoder\") {\n+ sources = [\n+ \"fuzz/FuzzEncoders.cpp\",\n+ \"fuzz/oss_fuzz/FuzzWEBPEncoder.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"skjson\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzJSON.cpp\" ]\n- deps = [ \"modules/jsonreader\" ]\n- }\n+ libfuzzer_app(\"skottie_json\") {\n+ sources = [ \"modules/skottie/fuzz/FuzzSkottieJSON.cpp\" ]\n+ deps = [\n+ \"modules/jsonreader\",\n+ \"modules/skottie\",\n+ \"modules/svg\",\n+ ]\n+ }\n \n- libfuzzer_app(\"api_polyutils\") {\n- sources = [\n- \"fuzz/FuzzPolyUtils.cpp\",\n- \"fuzz/oss_fuzz/FuzzPolyUtils.cpp\",\n- ]\n- deps = [ \":skia\" ]\n- }\n+ libfuzzer_app(\"skjson\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzJSON.cpp\" ]\n+ deps = [ \"modules/jsonreader\" ]\n+ }\n \n- libfuzzer_app(\"android_codec\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzAndroidCodec.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"api_polyutils\") {\n+ sources = [\n+ \"fuzz/FuzzPolyUtils.cpp\",\n+ \"fuzz/oss_fuzz/FuzzPolyUtils.cpp\",\n+ ]\n+ deps = [ \":skia\" ]\n+ }\n \n- libfuzzer_app(\"image_decode_incremental\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzIncrementalImage.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"android_codec\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzAndroidCodec.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"sksl2glsl\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSKSL2GLSL.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"image_decode_incremental\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzIncrementalImage.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"sksl2metal\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSKSL2Metal.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"grshape\") {\n+ sources = [\n+ \"fuzz/FuzzCanvasHelpers.cpp\",\n+ \"fuzz/FuzzCanvasHelpers.h\",\n+ \"fuzz/FuzzGrStyledShape.cpp\",\n+ \"fuzz/oss_fuzz/FuzzGrStyledShape.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"sksl2pipeline\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSKSL2Pipeline.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"sksl2glsl\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSKSL2GLSL.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"sksl2spirv\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSKSL2SPIRV.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"sksl2metal\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSKSL2Metal.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"sksl2wgsl\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSKSL2WGSL.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"sksl2pipeline\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSKSL2Pipeline.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"skdescriptor_deserialize\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSkDescriptorDeserialize.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"sksl2spirv\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSKSL2SPIRV.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"svg_dom\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSVG.cpp\" ]\n- deps = [ \"modules/svg\" ]\n- }\n+ libfuzzer_app(\"sksl2wgsl\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSKSL2WGSL.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"skruntimeblender\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSkRuntimeBlender.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"skdescriptor_deserialize\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSkDescriptorDeserialize.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"skruntimecolorfilter\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSkRuntimeColorFilter.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"svg_dom\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSVG.cpp\" ]\n+ deps = [ \"modules/svg\" ]\n+ }\n \n- libfuzzer_app(\"skruntimeeffect\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSkRuntimeEffect.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"skruntimeblender\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSkRuntimeBlender.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"skmeshspecification\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSkMeshSpecification.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"skruntimecolorfilter\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSkRuntimeColorFilter.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"skp\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzSKP.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"skruntimeeffect\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSkRuntimeEffect.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"colrv1\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzCOLRv1.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"skmeshspecification\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSkMeshSpecification.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"quad_roots\") {\n- sources = [\n- \"fuzz/FuzzQuadRoots.cpp\",\n- \"fuzz/oss_fuzz/FuzzQuadRoots.cpp\",\n- ]\n- deps = []\n- }\n+ libfuzzer_app(\"skp\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzSKP.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"cubic_roots\") {\n- sources = [\n- \"fuzz/FuzzCubicRoots.cpp\",\n- \"fuzz/oss_fuzz/FuzzCubicRoots.cpp\",\n- ]\n- deps = []\n- }\n+ libfuzzer_app(\"colrv1\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzCOLRv1.cpp\" ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"skcolorspace\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzColorspace.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"quad_roots\") {\n+ sources = [\n+ \"fuzz/FuzzQuadRoots.cpp\",\n+ \"fuzz/oss_fuzz/FuzzQuadRoots.cpp\",\n+ ]\n+ deps = []\n+ }\n \n- libfuzzer_app(\"parse_path\") {\n- sources = [ \"fuzz/oss_fuzz/FuzzParsePath.cpp\" ]\n- deps = []\n- }\n+ libfuzzer_app(\"cubic_roots\") {\n+ sources = [\n+ \"fuzz/FuzzCubicRoots.cpp\",\n+ \"fuzz/oss_fuzz/FuzzCubicRoots.cpp\",\n+ ]\n+ deps = []\n+ }\n+\n+ libfuzzer_app(\"skcolorspace\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzColorspace.cpp\" ]\n+ deps = []\n+ }\n+\n+ libfuzzer_app(\"parse_path\") {\n+ sources = [ \"fuzz/oss_fuzz/FuzzParsePath.cpp\" ]\n+ deps = []\n }\n }\n \n@@ -3662,6 +3904,12 @@ skiasharp_build(\"SkiaSharp\") {\n \n deps = [\n \":skia\",\n+ # mono/skia: upstream made pathops optional in m147 — :skia no longer\n+ # includes it, only :pdf and :xps pull it in indirectly. SkiaSharp's\n+ # C API exposes pathops as first-class public functions (sk_pathop_op,\n+ # sk_pathop_simplify, sk_pathop_tight_bounds, sk_pathop_as_winding,\n+ # SkOpBuilder) so we need it linked into libSkiaSharp.so directly.\n+ \":pathops\",\n \"modules/skottie\",\n ]\n \n@@ -3696,6 +3944,15 @@ skiasharp_build(\"HarfBuzzSharp\") {\n # \"HB_NO_WIN1256\",\n ]\n \n+ # Skia base config applies -fvisibility=hidden. HarfBuzz's HB_EXTERN\n+ # macro is plain `extern` and has no visibility attribute, so hb_*\n+ # symbols end up local and libHarfBuzzSharp.so exports nothing\n+ # (only ~155 KB instead of ~4 MB). On Windows we override HB_EXTERN\n+ # with __declspec(dllexport); do the equivalent on non-Windows.\n+ if (!is_win) {\n+ defines += [ \"HB_EXTERN=extern __attribute__((visibility(\\\"default\\\")))\" ]\n+ }\n+\n include_dirs = [\n \"third_party/harfbuzz\"\n ]", "oldDiff": "diff --git a/BUILD.gn b/BUILD.gn\nindex 3626895824..f12d99d1bd 100644\n--- a/BUILD.gn\n+++ b/BUILD.gn\n@@ -1021,19 +1021,17 @@ optional(\"gpu\") {\n \"src/gpu/ganesh/gl/glx/GrGLMakeGLXInterface.cpp\",\n \"src/gpu/ganesh/gl/glx/GrGLMakeNativeInterface_glx.cpp\",\n ]\n- libs += [ \"GL\" ]\n+ libs += [ \"dl\" ]\n } else if (is_mac) {\n sources += [ \"src/gpu/ganesh/gl/mac/GrGLMakeNativeInterface_mac.cpp\" ]\n } else if (is_ios) {\n sources += [ \"src/gpu/ganesh/gl/iOS/GrGLMakeNativeInterface_iOS.cpp\" ]\n- } else if (is_win && !skia_enable_winuwp) {\n+ } else if (is_win && !is_winrt && !skia_enable_winuwp) {\n sources += [\n \"src/gpu/ganesh/gl/win/GrGLMakeNativeInterface_win.cpp\",\n \"src/gpu/ganesh/gl/win/GrGLMakeWinInterface.cpp\",\n ]\n- if (target_cpu != \"arm64\") {\n- libs += [ \"OpenGL32.lib\" ]\n- }\n+ # GPU is not linked in, but loaded at runtime\n } else {\n sources += [ \"src/gpu/ganesh/gl/GrGLMakeNativeInterface_none.cpp\" ]\n }\n@@ -1683,6 +1681,10 @@ skia_component(\"skia\") {\n defines = []\n libs = []\n \n+ if (skia_use_vulkan) {\n+ configs += [ \":use_skia_vulkan_headers\" ]\n+ }\n+\n if (skia_build_for_debugger) {\n defines += [ \"SK_BUILD_FOR_DEBUGGER\" ]\n }\n@@ -3645,3 +3647,61 @@ if (skia_build_rust_targets) {\n ]\n }\n }\n+\n+# SkiaSharp + HarfBuzzSharp\n+\n+skiasharp_build(\"SkiaSharp\") {\n+ public_configs = [ \":skia_public\" ]\n+ configs += skia_library_configs\n+\n+ if (skia_use_vulkan) {\n+ configs += [ \":use_skia_vulkan_headers\" ]\n+ }\n+\n+ defines = [ \"SKIA_C_DLL\" ]\n+\n+ deps = [\n+ \":skia\",\n+ \"modules/skottie\",\n+ ]\n+\n+ sources = [\n+ \"src/xamarin/sk_compatpaint.cpp\",\n+ \"src/xamarin/sk_manageddrawable.cpp\",\n+ \"src/xamarin/sk_managedstream.cpp\",\n+ \"src/xamarin/sk_managedtracememorydump.cpp\",\n+ \"src/xamarin/sk_xamarin.cpp\",\n+ \"src/xamarin/SkiaKeeper.c\",\n+ \"src/xamarin/SkCompatPaint.cpp\",\n+ \"src/xamarin/SkManagedDrawable.cpp\",\n+ \"src/xamarin/SkManagedStream.cpp\",\n+ \"src/xamarin/SkManagedTraceMemoryDump.cpp\"\n+ ]\n+\n+ libs = []\n+}\n+\n+skiasharp_build(\"HarfBuzzSharp\") {\n+ cflags = [\n+ \"-fno-threadsafe-statics\",\n+ ]\n+\n+ defines = [\n+ #\"HAVE_FREETYPE\",\n+ #\"HAVE_ICU\",\n+ #\"HAVE_ICU_BUILTIN\",\n+ \"HAVE_OT\",\n+ \"HAVE_CONFIG_OVERRIDE_H\",\n+ \"HB_NO_FALLBACK_SHAPE\",\n+ # \"HB_NO_WIN1256\",\n+ ]\n+\n+ include_dirs = [\n+ \"third_party/harfbuzz\"\n+ ]\n+\n+ _src = \"third_party/externals/harfbuzz/src\"\n+ sources = [\n+ \"$_src/harfbuzz-subset.cc\",\n+ ]\n+}", "newDiff": "diff --git a/BUILD.gn b/BUILD.gn\nindex 5608bfa60e..737f4ca480 100644\n--- a/BUILD.gn\n+++ b/BUILD.gn\n@@ -914,6 +914,11 @@ optional(\"gpu_shared\") {\n }\n if (skia_use_vma) {\n sources += skia_vma_sources\n+ # Upstream removed SK_USE_VMA from the GN build in m147 (moved to Bazel\n+ # only). SkiaSharp still uses GN and needs this define so that GrVkGpu.cpp\n+ # compiles the VMA fallback that auto-creates a memory allocator when\n+ # fMemoryAllocator is null.\n+ public_defines += [ \"SK_USE_VMA\" ]\n public_deps += [ \"src/gpu/vk/vulkanmemoryallocator\" ]\n }\n }\n@@ -990,19 +995,17 @@ optional(\"gpu\") {\n \"src/gpu/ganesh/gl/glx/GrGLMakeGLXInterface.cpp\",\n \"src/gpu/ganesh/gl/glx/GrGLMakeNativeInterface_glx.cpp\",\n ]\n- libs += [ \"GL\" ]\n+ libs += [ \"dl\" ]\n } else if (is_mac) {\n sources += [ \"src/gpu/ganesh/gl/mac/GrGLMakeNativeInterface_mac.cpp\" ]\n } else if (is_ios) {\n sources += [ \"src/gpu/ganesh/gl/iOS/GrGLMakeNativeInterface_iOS.cpp\" ]\n- } else if (is_win && !skia_enable_winuwp) {\n+ } else if (is_win && !is_winrt && !skia_enable_winuwp) {\n sources += [\n \"src/gpu/ganesh/gl/win/GrGLMakeNativeInterface_win.cpp\",\n \"src/gpu/ganesh/gl/win/GrGLMakeWinInterface.cpp\",\n ]\n- if (target_cpu != \"arm64\") {\n- libs += [ \"OpenGL32.lib\" ]\n- }\n+ # GPU is not linked in, but loaded at runtime\n } else {\n sources += [ \"src/gpu/ganesh/gl/GrGLMakeNativeInterface_none.cpp\" ]\n }\n@@ -1802,6 +1805,26 @@ skia_source_set(\"core\") {\n public = skia_core_public\n sources = skia_core_sources\n \n+ # mono/skia: SkiaSharp's C API shims (src/c/gr_context.cpp et al.) are\n+ # compiled into :core via gn/core.gni, but Skia's backend defines live on\n+ # :gpu's all_dependent_configs and therefore don't reach :core. Without\n+ # them, SK_ONLY_DIRECT3D / SK_ONLY_VULKAN / SK_ONLY_METAL collapse to\n+ # stub returns, GPU context factory C entry points never reference\n+ # backend symbols, and the linker strips d3d12/vulkan/metal imports\n+ # from libSkiaSharp. :core's own compile needs the defines; its\n+ # dependents already inherit them from :gpu's chain.\n+ defines = []\n+ if (skia_use_direct3d) {\n+ defines += [ \"SK_DIRECT3D\" ]\n+ }\n+ if (skia_use_vulkan) {\n+ defines += [ \"SK_VULKAN\" ]\n+ configs += [ \":use_skia_vulkan_headers\" ]\n+ }\n+ if (skia_use_metal) {\n+ defines += [ \"SK_METAL\" ]\n+ }\n+\n # These deps don't belong to :core, but they are currently needed to support (de)serialization.\n public_deps = [\n \":fontmgr_FontConfigInterface\",\n@@ -3866,3 +3889,76 @@ if (skia_build_rust_targets) {\n ]\n }\n }\n+\n+# SkiaSharp + HarfBuzzSharp\n+\n+skiasharp_build(\"SkiaSharp\") {\n+ public_configs = [ \":skia_public\" ]\n+ configs += skia_library_configs\n+\n+ if (skia_use_vulkan) {\n+ configs += [ \":use_skia_vulkan_headers\" ]\n+ }\n+\n+ defines = [ \"SKIA_C_DLL\" ]\n+\n+ deps = [\n+ \":skia\",\n+ # mono/skia: upstream made pathops optional in m147 — :skia no longer\n+ # includes it, only :pdf and :xps pull it in indirectly. SkiaSharp's\n+ # C API exposes pathops as first-class public functions (sk_pathop_op,\n+ # sk_pathop_simplify, sk_pathop_tight_bounds, sk_pathop_as_winding,\n+ # SkOpBuilder) so we need it linked into libSkiaSharp.so directly.\n+ \":pathops\",\n+ \"modules/skottie\",\n+ ]\n+\n+ sources = [\n+ \"src/xamarin/sk_compatpaint.cpp\",\n+ \"src/xamarin/sk_manageddrawable.cpp\",\n+ \"src/xamarin/sk_managedstream.cpp\",\n+ \"src/xamarin/sk_managedtracememorydump.cpp\",\n+ \"src/xamarin/sk_xamarin.cpp\",\n+ \"src/xamarin/SkiaKeeper.c\",\n+ \"src/xamarin/SkCompatPaint.cpp\",\n+ \"src/xamarin/SkManagedDrawable.cpp\",\n+ \"src/xamarin/SkManagedStream.cpp\",\n+ \"src/xamarin/SkManagedTraceMemoryDump.cpp\"\n+ ]\n+\n+ libs = []\n+}\n+\n+skiasharp_build(\"HarfBuzzSharp\") {\n+ cflags = [\n+ \"-fno-threadsafe-statics\",\n+ ]\n+\n+ defines = [\n+ #\"HAVE_FREETYPE\",\n+ #\"HAVE_ICU\",\n+ #\"HAVE_ICU_BUILTIN\",\n+ \"HAVE_OT\",\n+ \"HAVE_CONFIG_OVERRIDE_H\",\n+ \"HB_NO_FALLBACK_SHAPE\",\n+ # \"HB_NO_WIN1256\",\n+ ]\n+\n+ # Skia base config applies -fvisibility=hidden. HarfBuzz's HB_EXTERN\n+ # macro is plain `extern` and has no visibility attribute, so hb_*\n+ # symbols end up local and libHarfBuzzSharp.so exports nothing\n+ # (only ~155 KB instead of ~4 MB). On Windows we override HB_EXTERN\n+ # with __declspec(dllexport); do the equivalent on non-Windows.\n+ if (!is_win) {\n+ defines += [ \"HB_EXTERN=extern __attribute__((visibility(\\\"default\\\")))\" ]\n+ }\n+\n+ include_dirs = [\n+ \"third_party/harfbuzz\"\n+ ]\n+\n+ _src = \"third_party/externals/harfbuzz/src\"\n+ sources = [\n+ \"$_src/harfbuzz-subset.cc\",\n+ ]\n+}", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,8 +1,20 @@\n diff --git a/BUILD.gn b/BUILD.gn\n-index 3626895824..f12d99d1bd 100644\n+index 5608bfa60e..737f4ca480 100644\n --- a/BUILD.gn\n +++ b/BUILD.gn\n-@@ -1021,19 +1021,17 @@ optional(\"gpu\") {\n+@@ -914,6 +914,11 @@ optional(\"gpu_shared\") {\n+ }\n+ if (skia_use_vma) {\n+ sources += skia_vma_sources\n++ # Upstream removed SK_USE_VMA from the GN build in m147 (moved to Bazel\n++ # only). SkiaSharp still uses GN and needs this define so that GrVkGpu.cpp\n++ # compiles the VMA fallback that auto-creates a memory allocator when\n++ # fMemoryAllocator is null.\n++ public_defines += [ \"SK_USE_VMA\" ]\n+ public_deps += [ \"src/gpu/vk/vulkanmemoryallocator\" ]\n+ }\n+ }\n+@@ -990,19 +995,17 @@ optional(\"gpu\") {\n \"src/gpu/ganesh/gl/glx/GrGLMakeGLXInterface.cpp\",\n \"src/gpu/ganesh/gl/glx/GrGLMakeNativeInterface_glx.cpp\",\n ]\n@@ -25,18 +37,34 @@ index 3626895824..f12d99d1bd 100644\n } else {\n sources += [ \"src/gpu/ganesh/gl/GrGLMakeNativeInterface_none.cpp\" ]\n }\n-@@ -1683,6 +1681,10 @@ skia_component(\"skia\") {\n- defines = []\n- libs = []\n+@@ -1802,6 +1805,26 @@ skia_source_set(\"core\") {\n+ public = skia_core_public\n+ sources = skia_core_sources\n \n++ # mono/skia: SkiaSharp's C API shims (src/c/gr_context.cpp et al.) are\n++ # compiled into :core via gn/core.gni, but Skia's backend defines live on\n++ # :gpu's all_dependent_configs and therefore don't reach :core. Without\n++ # them, SK_ONLY_DIRECT3D / SK_ONLY_VULKAN / SK_ONLY_METAL collapse to\n++ # stub returns, GPU context factory C entry points never reference\n++ # backend symbols, and the linker strips d3d12/vulkan/metal imports\n++ # from libSkiaSharp. :core's own compile needs the defines; its\n++ # dependents already inherit them from :gpu's chain.\n++ defines = []\n++ if (skia_use_direct3d) {\n++ defines += [ \"SK_DIRECT3D\" ]\n++ }\n + if (skia_use_vulkan) {\n++ defines += [ \"SK_VULKAN\" ]\n + configs += [ \":use_skia_vulkan_headers\" ]\n + }\n++ if (skia_use_metal) {\n++ defines += [ \"SK_METAL\" ]\n++ }\n +\n- if (skia_build_for_debugger) {\n- defines += [ \"SK_BUILD_FOR_DEBUGGER\" ]\n- }\n-@@ -3645,3 +3647,61 @@ if (skia_build_rust_targets) {\n+ # These deps don't belong to :core, but they are currently needed to support (de)serialization.\n+ public_deps = [\n+ \":fontmgr_FontConfigInterface\",\n+@@ -3866,3 +3889,76 @@ if (skia_build_rust_targets) {\n ]\n }\n }\n@@ -55,6 +83,12 @@ index 3626895824..f12d99d1bd 100644\n +\n + deps = [\n + \":skia\",\n++ # mono/skia: upstream made pathops optional in m147 — :skia no longer\n++ # includes it, only :pdf and :xps pull it in indirectly. SkiaSharp's\n++ # C API exposes pathops as first-class public functions (sk_pathop_op,\n++ # sk_pathop_simplify, sk_pathop_tight_bounds, sk_pathop_as_winding,\n++ # SkOpBuilder) so we need it linked into libSkiaSharp.so directly.\n++ \":pathops\",\n + \"modules/skottie\",\n + ]\n +\n@@ -89,6 +123,15 @@ index 3626895824..f12d99d1bd 100644\n + # \"HB_NO_WIN1256\",\n + ]\n +\n++ # Skia base config applies -fvisibility=hidden. HarfBuzz's HB_EXTERN\n++ # macro is plain `extern` and has no visibility attribute, so hb_*\n++ # symbols end up local and libHarfBuzzSharp.so exports nothing\n++ # (only ~155 KB instead of ~4 MB). On Windows we override HB_EXTERN\n++ # with __declspec(dllexport); do the equivalent on non-Windows.\n++ if (!is_win) {\n++ defines += [ \"HB_EXTERN=extern __attribute__((visibility(\\\"default\\\")))\" ]\n++ }\n++\n + include_dirs = [\n + \"third_party/harfbuzz\"\n + ]", "summary": "Major upstream build system refactoring: (1) Removes Fuchsia platform support entirely (imports, defines, fontmgr_fuchsia). (2) Adds pathops.gni and rust.gni imports, new fontmgr_android_parser target. (3) Renames 'is_wasm' checks to 'is_canvaskit' in several places. (4) Adds pipeline label tracing and fuzzer build defines. (5) Removes VMA define. (6) Adds partition_alloc and task dump support. (7) Adds public_configs forwarding in optional() template. The fork patch (SkiaSharp-specific changes) is carried forward with updated line offsets and adds sk_pathbuilder.h/cpp to the C API source lists.", "relatedFiles": [{"path": "gn/core.gni", "relationship": "related"}, {"path": "gn/BUILDCONFIG.gn", "relationship": "related"}]}, {"path": "DEPS", "diff": "diff --git a/DEPS b/DEPS\nindex b8b9255c28..a18c275898 100644\n--- a/DEPS\n+++ b/DEPS\n@@ -9,7 +9,7 @@ vars = {\n # Three lines of non-changing comments so that\n # the commit queue can handle CLs rolling different\n # dependencies without interference from each other.\n- 'infra_revision': '783200f5fd9e6100453e41f90e393714bf9fa639',\n+ 'infra_revision': '5997e0271ce752c20f475f4e76c92917d81b02eb',\n \n # ninja CIPD package version.\n # https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/ninja\n@@ -30,22 +30,26 @@ vars = {\n # To apply the changes for the GN build, you will need to resync the git repositories using:\n # ./tools/git-sync-deps\n deps = {\n- \"buildtools\" : \"https://chromium.googlesource.com/chromium/src/buildtools.git@b138e6ce86ae843c42a1a08f37903207bebcca75\",\n- # \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@7fea539cc99bed8fd315cfbc5026952a133ac3ae\",\n+ \"buildtools\" : \"https://chromium.googlesource.com/chromium/src/buildtools.git@729495f2ffa69080907780591fa2a630b2556e98\",\n+ # \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@b1b19492e609101305bf434bb01ca7ff93619549\",\n \"third_party/externals/brotli\" : \"https://skia.googlesource.com/external/github.com/google/brotli.git@028fb5a23661f123017c060daa546b55cf4bde29\",\n \"third_party/externals/d3d12allocator\" : \"https://skia.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator.git@169895d529dfce00390a20e69c2f516066fe7a3b\",\n- # Dawn requires jinja2 and markupsafe for the code generator, tint for SPIRV compilation, and abseil for string formatting.\n+ # Dawn requires jinja2 and markupsafe for the code generator, abseil for string formatting,\n+ # and a few other depencencies.\n # When the Dawn revision is updated these should be updated from the Dawn DEPS as well.\n- # \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@2a86250e561c56e9b1b9af5774f1253d9d66be97\",\n- # \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@e2d024354e11cc6b041b0cff032d73f0c7e43a07\",\n- # \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@0bad08bb207bbfc1d6f3bbc82b9242b0c50e5794\",\n- # \"third_party/externals/abseil-cpp\" : \"https://skia.googlesource.com/external/github.com/abseil/abseil-cpp.git@65a55c2ba891f6d2492477707f4a2e327a0b40dc\",\n+ # \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@620a520f5029e14b57a0b58096c022e339b1857b\",\n+ # \"third_party/externals/abseil-cpp\" : \"https://chromium.googlesource.com/chromium/src/third_party/abseil-cpp@526428fa2488f4b10406f697108659bc1619a97b\",\n+ # \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@c3027d884967773057bf74b957e3fea87e5df4d7\",\n+ # \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@4256084ae14175d38a3ff7d739dca83ae49ccec6\",\n+ # 'third_party/externals/glslang' : 'https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang@1d47ffa8ac4374a19b302021e216a20f22a3de92',\n+ # 'third_party/externals/webgpu-headers' : 'https://chromium.googlesource.com/external/github.com/webgpu-native/webgpu-headers@706853a9da45b8e89b7ea005aa267294d115f8ce',\n+\n # \"third_party/externals/delaunator-cpp\" : \"https://skia.googlesource.com/external/github.com/skia-dev/delaunator-cpp.git@98305ef6c4e862f7d48df9cc647b690d796fec68\",\n- \"third_party/externals/dng_sdk\" : \"https://android.googlesource.com/platform/external/dng_sdk.git@c8d0c9b1d16bfda56f15165d39e0ffa360a11123\",\n+ \"third_party/externals/dng_sdk\" : \"https://android.googlesource.com/platform/external/dng_sdk.git@dbe0a676450d9b8c71bf00688bb306409b779e90\",\n # \"third_party/externals/egl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/EGL-Registry@b055c9b483e70ecd57b3cf7204db21f5a06f9ffe\",\n- # \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@a896e3d066448b3530dbcaa48869fafefd738f57\",\n+ # \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@c69d433d8509c5c64564c2f0d054bf102a5cf67e\",\n \"third_party/externals/expat\" : \"https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git@f31adfd584b7f6c50bbf4d22eb928538ffc9145a\",\n- \"third_party/externals/freetype\" : \"https://chromium.googlesource.com/chromium/src/third_party/freetype2.git@83af801b552111e37d9466a887e1783a0fb5f196\",\n+ \"third_party/externals/freetype\" : \"https://chromium.googlesource.com/chromium/src/third_party/freetype2.git@b91f75bd02db43b06d634591eb286d3eb0ce3b65\",\n \"third_party/externals/harfbuzz\" : \"https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@2b3631a866b3077d9d675caa4ec9010b342b5a7c\",\n # \"third_party/externals/highway\" : \"https://chromium.googlesource.com/external/github.com/google/highway.git@424360251cdcfc314cfc528f53c872ecd63af0f0\",\n # \"third_party/externals/icu\" : \"https://chromium.googlesource.com/chromium/deps/icu.git@364118a1d9da24bb5b770ac3d762ac144d6da5a4\",\n@@ -54,7 +58,7 @@ deps = {\n # \"third_party/externals/libavif\" : \"https://skia.googlesource.com/external/github.com/AOMediaCodec/libavif.git@55aab4ac0607ab651055d354d64c4615cf3d8000\",\n # \"third_party/externals/libgav1\" : \"https://chromium.googlesource.com/codecs/libgav1.git@5cf722e659014ebaf2f573a6dd935116d36eadf1\",\n # \"third_party/externals/libgrapheme\" : \"https://skia.googlesource.com/external/github.com/FRIGN/libgrapheme/@c0cab63c5300fa12284194fbef57aa2ed62a94c0\",\n- \"third_party/externals/libjpeg-turbo\" : \"https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@927aabfcd26897abb9776ecf2a6c38ea5bb52ab6\",\n+ \"third_party/externals/libjpeg-turbo\" : \"https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@e14cbfaa85529d47f9f55b0f104a579c1061f9ad\",\n # \"third_party/externals/libjxl\" : \"https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git@a205468bc5d3a353fb15dae2398a101dff52f2d3\",\n \"third_party/externals/libpng\" : \"https://skia.googlesource.com/third_party/libpng.git@3061454d980de7d53608f594194cfac722721d2a\",\n \"third_party/externals/libwebp\" : \"https://chromium.googlesource.com/webm/libwebp.git@4fa21912338357f89e4fd51cf2368325b59e9bd9\",\n@@ -62,21 +66,21 @@ deps = {\n # \"third_party/externals/microhttpd\" : \"https://android.googlesource.com/platform/external/libmicrohttpd@748945ec6f1c67b7efc934ab0808e1d32f2fb98d\",\n # \"third_party/externals/oboe\" : \"https://chromium.googlesource.com/external/github.com/google/oboe.git@b02a12d1dd821118763debec6b83d00a8a0ee419\",\n # \"third_party/externals/opengl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry@14b80ebeab022b2c78f84a573f01028c96075553\",\n- # \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@ce13777cb731e0a60c606d1741091fd11a0574d7\",\n+ # \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@b8c0688f577c1bbce6c2c1ce4753cd685ca0f634\",\n # \"third_party/externals/perfetto\" : \"https://android.googlesource.com/platform/external/perfetto@93885509be1c9240bc55fa515ceb34811e54a394\",\n \"third_party/externals/piex\" : \"https://android.googlesource.com/platform/external/piex.git@bb217acdca1cc0c16b704669dd6f91a1b509c406\",\n- # \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@76855a9baecc97fa144ce70d7ae43a9f878e14c8\",\n+ # \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@313545f85af72f954820e54f4110cda591a6cf7b\",\n \"third_party/externals/vulkanmemoryallocator\" : \"https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator@c788c52156f3ef7bc7ab769cb03c110a53ac8fcb\",\n # vulkan-deps is a meta-repo containing several interdependent Khronos Vulkan repositories.\n # When the vulkan-deps revision is updated, those repos (spirv-*, vulkan-*) should be updated as well.\n- # \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@a2dfb2276ea5f9467eb84c9a19ecf917d92e4135\",\n+ # \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@9117cef67a601b46f8537a61dee24676f29d2a42\",\n \"third_party/externals/spirv-cross\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3\",\n- # \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@996c728cf7dcfb29845cfa15222822318f047810\",\n- # \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@9117e042b93d4ff08d2406542708170f77aaa2a3\",\n+ # \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@f88a2d766840fc825af1fc065977953ba1fa4a91\",\n+ # \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@7d8d9e58c384949f1615c069d4c9346bf51b9738\",\n # \"third_party/externals/vello\" : \"https://skia.googlesource.com/external/github.com/linebender/vello.git@3ee3bea02164c5a816fe6c16ef4e3a810edb7620\",\n- \"third_party/externals/vulkan-headers\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers@cbcad3c0587dddc768d76641ea00f5c45ab5a278\",\n- # \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@15f2de809304aba619ee327f3273425418ca83de\",\n- # \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@87ab6b39a97d084a2ef27db85e3cbaf5d2622a09\",\n+ \"third_party/externals/vulkan-headers\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers@74d8a6cb930c68ef617b202c3ff3c59d919e086b\",\n+ # \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@59f963ce1b1d16cc92137a241a0fe98d637d21f4\",\n+ # \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@20fb10eb1ec08ccd5cacec32b7df1b0e99e48a0c\",\n # \"third_party/externals/unicodetools\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/unicodetools@66a3fa9dbdca3b67053a483d130564eabc5fe095\",\n #\"third_party/externals/v8\" : \"https://chromium.googlesource.com/v8/v8.git@5f1ae66d5634e43563b2d25ea652dfb94c31a3b4\",\n \"third_party/externals/wuffs\" : \"https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git@e3f919ccfe3ef542cfc983a82146070258fb57f8\",", "oldDiff": "diff --git a/DEPS b/DEPS\nindex 4a8c5d69d9..b8b9255c28 100644\n--- a/DEPS\n+++ b/DEPS\n@@ -30,56 +30,57 @@ vars = {\n # To apply the changes for the GN build, you will need to resync the git repositories using:\n # ./tools/git-sync-deps\n deps = {\n- \"buildtools\" : \"https://chromium.googlesource.com/chromium/src/buildtools.git@1760ff6d7267dd97ae1968c7bee9ce04a2a8489d\",\n- \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@d65751b40f7e4441ca0e41210eadcc8a9cbccce5\",\n- \"third_party/externals/brotli\" : \"https://skia.googlesource.com/external/github.com/google/brotli.git@6d03dfbedda1615c4cba1211f8d81735575209c8\",\n+ \"buildtools\" : \"https://chromium.googlesource.com/chromium/src/buildtools.git@b138e6ce86ae843c42a1a08f37903207bebcca75\",\n+ # \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@7fea539cc99bed8fd315cfbc5026952a133ac3ae\",\n+ \"third_party/externals/brotli\" : \"https://skia.googlesource.com/external/github.com/google/brotli.git@028fb5a23661f123017c060daa546b55cf4bde29\",\n \"third_party/externals/d3d12allocator\" : \"https://skia.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator.git@169895d529dfce00390a20e69c2f516066fe7a3b\",\n # Dawn requires jinja2 and markupsafe for the code generator, tint for SPIRV compilation, and abseil for string formatting.\n # When the Dawn revision is updated these should be updated from the Dawn DEPS as well.\n- \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@3f908f3907e532481e4c91d3b814b46869405fe8\",\n- \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@e2d024354e11cc6b041b0cff032d73f0c7e43a07\",\n- \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@0bad08bb207bbfc1d6f3bbc82b9242b0c50e5794\",\n- \"third_party/externals/abseil-cpp\" : \"https://skia.googlesource.com/external/github.com/abseil/abseil-cpp.git@65a55c2ba891f6d2492477707f4a2e327a0b40dc\",\n- \"third_party/externals/delaunator-cpp\" : \"https://skia.googlesource.com/external/github.com/skia-dev/delaunator-cpp.git@98305ef6c4e862f7d48df9cc647b690d796fec68\",\n+ # \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@2a86250e561c56e9b1b9af5774f1253d9d66be97\",\n+ # \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@e2d024354e11cc6b041b0cff032d73f0c7e43a07\",\n+ # \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@0bad08bb207bbfc1d6f3bbc82b9242b0c50e5794\",\n+ # \"third_party/externals/abseil-cpp\" : \"https://skia.googlesource.com/external/github.com/abseil/abseil-cpp.git@65a55c2ba891f6d2492477707f4a2e327a0b40dc\",\n+ # \"third_party/externals/delaunator-cpp\" : \"https://skia.googlesource.com/external/github.com/skia-dev/delaunator-cpp.git@98305ef6c4e862f7d48df9cc647b690d796fec68\",\n \"third_party/externals/dng_sdk\" : \"https://android.googlesource.com/platform/external/dng_sdk.git@c8d0c9b1d16bfda56f15165d39e0ffa360a11123\",\n- \"third_party/externals/egl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/EGL-Registry@b055c9b483e70ecd57b3cf7204db21f5a06f9ffe\",\n- \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@a896e3d066448b3530dbcaa48869fafefd738f57\",\n- \"third_party/externals/expat\" : \"https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git@624da0f593bb8d7e146b9f42b06d8e6c80d032a3\",\n- \"third_party/externals/freetype\" : \"https://chromium.googlesource.com/chromium/src/third_party/freetype2.git@59320b2d3c2584ac01914ed0deff64bcc8fb23b2\",\n- \"third_party/externals/harfbuzz\" : \"https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@a070f9ebbe88dc71b248af9731dd49ec93f4e6e6\",\n- \"third_party/externals/highway\" : \"https://chromium.googlesource.com/external/github.com/google/highway.git@424360251cdcfc314cfc528f53c872ecd63af0f0\",\n- \"third_party/externals/icu\" : \"https://chromium.googlesource.com/chromium/deps/icu.git@364118a1d9da24bb5b770ac3d762ac144d6da5a4\",\n- \"third_party/externals/icu4x\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/icu4x.git@bcf4f7198d4dc5f3127e84a6ca657c88e7d07a13\",\n- \"third_party/externals/imgui\" : \"https://skia.googlesource.com/external/github.com/ocornut/imgui.git@55d35d8387c15bf0cfd71861df67af8cfbda7456\",\n- \"third_party/externals/libavif\" : \"https://skia.googlesource.com/external/github.com/AOMediaCodec/libavif.git@55aab4ac0607ab651055d354d64c4615cf3d8000\",\n- \"third_party/externals/libgav1\" : \"https://chromium.googlesource.com/codecs/libgav1.git@5cf722e659014ebaf2f573a6dd935116d36eadf1\",\n- \"third_party/externals/libgrapheme\" : \"https://skia.googlesource.com/external/github.com/FRIGN/libgrapheme/@c0cab63c5300fa12284194fbef57aa2ed62a94c0\",\n- \"third_party/externals/libjpeg-turbo\" : \"https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@ccfbe1c82a3b6dbe8647ceb36a3f9ee711fba3cf\",\n- \"third_party/externals/libjxl\" : \"https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git@a205468bc5d3a353fb15dae2398a101dff52f2d3\",\n- \"third_party/externals/libpng\" : \"https://skia.googlesource.com/third_party/libpng.git@ed217e3e601d8e462f7fd1e04bed43ac42212429\",\n- \"third_party/externals/libwebp\" : \"https://chromium.googlesource.com/webm/libwebp.git@845d5476a866141ba35ac133f856fa62f0b7445f\",\n- \"third_party/externals/libyuv\" : \"https://chromium.googlesource.com/libyuv/libyuv.git@d248929c059ff7629a85333699717d7a677d8d96\",\n- \"third_party/externals/oboe\" : \"https://chromium.googlesource.com/external/github.com/google/oboe.git@b02a12d1dd821118763debec6b83d00a8a0ee419\",\n- \"third_party/externals/opengl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry@14b80ebeab022b2c78f84a573f01028c96075553\",\n- \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@ce13777cb731e0a60c606d1741091fd11a0574d7\",\n- \"third_party/externals/perfetto\" : \"https://android.googlesource.com/platform/external/perfetto@93885509be1c9240bc55fa515ceb34811e54a394\",\n+ # \"third_party/externals/egl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/EGL-Registry@b055c9b483e70ecd57b3cf7204db21f5a06f9ffe\",\n+ # \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@a896e3d066448b3530dbcaa48869fafefd738f57\",\n+ \"third_party/externals/expat\" : \"https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git@f31adfd584b7f6c50bbf4d22eb928538ffc9145a\",\n+ \"third_party/externals/freetype\" : \"https://chromium.googlesource.com/chromium/src/third_party/freetype2.git@83af801b552111e37d9466a887e1783a0fb5f196\",\n+ \"third_party/externals/harfbuzz\" : \"https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@2b3631a866b3077d9d675caa4ec9010b342b5a7c\",\n+ # \"third_party/externals/highway\" : \"https://chromium.googlesource.com/external/github.com/google/highway.git@424360251cdcfc314cfc528f53c872ecd63af0f0\",\n+ # \"third_party/externals/icu\" : \"https://chromium.googlesource.com/chromium/deps/icu.git@364118a1d9da24bb5b770ac3d762ac144d6da5a4\",\n+ # \"third_party/externals/icu4x\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/icu4x.git@bcf4f7198d4dc5f3127e84a6ca657c88e7d07a13\",\n+ # \"third_party/externals/imgui\" : \"https://skia.googlesource.com/external/github.com/ocornut/imgui.git@55d35d8387c15bf0cfd71861df67af8cfbda7456\",\n+ # \"third_party/externals/libavif\" : \"https://skia.googlesource.com/external/github.com/AOMediaCodec/libavif.git@55aab4ac0607ab651055d354d64c4615cf3d8000\",\n+ # \"third_party/externals/libgav1\" : \"https://chromium.googlesource.com/codecs/libgav1.git@5cf722e659014ebaf2f573a6dd935116d36eadf1\",\n+ # \"third_party/externals/libgrapheme\" : \"https://skia.googlesource.com/external/github.com/FRIGN/libgrapheme/@c0cab63c5300fa12284194fbef57aa2ed62a94c0\",\n+ \"third_party/externals/libjpeg-turbo\" : \"https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@927aabfcd26897abb9776ecf2a6c38ea5bb52ab6\",\n+ # \"third_party/externals/libjxl\" : \"https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git@a205468bc5d3a353fb15dae2398a101dff52f2d3\",\n+ \"third_party/externals/libpng\" : \"https://skia.googlesource.com/third_party/libpng.git@3061454d980de7d53608f594194cfac722721d2a\",\n+ \"third_party/externals/libwebp\" : \"https://chromium.googlesource.com/webm/libwebp.git@4fa21912338357f89e4fd51cf2368325b59e9bd9\",\n+ # \"third_party/externals/libyuv\" : \"https://chromium.googlesource.com/libyuv/libyuv.git@d248929c059ff7629a85333699717d7a677d8d96\",\n+ # \"third_party/externals/microhttpd\" : \"https://android.googlesource.com/platform/external/libmicrohttpd@748945ec6f1c67b7efc934ab0808e1d32f2fb98d\",\n+ # \"third_party/externals/oboe\" : \"https://chromium.googlesource.com/external/github.com/google/oboe.git@b02a12d1dd821118763debec6b83d00a8a0ee419\",\n+ # \"third_party/externals/opengl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry@14b80ebeab022b2c78f84a573f01028c96075553\",\n+ # \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@ce13777cb731e0a60c606d1741091fd11a0574d7\",\n+ # \"third_party/externals/perfetto\" : \"https://android.googlesource.com/platform/external/perfetto@93885509be1c9240bc55fa515ceb34811e54a394\",\n \"third_party/externals/piex\" : \"https://android.googlesource.com/platform/external/piex.git@bb217acdca1cc0c16b704669dd6f91a1b509c406\",\n- \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@e76961fac58c34c61bb52ed3887917300f0e37a3\",\n- \"third_party/externals/vulkanmemoryallocator\" : \"https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator@a6bfc237255a6bac1513f7c1ebde6d8aed6b5191\",\n+ # \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@76855a9baecc97fa144ce70d7ae43a9f878e14c8\",\n+ \"third_party/externals/vulkanmemoryallocator\" : \"https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator@c788c52156f3ef7bc7ab769cb03c110a53ac8fcb\",\n # vulkan-deps is a meta-repo containing several interdependent Khronos Vulkan repositories.\n # When the vulkan-deps revision is updated, those repos (spirv-*, vulkan-*) should be updated as well.\n- \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@e2e618fdd93aae61355f75a60dffa4a775fd0f23\",\n+ # \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@a2dfb2276ea5f9467eb84c9a19ecf917d92e4135\",\n \"third_party/externals/spirv-cross\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3\",\n- \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@3f17b2af6784bfa2c5aa5dbb8e0e74a607dd8b3b\",\n- \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@1a0658f55aab97e1803ca46896596a04c395d50d\",\n- \"third_party/externals/vello\" : \"https://skia.googlesource.com/external/github.com/linebender/vello.git@3ee3bea02164c5a816fe6c16ef4e3a810edb7620\",\n- \"third_party/externals/vulkan-headers\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers@d4a196d8c84e032d27f999adcea3075517c1c97f\",\n- \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@a71347ae4d76eb8454459373d4e1bfb929ea6a89\",\n- \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@5a88b6042edb8f03eefc8de73bd73a899989373f\",\n- \"third_party/externals/unicodetools\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/unicodetools@66a3fa9dbdca3b67053a483d130564eabc5fe095\",\n+ # \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@996c728cf7dcfb29845cfa15222822318f047810\",\n+ # \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@9117e042b93d4ff08d2406542708170f77aaa2a3\",\n+ # \"third_party/externals/vello\" : \"https://skia.googlesource.com/external/github.com/linebender/vello.git@3ee3bea02164c5a816fe6c16ef4e3a810edb7620\",\n+ \"third_party/externals/vulkan-headers\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers@cbcad3c0587dddc768d76641ea00f5c45ab5a278\",\n+ # \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@15f2de809304aba619ee327f3273425418ca83de\",\n+ # \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@87ab6b39a97d084a2ef27db85e3cbaf5d2622a09\",\n+ # \"third_party/externals/unicodetools\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/unicodetools@66a3fa9dbdca3b67053a483d130564eabc5fe095\",\n #\"third_party/externals/v8\" : \"https://chromium.googlesource.com/v8/v8.git@5f1ae66d5634e43563b2d25ea652dfb94c31a3b4\",\n \"third_party/externals/wuffs\" : \"https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git@e3f919ccfe3ef542cfc983a82146070258fb57f8\",\n- \"third_party/externals/zlib\" : \"https://chromium.googlesource.com/chromium/src/third_party/zlib@646b7f569718921d7d4b5b8e22572ff6c76f2596\",\n+ \"third_party/externals/zlib\" : \"https://chromium.googlesource.com/chromium/src/third_party/zlib@e432200a7931de1b0b1b50201aac8a46d9380cb2\",\n \n 'bin': {\n 'packages': [", "newDiff": "diff --git a/DEPS b/DEPS\nindex 87fb60fc76..a18c275898 100644\n--- a/DEPS\n+++ b/DEPS\n@@ -31,59 +31,60 @@ vars = {\n # ./tools/git-sync-deps\n deps = {\n \"buildtools\" : \"https://chromium.googlesource.com/chromium/src/buildtools.git@729495f2ffa69080907780591fa2a630b2556e98\",\n- \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@b1b19492e609101305bf434bb01ca7ff93619549\",\n- \"third_party/externals/brotli\" : \"https://skia.googlesource.com/external/github.com/google/brotli.git@6d03dfbedda1615c4cba1211f8d81735575209c8\",\n+ # \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@b1b19492e609101305bf434bb01ca7ff93619549\",\n+ \"third_party/externals/brotli\" : \"https://skia.googlesource.com/external/github.com/google/brotli.git@028fb5a23661f123017c060daa546b55cf4bde29\",\n \"third_party/externals/d3d12allocator\" : \"https://skia.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator.git@169895d529dfce00390a20e69c2f516066fe7a3b\",\n # Dawn requires jinja2 and markupsafe for the code generator, abseil for string formatting,\n # and a few other depencencies.\n # When the Dawn revision is updated these should be updated from the Dawn DEPS as well.\n- \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@620a520f5029e14b57a0b58096c022e339b1857b\",\n- \"third_party/externals/abseil-cpp\" : \"https://chromium.googlesource.com/chromium/src/third_party/abseil-cpp@526428fa2488f4b10406f697108659bc1619a97b\",\n- \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@c3027d884967773057bf74b957e3fea87e5df4d7\",\n- \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@4256084ae14175d38a3ff7d739dca83ae49ccec6\",\n- 'third_party/externals/glslang' : 'https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang@1d47ffa8ac4374a19b302021e216a20f22a3de92',\n- 'third_party/externals/webgpu-headers' : 'https://chromium.googlesource.com/external/github.com/webgpu-native/webgpu-headers@706853a9da45b8e89b7ea005aa267294d115f8ce',\n+ # \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@620a520f5029e14b57a0b58096c022e339b1857b\",\n+ # \"third_party/externals/abseil-cpp\" : \"https://chromium.googlesource.com/chromium/src/third_party/abseil-cpp@526428fa2488f4b10406f697108659bc1619a97b\",\n+ # \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@c3027d884967773057bf74b957e3fea87e5df4d7\",\n+ # \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@4256084ae14175d38a3ff7d739dca83ae49ccec6\",\n+ # 'third_party/externals/glslang' : 'https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang@1d47ffa8ac4374a19b302021e216a20f22a3de92',\n+ # 'third_party/externals/webgpu-headers' : 'https://chromium.googlesource.com/external/github.com/webgpu-native/webgpu-headers@706853a9da45b8e89b7ea005aa267294d115f8ce',\n \n- \"third_party/externals/delaunator-cpp\" : \"https://skia.googlesource.com/external/github.com/skia-dev/delaunator-cpp.git@98305ef6c4e862f7d48df9cc647b690d796fec68\",\n+ # \"third_party/externals/delaunator-cpp\" : \"https://skia.googlesource.com/external/github.com/skia-dev/delaunator-cpp.git@98305ef6c4e862f7d48df9cc647b690d796fec68\",\n \"third_party/externals/dng_sdk\" : \"https://android.googlesource.com/platform/external/dng_sdk.git@dbe0a676450d9b8c71bf00688bb306409b779e90\",\n- \"third_party/externals/egl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/EGL-Registry@b055c9b483e70ecd57b3cf7204db21f5a06f9ffe\",\n- \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@c69d433d8509c5c64564c2f0d054bf102a5cf67e\",\n- \"third_party/externals/expat\" : \"https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git@8e49998f003d693213b538ef765814c7d21abada\",\n+ # \"third_party/externals/egl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/EGL-Registry@b055c9b483e70ecd57b3cf7204db21f5a06f9ffe\",\n+ # \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@c69d433d8509c5c64564c2f0d054bf102a5cf67e\",\n+ \"third_party/externals/expat\" : \"https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git@f31adfd584b7f6c50bbf4d22eb928538ffc9145a\",\n \"third_party/externals/freetype\" : \"https://chromium.googlesource.com/chromium/src/third_party/freetype2.git@b91f75bd02db43b06d634591eb286d3eb0ce3b65\",\n- \"third_party/externals/harfbuzz\" : \"https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@31695252eb6ed25096893aec7f848889dad874bc\",\n- \"third_party/externals/highway\" : \"https://chromium.googlesource.com/external/github.com/google/highway.git@424360251cdcfc314cfc528f53c872ecd63af0f0\",\n- \"third_party/externals/icu\" : \"https://chromium.googlesource.com/chromium/deps/icu.git@364118a1d9da24bb5b770ac3d762ac144d6da5a4\",\n- \"third_party/externals/icu4x\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/icu4x.git@bcf4f7198d4dc5f3127e84a6ca657c88e7d07a13\",\n- \"third_party/externals/imgui\" : \"https://skia.googlesource.com/external/github.com/ocornut/imgui.git@55d35d8387c15bf0cfd71861df67af8cfbda7456\",\n- \"third_party/externals/libavif\" : \"https://skia.googlesource.com/external/github.com/AOMediaCodec/libavif.git@55aab4ac0607ab651055d354d64c4615cf3d8000\",\n- \"third_party/externals/libgav1\" : \"https://chromium.googlesource.com/codecs/libgav1.git@5cf722e659014ebaf2f573a6dd935116d36eadf1\",\n- \"third_party/externals/libgrapheme\" : \"https://skia.googlesource.com/external/github.com/FRIGN/libgrapheme/@c0cab63c5300fa12284194fbef57aa2ed62a94c0\",\n+ \"third_party/externals/harfbuzz\" : \"https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@2b3631a866b3077d9d675caa4ec9010b342b5a7c\",\n+ # \"third_party/externals/highway\" : \"https://chromium.googlesource.com/external/github.com/google/highway.git@424360251cdcfc314cfc528f53c872ecd63af0f0\",\n+ # \"third_party/externals/icu\" : \"https://chromium.googlesource.com/chromium/deps/icu.git@364118a1d9da24bb5b770ac3d762ac144d6da5a4\",\n+ # \"third_party/externals/icu4x\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/icu4x.git@bcf4f7198d4dc5f3127e84a6ca657c88e7d07a13\",\n+ # \"third_party/externals/imgui\" : \"https://skia.googlesource.com/external/github.com/ocornut/imgui.git@55d35d8387c15bf0cfd71861df67af8cfbda7456\",\n+ # \"third_party/externals/libavif\" : \"https://skia.googlesource.com/external/github.com/AOMediaCodec/libavif.git@55aab4ac0607ab651055d354d64c4615cf3d8000\",\n+ # \"third_party/externals/libgav1\" : \"https://chromium.googlesource.com/codecs/libgav1.git@5cf722e659014ebaf2f573a6dd935116d36eadf1\",\n+ # \"third_party/externals/libgrapheme\" : \"https://skia.googlesource.com/external/github.com/FRIGN/libgrapheme/@c0cab63c5300fa12284194fbef57aa2ed62a94c0\",\n \"third_party/externals/libjpeg-turbo\" : \"https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@e14cbfaa85529d47f9f55b0f104a579c1061f9ad\",\n- \"third_party/externals/libjxl\" : \"https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git@a205468bc5d3a353fb15dae2398a101dff52f2d3\",\n- \"third_party/externals/libpng\" : \"https://skia.googlesource.com/third_party/libpng.git@4e3f57d50f552841550a36eabbb3fbcecacb7750\",\n- \"third_party/externals/libwebp\" : \"https://chromium.googlesource.com/webm/libwebp.git@845d5476a866141ba35ac133f856fa62f0b7445f\",\n- \"third_party/externals/libyuv\" : \"https://chromium.googlesource.com/libyuv/libyuv.git@d248929c059ff7629a85333699717d7a677d8d96\",\n- \"third_party/externals/oboe\" : \"https://chromium.googlesource.com/external/github.com/google/oboe.git@b02a12d1dd821118763debec6b83d00a8a0ee419\",\n- \"third_party/externals/opengl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry@14b80ebeab022b2c78f84a573f01028c96075553\",\n- \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@b8c0688f577c1bbce6c2c1ce4753cd685ca0f634\",\n- \"third_party/externals/perfetto\" : \"https://android.googlesource.com/platform/external/perfetto@93885509be1c9240bc55fa515ceb34811e54a394\",\n+ # \"third_party/externals/libjxl\" : \"https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git@a205468bc5d3a353fb15dae2398a101dff52f2d3\",\n+ \"third_party/externals/libpng\" : \"https://skia.googlesource.com/third_party/libpng.git@3061454d980de7d53608f594194cfac722721d2a\",\n+ \"third_party/externals/libwebp\" : \"https://chromium.googlesource.com/webm/libwebp.git@4fa21912338357f89e4fd51cf2368325b59e9bd9\",\n+ # \"third_party/externals/libyuv\" : \"https://chromium.googlesource.com/libyuv/libyuv.git@d248929c059ff7629a85333699717d7a677d8d96\",\n+ # \"third_party/externals/microhttpd\" : \"https://android.googlesource.com/platform/external/libmicrohttpd@748945ec6f1c67b7efc934ab0808e1d32f2fb98d\",\n+ # \"third_party/externals/oboe\" : \"https://chromium.googlesource.com/external/github.com/google/oboe.git@b02a12d1dd821118763debec6b83d00a8a0ee419\",\n+ # \"third_party/externals/opengl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry@14b80ebeab022b2c78f84a573f01028c96075553\",\n+ # \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@b8c0688f577c1bbce6c2c1ce4753cd685ca0f634\",\n+ # \"third_party/externals/perfetto\" : \"https://android.googlesource.com/platform/external/perfetto@93885509be1c9240bc55fa515ceb34811e54a394\",\n \"third_party/externals/piex\" : \"https://android.googlesource.com/platform/external/piex.git@bb217acdca1cc0c16b704669dd6f91a1b509c406\",\n- \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@313545f85af72f954820e54f4110cda591a6cf7b\",\n- \"third_party/externals/vulkanmemoryallocator\" : \"https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator@a6bfc237255a6bac1513f7c1ebde6d8aed6b5191\",\n+ # \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@313545f85af72f954820e54f4110cda591a6cf7b\",\n+ \"third_party/externals/vulkanmemoryallocator\" : \"https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator@c788c52156f3ef7bc7ab769cb03c110a53ac8fcb\",\n # vulkan-deps is a meta-repo containing several interdependent Khronos Vulkan repositories.\n # When the vulkan-deps revision is updated, those repos (spirv-*, vulkan-*) should be updated as well.\n- \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@9117cef67a601b46f8537a61dee24676f29d2a42\",\n+ # \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@9117cef67a601b46f8537a61dee24676f29d2a42\",\n \"third_party/externals/spirv-cross\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3\",\n- \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@f88a2d766840fc825af1fc065977953ba1fa4a91\",\n- \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@7d8d9e58c384949f1615c069d4c9346bf51b9738\",\n- \"third_party/externals/vello\" : \"https://skia.googlesource.com/external/github.com/linebender/vello.git@3ee3bea02164c5a816fe6c16ef4e3a810edb7620\",\n+ # \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@f88a2d766840fc825af1fc065977953ba1fa4a91\",\n+ # \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@7d8d9e58c384949f1615c069d4c9346bf51b9738\",\n+ # \"third_party/externals/vello\" : \"https://skia.googlesource.com/external/github.com/linebender/vello.git@3ee3bea02164c5a816fe6c16ef4e3a810edb7620\",\n \"third_party/externals/vulkan-headers\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers@74d8a6cb930c68ef617b202c3ff3c59d919e086b\",\n- \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@59f963ce1b1d16cc92137a241a0fe98d637d21f4\",\n- \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@20fb10eb1ec08ccd5cacec32b7df1b0e99e48a0c\",\n- \"third_party/externals/unicodetools\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/unicodetools@66a3fa9dbdca3b67053a483d130564eabc5fe095\",\n+ # \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@59f963ce1b1d16cc92137a241a0fe98d637d21f4\",\n+ # \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@20fb10eb1ec08ccd5cacec32b7df1b0e99e48a0c\",\n+ # \"third_party/externals/unicodetools\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/unicodetools@66a3fa9dbdca3b67053a483d130564eabc5fe095\",\n #\"third_party/externals/v8\" : \"https://chromium.googlesource.com/v8/v8.git@5f1ae66d5634e43563b2d25ea652dfb94c31a3b4\",\n \"third_party/externals/wuffs\" : \"https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git@e3f919ccfe3ef542cfc983a82146070258fb57f8\",\n- \"third_party/externals/zlib\" : \"https://chromium.googlesource.com/chromium/src/third_party/zlib@646b7f569718921d7d4b5b8e22572ff6c76f2596\",\n+ \"third_party/externals/zlib\" : \"https://chromium.googlesource.com/chromium/src/third_party/zlib@e432200a7931de1b0b1b50201aac8a46d9380cb2\",\n \n 'bin': {\n 'packages': [", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,36 +1,43 @@\n diff --git a/DEPS b/DEPS\n-index 4a8c5d69d9..b8b9255c28 100644\n+index 87fb60fc76..a18c275898 100644\n --- a/DEPS\n +++ b/DEPS\n-@@ -30,56 +30,57 @@ vars = {\n- # To apply the changes for the GN build, you will need to resync the git repositories using:\n+@@ -31,59 +31,60 @@ vars = {\n # ./tools/git-sync-deps\n deps = {\n-- \"buildtools\" : \"https://chromium.googlesource.com/chromium/src/buildtools.git@1760ff6d7267dd97ae1968c7bee9ce04a2a8489d\",\n-- \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@d65751b40f7e4441ca0e41210eadcc8a9cbccce5\",\n+ \"buildtools\" : \"https://chromium.googlesource.com/chromium/src/buildtools.git@729495f2ffa69080907780591fa2a630b2556e98\",\n+- \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@b1b19492e609101305bf434bb01ca7ff93619549\",\n - \"third_party/externals/brotli\" : \"https://skia.googlesource.com/external/github.com/google/brotli.git@6d03dfbedda1615c4cba1211f8d81735575209c8\",\n-+ \"buildtools\" : \"https://chromium.googlesource.com/chromium/src/buildtools.git@b138e6ce86ae843c42a1a08f37903207bebcca75\",\n-+ # \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@7fea539cc99bed8fd315cfbc5026952a133ac3ae\",\n++ # \"third_party/externals/angle2\" : \"https://chromium.googlesource.com/angle/angle.git@b1b19492e609101305bf434bb01ca7ff93619549\",\n + \"third_party/externals/brotli\" : \"https://skia.googlesource.com/external/github.com/google/brotli.git@028fb5a23661f123017c060daa546b55cf4bde29\",\n \"third_party/externals/d3d12allocator\" : \"https://skia.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator.git@169895d529dfce00390a20e69c2f516066fe7a3b\",\n- # Dawn requires jinja2 and markupsafe for the code generator, tint for SPIRV compilation, and abseil for string formatting.\n+ # Dawn requires jinja2 and markupsafe for the code generator, abseil for string formatting,\n+ # and a few other depencencies.\n # When the Dawn revision is updated these should be updated from the Dawn DEPS as well.\n-- \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@3f908f3907e532481e4c91d3b814b46869405fe8\",\n-- \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@e2d024354e11cc6b041b0cff032d73f0c7e43a07\",\n-- \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@0bad08bb207bbfc1d6f3bbc82b9242b0c50e5794\",\n-- \"third_party/externals/abseil-cpp\" : \"https://skia.googlesource.com/external/github.com/abseil/abseil-cpp.git@65a55c2ba891f6d2492477707f4a2e327a0b40dc\",\n+- \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@620a520f5029e14b57a0b58096c022e339b1857b\",\n+- \"third_party/externals/abseil-cpp\" : \"https://chromium.googlesource.com/chromium/src/third_party/abseil-cpp@526428fa2488f4b10406f697108659bc1619a97b\",\n+- \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@c3027d884967773057bf74b957e3fea87e5df4d7\",\n+- \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@4256084ae14175d38a3ff7d739dca83ae49ccec6\",\n+- 'third_party/externals/glslang' : 'https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang@1d47ffa8ac4374a19b302021e216a20f22a3de92',\n+- 'third_party/externals/webgpu-headers' : 'https://chromium.googlesource.com/external/github.com/webgpu-native/webgpu-headers@706853a9da45b8e89b7ea005aa267294d115f8ce',\n++ # \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@620a520f5029e14b57a0b58096c022e339b1857b\",\n++ # \"third_party/externals/abseil-cpp\" : \"https://chromium.googlesource.com/chromium/src/third_party/abseil-cpp@526428fa2488f4b10406f697108659bc1619a97b\",\n++ # \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@c3027d884967773057bf74b957e3fea87e5df4d7\",\n++ # \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@4256084ae14175d38a3ff7d739dca83ae49ccec6\",\n++ # 'third_party/externals/glslang' : 'https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang@1d47ffa8ac4374a19b302021e216a20f22a3de92',\n++ # 'third_party/externals/webgpu-headers' : 'https://chromium.googlesource.com/external/github.com/webgpu-native/webgpu-headers@706853a9da45b8e89b7ea005aa267294d115f8ce',\n+ \n - \"third_party/externals/delaunator-cpp\" : \"https://skia.googlesource.com/external/github.com/skia-dev/delaunator-cpp.git@98305ef6c4e862f7d48df9cc647b690d796fec68\",\n-+ # \"third_party/externals/dawn\" : \"https://dawn.googlesource.com/dawn.git@2a86250e561c56e9b1b9af5774f1253d9d66be97\",\n-+ # \"third_party/externals/jinja2\" : \"https://chromium.googlesource.com/chromium/src/third_party/jinja2@e2d024354e11cc6b041b0cff032d73f0c7e43a07\",\n-+ # \"third_party/externals/markupsafe\" : \"https://chromium.googlesource.com/chromium/src/third_party/markupsafe@0bad08bb207bbfc1d6f3bbc82b9242b0c50e5794\",\n-+ # \"third_party/externals/abseil-cpp\" : \"https://skia.googlesource.com/external/github.com/abseil/abseil-cpp.git@65a55c2ba891f6d2492477707f4a2e327a0b40dc\",\n + # \"third_party/externals/delaunator-cpp\" : \"https://skia.googlesource.com/external/github.com/skia-dev/delaunator-cpp.git@98305ef6c4e862f7d48df9cc647b690d796fec68\",\n- \"third_party/externals/dng_sdk\" : \"https://android.googlesource.com/platform/external/dng_sdk.git@c8d0c9b1d16bfda56f15165d39e0ffa360a11123\",\n+ \"third_party/externals/dng_sdk\" : \"https://android.googlesource.com/platform/external/dng_sdk.git@dbe0a676450d9b8c71bf00688bb306409b779e90\",\n - \"third_party/externals/egl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/EGL-Registry@b055c9b483e70ecd57b3cf7204db21f5a06f9ffe\",\n-- \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@a896e3d066448b3530dbcaa48869fafefd738f57\",\n-- \"third_party/externals/expat\" : \"https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git@624da0f593bb8d7e146b9f42b06d8e6c80d032a3\",\n-- \"third_party/externals/freetype\" : \"https://chromium.googlesource.com/chromium/src/third_party/freetype2.git@59320b2d3c2584ac01914ed0deff64bcc8fb23b2\",\n-- \"third_party/externals/harfbuzz\" : \"https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@a070f9ebbe88dc71b248af9731dd49ec93f4e6e6\",\n+- \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@c69d433d8509c5c64564c2f0d054bf102a5cf67e\",\n+- \"third_party/externals/expat\" : \"https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git@8e49998f003d693213b538ef765814c7d21abada\",\n++ # \"third_party/externals/egl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/EGL-Registry@b055c9b483e70ecd57b3cf7204db21f5a06f9ffe\",\n++ # \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@c69d433d8509c5c64564c2f0d054bf102a5cf67e\",\n++ \"third_party/externals/expat\" : \"https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git@f31adfd584b7f6c50bbf4d22eb928538ffc9145a\",\n+ \"third_party/externals/freetype\" : \"https://chromium.googlesource.com/chromium/src/third_party/freetype2.git@b91f75bd02db43b06d634591eb286d3eb0ce3b65\",\n+- \"third_party/externals/harfbuzz\" : \"https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@31695252eb6ed25096893aec7f848889dad874bc\",\n - \"third_party/externals/highway\" : \"https://chromium.googlesource.com/external/github.com/google/highway.git@424360251cdcfc314cfc528f53c872ecd63af0f0\",\n - \"third_party/externals/icu\" : \"https://chromium.googlesource.com/chromium/deps/icu.git@364118a1d9da24bb5b770ac3d762ac144d6da5a4\",\n - \"third_party/externals/icu4x\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/icu4x.git@bcf4f7198d4dc5f3127e84a6ca657c88e7d07a13\",\n@@ -38,19 +45,6 @@ index 4a8c5d69d9..b8b9255c28 100644\n - \"third_party/externals/libavif\" : \"https://skia.googlesource.com/external/github.com/AOMediaCodec/libavif.git@55aab4ac0607ab651055d354d64c4615cf3d8000\",\n - \"third_party/externals/libgav1\" : \"https://chromium.googlesource.com/codecs/libgav1.git@5cf722e659014ebaf2f573a6dd935116d36eadf1\",\n - \"third_party/externals/libgrapheme\" : \"https://skia.googlesource.com/external/github.com/FRIGN/libgrapheme/@c0cab63c5300fa12284194fbef57aa2ed62a94c0\",\n-- \"third_party/externals/libjpeg-turbo\" : \"https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@ccfbe1c82a3b6dbe8647ceb36a3f9ee711fba3cf\",\n-- \"third_party/externals/libjxl\" : \"https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git@a205468bc5d3a353fb15dae2398a101dff52f2d3\",\n-- \"third_party/externals/libpng\" : \"https://skia.googlesource.com/third_party/libpng.git@ed217e3e601d8e462f7fd1e04bed43ac42212429\",\n-- \"third_party/externals/libwebp\" : \"https://chromium.googlesource.com/webm/libwebp.git@845d5476a866141ba35ac133f856fa62f0b7445f\",\n-- \"third_party/externals/libyuv\" : \"https://chromium.googlesource.com/libyuv/libyuv.git@d248929c059ff7629a85333699717d7a677d8d96\",\n-- \"third_party/externals/oboe\" : \"https://chromium.googlesource.com/external/github.com/google/oboe.git@b02a12d1dd821118763debec6b83d00a8a0ee419\",\n-- \"third_party/externals/opengl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry@14b80ebeab022b2c78f84a573f01028c96075553\",\n-- \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@ce13777cb731e0a60c606d1741091fd11a0574d7\",\n-- \"third_party/externals/perfetto\" : \"https://android.googlesource.com/platform/external/perfetto@93885509be1c9240bc55fa515ceb34811e54a394\",\n-+ # \"third_party/externals/egl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/EGL-Registry@b055c9b483e70ecd57b3cf7204db21f5a06f9ffe\",\n-+ # \"third_party/externals/emsdk\" : \"https://skia.googlesource.com/external/github.com/emscripten-core/emsdk.git@a896e3d066448b3530dbcaa48869fafefd738f57\",\n-+ \"third_party/externals/expat\" : \"https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git@f31adfd584b7f6c50bbf4d22eb928538ffc9145a\",\n-+ \"third_party/externals/freetype\" : \"https://chromium.googlesource.com/chromium/src/third_party/freetype2.git@83af801b552111e37d9466a887e1783a0fb5f196\",\n + \"third_party/externals/harfbuzz\" : \"https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@2b3631a866b3077d9d675caa4ec9010b342b5a7c\",\n + # \"third_party/externals/highway\" : \"https://chromium.googlesource.com/external/github.com/google/highway.git@424360251cdcfc314cfc528f53c872ecd63af0f0\",\n + # \"third_party/externals/icu\" : \"https://chromium.googlesource.com/chromium/deps/icu.git@364118a1d9da24bb5b770ac3d762ac144d6da5a4\",\n@@ -59,7 +53,15 @@ index 4a8c5d69d9..b8b9255c28 100644\n + # \"third_party/externals/libavif\" : \"https://skia.googlesource.com/external/github.com/AOMediaCodec/libavif.git@55aab4ac0607ab651055d354d64c4615cf3d8000\",\n + # \"third_party/externals/libgav1\" : \"https://chromium.googlesource.com/codecs/libgav1.git@5cf722e659014ebaf2f573a6dd935116d36eadf1\",\n + # \"third_party/externals/libgrapheme\" : \"https://skia.googlesource.com/external/github.com/FRIGN/libgrapheme/@c0cab63c5300fa12284194fbef57aa2ed62a94c0\",\n-+ \"third_party/externals/libjpeg-turbo\" : \"https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@927aabfcd26897abb9776ecf2a6c38ea5bb52ab6\",\n+ \"third_party/externals/libjpeg-turbo\" : \"https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@e14cbfaa85529d47f9f55b0f104a579c1061f9ad\",\n+- \"third_party/externals/libjxl\" : \"https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git@a205468bc5d3a353fb15dae2398a101dff52f2d3\",\n+- \"third_party/externals/libpng\" : \"https://skia.googlesource.com/third_party/libpng.git@4e3f57d50f552841550a36eabbb3fbcecacb7750\",\n+- \"third_party/externals/libwebp\" : \"https://chromium.googlesource.com/webm/libwebp.git@845d5476a866141ba35ac133f856fa62f0b7445f\",\n+- \"third_party/externals/libyuv\" : \"https://chromium.googlesource.com/libyuv/libyuv.git@d248929c059ff7629a85333699717d7a677d8d96\",\n+- \"third_party/externals/oboe\" : \"https://chromium.googlesource.com/external/github.com/google/oboe.git@b02a12d1dd821118763debec6b83d00a8a0ee419\",\n+- \"third_party/externals/opengl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry@14b80ebeab022b2c78f84a573f01028c96075553\",\n+- \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@b8c0688f577c1bbce6c2c1ce4753cd685ca0f634\",\n+- \"third_party/externals/perfetto\" : \"https://android.googlesource.com/platform/external/perfetto@93885509be1c9240bc55fa515ceb34811e54a394\",\n + # \"third_party/externals/libjxl\" : \"https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git@a205468bc5d3a353fb15dae2398a101dff52f2d3\",\n + \"third_party/externals/libpng\" : \"https://skia.googlesource.com/third_party/libpng.git@3061454d980de7d53608f594194cfac722721d2a\",\n + \"third_party/externals/libwebp\" : \"https://chromium.googlesource.com/webm/libwebp.git@4fa21912338357f89e4fd51cf2368325b59e9bd9\",\n@@ -67,31 +69,30 @@ index 4a8c5d69d9..b8b9255c28 100644\n + # \"third_party/externals/microhttpd\" : \"https://android.googlesource.com/platform/external/libmicrohttpd@748945ec6f1c67b7efc934ab0808e1d32f2fb98d\",\n + # \"third_party/externals/oboe\" : \"https://chromium.googlesource.com/external/github.com/google/oboe.git@b02a12d1dd821118763debec6b83d00a8a0ee419\",\n + # \"third_party/externals/opengl-registry\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry@14b80ebeab022b2c78f84a573f01028c96075553\",\n-+ # \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@ce13777cb731e0a60c606d1741091fd11a0574d7\",\n++ # \"third_party/externals/partition_alloc\" : \"https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git@b8c0688f577c1bbce6c2c1ce4753cd685ca0f634\",\n + # \"third_party/externals/perfetto\" : \"https://android.googlesource.com/platform/external/perfetto@93885509be1c9240bc55fa515ceb34811e54a394\",\n \"third_party/externals/piex\" : \"https://android.googlesource.com/platform/external/piex.git@bb217acdca1cc0c16b704669dd6f91a1b509c406\",\n-- \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@e76961fac58c34c61bb52ed3887917300f0e37a3\",\n+- \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@313545f85af72f954820e54f4110cda591a6cf7b\",\n - \"third_party/externals/vulkanmemoryallocator\" : \"https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator@a6bfc237255a6bac1513f7c1ebde6d8aed6b5191\",\n-+ # \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@76855a9baecc97fa144ce70d7ae43a9f878e14c8\",\n++ # \"third_party/externals/swiftshader\" : \"https://swiftshader.googlesource.com/SwiftShader@313545f85af72f954820e54f4110cda591a6cf7b\",\n + \"third_party/externals/vulkanmemoryallocator\" : \"https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator@c788c52156f3ef7bc7ab769cb03c110a53ac8fcb\",\n # vulkan-deps is a meta-repo containing several interdependent Khronos Vulkan repositories.\n # When the vulkan-deps revision is updated, those repos (spirv-*, vulkan-*) should be updated as well.\n-- \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@e2e618fdd93aae61355f75a60dffa4a775fd0f23\",\n-+ # \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@a2dfb2276ea5f9467eb84c9a19ecf917d92e4135\",\n+- \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@9117cef67a601b46f8537a61dee24676f29d2a42\",\n++ # \"third_party/externals/vulkan-deps\" : \"https://chromium.googlesource.com/vulkan-deps@9117cef67a601b46f8537a61dee24676f29d2a42\",\n \"third_party/externals/spirv-cross\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3\",\n-- \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@3f17b2af6784bfa2c5aa5dbb8e0e74a607dd8b3b\",\n-- \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@1a0658f55aab97e1803ca46896596a04c395d50d\",\n+- \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@f88a2d766840fc825af1fc065977953ba1fa4a91\",\n+- \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@7d8d9e58c384949f1615c069d4c9346bf51b9738\",\n - \"third_party/externals/vello\" : \"https://skia.googlesource.com/external/github.com/linebender/vello.git@3ee3bea02164c5a816fe6c16ef4e3a810edb7620\",\n-- \"third_party/externals/vulkan-headers\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers@d4a196d8c84e032d27f999adcea3075517c1c97f\",\n-- \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@a71347ae4d76eb8454459373d4e1bfb929ea6a89\",\n-- \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@5a88b6042edb8f03eefc8de73bd73a899989373f\",\n-- \"third_party/externals/unicodetools\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/unicodetools@66a3fa9dbdca3b67053a483d130564eabc5fe095\",\n-+ # \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@996c728cf7dcfb29845cfa15222822318f047810\",\n-+ # \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@9117e042b93d4ff08d2406542708170f77aaa2a3\",\n++ # \"third_party/externals/spirv-headers\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@f88a2d766840fc825af1fc065977953ba1fa4a91\",\n++ # \"third_party/externals/spirv-tools\" : \"https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@7d8d9e58c384949f1615c069d4c9346bf51b9738\",\n + # \"third_party/externals/vello\" : \"https://skia.googlesource.com/external/github.com/linebender/vello.git@3ee3bea02164c5a816fe6c16ef4e3a810edb7620\",\n-+ \"third_party/externals/vulkan-headers\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers@cbcad3c0587dddc768d76641ea00f5c45ab5a278\",\n-+ # \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@15f2de809304aba619ee327f3273425418ca83de\",\n-+ # \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@87ab6b39a97d084a2ef27db85e3cbaf5d2622a09\",\n+ \"third_party/externals/vulkan-headers\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers@74d8a6cb930c68ef617b202c3ff3c59d919e086b\",\n+- \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@59f963ce1b1d16cc92137a241a0fe98d637d21f4\",\n+- \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@20fb10eb1ec08ccd5cacec32b7df1b0e99e48a0c\",\n+- \"third_party/externals/unicodetools\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/unicodetools@66a3fa9dbdca3b67053a483d130564eabc5fe095\",\n++ # \"third_party/externals/vulkan-tools\" : \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools@59f963ce1b1d16cc92137a241a0fe98d637d21f4\",\n++ # \"third_party/externals/vulkan-utility-libraries\": \"https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@20fb10eb1ec08ccd5cacec32b7df1b0e99e48a0c\",\n + # \"third_party/externals/unicodetools\" : \"https://chromium.googlesource.com/external/github.com/unicode-org/unicodetools@66a3fa9dbdca3b67053a483d130564eabc5fe095\",\n #\"third_party/externals/v8\" : \"https://chromium.googlesource.com/v8/v8.git@5f1ae66d5634e43563b2d25ea652dfb94c31a3b4\",\n \"third_party/externals/wuffs\" : \"https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git@e3f919ccfe3ef542cfc983a82146070258fb57f8\",", "summary": "Updates all third-party dependency pinned revisions to newer commits. Key changes: infra_revision updated, buildtools bumped, dng_sdk/freetype/libjpeg-turbo/vulkan-headers updated to new revisions. The fork patch continues to comment out Dawn, ANGLE, abseil-cpp, jinja2, markupsafe, emsdk, glslang, webgpu-headers, swiftshader, partition_alloc, vulkan-deps, spirv-headers, and spirv-tools (keeping them as comments since SkiaSharp doesn't use these). New upstream deps (glslang, webgpu-headers) are also commented out in the fork."}, {"path": "gn/BUILDCONFIG.gn", "diff": "diff --git a/gn/BUILDCONFIG.gn b/gn/BUILDCONFIG.gn\nindex 8a23f9f2f0..5a52b6f02e 100644\n--- a/gn/BUILDCONFIG.gn\n+++ b/gn/BUILDCONFIG.gn\n@@ -61,7 +61,7 @@ declare_args() {\n is_debug = !is_official_build\n \n # This affects Skia's ABI; must be set consistently for Skia and dependents.\n- is_trivial_abi = !is_official_build\n+ is_trivial_abi = false\n }\n \n assert(!(is_debug && is_official_build))\n@@ -82,7 +82,6 @@ if (current_os == \"\") {\n }\n \n is_android = current_os == \"android\"\n-is_fuchsia = current_os == \"fuchsia\"\n is_ios = current_os == \"ios\" || current_os == \"tvos\" || current_os == \"watchos\" || current_os == \"maccatalyst\"\n is_tvos = current_os == \"tvos\"\n is_watchos = current_os == \"watchos\"\n@@ -94,6 +93,9 @@ is_win = current_os == \"win\" || current_os == \"winrt\"\n is_winrt = current_os == \"winrt\"\n is_tizen = current_os == \"tizen\"\n \n+# Dawn has references to fuchsia, but Skia's GN rules do not\n+is_fuchsia = false\n+\n # This is just to make the Dawn build files happy. Skia itself uses target_os = \"linux\"\n # for ChromeOS, so this variable will not affect Skia proper.\n is_chromeos = false\n@@ -114,7 +116,7 @@ if (current_cpu == \"\") {\n current_cpu = target_cpu\n }\n \n-is_clang = is_android || is_ios || is_mac || is_fuchsia || is_tizen || is_wasm ||\n+is_clang = is_android || is_ios || is_mac || is_tizen || is_wasm ||\n (cc == \"clang\" && cxx == \"clang++\") || clang_win != \"\"\n if (!is_clang && !is_win) {\n is_clang = exec_script(\"//gn/is_clang.py\",\n@@ -249,6 +251,9 @@ if (is_trivial_abi) {\n if (!is_official_build) {\n default_configs += [ \"//gn/skia:debug_symbols\" ]\n }\n+if (is_wasm) {\n+ default_configs += [ \"//gn/skia:wasm\" ]\n+}\n default_configs += [ \"//gn/skia:extra_flags\" ]\n \n set_defaults(\"executable\") {", "oldDiff": "diff --git a/gn/BUILDCONFIG.gn b/gn/BUILDCONFIG.gn\nindex cd4030ae0f..8a23f9f2f0 100644\n--- a/gn/BUILDCONFIG.gn\n+++ b/gn/BUILDCONFIG.gn\n@@ -11,29 +11,47 @@ declare_args() {\n is_official_build = false\n is_component_build = false\n use_libfuzzer = false\n+ is_static_skiasharp = false\n ndk = \"\"\n \n # Android 5.0, Lollipop\n ndk_api = 21\n \n+ linux_soname_version = \"\"\n sanitize = \"\"\n \n ar = \"ar\"\n cc = \"cc\"\n cxx = \"c++\"\n \n- win_sdk = \"C:/Program Files (x86)/Windows Kits/10\"\n+ win_sdk = \"\"\n+ min_win_sdk_version = \"10.0.16299.0\"\n win_sdk_version = \"\"\n \n win_vc = \"\"\n win_toolchain_version = \"\"\n+ win_vcvars_version = \"\"\n \n clang_win = \"\"\n clang_win_version = \"\"\n \n+ ncli = \"\"\n+ ncli_version = \"8.0\"\n+ ncli_gcc_version = \"9.2.0\"\n+ ncli_gcc_version_short = \"9.2\"\n+ ncli_llvm_version = \"10\"\n+\n ios_min_target = \"\"\n+\n+ min_ios_version = \"8.0\"\n+ min_tvos_version = \"9.0\"\n+ min_watchos_version = \"2.0\"\n+ min_macos_version = \"10.8\"\n+ min_maccatalyst_version = \"13.0\"\n+\n ios_use_simulator =\n- target_os == \"ios\" && (target_cpu == \"x86\" || target_cpu == \"x64\")\n+ (target_os == \"ios\" || target_os == \"tvos\" || target_os == \"watchos\") &&\n+ (target_cpu == \"x86\" || target_cpu == \"x64\")\n \n # Enable -H, which prints the include tree during compilation.\n # For use by external tools for analyzing include files.\n@@ -65,12 +83,16 @@ if (current_os == \"\") {\n \n is_android = current_os == \"android\"\n is_fuchsia = current_os == \"fuchsia\"\n-is_ios = current_os == \"ios\" || current_os == \"tvos\"\n+is_ios = current_os == \"ios\" || current_os == \"tvos\" || current_os == \"watchos\" || current_os == \"maccatalyst\"\n is_tvos = current_os == \"tvos\"\n-is_linux = current_os == \"linux\"\n+is_watchos = current_os == \"watchos\"\n+is_maccatalyst = current_os == \"maccatalyst\"\n+is_linux = current_os == \"linux\" || current_os == \"tizen\"\n is_mac = current_os == \"mac\"\n is_wasm = current_os == \"wasm\"\n-is_win = current_os == \"win\"\n+is_win = current_os == \"win\" || current_os == \"winrt\"\n+is_winrt = current_os == \"winrt\"\n+is_tizen = current_os == \"tizen\"\n \n # This is just to make the Dawn build files happy. Skia itself uses target_os = \"linux\"\n # for ChromeOS, so this variable will not affect Skia proper.\n@@ -92,7 +114,7 @@ if (current_cpu == \"\") {\n current_cpu = target_cpu\n }\n \n-is_clang = is_android || is_ios || is_mac || is_fuchsia || is_wasm ||\n+is_clang = is_android || is_ios || is_mac || is_fuchsia || is_tizen || is_wasm ||\n (cc == \"clang\" && cxx == \"clang++\") || clang_win != \"\"\n if (!is_clang && !is_win) {\n is_clang = exec_script(\"//gn/is_clang.py\",\n@@ -126,33 +148,30 @@ if (is_android) {\n }\n }\n \n-if (target_os == \"win\") {\n+if (is_win) {\n # By default we look for 2017 (Enterprise, Pro, and Community), then 2015. If MSVC is installed in a\n # non-default location, you can set win_vc to inform us where it is.\n \n if (win_vc == \"\") {\n win_vc = exec_script(\"//gn/find_msvc.py\", [], \"trim string\")\n }\n- assert(win_vc != \"\") # Could not find VC installation. Set win_vc to your VC\n- # directory.\n-}\n-\n-if (target_os == \"win\") {\n- if (win_toolchain_version == \"\") {\n- win_toolchain_version = exec_script(\"//gn/highest_version_dir.py\",\n- [\n- \"$win_vc/Tools/MSVC\",\n- \"[0-9]{2}\\.[0-9]{2}\\.[0-9]{5}\",\n- ],\n- \"trim string\")\n+ if (win_vc != \"\") {\n+ if (win_toolchain_version == \"\") {\n+ if (win_vcvars_version != \"\") {\n+ win_toolchain_version = exec_script(\"//gn/highest_version_dir.py\", [ \"$win_vc/Tools/MSVC\", \"$win_vcvars_version[0-9]{1}\\.[0-9]{5}\" ], \"trim string\")\n+ } else {\n+ win_toolchain_version = exec_script(\"//gn/highest_version_dir.py\", [ \"$win_vc/Tools/MSVC\", \"[0-9]{2}\\.[0-9]{2}\\.[0-9]{5}\" ], \"trim string\")\n+ }\n+ }\n+ if (win_vcvars_version == \"\") {\n+ win_vcvars_version = exec_script(\"//gn/get_vcvars_version.py\", [ win_toolchain_version ], \"trim string\")\n+ }\n }\n- if (win_sdk_version == \"\") {\n- win_sdk_version = exec_script(\"//gn/highest_version_dir.py\",\n- [\n- \"$win_sdk/Include\",\n- \"[0-9]{2}\\.[0-9]\\.[0-9]{5}\\.[0-9]\",\n- ],\n- \"trim string\")\n+ if (win_sdk == \"\") {\n+ win_sdk = exec_script(\"//gn/find_winsdk.py\", [], \"trim string\")\n+ }\n+ if (win_sdk != \"\" && win_sdk_version == \"\") {\n+ win_sdk_version = exec_script(\"//gn/lowest_version_dir.py\", [ \"$win_sdk/Include\", \"[0-9]{2}\\.[0-9]\\.[0-9]{5}\\.[0-9]\", min_win_sdk_version ], \"trim string\")\n }\n if (clang_win != \"\" && clang_win_version == \"\") {\n clang_win_version = exec_script(\"//gn/highest_version_dir.py\",\n@@ -164,6 +183,29 @@ if (target_os == \"win\") {\n }\n }\n \n+if (is_tizen) {\n+ ncli_target = \"\"\n+ ncli_platform = \"\"\n+ ncli_gccdir = \"\"\n+ if (target_cpu == \"arm\") {\n+ ncli_target = \"arm-tizen-linux-gnueabi\"\n+ ncli_platform = \"tizen-${ncli_version}/mobile/rootstraps/mobile-${ncli_version}-device.core\"\n+ ncli_gccdir = \"arm-linux-gnueabi-gcc-${ncli_gcc_version_short}\"\n+ } else if (target_cpu == \"x86\") {\n+ ncli_target = \"i586-tizen-linux-gnueabi\"\n+ ncli_platform = \"tizen-${ncli_version}/mobile/rootstraps/mobile-${ncli_version}-emulator.core\"\n+ ncli_gccdir = \"i586-linux-gnueabi-gcc-${ncli_gcc_version_short}\"\n+ } else if (target_cpu == \"x64\") {\n+ ncli_target = \"x86_64-tizen-linux-gnu\"\n+ ncli_platform = \"tizen-${ncli_version}/tizen/rootstraps/tizen-${ncli_version}-emulator64.core\"\n+ ncli_gccdir = \"x86_64-linux-gnu-gcc-${ncli_gcc_version_short}\"\n+ } else if (target_cpu == \"arm64\") {\n+ ncli_target = \"aarch64-tizen-linux-gnu\"\n+ ncli_platform = \"tizen-${ncli_version}/tizen/rootstraps/tizen-${ncli_version}-device64.core\"\n+ ncli_gccdir = \"aarch64-linux-gnu-gcc-${ncli_gcc_version_short}\"\n+ }\n+}\n+\n # A component is either a static or a shared library.\n template(\"component\") {\n _component_mode = \"static_library\"\n@@ -176,6 +218,18 @@ template(\"component\") {\n }\n }\n \n+# SkiaSharp differs depending on the platform\n+template(\"skiasharp_build\") {\n+ _skiasharp_mode = \"shared_library\"\n+ if (is_static_skiasharp) {\n+ _skiasharp_mode = \"static_library\"\n+ }\n+\n+ target(_skiasharp_mode, target_name) {\n+ forward_variables_from(invoker, \"*\")\n+ }\n+}\n+\n # Default configs\n default_configs = [\n \"//gn/skia:default\",\n@@ -246,3 +300,10 @@ if (is_win) {\n default_toolchain_name = \"gcc_like\"\n host_toolchain = \"gcc_like_host\"\n }\n+\n+set_defaults(\"skiasharp_build\") {\n+ configs = default_configs\n+ if (is_static_skiasharp) {\n+ complete_static_lib = true\n+ }\n+}", "newDiff": "diff --git a/gn/BUILDCONFIG.gn b/gn/BUILDCONFIG.gn\nindex 8700375961..5a52b6f02e 100644\n--- a/gn/BUILDCONFIG.gn\n+++ b/gn/BUILDCONFIG.gn\n@@ -11,29 +11,47 @@ declare_args() {\n is_official_build = false\n is_component_build = false\n use_libfuzzer = false\n+ is_static_skiasharp = false\n ndk = \"\"\n \n # Android 5.0, Lollipop\n ndk_api = 21\n \n+ linux_soname_version = \"\"\n sanitize = \"\"\n \n ar = \"ar\"\n cc = \"cc\"\n cxx = \"c++\"\n \n- win_sdk = \"C:/Program Files (x86)/Windows Kits/10\"\n+ win_sdk = \"\"\n+ min_win_sdk_version = \"10.0.16299.0\"\n win_sdk_version = \"\"\n \n win_vc = \"\"\n win_toolchain_version = \"\"\n+ win_vcvars_version = \"\"\n \n clang_win = \"\"\n clang_win_version = \"\"\n \n+ ncli = \"\"\n+ ncli_version = \"8.0\"\n+ ncli_gcc_version = \"9.2.0\"\n+ ncli_gcc_version_short = \"9.2\"\n+ ncli_llvm_version = \"10\"\n+\n ios_min_target = \"\"\n+\n+ min_ios_version = \"8.0\"\n+ min_tvos_version = \"9.0\"\n+ min_watchos_version = \"2.0\"\n+ min_macos_version = \"10.8\"\n+ min_maccatalyst_version = \"13.0\"\n+\n ios_use_simulator =\n- target_os == \"ios\" && (target_cpu == \"x86\" || target_cpu == \"x64\")\n+ (target_os == \"ios\" || target_os == \"tvos\" || target_os == \"watchos\") &&\n+ (target_cpu == \"x86\" || target_cpu == \"x64\")\n \n # Enable -H, which prints the include tree during compilation.\n # For use by external tools for analyzing include files.\n@@ -64,12 +82,16 @@ if (current_os == \"\") {\n }\n \n is_android = current_os == \"android\"\n-is_ios = current_os == \"ios\" || current_os == \"tvos\"\n+is_ios = current_os == \"ios\" || current_os == \"tvos\" || current_os == \"watchos\" || current_os == \"maccatalyst\"\n is_tvos = current_os == \"tvos\"\n-is_linux = current_os == \"linux\"\n+is_watchos = current_os == \"watchos\"\n+is_maccatalyst = current_os == \"maccatalyst\"\n+is_linux = current_os == \"linux\" || current_os == \"tizen\"\n is_mac = current_os == \"mac\"\n is_wasm = current_os == \"wasm\"\n-is_win = current_os == \"win\"\n+is_win = current_os == \"win\" || current_os == \"winrt\"\n+is_winrt = current_os == \"winrt\"\n+is_tizen = current_os == \"tizen\"\n \n # Dawn has references to fuchsia, but Skia's GN rules do not\n is_fuchsia = false\n@@ -94,7 +116,7 @@ if (current_cpu == \"\") {\n current_cpu = target_cpu\n }\n \n-is_clang = is_android || is_ios || is_mac || is_wasm ||\n+is_clang = is_android || is_ios || is_mac || is_tizen || is_wasm ||\n (cc == \"clang\" && cxx == \"clang++\") || clang_win != \"\"\n if (!is_clang && !is_win) {\n is_clang = exec_script(\"//gn/is_clang.py\",\n@@ -128,33 +150,30 @@ if (is_android) {\n }\n }\n \n-if (target_os == \"win\") {\n+if (is_win) {\n # By default we look for 2017 (Enterprise, Pro, and Community), then 2015. If MSVC is installed in a\n # non-default location, you can set win_vc to inform us where it is.\n \n if (win_vc == \"\") {\n win_vc = exec_script(\"//gn/find_msvc.py\", [], \"trim string\")\n }\n- assert(win_vc != \"\") # Could not find VC installation. Set win_vc to your VC\n- # directory.\n-}\n-\n-if (target_os == \"win\") {\n- if (win_toolchain_version == \"\") {\n- win_toolchain_version = exec_script(\"//gn/highest_version_dir.py\",\n- [\n- \"$win_vc/Tools/MSVC\",\n- \"[0-9]{2}\\.[0-9]{2}\\.[0-9]{5}\",\n- ],\n- \"trim string\")\n+ if (win_vc != \"\") {\n+ if (win_toolchain_version == \"\") {\n+ if (win_vcvars_version != \"\") {\n+ win_toolchain_version = exec_script(\"//gn/highest_version_dir.py\", [ \"$win_vc/Tools/MSVC\", \"$win_vcvars_version[0-9]{1}\\.[0-9]{5}\" ], \"trim string\")\n+ } else {\n+ win_toolchain_version = exec_script(\"//gn/highest_version_dir.py\", [ \"$win_vc/Tools/MSVC\", \"[0-9]{2}\\.[0-9]{2}\\.[0-9]{5}\" ], \"trim string\")\n+ }\n+ }\n+ if (win_vcvars_version == \"\") {\n+ win_vcvars_version = exec_script(\"//gn/get_vcvars_version.py\", [ win_toolchain_version ], \"trim string\")\n+ }\n }\n- if (win_sdk_version == \"\") {\n- win_sdk_version = exec_script(\"//gn/highest_version_dir.py\",\n- [\n- \"$win_sdk/Include\",\n- \"[0-9]{2}\\.[0-9]\\.[0-9]{5}\\.[0-9]\",\n- ],\n- \"trim string\")\n+ if (win_sdk == \"\") {\n+ win_sdk = exec_script(\"//gn/find_winsdk.py\", [], \"trim string\")\n+ }\n+ if (win_sdk != \"\" && win_sdk_version == \"\") {\n+ win_sdk_version = exec_script(\"//gn/lowest_version_dir.py\", [ \"$win_sdk/Include\", \"[0-9]{2}\\.[0-9]\\.[0-9]{5}\\.[0-9]\", min_win_sdk_version ], \"trim string\")\n }\n if (clang_win != \"\" && clang_win_version == \"\") {\n clang_win_version = exec_script(\"//gn/highest_version_dir.py\",\n@@ -166,6 +185,29 @@ if (target_os == \"win\") {\n }\n }\n \n+if (is_tizen) {\n+ ncli_target = \"\"\n+ ncli_platform = \"\"\n+ ncli_gccdir = \"\"\n+ if (target_cpu == \"arm\") {\n+ ncli_target = \"arm-tizen-linux-gnueabi\"\n+ ncli_platform = \"tizen-${ncli_version}/mobile/rootstraps/mobile-${ncli_version}-device.core\"\n+ ncli_gccdir = \"arm-linux-gnueabi-gcc-${ncli_gcc_version_short}\"\n+ } else if (target_cpu == \"x86\") {\n+ ncli_target = \"i586-tizen-linux-gnueabi\"\n+ ncli_platform = \"tizen-${ncli_version}/mobile/rootstraps/mobile-${ncli_version}-emulator.core\"\n+ ncli_gccdir = \"i586-linux-gnueabi-gcc-${ncli_gcc_version_short}\"\n+ } else if (target_cpu == \"x64\") {\n+ ncli_target = \"x86_64-tizen-linux-gnu\"\n+ ncli_platform = \"tizen-${ncli_version}/tizen/rootstraps/tizen-${ncli_version}-emulator64.core\"\n+ ncli_gccdir = \"x86_64-linux-gnu-gcc-${ncli_gcc_version_short}\"\n+ } else if (target_cpu == \"arm64\") {\n+ ncli_target = \"aarch64-tizen-linux-gnu\"\n+ ncli_platform = \"tizen-${ncli_version}/tizen/rootstraps/tizen-${ncli_version}-device64.core\"\n+ ncli_gccdir = \"aarch64-linux-gnu-gcc-${ncli_gcc_version_short}\"\n+ }\n+}\n+\n # A component is either a static or a shared library.\n template(\"component\") {\n _component_mode = \"static_library\"\n@@ -178,6 +220,18 @@ template(\"component\") {\n }\n }\n \n+# SkiaSharp differs depending on the platform\n+template(\"skiasharp_build\") {\n+ _skiasharp_mode = \"shared_library\"\n+ if (is_static_skiasharp) {\n+ _skiasharp_mode = \"static_library\"\n+ }\n+\n+ target(_skiasharp_mode, target_name) {\n+ forward_variables_from(invoker, \"*\")\n+ }\n+}\n+\n # Default configs\n default_configs = [\n \"//gn/skia:default\",\n@@ -251,3 +305,10 @@ if (is_win) {\n default_toolchain_name = \"gcc_like\"\n host_toolchain = \"gcc_like_host\"\n }\n+\n+set_defaults(\"skiasharp_build\") {\n+ configs = default_configs\n+ if (is_static_skiasharp) {\n+ complete_static_lib = true\n+ }\n+}", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,5 +1,5 @@\n diff --git a/gn/BUILDCONFIG.gn b/gn/BUILDCONFIG.gn\n-index cd4030ae0f..8a23f9f2f0 100644\n+index 8700375961..5a52b6f02e 100644\n --- a/gn/BUILDCONFIG.gn\n +++ b/gn/BUILDCONFIG.gn\n @@ -11,29 +11,47 @@ declare_args() {\n@@ -52,10 +52,10 @@ index cd4030ae0f..8a23f9f2f0 100644\n \n # Enable -H, which prints the include tree during compilation.\n # For use by external tools for analyzing include files.\n-@@ -65,12 +83,16 @@ if (current_os == \"\") {\n+@@ -64,12 +82,16 @@ if (current_os == \"\") {\n+ }\n \n is_android = current_os == \"android\"\n- is_fuchsia = current_os == \"fuchsia\"\n -is_ios = current_os == \"ios\" || current_os == \"tvos\"\n +is_ios = current_os == \"ios\" || current_os == \"tvos\" || current_os == \"watchos\" || current_os == \"maccatalyst\"\n is_tvos = current_os == \"tvos\"\n@@ -70,18 +70,18 @@ index cd4030ae0f..8a23f9f2f0 100644\n +is_winrt = current_os == \"winrt\"\n +is_tizen = current_os == \"tizen\"\n \n- # This is just to make the Dawn build files happy. Skia itself uses target_os = \"linux\"\n- # for ChromeOS, so this variable will not affect Skia proper.\n-@@ -92,7 +114,7 @@ if (current_cpu == \"\") {\n+ # Dawn has references to fuchsia, but Skia's GN rules do not\n+ is_fuchsia = false\n+@@ -94,7 +116,7 @@ if (current_cpu == \"\") {\n current_cpu = target_cpu\n }\n \n--is_clang = is_android || is_ios || is_mac || is_fuchsia || is_wasm ||\n-+is_clang = is_android || is_ios || is_mac || is_fuchsia || is_tizen || is_wasm ||\n+-is_clang = is_android || is_ios || is_mac || is_wasm ||\n++is_clang = is_android || is_ios || is_mac || is_tizen || is_wasm ||\n (cc == \"clang\" && cxx == \"clang++\") || clang_win != \"\"\n if (!is_clang && !is_win) {\n is_clang = exec_script(\"//gn/is_clang.py\",\n-@@ -126,33 +148,30 @@ if (is_android) {\n+@@ -128,33 +150,30 @@ if (is_android) {\n }\n }\n \n@@ -132,7 +132,7 @@ index cd4030ae0f..8a23f9f2f0 100644\n }\n if (clang_win != \"\" && clang_win_version == \"\") {\n clang_win_version = exec_script(\"//gn/highest_version_dir.py\",\n-@@ -164,6 +183,29 @@ if (target_os == \"win\") {\n+@@ -166,6 +185,29 @@ if (target_os == \"win\") {\n }\n }\n \n@@ -162,7 +162,7 @@ index cd4030ae0f..8a23f9f2f0 100644\n # A component is either a static or a shared library.\n template(\"component\") {\n _component_mode = \"static_library\"\n-@@ -176,6 +218,18 @@ template(\"component\") {\n+@@ -178,6 +220,18 @@ template(\"component\") {\n }\n }\n \n@@ -181,7 +181,7 @@ index cd4030ae0f..8a23f9f2f0 100644\n # Default configs\n default_configs = [\n \"//gn/skia:default\",\n-@@ -246,3 +300,10 @@ if (is_win) {\n+@@ -251,3 +305,10 @@ if (is_win) {\n default_toolchain_name = \"gcc_like\"\n host_toolchain = \"gcc_like_host\"\n }", "summary": "Upstream changes: (1) Sets is_trivial_abi=false unconditionally (was !is_official_build). (2) Removes is_fuchsia as a dynamic OS detection, hardcodes it to false. (3) Removes is_fuchsia from is_clang detection. (4) Removes Fuchsia SDK sysroot handling. (5) Bumps C++ standard from c++17 to c++20. (6) Removes use_PIC and visibility_hidden as configurable args (now hardcoded on). (7) Adds wasm config. Fork patch updates: (1) Adds Tizen-specific c++2a spelling for clang-10 compatibility instead of c++20. (2) Carries forward is_tizen, is_winrt, is_maccatalyst OS definitions, NDK/Tizen/WinRT toolchain logic, and other SkiaSharp platform support.", "relatedFiles": [{"path": "gn/skia/BUILD.gn", "relationship": "related"}, {"path": "gn/toolchain/BUILD.gn", "relationship": "related"}]}, {"path": "gn/core.gni", "diff": "diff --git a/gn/core.gni b/gn/core.gni\nindex 3fec485819..c034f58a9b 100644\n--- a/gn/core.gni\n+++ b/gn/core.gni\n@@ -2,28 +2,26 @@\n # See //bazel/exporter_tool/README.md for more information.\n #\n # The sources of truth are:\n-# //experimental/rust_png/encoder/BUILD.bazel\n-# //experimental/rust_png/ffi/BUILD.bazel\n+# //include/android/BUILD.bazel\n # //include/core/BUILD.bazel\n # //include/encode/BUILD.bazel\n-# //include/pathops/BUILD.bazel\n # //include/private/BUILD.bazel\n # //include/private/base/BUILD.bazel\n # //include/private/chromium/BUILD.bazel\n+# //src/android/BUILD.bazel\n # //src/base/BUILD.bazel\n+# //src/capture/BUILD.bazel\n # //src/core/BUILD.bazel\n # //src/encode/BUILD.bazel\n # //src/image/BUILD.bazel\n # //src/lazy/BUILD.bazel\n # //src/opts/BUILD.bazel\n-# //src/pathops/BUILD.bazel\n # //src/shaders/BUILD.bazel\n # //src/text/BUILD.bazel\n \n # To update this file, run make -C bazel generate_gni\n \n _src = get_path_info(\"../src\", \"abspath\")\n-_experimental = get_path_info(\"../experimental\", \"abspath\")\n _include = get_path_info(\"../include\", \"abspath\")\n \n # Generated by Bazel rule //include/core:core_hdrs\n@@ -36,13 +34,14 @@ skia_core_public = [\n \"$_include/core/SkBlendMode.h\",\n \"$_include/core/SkBlender.h\",\n \"$_include/core/SkBlurTypes.h\",\n+ \"$_include/core/SkCPUContext.h\",\n+ \"$_include/core/SkCPURecorder.h\",\n \"$_include/core/SkCanvas.h\",\n \"$_include/core/SkCanvasVirtualEnforcer.h\",\n \"$_include/core/SkCapabilities.h\",\n \"$_include/core/SkClipOp.h\",\n \"$_include/core/SkColor.h\",\n \"$_include/core/SkColorFilter.h\",\n- \"$_include/core/SkColorPriv.h\",\n \"$_include/core/SkColorSpace.h\",\n \"$_include/core/SkColorTable.h\",\n \"$_include/core/SkColorType.h\",\n@@ -81,6 +80,7 @@ skia_core_public = [\n \"$_include/core/SkPath.h\",\n \"$_include/core/SkPathBuilder.h\",\n \"$_include/core/SkPathEffect.h\",\n+ \"$_include/core/SkPathIter.h\",\n \"$_include/core/SkPathMeasure.h\",\n \"$_include/core/SkPathTypes.h\",\n \"$_include/core/SkPathUtils.h\",\n@@ -93,6 +93,7 @@ skia_core_public = [\n \"$_include/core/SkRRect.h\",\n \"$_include/core/SkRSXform.h\",\n \"$_include/core/SkRasterHandleAllocator.h\",\n+ \"$_include/core/SkRecorder.h\",\n \"$_include/core/SkRect.h\",\n \"$_include/core/SkRefCnt.h\",\n \"$_include/core/SkRegion.h\",\n@@ -130,6 +131,8 @@ skia_core_public = [\n # //src/base:private_hdrs\n # //src/base:skslc_srcs\n # //src/base:srcs\n+# //src/capture:capture_hdrs\n+# //src/capture:capture_srcs\n # //src/core:core_priv_hdrs\n # //src/core:core_priv_srcs\n # //src/core:core_srcs\n@@ -144,9 +147,9 @@ skia_core_public = [\n # //src/text:text_hdrs\n # //src/text:text_srcs\n skia_core_sources = [\n- \"$_include/private/SkColorData.h\",\n \"$_include/private/SkGainmapInfo.h\",\n \"$_include/private/SkGainmapShader.h\",\n+ \"$_include/private/SkHdrMetadata.h\",\n \"$_include/private/SkIDChangeListener.h\",\n \"$_include/private/SkSLSampleUsage.h\",\n \"$_include/private/base/SingleOwner.h\",\n@@ -165,6 +168,8 @@ skia_core_sources = [\n \"$_include/private/base/SkFixed.h\",\n \"$_include/private/base/SkFloatingPoint.h\",\n \"$_include/private/base/SkLoadUserConfig.h\",\n+ \"$_include/private/base/SkLog.h\",\n+ \"$_include/private/base/SkLogPriority.h\",\n \"$_include/private/base/SkMacros.h\",\n \"$_include/private/base/SkMalloc.h\",\n \"$_include/private/base/SkMath.h\",\n@@ -187,6 +192,7 @@ skia_core_sources = [\n \"$_include/private/base/SkTypeTraits.h\",\n \"$_include/private/chromium/SkChromeRemoteGlyphCache.h\",\n \"$_include/private/chromium/SkDiscardableMemory.h\",\n+ \"$_include/private/chromium/SkPMColor.h\",\n \"$_include/private/chromium/Slug.h\",\n \"$_src/base/SkArenaAlloc.cpp\",\n \"$_src/base/SkArenaAlloc.h\",\n@@ -214,6 +220,7 @@ skia_core_sources = [\n \"$_src/base/SkHalf.cpp\",\n \"$_src/base/SkHalf.h\",\n \"$_src/base/SkLeanWindows.h\",\n+ \"$_src/base/SkLog.cpp\",\n \"$_src/base/SkMSAN.h\",\n \"$_src/base/SkMalloc.cpp\",\n \"$_src/base/SkMathPriv.cpp\",\n@@ -227,6 +234,8 @@ skia_core_sources = [\n \"$_src/base/SkSafeMath.h\",\n \"$_src/base/SkScopeExit.h\",\n \"$_src/base/SkSemaphore.cpp\",\n+ \"$_src/base/SkSharedMutex.cpp\",\n+ \"$_src/base/SkSharedMutex.h\",\n \"$_src/base/SkSpinlock.cpp\",\n \"$_src/base/SkSpinlock.h\",\n \"$_src/base/SkStringView.h\",\n@@ -247,6 +256,12 @@ skia_core_sources = [\n \"$_src/base/SkUtils.h\",\n \"$_src/base/SkVx.h\",\n \"$_src/base/SkZip.h\",\n+ \"$_src/capture/SkCapture.cpp\",\n+ \"$_src/capture/SkCapture.h\",\n+ \"$_src/capture/SkCaptureCanvas.cpp\",\n+ \"$_src/capture/SkCaptureCanvas.h\",\n+ \"$_src/capture/SkCaptureManager.cpp\",\n+ \"$_src/capture/SkCaptureManager.h\",\n \"$_src/core/Sk4px.h\",\n \"$_src/core/SkAAClip.cpp\",\n \"$_src/core/SkAAClip.h\",\n@@ -302,6 +317,10 @@ skia_core_sources = [\n \"$_src/core/SkBlurMask.h\",\n \"$_src/core/SkBlurMaskFilterImpl.cpp\",\n \"$_src/core/SkBlurMaskFilterImpl.h\",\n+ \"$_src/core/SkCPUContext.cpp\",\n+ \"$_src/core/SkCPUContextImpl.h\",\n+ \"$_src/core/SkCPURecorder.cpp\",\n+ \"$_src/core/SkCPURecorderImpl.h\",\n \"$_src/core/SkCachedData.cpp\",\n \"$_src/core/SkCachedData.h\",\n \"$_src/core/SkCanvas.cpp\",\n@@ -316,8 +335,10 @@ skia_core_sources = [\n \"$_src/core/SkClipStackDevice.cpp\",\n \"$_src/core/SkClipStackDevice.h\",\n \"$_src/core/SkColor.cpp\",\n+ \"$_src/core/SkColorData.h\",\n \"$_src/core/SkColorFilter.cpp\",\n \"$_src/core/SkColorFilterPriv.h\",\n+ \"$_src/core/SkColorPriv.h\",\n \"$_src/core/SkColorSpace.cpp\",\n \"$_src/core/SkColorSpacePriv.h\",\n \"$_src/core/SkColorSpaceXformSteps.cpp\",\n@@ -346,11 +367,10 @@ skia_core_sources = [\n \"$_src/core/SkDocument.cpp\",\n \"$_src/core/SkDraw.cpp\",\n \"$_src/core/SkDraw.h\",\n- \"$_src/core/SkDrawBase.cpp\",\n- \"$_src/core/SkDrawBase.h\",\n \"$_src/core/SkDrawProcs.h\",\n \"$_src/core/SkDrawShadowInfo.cpp\",\n \"$_src/core/SkDrawShadowInfo.h\",\n+ \"$_src/core/SkDrawTypes.h\",\n \"$_src/core/SkDraw_atlas.cpp\",\n \"$_src/core/SkDraw_text.cpp\",\n \"$_src/core/SkDraw_vertices.cpp\",\n@@ -397,7 +417,6 @@ skia_core_sources = [\n \"$_src/core/SkImageGenerator.cpp\",\n \"$_src/core/SkImageInfo.cpp\",\n \"$_src/core/SkImageInfoPriv.h\",\n- \"$_src/core/SkImagePriv.h\",\n \"$_src/core/SkKnownRuntimeEffects.cpp\",\n \"$_src/core/SkKnownRuntimeEffects.h\",\n \"$_src/core/SkLRUCache.h\",\n@@ -418,6 +437,7 @@ skia_core_sources = [\n \"$_src/core/SkMaskCache.cpp\",\n \"$_src/core/SkMaskCache.h\",\n \"$_src/core/SkMaskFilter.cpp\",\n+ \"$_src/core/SkMaskFilterBase.cpp\",\n \"$_src/core/SkMaskFilterBase.h\",\n \"$_src/core/SkMaskGamma.cpp\",\n \"$_src/core/SkMaskGamma.h\",\n@@ -455,15 +475,24 @@ skia_core_sources = [\n \"$_src/core/SkPaintPriv.h\",\n \"$_src/core/SkPath.cpp\",\n \"$_src/core/SkPathBuilder.cpp\",\n+ \"$_src/core/SkPathData.cpp\",\n+ \"$_src/core/SkPathData.h\",\n+ \"$_src/core/SkPathDump.cpp\",\n \"$_src/core/SkPathEffect.cpp\",\n \"$_src/core/SkPathEffectBase.h\",\n \"$_src/core/SkPathEnums.h\",\n+ \"$_src/core/SkPathIter.cpp\",\n \"$_src/core/SkPathMakers.h\",\n \"$_src/core/SkPathMeasure.cpp\",\n \"$_src/core/SkPathMeasurePriv.h\",\n+ \"$_src/core/SkPathPriv.cpp\",\n \"$_src/core/SkPathPriv.h\",\n- \"$_src/core/SkPathRef.cpp\",\n+ \"$_src/core/SkPathRaw.cpp\",\n+ \"$_src/core/SkPathRaw.h\",\n+ \"$_src/core/SkPathRawShapes.cpp\",\n+ \"$_src/core/SkPathRawShapes.h\",\n \"$_src/core/SkPathUtils.cpp\",\n+ \"$_src/core/SkPath_interpolate.cpp\",\n \"$_src/core/SkPath_serial.cpp\",\n \"$_src/core/SkPicture.cpp\",\n \"$_src/core/SkPictureData.cpp\",\n@@ -501,12 +530,15 @@ skia_core_sources = [\n \"$_src/core/SkRasterPipelineContextUtils.h\",\n \"$_src/core/SkRasterPipelineOpContexts.h\",\n \"$_src/core/SkRasterPipelineOpList.h\",\n+ \"$_src/core/SkRasterPipelineVizualizer.h\",\n \"$_src/core/SkReadBuffer.cpp\",\n \"$_src/core/SkReadBuffer.h\",\n \"$_src/core/SkReadPixelsRec.cpp\",\n \"$_src/core/SkReadPixelsRec.h\",\n \"$_src/core/SkRecord.cpp\",\n \"$_src/core/SkRecord.h\",\n+ \"$_src/core/SkRecordCanvas.cpp\",\n+ \"$_src/core/SkRecordCanvas.h\",\n \"$_src/core/SkRecordDraw.cpp\",\n \"$_src/core/SkRecordDraw.h\",\n \"$_src/core/SkRecordOpts.cpp\",\n@@ -514,8 +546,6 @@ skia_core_sources = [\n \"$_src/core/SkRecordPattern.h\",\n \"$_src/core/SkRecordedDrawable.cpp\",\n \"$_src/core/SkRecordedDrawable.h\",\n- \"$_src/core/SkRecorder.cpp\",\n- \"$_src/core/SkRecorder.h\",\n \"$_src/core/SkRecords.cpp\",\n \"$_src/core/SkRecords.h\",\n \"$_src/core/SkRect.cpp\",\n@@ -545,6 +575,7 @@ skia_core_sources = [\n \"$_src/core/SkScan_Antihair.cpp\",\n \"$_src/core/SkScan_Hairline.cpp\",\n \"$_src/core/SkScan_Path.cpp\",\n+ \"$_src/core/SkSpanPriv.h\",\n \"$_src/core/SkSpecialImage.cpp\",\n \"$_src/core/SkSpecialImage.h\",\n \"$_src/core/SkSpriteBlitter.h\",\n@@ -572,6 +603,8 @@ skia_core_sources = [\n \"$_src/core/SkSwizzler_opts_hsw.cpp\",\n \"$_src/core/SkSwizzler_opts_lasx.cpp\",\n \"$_src/core/SkSwizzler_opts_ssse3.cpp\",\n+ \"$_src/core/SkSynchronizedResourceCache.cpp\",\n+ \"$_src/core/SkSynchronizedResourceCache.h\",\n \"$_src/core/SkTDynamicHash.h\",\n \"$_src/core/SkTHash.h\",\n \"$_src/core/SkTMultiMap.h\",\n@@ -679,72 +712,6 @@ skia_core_sources = [\n \"$_src/text/StrikeForGPU.h\",\n ]\n \n-# Generated by Bazel rule //include/pathops:public_hdrs\n-skia_pathops_public = [ \"$_include/pathops/SkPathOps.h\" ]\n-\n-# List generated by Bazel rules:\n-# //src/pathops:_pathops_hdrs\n-# //src/pathops:_pathops_srcs\n-skia_pathops_sources = [\n- \"$_src/pathops/SkAddIntersections.cpp\",\n- \"$_src/pathops/SkAddIntersections.h\",\n- \"$_src/pathops/SkDConicLineIntersection.cpp\",\n- \"$_src/pathops/SkDCubicLineIntersection.cpp\",\n- \"$_src/pathops/SkDCubicToQuads.cpp\",\n- \"$_src/pathops/SkDLineIntersection.cpp\",\n- \"$_src/pathops/SkDQuadLineIntersection.cpp\",\n- \"$_src/pathops/SkIntersectionHelper.h\",\n- \"$_src/pathops/SkIntersections.cpp\",\n- \"$_src/pathops/SkIntersections.h\",\n- \"$_src/pathops/SkLineParameters.h\",\n- \"$_src/pathops/SkOpAngle.cpp\",\n- \"$_src/pathops/SkOpAngle.h\",\n- \"$_src/pathops/SkOpBuilder.cpp\",\n- \"$_src/pathops/SkOpCoincidence.cpp\",\n- \"$_src/pathops/SkOpCoincidence.h\",\n- \"$_src/pathops/SkOpContour.cpp\",\n- \"$_src/pathops/SkOpContour.h\",\n- \"$_src/pathops/SkOpCubicHull.cpp\",\n- \"$_src/pathops/SkOpEdgeBuilder.cpp\",\n- \"$_src/pathops/SkOpEdgeBuilder.h\",\n- \"$_src/pathops/SkOpSegment.cpp\",\n- \"$_src/pathops/SkOpSegment.h\",\n- \"$_src/pathops/SkOpSpan.cpp\",\n- \"$_src/pathops/SkOpSpan.h\",\n- \"$_src/pathops/SkPathOpsAsWinding.cpp\",\n- \"$_src/pathops/SkPathOpsBounds.h\",\n- \"$_src/pathops/SkPathOpsCommon.cpp\",\n- \"$_src/pathops/SkPathOpsCommon.h\",\n- \"$_src/pathops/SkPathOpsConic.cpp\",\n- \"$_src/pathops/SkPathOpsConic.h\",\n- \"$_src/pathops/SkPathOpsCubic.cpp\",\n- \"$_src/pathops/SkPathOpsCubic.h\",\n- \"$_src/pathops/SkPathOpsCurve.cpp\",\n- \"$_src/pathops/SkPathOpsCurve.h\",\n- \"$_src/pathops/SkPathOpsDebug.cpp\",\n- \"$_src/pathops/SkPathOpsDebug.h\",\n- \"$_src/pathops/SkPathOpsLine.cpp\",\n- \"$_src/pathops/SkPathOpsLine.h\",\n- \"$_src/pathops/SkPathOpsOp.cpp\",\n- \"$_src/pathops/SkPathOpsPoint.h\",\n- \"$_src/pathops/SkPathOpsQuad.cpp\",\n- \"$_src/pathops/SkPathOpsQuad.h\",\n- \"$_src/pathops/SkPathOpsRect.cpp\",\n- \"$_src/pathops/SkPathOpsRect.h\",\n- \"$_src/pathops/SkPathOpsSimplify.cpp\",\n- \"$_src/pathops/SkPathOpsTCurve.h\",\n- \"$_src/pathops/SkPathOpsTSect.cpp\",\n- \"$_src/pathops/SkPathOpsTSect.h\",\n- \"$_src/pathops/SkPathOpsTightBounds.cpp\",\n- \"$_src/pathops/SkPathOpsTypes.cpp\",\n- \"$_src/pathops/SkPathOpsTypes.h\",\n- \"$_src/pathops/SkPathOpsWinding.cpp\",\n- \"$_src/pathops/SkPathWriter.cpp\",\n- \"$_src/pathops/SkPathWriter.h\",\n- \"$_src/pathops/SkReduceOrder.cpp\",\n- \"$_src/pathops/SkReduceOrder.h\",\n-]\n-\n # Generated by Bazel rule //include/encode:encode_hdrs\n skia_encode_public = [ \"$_include/encode/SkEncoder.h\" ]\n \n@@ -772,18 +739,14 @@ skia_encode_jpeg_srcs = [\n \"$_src/encode/SkJpegEncoderImpl.h\",\n ]\n \n-# Generated by Bazel rule //experimental/rust_png/encoder:hdrs\n-skia_encode_rust_png_public =\n- [ \"$_experimental/rust_png/encoder/SkPngRustEncoder.h\" ]\n+# Generated by Bazel rule //include/encode:rust_png_public_hdrs\n+skia_encode_rust_png_public = [ \"$_include/encode/SkPngRustEncoder.h\" ]\n \n-# List generated by Bazel rules:\n-# //experimental/rust_png/encoder:srcs\n-# //experimental/rust_png/ffi:utils\n+# Generated by Bazel rule //src/encode:rust_png_srcs\n skia_encode_rust_png_srcs = [\n- \"$_experimental/rust_png/encoder/SkPngRustEncoder.cpp\",\n- \"$_experimental/rust_png/encoder/impl/SkPngRustEncoderImpl.cpp\",\n- \"$_experimental/rust_png/encoder/impl/SkPngRustEncoderImpl.h\",\n- \"$_experimental/rust_png/ffi/UtilsForFFI.h\",\n+ \"$_src/encode/SkPngRustEncoder.cpp\",\n+ \"$_src/encode/SkPngRustEncoderImpl.cpp\",\n+ \"$_src/encode/SkPngRustEncoderImpl.h\",\n ]\n \n # List generated by Bazel rules:\n@@ -805,17 +768,8 @@ skia_encode_libpng_srcs = [\n # Generated by Bazel rule //include/encode:png_hdrs\n skia_encode_png_public = [ \"$_include/encode/SkPngEncoder.h\" ]\n \n-# List generated by Bazel rules:\n-# //src/encode:png_encode_base_srcs\n-# //src/encode:png_encode_base_hdrs\n-# //src/encode:png_encode_srcs\n-# //src/encode:png_encode_hdrs\n-skia_encode_png_srcs = [\n- \"$_src/encode/SkPngEncoderBase.cpp\",\n- \"$_src/encode/SkPngEncoderBase.h\",\n- \"$_src/encode/SkPngEncoderImpl.cpp\",\n- \"$_src/encode/SkPngEncoderImpl.h\",\n-]\n+# Generated by Bazel rule //include/encode:png_hdrs\n+skia_encode_libpng_public = [ \"$_include/encode/SkPngEncoder.h\" ]\n \n # Generated by Bazel rule //include/encode:webp_hdrs\n skia_encode_webp_public = [ \"$_include/encode/SkWebpEncoder.h\" ]\n@@ -836,11 +790,16 @@ skia_no_encode_webp_srcs = [ \"$_src/encode/SkWebpEncoder_none.cpp\" ]\n skia_discardable_memory_chromium =\n [ \"$_include/private/chromium/SkDiscardableMemory.h\" ]\n \n-skia_no_slug_srcs = []\n-\n-skia_core_sources += skia_pathops_sources\n+# List generated by Bazel rules:\n+# //src/image:android_srcs\n+# //src/android:animated_image\n+skia_android_core_srcs = [\n+ \"$_src/android/SkAnimatedImage.cpp\",\n+ \"$_src/image/SkImage_AndroidFactories.cpp\",\n+]\n \n-skia_core_public += skia_pathops_public\n+# Generated by Bazel rule //include/android:animated_image_hdrs\n+skia_android_core_hdrs = [ \"$_include/android/SkAnimatedImage.h\" ]\n \n # SkiaSharp C API additions (mono/skia fork)\n skia_core_public += [\n@@ -862,6 +821,7 @@ skia_core_public += [\n \"$_include/c/sk_matrix.h\",\n \"$_include/c/sk_paint.h\",\n \"$_include/c/sk_path.h\",\n+ \"$_include/c/sk_pathbuilder.h\",\n \"$_include/c/sk_patheffect.h\",\n \"$_include/c/sk_picture.h\",\n \"$_include/c/sk_pixmap.h\",\n@@ -900,6 +860,7 @@ skia_core_sources += [\n \"$_src/c/sk_matrix.cpp\",\n \"$_src/c/sk_paint.cpp\",\n \"$_src/c/sk_path.cpp\",\n+ \"$_src/c/sk_pathbuilder.cpp\",\n \"$_src/c/sk_patheffect.cpp\",\n \"$_src/c/sk_picture.cpp\",\n \"$_src/c/sk_pixmap.cpp\",", "oldDiff": "diff --git a/gn/core.gni b/gn/core.gni\nindex 0d167deefd..3fec485819 100644\n--- a/gn/core.gni\n+++ b/gn/core.gni\n@@ -841,3 +841,84 @@ skia_no_slug_srcs = []\n skia_core_sources += skia_pathops_sources\n \n skia_core_public += skia_pathops_public\n+\n+# SkiaSharp C API additions (mono/skia fork)\n+skia_core_public += [\n+ \"$_include/c/sk_bitmap.h\",\n+ \"$_include/c/sk_blender.h\",\n+ \"$_include/c/sk_canvas.h\",\n+ \"$_include/c/sk_codec.h\",\n+ \"$_include/c/sk_colorfilter.h\",\n+ \"$_include/c/sk_colorspace.h\",\n+ \"$_include/c/sk_data.h\",\n+ \"$_include/c/sk_document.h\",\n+ \"$_include/c/sk_drawable.h\",\n+ \"$_include/c/sk_font.h\",\n+ \"$_include/c/sk_general.h\",\n+ \"$_include/c/sk_graphics.h\",\n+ \"$_include/c/sk_image.h\",\n+ \"$_include/c/sk_imagefilter.h\",\n+ \"$_include/c/sk_maskfilter.h\",\n+ \"$_include/c/sk_matrix.h\",\n+ \"$_include/c/sk_paint.h\",\n+ \"$_include/c/sk_path.h\",\n+ \"$_include/c/sk_patheffect.h\",\n+ \"$_include/c/sk_picture.h\",\n+ \"$_include/c/sk_pixmap.h\",\n+ \"$_include/c/sk_region.h\",\n+ \"$_include/c/sk_rrect.h\",\n+ \"$_include/c/sk_runtimeeffect.h\",\n+ \"$_include/c/sk_shader.h\",\n+ \"$_include/c/sk_stream.h\",\n+ \"$_include/c/sk_string.h\",\n+ \"$_include/c/sk_surface.h\",\n+ \"$_include/c/sk_svg.h\",\n+ \"$_include/c/sk_textblob.h\",\n+ \"$_include/c/sk_typeface.h\",\n+ \"$_include/c/sk_types.h\",\n+ \"$_include/c/sk_vertices.h\",\n+ \"$_include/c/gr_context.h\",\n+]\n+\n+skia_core_sources += [\n+ \"$_src/c/sk_bitmap.cpp\",\n+ \"$_src/c/sk_blender.cpp\",\n+ \"$_src/c/sk_canvas.cpp\",\n+ \"$_src/c/sk_codec.cpp\",\n+ \"$_src/c/sk_colorfilter.cpp\",\n+ \"$_src/c/sk_colorspace.cpp\",\n+ \"$_src/c/sk_data.cpp\",\n+ \"$_src/c/sk_document.cpp\",\n+ \"$_src/c/sk_drawable.cpp\",\n+ \"$_src/c/sk_enums.cpp\",\n+ \"$_src/c/sk_font.cpp\",\n+ \"$_src/c/sk_general.cpp\",\n+ \"$_src/c/sk_graphics.cpp\",\n+ \"$_src/c/sk_image.cpp\",\n+ \"$_src/c/sk_imagefilter.cpp\",\n+ \"$_src/c/sk_maskfilter.cpp\",\n+ \"$_src/c/sk_matrix.cpp\",\n+ \"$_src/c/sk_paint.cpp\",\n+ \"$_src/c/sk_path.cpp\",\n+ \"$_src/c/sk_patheffect.cpp\",\n+ \"$_src/c/sk_picture.cpp\",\n+ \"$_src/c/sk_pixmap.cpp\",\n+ \"$_src/c/sk_region.cpp\",\n+ \"$_src/c/sk_rrect.cpp\",\n+ \"$_src/c/sk_runtimeeffect.cpp\",\n+ \"$_src/c/sk_shader.cpp\",\n+ \"$_src/c/sk_stream.cpp\",\n+ \"$_src/c/sk_string.cpp\",\n+ \"$_src/c/sk_structs.cpp\",\n+ \"$_src/c/sk_surface.cpp\",\n+ \"$_src/c/sk_svg.cpp\",\n+ \"$_src/c/sk_textblob.cpp\",\n+ \"$_src/c/sk_typeface.cpp\",\n+ \"$_src/c/sk_types_priv.h\",\n+ \"$_src/c/sk_vertices.cpp\",\n+ \"$_src/c/gr_context.cpp\",\n+ \"$_src/c/sk_linker.cpp\",\n+ \"$_src/c/skottie_animation.cpp\",\n+ \"$_src/c/skresources_resource_provider.cpp\",\n+ \"$_src/c/sksg_invalidation_controller.cpp\",\n+]", "newDiff": "diff --git a/gn/core.gni b/gn/core.gni\nindex dbf6be0143..c034f58a9b 100644\n--- a/gn/core.gni\n+++ b/gn/core.gni\n@@ -800,3 +800,86 @@ skia_android_core_srcs = [\n \n # Generated by Bazel rule //include/android:animated_image_hdrs\n skia_android_core_hdrs = [ \"$_include/android/SkAnimatedImage.h\" ]\n+\n+# SkiaSharp C API additions (mono/skia fork)\n+skia_core_public += [\n+ \"$_include/c/sk_bitmap.h\",\n+ \"$_include/c/sk_blender.h\",\n+ \"$_include/c/sk_canvas.h\",\n+ \"$_include/c/sk_codec.h\",\n+ \"$_include/c/sk_colorfilter.h\",\n+ \"$_include/c/sk_colorspace.h\",\n+ \"$_include/c/sk_data.h\",\n+ \"$_include/c/sk_document.h\",\n+ \"$_include/c/sk_drawable.h\",\n+ \"$_include/c/sk_font.h\",\n+ \"$_include/c/sk_general.h\",\n+ \"$_include/c/sk_graphics.h\",\n+ \"$_include/c/sk_image.h\",\n+ \"$_include/c/sk_imagefilter.h\",\n+ \"$_include/c/sk_maskfilter.h\",\n+ \"$_include/c/sk_matrix.h\",\n+ \"$_include/c/sk_paint.h\",\n+ \"$_include/c/sk_path.h\",\n+ \"$_include/c/sk_pathbuilder.h\",\n+ \"$_include/c/sk_patheffect.h\",\n+ \"$_include/c/sk_picture.h\",\n+ \"$_include/c/sk_pixmap.h\",\n+ \"$_include/c/sk_region.h\",\n+ \"$_include/c/sk_rrect.h\",\n+ \"$_include/c/sk_runtimeeffect.h\",\n+ \"$_include/c/sk_shader.h\",\n+ \"$_include/c/sk_stream.h\",\n+ \"$_include/c/sk_string.h\",\n+ \"$_include/c/sk_surface.h\",\n+ \"$_include/c/sk_svg.h\",\n+ \"$_include/c/sk_textblob.h\",\n+ \"$_include/c/sk_typeface.h\",\n+ \"$_include/c/sk_types.h\",\n+ \"$_include/c/sk_vertices.h\",\n+ \"$_include/c/gr_context.h\",\n+]\n+\n+skia_core_sources += [\n+ \"$_src/c/sk_bitmap.cpp\",\n+ \"$_src/c/sk_blender.cpp\",\n+ \"$_src/c/sk_canvas.cpp\",\n+ \"$_src/c/sk_codec.cpp\",\n+ \"$_src/c/sk_colorfilter.cpp\",\n+ \"$_src/c/sk_colorspace.cpp\",\n+ \"$_src/c/sk_data.cpp\",\n+ \"$_src/c/sk_document.cpp\",\n+ \"$_src/c/sk_drawable.cpp\",\n+ \"$_src/c/sk_enums.cpp\",\n+ \"$_src/c/sk_font.cpp\",\n+ \"$_src/c/sk_general.cpp\",\n+ \"$_src/c/sk_graphics.cpp\",\n+ \"$_src/c/sk_image.cpp\",\n+ \"$_src/c/sk_imagefilter.cpp\",\n+ \"$_src/c/sk_maskfilter.cpp\",\n+ \"$_src/c/sk_matrix.cpp\",\n+ \"$_src/c/sk_paint.cpp\",\n+ \"$_src/c/sk_path.cpp\",\n+ \"$_src/c/sk_pathbuilder.cpp\",\n+ \"$_src/c/sk_patheffect.cpp\",\n+ \"$_src/c/sk_picture.cpp\",\n+ \"$_src/c/sk_pixmap.cpp\",\n+ \"$_src/c/sk_region.cpp\",\n+ \"$_src/c/sk_rrect.cpp\",\n+ \"$_src/c/sk_runtimeeffect.cpp\",\n+ \"$_src/c/sk_shader.cpp\",\n+ \"$_src/c/sk_stream.cpp\",\n+ \"$_src/c/sk_string.cpp\",\n+ \"$_src/c/sk_structs.cpp\",\n+ \"$_src/c/sk_surface.cpp\",\n+ \"$_src/c/sk_svg.cpp\",\n+ \"$_src/c/sk_textblob.cpp\",\n+ \"$_src/c/sk_typeface.cpp\",\n+ \"$_src/c/sk_types_priv.h\",\n+ \"$_src/c/sk_vertices.cpp\",\n+ \"$_src/c/gr_context.cpp\",\n+ \"$_src/c/sk_linker.cpp\",\n+ \"$_src/c/skottie_animation.cpp\",\n+ \"$_src/c/skresources_resource_provider.cpp\",\n+ \"$_src/c/sksg_invalidation_controller.cpp\",\n+]", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,11 +1,11 @@\n diff --git a/gn/core.gni b/gn/core.gni\n-index 0d167deefd..3fec485819 100644\n+index dbf6be0143..c034f58a9b 100644\n --- a/gn/core.gni\n +++ b/gn/core.gni\n-@@ -841,3 +841,84 @@ skia_no_slug_srcs = []\n- skia_core_sources += skia_pathops_sources\n+@@ -800,3 +800,86 @@ skia_android_core_srcs = [\n \n- skia_core_public += skia_pathops_public\n+ # Generated by Bazel rule //include/android:animated_image_hdrs\n+ skia_android_core_hdrs = [ \"$_include/android/SkAnimatedImage.h\" ]\n +\n +# SkiaSharp C API additions (mono/skia fork)\n +skia_core_public += [\n@@ -27,6 +27,7 @@ index 0d167deefd..3fec485819 100644\n + \"$_include/c/sk_matrix.h\",\n + \"$_include/c/sk_paint.h\",\n + \"$_include/c/sk_path.h\",\n++ \"$_include/c/sk_pathbuilder.h\",\n + \"$_include/c/sk_patheffect.h\",\n + \"$_include/c/sk_picture.h\",\n + \"$_include/c/sk_pixmap.h\",\n@@ -65,6 +66,7 @@ index 0d167deefd..3fec485819 100644\n + \"$_src/c/sk_matrix.cpp\",\n + \"$_src/c/sk_paint.cpp\",\n + \"$_src/c/sk_path.cpp\",\n++ \"$_src/c/sk_pathbuilder.cpp\",\n + \"$_src/c/sk_patheffect.cpp\",\n + \"$_src/c/sk_picture.cpp\",\n + \"$_src/c/sk_pixmap.cpp\",", "summary": "Large upstream refactoring of core source lists: (1) Removes pathops sources from core (moved to separate gn/pathops.gni). (2) Adds new files: SkCPUContext, SkCPURecorder, SkPathIter, SkPathData, SkPathRaw, SkRecordCanvas, SkCapture*, SkLog, SkSharedMutex, SkSynchronizedResourceCache. (3) Removes SkDrawBase, SkImagePriv, SkRecorder (moved/renamed). (4) Moves SkColorData.h/SkColorPriv.h from include/private to src/core. (5) Adds SkPMColor.h to chromium private headers. (6) Adds android core sources and headers (SkAnimatedImage). (7) Moves rust_png encoder from experimental/ to src/encode/. Fork patch updated: adds sk_pathbuilder.h and sk_pathbuilder.cpp to the SkiaSharp C API source lists.", "relatedFiles": [{"path": "BUILD.gn", "relationship": "related"}]}, {"path": "gn/skia/BUILD.gn", "diff": "diff --git a/gn/skia/BUILD.gn b/gn/skia/BUILD.gn\nindex 1ee74144de..161edb2efc 100644\n--- a/gn/skia/BUILD.gn\n+++ b/gn/skia/BUILD.gn\n@@ -3,9 +3,6 @@\n # Use of this source code is governed by a BSD-style license that can be\n # found in the LICENSE file.\n \n-if (is_fuchsia) {\n- import(\"//build/fuchsia/sdk.gni\")\n-}\n if (is_wasm) {\n import(\"../toolchain/wasm.gni\")\n }\n@@ -18,7 +15,6 @@ declare_args() {\n extra_cflags_c = []\n extra_cflags_cc = []\n extra_ldflags = []\n- use_PIC = true\n \n malloc = \"\"\n \n@@ -28,8 +24,6 @@ declare_args() {\n \n werror = false\n xcode_sysroot = \"\"\n-\n- visibility_hidden = true\n }\n \n if (is_ios && !is_maccatalyst && xcode_sysroot == \"\") {\n@@ -86,26 +80,6 @@ config(\"default\") {\n cflags += [ \"-ffp-contract=off\" ]\n }\n \n- if (is_fuchsia && using_fuchsia_sdk) {\n- ldflags += [\n- \"-v\",\n- \"--sysroot=\" + rebase_path(\"$fuchsia_sdk_path/arch/$current_cpu/sysroot\"),\n- ]\n- cflags += [ \"--sysroot=\" +\n- rebase_path(\"$fuchsia_sdk_path/arch/$current_cpu/sysroot\") ]\n- if (current_cpu == \"x64\") {\n- current_cpu = \"--target=x86_64-${current_os}\"\n- } else if (current_cpu == \"arm64\") {\n- target_triple = \"--target=aarch64-unknown-${current_os}\"\n- } else {\n- print(\"Unknown target CPU for Fuchsia target build.\")\n- assert(false)\n- }\n- ldflags += [ target_triple ]\n- cflags += [ target_triple ]\n- asmflags += [ target_triple ]\n- }\n-\n if (is_win) {\n if (is_clang && current_cpu == \"arm64\") {\n cflags += [ \"--target=arm64-windows\" ]\n@@ -114,7 +88,8 @@ config(\"default\") {\n \"/bigobj\", # Some of our files are bigger than the regular limits.\n \"/utf-8\", # Set Source and Executable character sets to UTF-8.\n ]\n- cflags_cc += [ \"/std:c++17\" ]\n+ cflags_cc += [ \"/std:c++20\" ]\n+\n if (!is_clang) {\n # https://developercommunity.visualstudio.com/t/Incorrect-C4573-when-taking-address-of-m/10662923\n cflags_cc += [ \"/Zc:lambda\" ]\n@@ -166,16 +141,20 @@ config(\"default\") {\n \"$win_vc/Tools/MSVC/$win_toolchain_version/lib/$target_cpu$_is_store\",\n ]\n } else {\n- if (use_PIC) {\n- cflags += [ \"-fPIC\" ]\n- }\n- cflags_cc += [ \"-std=c++17\" ]\n-\n- if (visibility_hidden) {\n- # The main idea is to slim the exported API, but these flags also improve link time on Mac.\n- # These would make stack traces worse on Linux, so we don't just set them willy-nilly.\n- cflags += [ \"-fvisibility=hidden\" ]\n- cflags_cc += [ \"-fvisibility-inlines-hidden\" ]\n+ cflags += [\n+ \"-fPIC\",\n+ \"-fvisibility=hidden\",\n+ ]\n+ cflags_cc += [ \"-fvisibility-inlines-hidden\" ]\n+ # mono/skia: Tizen Studio bundles clang-10, which only recognises the\n+ # C++20 working-draft spelling `c++2a`. The final `c++20` value was\n+ # added in clang 12. Substitute the older spelling for Tizen builds\n+ # so Skia post-m143 (which made C++20 the default) keeps building\n+ # against the Tizen NDK toolchain.\n+ if (is_tizen) {\n+ cflags_cc += [ \"-std=c++2a\" ]\n+ } else {\n+ cflags_cc += [ \"-std=c++20\" ]\n }\n }\n \n@@ -462,7 +441,7 @@ config(\"default\") {\n sanitizers = \"undefined,address,float-divide-by-zero\"\n \n if (is_android) {\n- # TODO(skia:13344): work out UBSAN link errors\n+ # TODO(skbug.com/40044427): work out UBSAN link errors\n sanitizers = \"address\"\n }\n } else if (sanitize == \"HWASAN\") {\n@@ -515,7 +494,7 @@ config(\"default\") {\n cflags_objcc += cflags_cc\n }\n \n-# See skia:9731.\n+# See skbug.com/40041063.\n config(\"recover_pointer_overflow\") {\n if (sanitize == \"ASAN\" && !(is_win && !is_clang)) {\n cflags = [ \"-fsanitize-recover=pointer-overflow\" ]\n@@ -656,7 +635,6 @@ config(\"warnings\") {\n \"-Wno-pedantic\",\n \"-Wno-reserved-id-macro\",\n \"-Wno-reserved-identifier\",\n- \"-Wno-shift-sign-overflow\",\n \"-Wno-signed-enum-bitfield\",\n \"-Wno-switch-enum\",\n \"-Wno-thread-safety-negative\",\n@@ -704,6 +682,7 @@ config(\"warnings\") {\n \"-Wno-c++98-compat\",\n \"-Wno-c++98-compat-pedantic\",\n \"-Wno-undefined-func-template\",\n+ \"-Wc++98-compat-extra-semi\",\n ]\n cflags_objc += [\n \"-Wno-direct-ivar-access\",\n@@ -807,7 +786,9 @@ config(\"debug_symbols\") {\n }\n \n config(\"no_rtti\") {\n- if (sanitize != \"ASAN\") { # -fsanitize=vptr requires RTTI\n+ # -fsanitize=vptr requires RTTI which is enabled as a part of\n+ # -fsanitize=undefined\n+ if (sanitize != \"ASAN\") {\n if (is_win) {\n cflags_cc = [ \"/GR-\" ]\n } else {\n@@ -914,3 +895,44 @@ config(\"executable\") {\n ]\n }\n }\n+\n+if (is_wasm) {\n+ if (is_canvaskit) {\n+ # CK manages its flags separately.\n+ config(\"wasm\") {\n+ }\n+ } else {\n+ config(\"wasm\") {\n+ # mono/skia: upstream (standalone-wasm commit e979274a45) adds\n+ # `-pthread` unconditionally here. That enables the wasm `atomics`\n+ # target feature and makes `__atomic_*` builtins lower to real\n+ # `i32.atomic.*` instructions, which later break the single-threaded\n+ # Blazor/dotnet wasm-opt pass (it runs without `--enable-threads`).\n+ # SkiaSharp's build.cake opts `-pthread` in via `extra_cflags_cc`\n+ # only for the `mt` variant, so we drop it from the default config\n+ # here and let build.cake control per-variant threading.\n+ common = [\n+ \"--sysroot=$skia_emsdk_dir/upstream/emscripten/cache/sysroot\",\n+ ]\n+ cflags = common\n+ ldflags = common\n+ ldflags += [\n+ \"-sDYNAMIC_EXECUTION=0\", # Disallow eval(): widens portability\n+ \"-sMIN_WEBGL_VERSION=2\",\n+ \"-sMAX_WEBGL_VERSION=2\",\n+ \"-sWASM=1\",\n+ \"-sALLOW_MEMORY_GROWTH=1\",\n+ \"-sSTACK_SIZE=1048576\", # 1 MB\n+ \"-sEXPORT_ES6=1\",\n+ \"-sMODULARIZE=1\", # Do not pollute global JS scope\n+ ]\n+ if (is_debug) {\n+ ldflags += [\n+ \"-sASSERTIONS=1\",\n+ \"-sPTHREADS_DEBUG=1\",\n+ \"-gsource-map\",\n+ ]\n+ }\n+ }\n+ }\n+}", "oldDiff": "diff --git a/gn/skia/BUILD.gn b/gn/skia/BUILD.gn\nindex ebc232237c..1ee74144de 100644\n--- a/gn/skia/BUILD.gn\n+++ b/gn/skia/BUILD.gn\n@@ -18,23 +18,32 @@ declare_args() {\n extra_cflags_c = []\n extra_cflags_cc = []\n extra_ldflags = []\n+ use_PIC = true\n \n malloc = \"\"\n+\n+ enable_bitcode =\n+ (is_tvos || is_watchos) &&\n+ (target_cpu == \"arm\" || target_cpu == \"arm64\")\n+\n werror = false\n xcode_sysroot = \"\"\n+\n+ visibility_hidden = true\n }\n \n-if (is_ios && xcode_sysroot == \"\") {\n+if (is_ios && !is_maccatalyst && xcode_sysroot == \"\") {\n if (is_tvos) {\n- sdk = \"appletvos\"\n- if (ios_use_simulator) {\n- sdk = \"appletvsimulator\"\n- }\n+ sdk = \"appletv\"\n+ } else if (is_watchos) {\n+ sdk = \"watch\"\n } else {\n- sdk = \"iphoneos\"\n- if (ios_use_simulator) {\n- sdk = \"iphonesimulator\"\n- }\n+ sdk = \"iphone\"\n+ }\n+ if (ios_use_simulator) {\n+ sdk += \"simulator\"\n+ } else {\n+ sdk += \"os\"\n }\n xcode_sysroot =\n exec_script(\"../find_xcode_sysroot.py\", [ sdk ], \"trim string\")\n@@ -44,7 +53,7 @@ if (is_ios && xcode_sysroot == \"\") {\n # shipped with chrome can find them. When the gn_to_bp.py tool is run, then the host_os != mac.\n # In this case leave the xcode_sysroot empty, and the cc/c++ that come with XCode will be able to\n # find needed include paths.\n-if (is_mac && host_os == \"mac\" && xcode_sysroot == \"\") {\n+if ((is_mac || is_maccatalyst) && host_os == \"mac\" && xcode_sysroot == \"\") {\n xcode_sysroot =\n exec_script(\"../find_xcode_sysroot.py\", [ \"macosx\" ], \"trim string\")\n }\n@@ -116,6 +125,16 @@ config(\"default\") {\n \"WIN32_LEAN_AND_MEAN\",\n \"NOMINMAX\",\n ]\n+ if (is_winrt) {\n+ defines += [\n+ \"WINAPI_FAMILY=WINAPI_FAMILY_APP\",\n+ \"SK_BUILD_FOR_WINRT\",\n+ ]\n+ ldflags += [\n+ \"/APPCONTAINER\",\n+ \"WindowsApp.lib\",\n+ ]\n+ }\n \n _include_dirs = [\n \"$win_vc/Tools/MSVC/$win_toolchain_version/include\",\n@@ -136,23 +155,31 @@ config(\"default\") {\n include_dirs = _include_dirs\n }\n \n+ _is_store = \"\"\n+ if (is_winrt) {\n+ _is_store = \"/store\"\n+ }\n+\n lib_dirs = [\n- \"$win_sdk/Lib/$win_sdk_version/ucrt/$current_cpu\",\n- \"$win_sdk/Lib/$win_sdk_version/um/$current_cpu\",\n- \"$win_vc/Tools/MSVC/$win_toolchain_version/lib/$current_cpu\",\n+ \"$win_sdk/Lib/$win_sdk_version/ucrt/$target_cpu\",\n+ \"$win_sdk/Lib/$win_sdk_version/um/$target_cpu\",\n+ \"$win_vc/Tools/MSVC/$win_toolchain_version/lib/$target_cpu$_is_store\",\n ]\n } else {\n- cflags += [\n- \"-fPIC\",\n- \"-fvisibility=hidden\",\n- ]\n- cflags_cc += [\n- \"-std=c++17\",\n- \"-fvisibility-inlines-hidden\",\n- ]\n+ if (use_PIC) {\n+ cflags += [ \"-fPIC\" ]\n+ }\n+ cflags_cc += [ \"-std=c++17\" ]\n+\n+ if (visibility_hidden) {\n+ # The main idea is to slim the exported API, but these flags also improve link time on Mac.\n+ # These would make stack traces worse on Linux, so we don't just set them willy-nilly.\n+ cflags += [ \"-fvisibility=hidden\" ]\n+ cflags_cc += [ \"-fvisibility-inlines-hidden\" ]\n+ }\n }\n \n- if (current_cpu == \"arm\") {\n+ if (current_cpu == \"arm\" && !is_win) {\n cflags += [\n \"-march=armv7-a\",\n \"-mfpu=neon\",\n@@ -185,7 +212,35 @@ config(\"default\") {\n \n if (is_android) {\n cflags += [ \"--sysroot=$ndk/toolchains/llvm/prebuilt/$ndk_host/sysroot\" ]\n- ldflags += [ \"-static-libstdc++\" ]\n+ ldflags += [\n+ \"-static-libstdc++\",\n+ \"-Wl,--no-undefined\",\n+ ]\n+ }\n+\n+ if (is_tizen) {\n+ defines += [ \"SK_BUILD_FOR_TIZEN\" ]\n+ asmflags += [\n+ \"--target=$ncli_target\",\n+ \"-B$ncli/tools/$ncli_gccdir/$ncli_target/bin\",\n+ ]\n+ cflags += [\n+ \"--sysroot=$ncli/platforms/$ncli_platform\",\n+ \"--target=$ncli_target\",\n+ \"-B$ncli/tools/$ncli_gccdir/$ncli_target/bin\",\n+ ]\n+ cflags_cc += [\n+ \"-isystem$ncli/tools/$ncli_gccdir/$ncli_target/include/c++/${ncli_gcc_version}\",\n+ \"-isystem$ncli/tools/$ncli_gccdir/$ncli_target/include/c++/${ncli_gcc_version}/$ncli_target\",\n+ ]\n+ ldflags += [\n+ \"--sysroot=$ncli/platforms/$ncli_platform\",\n+ \"--target=$ncli_target\",\n+ \"-B$ncli/tools/$ncli_gccdir/$ncli_target/bin\",\n+ ]\n+ lib_dirs = [\n+ \"$ncli/platforms/$ncli_platform/usr/lib\",\n+ ]\n }\n \n if (show_includes) {\n@@ -204,19 +259,37 @@ config(\"default\") {\n }\n \n if (is_ios) {\n- if (current_cpu == \"arm\") {\n- _arch_flags = [\n- \"-arch\",\n- \"armv7\",\n- ]\n- } else if (current_cpu == \"arm64\") {\n- _arch_flags = [\n- \"-arch\",\n- \"arm64\",\n- \"-arch\",\n- \"arm64e\",\n- ]\n- } else if (current_cpu == \"x86\") {\n+ if (target_cpu == \"arm\") {\n+ if (is_watchos) {\n+ _arch_flags = [\n+ \"-arch\",\n+ \"armv7k\",\n+ ]\n+ } else {\n+ _arch_flags = [\n+ \"-arch\",\n+ \"armv7\",\n+ ]\n+ }\n+ } else if (target_cpu == \"arm64\") {\n+ if (is_watchos) {\n+ _arch_flags = [\n+ \"-arch\",\n+ \"arm64_32\",\n+ ]\n+ } else {\n+ _arch_flags = [\n+ \"-arch\",\n+ \"arm64\",\n+ ]\n+ if (!ios_use_simulator) {\n+ _arch_flags += [\n+ \"-arch\",\n+ \"arm64e\",\n+ ]\n+ }\n+ }\n+ } else if (target_cpu == \"x86\") {\n _arch_flags = [\n \"-arch\",\n \"i386\",\n@@ -251,21 +324,60 @@ config(\"default\") {\n \"-stdlib=libc++\",\n ] + _arch_flags\n libs += [ \"objc\" ]\n- if (ios_min_target != \"\") {\n+ if (is_watchos) {\n+ defines += [ \"SK_BUILD_FOR_WATCHOS\" ]\n+ cflags += [ \"-mwatchos-version-min=$min_watchos_version\" ]\n+ ldflags += [ \"-Wl,watchos_version_min=$min_watchos_version\" ]\n+ } else if (is_tvos) {\n+ defines += [ \"SK_BUILD_FOR_TVOS\" ]\n+ cflags += [ \"-mtvos-version-min=$min_tvos_version\" ]\n+ ldflags += [ \"-Wl,tvos_version_min=$min_tvos_version\" ]\n if (ios_use_simulator) {\n- cflags += [ \"-miphonesimulator-version-min=$ios_min_target\" ]\n- asmflags += [ \"-miphonesimulator-version-min=$ios_min_target\" ]\n- ldflags += [ \"-miphonesimulator-version-min=$ios_min_target\" ]\n- } else {\n- cflags += [ \"-miphoneos-version-min=$ios_min_target\" ]\n- asmflags += [ \"-miphoneos-version-min=$ios_min_target\" ]\n- ldflags += [ \"-miphoneos-version-min=$ios_min_target\" ]\n+ cflags += [\n+ \"-target\", \"$target_cpu-apple-tvos$min_tvos_version-simulator\",\n+ ]\n+ ldflags += [\n+ \"-target\", \"$target_cpu-apple-tvos$min_tvos_version-simulator\",\n+ ]\n+ }\n+ } else if (is_maccatalyst) {\n+ defines += [ \"SK_BUILD_FOR_MACCATALYST\" ]\n+ if (target_cpu == \"x64\") {\n+ _target = \"x86_64\"\n+ } else if (target_cpu == \"arm64\") {\n+ _target = \"arm64\"\n+ }\n+ cflags += [\n+ \"-target\", \"$_target-apple-ios$min_maccatalyst_version-macabi\",\n+ \"-iframework\", \"$xcode_sysroot/System/iOSSupport/System/Library/Frameworks\",\n+ ]\n+ ldflags += [\n+ \"-target\", \"$_target-apple-ios$min_maccatalyst_version-macabi\",\n+ \"-iframework\", \"$xcode_sysroot/System/iOSSupport/System/Library/Frameworks\",\n+ ]\n+ } else {\n+ cflags += [ \"-mios-version-min=$min_ios_version\" ]\n+ ldflags += [ \"-Wl,ios_version_min=$min_ios_version\" ]\n+ if (ios_use_simulator) {\n+ cflags += [\n+ \"-target\", \"$target_cpu-apple-ios$min_ios_version-simulator\",\n+ ]\n+ ldflags += [\n+ \"-target\", \"$target_cpu-apple-ios$min_ios_version-simulator\",\n+ ]\n }\n }\n }\n \n+ if (enable_bitcode) {\n+ cflags += [\n+ \"-fembed-bitcode\"\n+ ]\n+ }\n+\n if (is_linux) {\n libs += [ \"pthread\" ]\n+ ldflags += [ \"-Wl,--no-undefined\" ]\n }\n \n if (is_mac) {\n@@ -279,10 +391,12 @@ config(\"default\") {\n cflags += [\n \"-isysroot\",\n xcode_sysroot,\n+ \"-mmacosx-version-min=$min_macos_version\",\n ]\n ldflags += [\n \"-isysroot\",\n xcode_sysroot,\n+ \"-Wl,macosx_version_min=$min_macos_version\",\n ]\n }\n \n@@ -298,33 +412,34 @@ config(\"default\") {\n if (current_cpu == \"arm64\") {\n asmflags += [\n \"-target\",\n- \"arm64-apple-macos11\",\n+ \"arm64-apple-macos$min_macos_version\",\n ]\n cflags += [\n \"-target\",\n- \"arm64-apple-macos11\",\n+ \"arm64-apple-macos$min_macos_version\",\n ]\n ldflags += [\n \"-target\",\n- \"arm64-apple-macos11\",\n+ \"arm64-apple-macos$min_macos_version\",\n ]\n } else {\n asmflags += [\n \"-target\",\n- \"x86_64-apple-macos10.15\",\n+ \"x86_64-apple-macos$min_macos_version\",\n ]\n cflags += [\n \"-target\",\n- \"x86_64-apple-macos10.15\",\n+ \"x86_64-apple-macos$min_macos_version\",\n ]\n ldflags += [\n \"-target\",\n- \"x86_64-apple-macos10.15\",\n+ \"x86_64-apple-macos$min_macos_version\",\n ]\n }\n }\n \n if (is_wasm) {\n+ defines += [ \"SK_BUILD_FOR_WASM\" ]\n cflags += [ \"--sysroot=$skia_emsdk_dir/upstream/emscripten/cache/sysroot\" ]\n ldflags += [ \"--sysroot=$skia_emsdk_dir/upstream/emscripten/cache/sysroot\" ]\n }\n@@ -730,15 +845,24 @@ config(\"optimize\") {\n } else {\n cflags = [ \"-O3\" ]\n }\n- if (is_mac || is_ios) {\n- ldflags += [ \"-dead_strip\" ]\n- } else if (!is_wasm) {\n+ if (!enable_bitcode) {\n cflags += [\n \"-fdata-sections\",\n \"-ffunction-sections\",\n ]\n+ }\n+ if (is_mac || is_ios) {\n+ ldflags += [ \"-dead_strip\" ]\n+ } else {\n ldflags += [ \"-Wl,--gc-sections\" ]\n }\n+ if (target_cpu == \"wasm\") {\n+ # The compiler asks us to add an optimization flag to both cflags\n+ # and ldflags to cut down on the local variables,\n+ # for performance reasons.\n+ # The \"linking\" step is the conversion to javascript.\n+ ldflags += [ \"-O3\" ]\n+ }\n }\n }", "newDiff": "diff --git a/gn/skia/BUILD.gn b/gn/skia/BUILD.gn\nindex 4ef096e238..161edb2efc 100644\n--- a/gn/skia/BUILD.gn\n+++ b/gn/skia/BUILD.gn\n@@ -17,21 +17,27 @@ declare_args() {\n extra_ldflags = []\n \n malloc = \"\"\n+\n+ enable_bitcode =\n+ (is_tvos || is_watchos) &&\n+ (target_cpu == \"arm\" || target_cpu == \"arm64\")\n+\n werror = false\n xcode_sysroot = \"\"\n }\n \n-if (is_ios && xcode_sysroot == \"\") {\n+if (is_ios && !is_maccatalyst && xcode_sysroot == \"\") {\n if (is_tvos) {\n- sdk = \"appletvos\"\n- if (ios_use_simulator) {\n- sdk = \"appletvsimulator\"\n- }\n+ sdk = \"appletv\"\n+ } else if (is_watchos) {\n+ sdk = \"watch\"\n } else {\n- sdk = \"iphoneos\"\n- if (ios_use_simulator) {\n- sdk = \"iphonesimulator\"\n- }\n+ sdk = \"iphone\"\n+ }\n+ if (ios_use_simulator) {\n+ sdk += \"simulator\"\n+ } else {\n+ sdk += \"os\"\n }\n xcode_sysroot =\n exec_script(\"../find_xcode_sysroot.py\", [ sdk ], \"trim string\")\n@@ -41,7 +47,7 @@ if (is_ios && xcode_sysroot == \"\") {\n # shipped with chrome can find them. When the gn_to_bp.py tool is run, then the host_os != mac.\n # In this case leave the xcode_sysroot empty, and the cc/c++ that come with XCode will be able to\n # find needed include paths.\n-if (is_mac && host_os == \"mac\" && xcode_sysroot == \"\") {\n+if ((is_mac || is_maccatalyst) && host_os == \"mac\" && xcode_sysroot == \"\") {\n xcode_sysroot =\n exec_script(\"../find_xcode_sysroot.py\", [ \"macosx\" ], \"trim string\")\n }\n@@ -94,6 +100,16 @@ config(\"default\") {\n \"WIN32_LEAN_AND_MEAN\",\n \"NOMINMAX\",\n ]\n+ if (is_winrt) {\n+ defines += [\n+ \"WINAPI_FAMILY=WINAPI_FAMILY_APP\",\n+ \"SK_BUILD_FOR_WINRT\",\n+ ]\n+ ldflags += [\n+ \"/APPCONTAINER\",\n+ \"WindowsApp.lib\",\n+ ]\n+ }\n \n _include_dirs = [\n \"$win_vc/Tools/MSVC/$win_toolchain_version/include\",\n@@ -114,10 +130,15 @@ config(\"default\") {\n include_dirs = _include_dirs\n }\n \n+ _is_store = \"\"\n+ if (is_winrt) {\n+ _is_store = \"/store\"\n+ }\n+\n lib_dirs = [\n- \"$win_sdk/Lib/$win_sdk_version/ucrt/$current_cpu\",\n- \"$win_sdk/Lib/$win_sdk_version/um/$current_cpu\",\n- \"$win_vc/Tools/MSVC/$win_toolchain_version/lib/$current_cpu\",\n+ \"$win_sdk/Lib/$win_sdk_version/ucrt/$target_cpu\",\n+ \"$win_sdk/Lib/$win_sdk_version/um/$target_cpu\",\n+ \"$win_vc/Tools/MSVC/$win_toolchain_version/lib/$target_cpu$_is_store\",\n ]\n } else {\n cflags += [\n@@ -125,10 +146,19 @@ config(\"default\") {\n \"-fvisibility=hidden\",\n ]\n cflags_cc += [ \"-fvisibility-inlines-hidden\" ]\n- cflags_cc += [ \"-std=c++20\" ]\n+ # mono/skia: Tizen Studio bundles clang-10, which only recognises the\n+ # C++20 working-draft spelling `c++2a`. The final `c++20` value was\n+ # added in clang 12. Substitute the older spelling for Tizen builds\n+ # so Skia post-m143 (which made C++20 the default) keeps building\n+ # against the Tizen NDK toolchain.\n+ if (is_tizen) {\n+ cflags_cc += [ \"-std=c++2a\" ]\n+ } else {\n+ cflags_cc += [ \"-std=c++20\" ]\n+ }\n }\n \n- if (current_cpu == \"arm\") {\n+ if (current_cpu == \"arm\" && !is_win) {\n cflags += [\n \"-march=armv7-a\",\n \"-mfpu=neon\",\n@@ -161,7 +191,35 @@ config(\"default\") {\n \n if (is_android) {\n cflags += [ \"--sysroot=$ndk/toolchains/llvm/prebuilt/$ndk_host/sysroot\" ]\n- ldflags += [ \"-static-libstdc++\" ]\n+ ldflags += [\n+ \"-static-libstdc++\",\n+ \"-Wl,--no-undefined\",\n+ ]\n+ }\n+\n+ if (is_tizen) {\n+ defines += [ \"SK_BUILD_FOR_TIZEN\" ]\n+ asmflags += [\n+ \"--target=$ncli_target\",\n+ \"-B$ncli/tools/$ncli_gccdir/$ncli_target/bin\",\n+ ]\n+ cflags += [\n+ \"--sysroot=$ncli/platforms/$ncli_platform\",\n+ \"--target=$ncli_target\",\n+ \"-B$ncli/tools/$ncli_gccdir/$ncli_target/bin\",\n+ ]\n+ cflags_cc += [\n+ \"-isystem$ncli/tools/$ncli_gccdir/$ncli_target/include/c++/${ncli_gcc_version}\",\n+ \"-isystem$ncli/tools/$ncli_gccdir/$ncli_target/include/c++/${ncli_gcc_version}/$ncli_target\",\n+ ]\n+ ldflags += [\n+ \"--sysroot=$ncli/platforms/$ncli_platform\",\n+ \"--target=$ncli_target\",\n+ \"-B$ncli/tools/$ncli_gccdir/$ncli_target/bin\",\n+ ]\n+ lib_dirs = [\n+ \"$ncli/platforms/$ncli_platform/usr/lib\",\n+ ]\n }\n \n if (show_includes) {\n@@ -180,19 +238,37 @@ config(\"default\") {\n }\n \n if (is_ios) {\n- if (current_cpu == \"arm\") {\n- _arch_flags = [\n- \"-arch\",\n- \"armv7\",\n- ]\n- } else if (current_cpu == \"arm64\") {\n- _arch_flags = [\n- \"-arch\",\n- \"arm64\",\n- \"-arch\",\n- \"arm64e\",\n- ]\n- } else if (current_cpu == \"x86\") {\n+ if (target_cpu == \"arm\") {\n+ if (is_watchos) {\n+ _arch_flags = [\n+ \"-arch\",\n+ \"armv7k\",\n+ ]\n+ } else {\n+ _arch_flags = [\n+ \"-arch\",\n+ \"armv7\",\n+ ]\n+ }\n+ } else if (target_cpu == \"arm64\") {\n+ if (is_watchos) {\n+ _arch_flags = [\n+ \"-arch\",\n+ \"arm64_32\",\n+ ]\n+ } else {\n+ _arch_flags = [\n+ \"-arch\",\n+ \"arm64\",\n+ ]\n+ if (!ios_use_simulator) {\n+ _arch_flags += [\n+ \"-arch\",\n+ \"arm64e\",\n+ ]\n+ }\n+ }\n+ } else if (target_cpu == \"x86\") {\n _arch_flags = [\n \"-arch\",\n \"i386\",\n@@ -227,21 +303,60 @@ config(\"default\") {\n \"-stdlib=libc++\",\n ] + _arch_flags\n libs += [ \"objc\" ]\n- if (ios_min_target != \"\") {\n+ if (is_watchos) {\n+ defines += [ \"SK_BUILD_FOR_WATCHOS\" ]\n+ cflags += [ \"-mwatchos-version-min=$min_watchos_version\" ]\n+ ldflags += [ \"-Wl,watchos_version_min=$min_watchos_version\" ]\n+ } else if (is_tvos) {\n+ defines += [ \"SK_BUILD_FOR_TVOS\" ]\n+ cflags += [ \"-mtvos-version-min=$min_tvos_version\" ]\n+ ldflags += [ \"-Wl,tvos_version_min=$min_tvos_version\" ]\n if (ios_use_simulator) {\n- cflags += [ \"-miphonesimulator-version-min=$ios_min_target\" ]\n- asmflags += [ \"-miphonesimulator-version-min=$ios_min_target\" ]\n- ldflags += [ \"-miphonesimulator-version-min=$ios_min_target\" ]\n- } else {\n- cflags += [ \"-miphoneos-version-min=$ios_min_target\" ]\n- asmflags += [ \"-miphoneos-version-min=$ios_min_target\" ]\n- ldflags += [ \"-miphoneos-version-min=$ios_min_target\" ]\n+ cflags += [\n+ \"-target\", \"$target_cpu-apple-tvos$min_tvos_version-simulator\",\n+ ]\n+ ldflags += [\n+ \"-target\", \"$target_cpu-apple-tvos$min_tvos_version-simulator\",\n+ ]\n+ }\n+ } else if (is_maccatalyst) {\n+ defines += [ \"SK_BUILD_FOR_MACCATALYST\" ]\n+ if (target_cpu == \"x64\") {\n+ _target = \"x86_64\"\n+ } else if (target_cpu == \"arm64\") {\n+ _target = \"arm64\"\n+ }\n+ cflags += [\n+ \"-target\", \"$_target-apple-ios$min_maccatalyst_version-macabi\",\n+ \"-iframework\", \"$xcode_sysroot/System/iOSSupport/System/Library/Frameworks\",\n+ ]\n+ ldflags += [\n+ \"-target\", \"$_target-apple-ios$min_maccatalyst_version-macabi\",\n+ \"-iframework\", \"$xcode_sysroot/System/iOSSupport/System/Library/Frameworks\",\n+ ]\n+ } else {\n+ cflags += [ \"-mios-version-min=$min_ios_version\" ]\n+ ldflags += [ \"-Wl,ios_version_min=$min_ios_version\" ]\n+ if (ios_use_simulator) {\n+ cflags += [\n+ \"-target\", \"$target_cpu-apple-ios$min_ios_version-simulator\",\n+ ]\n+ ldflags += [\n+ \"-target\", \"$target_cpu-apple-ios$min_ios_version-simulator\",\n+ ]\n }\n }\n }\n \n+ if (enable_bitcode) {\n+ cflags += [\n+ \"-fembed-bitcode\"\n+ ]\n+ }\n+\n if (is_linux) {\n libs += [ \"pthread\" ]\n+ ldflags += [ \"-Wl,--no-undefined\" ]\n }\n \n if (is_mac) {\n@@ -255,10 +370,12 @@ config(\"default\") {\n cflags += [\n \"-isysroot\",\n xcode_sysroot,\n+ \"-mmacosx-version-min=$min_macos_version\",\n ]\n ldflags += [\n \"-isysroot\",\n xcode_sysroot,\n+ \"-Wl,macosx_version_min=$min_macos_version\",\n ]\n }\n \n@@ -274,33 +391,34 @@ config(\"default\") {\n if (current_cpu == \"arm64\") {\n asmflags += [\n \"-target\",\n- \"arm64-apple-macos11\",\n+ \"arm64-apple-macos$min_macos_version\",\n ]\n cflags += [\n \"-target\",\n- \"arm64-apple-macos11\",\n+ \"arm64-apple-macos$min_macos_version\",\n ]\n ldflags += [\n \"-target\",\n- \"arm64-apple-macos11\",\n+ \"arm64-apple-macos$min_macos_version\",\n ]\n } else {\n asmflags += [\n \"-target\",\n- \"x86_64-apple-macos11\",\n+ \"x86_64-apple-macos$min_macos_version\",\n ]\n cflags += [\n \"-target\",\n- \"x86_64-apple-macos11\",\n+ \"x86_64-apple-macos$min_macos_version\",\n ]\n ldflags += [\n \"-target\",\n- \"x86_64-apple-macos11\",\n+ \"x86_64-apple-macos$min_macos_version\",\n ]\n }\n }\n \n- if (is_canvaskit) {\n+ if (is_wasm) {\n+ defines += [ \"SK_BUILD_FOR_WASM\" ]\n cflags += [ \"--sysroot=$skia_emsdk_dir/upstream/emscripten/cache/sysroot\" ]\n ldflags += [ \"--sysroot=$skia_emsdk_dir/upstream/emscripten/cache/sysroot\" ]\n }\n@@ -708,15 +826,24 @@ config(\"optimize\") {\n } else {\n cflags = [ \"-O3\" ]\n }\n- if (is_mac || is_ios) {\n- ldflags += [ \"-dead_strip\" ]\n- } else if (!is_canvaskit) {\n+ if (!enable_bitcode) {\n cflags += [\n \"-fdata-sections\",\n \"-ffunction-sections\",\n ]\n+ }\n+ if (is_mac || is_ios) {\n+ ldflags += [ \"-dead_strip\" ]\n+ } else {\n ldflags += [ \"-Wl,--gc-sections\" ]\n }\n+ if (target_cpu == \"wasm\") {\n+ # The compiler asks us to add an optimization flag to both cflags\n+ # and ldflags to cut down on the local variables,\n+ # for performance reasons.\n+ # The \"linking\" step is the conversion to javascript.\n+ ldflags += [ \"-O3\" ]\n+ }\n }\n }\n \n@@ -776,9 +903,16 @@ if (is_wasm) {\n }\n } else {\n config(\"wasm\") {\n+ # mono/skia: upstream (standalone-wasm commit e979274a45) adds\n+ # `-pthread` unconditionally here. That enables the wasm `atomics`\n+ # target feature and makes `__atomic_*` builtins lower to real\n+ # `i32.atomic.*` instructions, which later break the single-threaded\n+ # Blazor/dotnet wasm-opt pass (it runs without `--enable-threads`).\n+ # SkiaSharp's build.cake opts `-pthread` in via `extra_cflags_cc`\n+ # only for the `mt` variant, so we drop it from the default config\n+ # here and let build.cake control per-variant threading.\n common = [\n \"--sysroot=$skia_emsdk_dir/upstream/emscripten/cache/sysroot\",\n- \"-pthread\",\n ]\n cflags = common\n ldflags = common", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,12 +1,9 @@\n diff --git a/gn/skia/BUILD.gn b/gn/skia/BUILD.gn\n-index ebc232237c..1ee74144de 100644\n+index 4ef096e238..161edb2efc 100644\n --- a/gn/skia/BUILD.gn\n +++ b/gn/skia/BUILD.gn\n-@@ -18,23 +18,32 @@ declare_args() {\n- extra_cflags_c = []\n- extra_cflags_cc = []\n+@@ -17,21 +17,27 @@ declare_args() {\n extra_ldflags = []\n-+ use_PIC = true\n \n malloc = \"\"\n +\n@@ -16,8 +13,6 @@ index ebc232237c..1ee74144de 100644\n +\n werror = false\n xcode_sysroot = \"\"\n-+\n-+ visibility_hidden = true\n }\n \n -if (is_ios && xcode_sysroot == \"\") {\n@@ -44,7 +39,7 @@ index ebc232237c..1ee74144de 100644\n }\n xcode_sysroot =\n exec_script(\"../find_xcode_sysroot.py\", [ sdk ], \"trim string\")\n-@@ -44,7 +53,7 @@ if (is_ios && xcode_sysroot == \"\") {\n+@@ -41,7 +47,7 @@ if (is_ios && xcode_sysroot == \"\") {\n # shipped with chrome can find them. When the gn_to_bp.py tool is run, then the host_os != mac.\n # In this case leave the xcode_sysroot empty, and the cc/c++ that come with XCode will be able to\n # find needed include paths.\n@@ -53,7 +48,7 @@ index ebc232237c..1ee74144de 100644\n xcode_sysroot =\n exec_script(\"../find_xcode_sysroot.py\", [ \"macosx\" ], \"trim string\")\n }\n-@@ -116,6 +125,16 @@ config(\"default\") {\n+@@ -94,6 +100,16 @@ config(\"default\") {\n \"WIN32_LEAN_AND_MEAN\",\n \"NOMINMAX\",\n ]\n@@ -70,7 +65,7 @@ index ebc232237c..1ee74144de 100644\n \n _include_dirs = [\n \"$win_vc/Tools/MSVC/$win_toolchain_version/include\",\n-@@ -136,23 +155,31 @@ config(\"default\") {\n+@@ -114,10 +130,15 @@ config(\"default\") {\n include_dirs = _include_dirs\n }\n \n@@ -88,24 +83,21 @@ index ebc232237c..1ee74144de 100644\n + \"$win_vc/Tools/MSVC/$win_toolchain_version/lib/$target_cpu$_is_store\",\n ]\n } else {\n-- cflags += [\n-- \"-fPIC\",\n-- \"-fvisibility=hidden\",\n-- ]\n-- cflags_cc += [\n-- \"-std=c++17\",\n-- \"-fvisibility-inlines-hidden\",\n-- ]\n-+ if (use_PIC) {\n-+ cflags += [ \"-fPIC\" ]\n-+ }\n-+ cflags_cc += [ \"-std=c++17\" ]\n-+\n-+ if (visibility_hidden) {\n-+ # The main idea is to slim the exported API, but these flags also improve link time on Mac.\n-+ # These would make stack traces worse on Linux, so we don't just set them willy-nilly.\n-+ cflags += [ \"-fvisibility=hidden\" ]\n-+ cflags_cc += [ \"-fvisibility-inlines-hidden\" ]\n+ cflags += [\n+@@ -125,10 +146,19 @@ config(\"default\") {\n+ \"-fvisibility=hidden\",\n+ ]\n+ cflags_cc += [ \"-fvisibility-inlines-hidden\" ]\n+- cflags_cc += [ \"-std=c++20\" ]\n++ # mono/skia: Tizen Studio bundles clang-10, which only recognises the\n++ # C++20 working-draft spelling `c++2a`. The final `c++20` value was\n++ # added in clang 12. Substitute the older spelling for Tizen builds\n++ # so Skia post-m143 (which made C++20 the default) keeps building\n++ # against the Tizen NDK toolchain.\n++ if (is_tizen) {\n++ cflags_cc += [ \"-std=c++2a\" ]\n++ } else {\n++ cflags_cc += [ \"-std=c++20\" ]\n + }\n }\n \n@@ -114,7 +106,7 @@ index ebc232237c..1ee74144de 100644\n cflags += [\n \"-march=armv7-a\",\n \"-mfpu=neon\",\n-@@ -185,7 +212,35 @@ config(\"default\") {\n+@@ -161,7 +191,35 @@ config(\"default\") {\n \n if (is_android) {\n cflags += [ \"--sysroot=$ndk/toolchains/llvm/prebuilt/$ndk_host/sysroot\" ]\n@@ -151,7 +143,7 @@ index ebc232237c..1ee74144de 100644\n }\n \n if (show_includes) {\n-@@ -204,19 +259,37 @@ config(\"default\") {\n+@@ -180,19 +238,37 @@ config(\"default\") {\n }\n \n if (is_ios) {\n@@ -202,7 +194,7 @@ index ebc232237c..1ee74144de 100644\n _arch_flags = [\n \"-arch\",\n \"i386\",\n-@@ -251,21 +324,60 @@ config(\"default\") {\n+@@ -227,21 +303,60 @@ config(\"default\") {\n \"-stdlib=libc++\",\n ] + _arch_flags\n libs += [ \"objc\" ]\n@@ -271,7 +263,7 @@ index ebc232237c..1ee74144de 100644\n }\n \n if (is_mac) {\n-@@ -279,10 +391,12 @@ config(\"default\") {\n+@@ -255,10 +370,12 @@ config(\"default\") {\n cflags += [\n \"-isysroot\",\n xcode_sysroot,\n@@ -284,7 +276,7 @@ index ebc232237c..1ee74144de 100644\n ]\n }\n \n-@@ -298,33 +412,34 @@ config(\"default\") {\n+@@ -274,33 +391,34 @@ config(\"default\") {\n if (current_cpu == \"arm64\") {\n asmflags += [\n \"-target\",\n@@ -304,34 +296,35 @@ index ebc232237c..1ee74144de 100644\n } else {\n asmflags += [\n \"-target\",\n-- \"x86_64-apple-macos10.15\",\n+- \"x86_64-apple-macos11\",\n + \"x86_64-apple-macos$min_macos_version\",\n ]\n cflags += [\n \"-target\",\n-- \"x86_64-apple-macos10.15\",\n+- \"x86_64-apple-macos11\",\n + \"x86_64-apple-macos$min_macos_version\",\n ]\n ldflags += [\n \"-target\",\n-- \"x86_64-apple-macos10.15\",\n+- \"x86_64-apple-macos11\",\n + \"x86_64-apple-macos$min_macos_version\",\n ]\n }\n }\n \n- if (is_wasm) {\n+- if (is_canvaskit) {\n++ if (is_wasm) {\n + defines += [ \"SK_BUILD_FOR_WASM\" ]\n cflags += [ \"--sysroot=$skia_emsdk_dir/upstream/emscripten/cache/sysroot\" ]\n ldflags += [ \"--sysroot=$skia_emsdk_dir/upstream/emscripten/cache/sysroot\" ]\n }\n-@@ -730,15 +845,24 @@ config(\"optimize\") {\n+@@ -708,15 +826,24 @@ config(\"optimize\") {\n } else {\n cflags = [ \"-O3\" ]\n }\n - if (is_mac || is_ios) {\n - ldflags += [ \"-dead_strip\" ]\n-- } else if (!is_wasm) {\n+- } else if (!is_canvaskit) {\n + if (!enable_bitcode) {\n cflags += [\n \"-fdata-sections\",\n@@ -351,4 +344,23 @@ index ebc232237c..1ee74144de 100644\n + ldflags += [ \"-O3\" ]\n + }\n }\n- }\n\\ No newline at end of file\n+ }\n+ \n+@@ -776,9 +903,16 @@ if (is_wasm) {\n+ }\n+ } else {\n+ config(\"wasm\") {\n++ # mono/skia: upstream (standalone-wasm commit e979274a45) adds\n++ # `-pthread` unconditionally here. That enables the wasm `atomics`\n++ # target feature and makes `__atomic_*` builtins lower to real\n++ # `i32.atomic.*` instructions, which later break the single-threaded\n++ # Blazor/dotnet wasm-opt pass (it runs without `--enable-threads`).\n++ # SkiaSharp's build.cake opts `-pthread` in via `extra_cflags_cc`\n++ # only for the `mt` variant, so we drop it from the default config\n++ # here and let build.cake control per-variant threading.\n+ common = [\n+ \"--sysroot=$skia_emsdk_dir/upstream/emscripten/cache/sysroot\",\n+- \"-pthread\",\n+ ]\n+ cflags = common\n+ ldflags = common\n\\ No newline at end of file", "summary": "Upstream changes: (1) Removes all Fuchsia SDK imports and sysroot configuration. (2) Bumps C++ from c++17 to c++20, removes use_PIC/visibility_hidden args (now hardcoded). (3) Changes macOS minimum version targets from hardcoded 10.15 to variable min_macos_version. (4) Adds wasm config block with Emscripten sysroot, memory/stack settings, ES6 module export, and WebGL2 defaults. Fork patch: (1) Adds Tizen c++2a workaround for clang-10. (2) Carries forward all SkiaSharp platform-specific config (Tizen toolchain, WinRT, watchOS/tvOS/macCatalyst, NDK paths, bitcode). (3) In wasm config, removes upstream's unconditional -pthread flag — SkiaSharp controls per-variant threading via build.cake extra_cflags_cc. (4) Adds Android SDK/NDK path resolution, Tizen rootstrap config, and macOS/iOS min version variables.", "relatedFiles": [{"path": "gn/BUILDCONFIG.gn", "relationship": "related"}, {"path": "gn/toolchain/BUILD.gn", "relationship": "related"}]}, {"path": "gn/toolchain/BUILD.gn", "diff": "diff --git a/gn/toolchain/BUILD.gn b/gn/toolchain/BUILD.gn\nindex e6808f826b..f9e4b1f59d 100644\n--- a/gn/toolchain/BUILD.gn\n+++ b/gn/toolchain/BUILD.gn\n@@ -1,9 +1,6 @@\n if (is_wasm) {\n import(\"wasm.gni\")\n }\n-if (is_fuchsia) {\n- import(\"//build/fuchsia/sdk.gni\")\n-}\n \n declare_args() {\n host_ar = ar\n@@ -32,13 +29,6 @@ declare_args() {\n target_cc = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang\"\n target_cxx = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang++\"\n }\n- } else if (is_fuchsia && using_fuchsia_sdk) {\n- target_ar = rebase_path(\"$fuchsia_toolchain_path/bin/llvm-ar\")\n- target_cc = rebase_path(\"$fuchsia_toolchain_path/bin/clang\")\n- target_cxx = rebase_path(\"$fuchsia_toolchain_path/bin/clang++\")\n- cflags = \"--sysroot=\" +\n- rebase_path(\"$fuchsia_toolchain_path/$target_cpu/sysroot\")\n- link = rebase_path(\"$fuchsia_toolchain_path/bin/ld.lld\")\n } else {\n target_ar = ar\n target_cc = cc\n@@ -321,7 +311,11 @@ template(\"gcc_like_toolchain\") {\n \n outputs =\n [ \"{{root_out_dir}}/{{target_output_name}}{{output_extension}}\" ]\n- default_output_extension = \".a\"\n+ if (is_wasm && !is_canvaskit) {\n+ default_output_extension = \".a.wasm\"\n+ } else {\n+ default_output_extension = \".a\"\n+ }\n output_prefix = \"lib\"\n description = \"link {{output}}\"\n if (0 <= link_pool_depth) {\n@@ -351,7 +345,7 @@ template(\"gcc_like_toolchain\") {\n # LLD doesn't need these flags, but accepts and ignores them.\n _start_group = \"-Wl,--start-group\"\n _end_group = \"-Wl,--end-group\"\n- if (is_mac || is_ios || is_fuchsia) {\n+ if (is_mac || is_ios) {\n _start_group = \"\"\n _end_group = \"\"\n }\n@@ -361,6 +355,8 @@ template(\"gcc_like_toolchain\") {\n output_prefix = \"lib\"\n if (is_mac || is_ios) {\n default_output_extension = \".dylib\"\n+ } else if (is_wasm && !is_canvaskit) {\n+ default_output_extension = \".so.wasm\"\n } else {\n default_output_extension = \".so\"\n }\n@@ -383,7 +379,7 @@ template(\"gcc_like_toolchain\") {\n # LLD doesn't need these flags, but accepts and ignores them.\n _start_group = \"-Wl,--start-group\"\n _end_group = \"-Wl,--end-group\"\n- if (is_mac || is_ios || is_fuchsia) {\n+ if (is_mac || is_ios) {\n _start_group = \"\"\n _end_group = \"\"\n }\n@@ -394,6 +390,12 @@ template(\"gcc_like_toolchain\") {\n if (0 <= link_pool_depth) {\n pool = \":link_pool($default_toolchain)\"\n }\n+\n+ if (is_wasm && !is_canvaskit) {\n+ # Executables for wasm are run via Emscripten JS hooks. Those hooks will\n+ # only be generated when the output extension is .js.\n+ default_output_extension = \".js\"\n+ }\n }\n \n tool(\"stamp\") {", "oldDiff": "diff --git a/gn/toolchain/BUILD.gn b/gn/toolchain/BUILD.gn\nindex 4d4abc952f..e6808f826b 100644\n--- a/gn/toolchain/BUILD.gn\n+++ b/gn/toolchain/BUILD.gn\n@@ -22,6 +22,16 @@ declare_args() {\n target_cc = \"$_prefix/$ndk_target$ndk_api-clang\"\n target_cxx = \"$_prefix/$ndk_target$ndk_api-clang++\"\n }\n+ } else if (is_tizen) {\n+ if (host_os == \"win\") {\n+ target_ar = \"$ncli/tools/$ncli_gccdir/$ncli_target/bin/ar.exe\"\n+ target_cc = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang.exe\"\n+ target_cxx = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang++.exe\"\n+ } else {\n+ target_ar = \"$ncli/tools/$ncli_gccdir/$ncli_target/bin/ar\"\n+ target_cc = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang\"\n+ target_cxx = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang++\"\n+ }\n } else if (is_fuchsia && using_fuchsia_sdk) {\n target_ar = rebase_path(\"$fuchsia_toolchain_path/bin/llvm-ar\")\n target_cc = rebase_path(\"$fuchsia_toolchain_path/bin/clang\")\n@@ -79,183 +89,166 @@ if (current_toolchain == default_toolchain) {\n }\n }\n \n-template(\"msvc_toolchain\") {\n- toolchain(target_name) {\n- toolchain_target_cpu = invoker.cpu\n- lib_switch = \"\"\n- lib_dir_switch = \"/LIBPATH:\"\n-\n- bin = \"$win_vc/Tools/MSVC/$win_toolchain_version/bin/HostX64/$toolchain_target_cpu\"\n-\n- env_setup = \"\"\n- if (toolchain_target_cpu == \"x86\") {\n- # Toolchain asset includes a script that configures for x86 building.\n- # We don't support x86 builds with local MSVC installations.\n- env_setup = \"$shell $win_sdk/bin/SetEnv.cmd /x86 && \"\n- } else if (toolchain_target_cpu == \"arm64\") {\n- # ARM64 compiler is incomplete - it relies on DLLs located in the host toolchain directory.\n- env_setup = \"$shell set \\\"PATH=%PATH%;$win_vc\\\\Tools\\\\MSVC\\\\$win_toolchain_version\\\\bin\\\\HostX64\\\\x64\\\" && \"\n- }\n-\n- cl_m32_flag = \"\"\n-\n- if (clang_win != \"\") {\n- if (toolchain_target_cpu == \"x86\") {\n- # cl.exe knows implicitly by the choice of executable that it's targeting\n- # x86, but clang-cl.exe needs to be told when targeting non-host\n- # platforms. (All our builders are x86-64, so x86 is always non-host.)\n- cl_m32_flag = \"-m32\"\n- }\n- if (host_os == \"win\") {\n- cl = \"\\\"$clang_win/bin/clang-cl.exe\\\"\"\n- lib = \"\\\"$clang_win/bin/lld-link.exe\\\" /lib\"\n- link = \"\\\"$clang_win/bin/lld-link.exe\\\"\"\n- } else {\n- cl = \"\\\"$clang_win/bin/clang-cl\\\"\"\n- lib = \"\\\"$clang_win/bin/lld-link\\\" /lib\"\n- link = \"\\\"$clang_win/bin/lld-link\\\"\"\n- }\n- } else {\n- cl = \"\\\"$bin/cl.exe\\\"\"\n- lib = \"\\\"$bin/lib.exe\\\"\"\n- link = \"\\\"$bin/link.exe\\\"\"\n- }\n+toolchain(\"msvc\") {\n+ lib_switch = \"\"\n+ lib_dir_switch = \"/LIBPATH:\"\n \n- tool(\"asm\") {\n- _ml = \"ml\"\n- if (toolchain_target_cpu == \"x64\") {\n- _ml += \"64\"\n- }\n- command = \"$env_setup \\\"$bin/$_ml.exe\\\" {{asmflags}} /nologo /c /Fo {{output}} {{source}}\"\n- outputs = [\n- \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\",\n- ]\n- description = \"assemble {{source}}\"\n- }\n+ bin = \"$win_vc/Tools/MSVC/$win_toolchain_version/bin/HostX64/$target_cpu\"\n \n- tool(\"cc\") {\n- precompiled_header_type = \"msvc\"\n- pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n-\n- # Label names may have spaces so pdbname must be quoted.\n- command = \"$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n- depsformat = \"msvc\"\n- outputs = [\n- \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\",\n- ]\n- description = \"compile {{source}}\"\n+ if (target_cpu == \"x64\") {\n+ _target = \"amd64\"\n+ } else {\n+ _target = \"amd64_\" + target_cpu\n+ }\n+ if (is_winrt) {\n+ _target += \" uwp\"\n+ }\n+ _target += \" \" + win_sdk_version + \" -vcvars_ver=\" + win_vcvars_version\n+ _vcvarsall = \"$win_vc/Auxiliary/Build/vcvarsall.bat\"\n+ env_setup = \"cmd /c set __VSCMD_ARG_NO_LOGO=1 && set VSCMD_START_DIR=%CD% && \\\"$_vcvarsall\\\" $_target && \"\n+\n+ cl_m32_flag = \"\"\n+\n+ if (clang_win != \"\") {\n+ if (target_cpu == \"x86\") {\n+ # cl.exe knows implicitly by the choice of executable that it's targeting\n+ # x86, but clang-cl.exe needs to be told when targeting non-host\n+ # platforms. (All our builders are x86-64, so x86 is always non-host.)\n+ cl_m32_flag = \"-m32\"\n }\n-\n- tool(\"cxx\") {\n- precompiled_header_type = \"msvc\"\n- pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n-\n- # Label names may have spaces so pdbname must be quoted.\n- command = \"$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n- depsformat = \"msvc\"\n- outputs = [\n- \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\",\n- ]\n- description = \"compile {{source}}\"\n+ if (host_os == \"win\") {\n+ cl = \"\\\"$clang_win/bin/clang-cl.exe\\\"\"\n+ lib = \"\\\"$clang_win/bin/lld-link.exe\\\" /lib\"\n+ link = \"\\\"$clang_win/bin/lld-link.exe\\\"\"\n+ } else {\n+ cl = \"\\\"$clang_win/bin/clang-cl\\\"\"\n+ lib = \"\\\"$clang_win/bin/lld-link\\\" /lib\"\n+ link = \"\\\"$clang_win/bin/lld-link\\\"\"\n }\n+ } else {\n+ cl = \"\\\"$bin/cl.exe\\\"\"\n+ lib = \"\\\"$bin/lib.exe\\\"\"\n+ link = \"\\\"$bin/link.exe\\\"\"\n+ }\n \n- tool(\"alink\") {\n- rspfile = \"{{output}}.rsp\"\n-\n- command = \"$env_setup $lib /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile\"\n- outputs = [\n- # Ignore {{output_extension}} and always use .lib, there's no reason to\n- # allow targets to override this extension on Windows.\n- \"{{root_out_dir}}/{{target_output_name}}{{output_extension}}\",\n- ]\n- default_output_extension = \".lib\"\n- default_output_dir = \"{{target_out_dir}}\"\n-\n- # inputs_newline works around a fixed per-line buffer size in the linker.\n- rspfile_content = \"{{inputs_newline}}\"\n- description = \"link {{output}}\"\n- if (0 <= link_pool_depth) {\n- pool = \":link_pool($default_toolchain)\"\n- }\n+ tool(\"asm\") {\n+ _ml = \"ml\"\n+ if (target_cpu == \"x64\") {\n+ _ml += \"64\"\n }\n+ command = \"$env_setup \\\"$bin/$_ml.exe\\\" {{asmflags}} /nologo /c /Fo {{output}} {{source}}\"\n+ outputs =\n+ [ \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\" ]\n+ description = \"assemble {{source}}\"\n+ }\n \n- tool(\"solink\") {\n- dllname = \"{{output_dir}}/{{target_output_name}}{{output_extension}}\"\n- libname = \"${dllname}.lib\"\n- pdbname = \"${dllname}.pdb\"\n- rspfile = \"${dllname}.rsp\"\n-\n- command = \"$env_setup $link /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile\"\n- outputs = [\n- dllname,\n- libname,\n- pdbname,\n- ]\n- default_output_extension = \".dll\"\n- default_output_dir = \"{{root_out_dir}}\"\n-\n- link_output = libname\n- depend_output = libname\n- runtime_outputs = [\n- dllname,\n- pdbname,\n- ]\n-\n- # I don't quite understand this. Aping Chrome's toolchain/win/BUILD.gn.\n- restat = true\n-\n- # inputs_newline works around a fixed per-line buffer size in the linker.\n- rspfile_content = \"{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}\"\n- description = \"link {{output}}\"\n- if (0 <= link_pool_depth) {\n- pool = \":link_pool($default_toolchain)\"\n- }\n- }\n+ tool(\"cc\") {\n+ precompiled_header_type = \"msvc\"\n+ pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n \n- tool(\"link\") {\n- exename = \"{{root_out_dir}}/{{target_output_name}}{{output_extension}}\"\n- pdbname = \"$exename.pdb\"\n- rspfile = \"$exename.rsp\"\n+ # Label names may have spaces so pdbname must be quoted.\n+ command = \"$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n+ depsformat = \"msvc\"\n+ outputs =\n+ [ \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\" ]\n+ description = \"compile {{source}}\"\n+ }\n \n- command = \"$env_setup $link /nologo /OUT:$exename /PDB:$pdbname @$rspfile\"\n- default_output_extension = \".exe\"\n- default_output_dir = \"{{root_out_dir}}\"\n- outputs = [ exename ]\n+ tool(\"cxx\") {\n+ precompiled_header_type = \"msvc\"\n+ pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n \n- # inputs_newline works around a fixed per-line buffer size in the linker.\n- rspfile_content = \"{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}\"\n- description = \"link {{output}}\"\n- if (0 <= link_pool_depth) {\n- pool = \":link_pool($default_toolchain)\"\n- }\n- }\n+ # Label names may have spaces so pdbname must be quoted.\n+ command = \"$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n+ depsformat = \"msvc\"\n+ outputs =\n+ [ \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\" ]\n+ description = \"compile {{source}}\"\n+ }\n \n- tool(\"stamp\") {\n- command = \"$stamp {{output}}\"\n- description = \"stamp {{output}}\"\n+ tool(\"alink\") {\n+ rspfile = \"{{output}}.rsp\"\n+\n+ command = \"$env_setup $lib /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile\"\n+ outputs = [\n+ # Ignore {{output_extension}} and always use .lib, there's no reason to\n+ # allow targets to override this extension on Windows.\n+ \"{{root_out_dir}}/{{target_output_name}}{{output_extension}}\",\n+ ]\n+ default_output_extension = \".lib\"\n+ default_output_dir = \"{{target_out_dir}}\"\n+\n+ # inputs_newline works around a fixed per-line buffer size in the linker.\n+ rspfile_content = \"{{inputs_newline}}\"\n+ description = \"link {{output}}\"\n+ if (0 <= link_pool_depth) {\n+ pool = \":link_pool($default_toolchain)\"\n }\n+ }\n \n- tool(\"copy\") {\n- cp_py = rebase_path(\"../cp.py\")\n- command = \"$shell python3 \\\"$cp_py\\\" {{source}} {{output}}\"\n- description = \"copy {{source}} {{output}}\"\n+ tool(\"solink\") {\n+ output_prefix = \"lib\"\n+ dllname_no_ext = \"{{output_dir}}/{{target_output_name}}\"\n+ dllname = \"${dllname_no_ext}{{output_extension}}\"\n+ libname = \"${dllname_no_ext}.lib\"\n+ pdbname = \"${dllname_no_ext}.pdb\"\n+ rspfile = \"${dllname_no_ext}.rsp\"\n+\n+ command = \"$env_setup $link /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile\"\n+ outputs = [\n+ dllname,\n+ libname,\n+ pdbname,\n+ ]\n+ default_output_extension = \".dll\"\n+ default_output_dir = \"{{root_out_dir}}\"\n+\n+ link_output = libname\n+ depend_output = libname\n+ runtime_outputs = [\n+ dllname,\n+ pdbname,\n+ ]\n+\n+ # I don't quite understand this. Aping Chrome's toolchain/win/BUILD.gn.\n+ restat = true\n+\n+ # inputs_newline works around a fixed per-line buffer size in the linker.\n+ rspfile_content = \"{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}\"\n+ description = \"link {{output}}\"\n+ if (0 <= link_pool_depth) {\n+ pool = \":link_pool($default_toolchain)\"\n }\n+ }\n \n- toolchain_args = {\n- current_cpu = invoker.cpu\n- current_os = invoker.os\n+ tool(\"link\") {\n+ exename = \"{{root_out_dir}}/{{target_output_name}}{{output_extension}}\"\n+ pdbname = \"$exename.pdb\"\n+ rspfile = \"$exename.rsp\"\n+\n+ command = \"$env_setup $link /nologo /OUT:$exename /PDB:$pdbname @$rspfile\"\n+ default_output_extension = \".exe\"\n+ default_output_dir = \"{{root_out_dir}}\"\n+ outputs = [ exename ]\n+\n+ # inputs_newline works around a fixed per-line buffer size in the linker.\n+ rspfile_content = \"{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}\"\n+ description = \"link {{output}}\"\n+ if (0 <= link_pool_depth) {\n+ pool = \":link_pool($default_toolchain)\"\n }\n }\n-}\n \n-msvc_toolchain(\"msvc\") {\n- cpu = current_cpu\n- os = current_os\n-}\n+ tool(\"stamp\") {\n+ command = \"$stamp {{output}}\"\n+ description = \"stamp {{output}}\"\n+ }\n \n-msvc_toolchain(\"msvc_host\") {\n- cpu = host_cpu\n- os = host_os\n+ tool(\"copy\") {\n+ cp_py = rebase_path(\"../cp.py\")\n+ command = \"$shell python3 \\\"$cp_py\\\" {{source}} {{output}}\"\n+ description = \"copy {{source}} {{output}}\"\n+ }\n }\n \n template(\"gcc_like_toolchain\") {\n@@ -338,6 +331,9 @@ template(\"gcc_like_toolchain\") {\n \n tool(\"solink\") {\n soname = \"{{target_output_name}}{{output_extension}}\"\n+ if (is_linux && linux_soname_version != \"\") {\n+ soname += \".$linux_soname_version\"\n+ }\n \n rpath = \"-Wl,-soname,$soname\"\n if (is_mac || is_ios) {", "newDiff": "diff --git a/gn/toolchain/BUILD.gn b/gn/toolchain/BUILD.gn\nindex df0bf78f55..f9e4b1f59d 100644\n--- a/gn/toolchain/BUILD.gn\n+++ b/gn/toolchain/BUILD.gn\n@@ -19,6 +19,16 @@ declare_args() {\n target_cc = \"$_prefix/$ndk_target$ndk_api-clang\"\n target_cxx = \"$_prefix/$ndk_target$ndk_api-clang++\"\n }\n+ } else if (is_tizen) {\n+ if (host_os == \"win\") {\n+ target_ar = \"$ncli/tools/$ncli_gccdir/$ncli_target/bin/ar.exe\"\n+ target_cc = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang.exe\"\n+ target_cxx = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang++.exe\"\n+ } else {\n+ target_ar = \"$ncli/tools/$ncli_gccdir/$ncli_target/bin/ar\"\n+ target_cc = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang\"\n+ target_cxx = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang++\"\n+ }\n } else {\n target_ar = ar\n target_cc = cc\n@@ -69,175 +79,166 @@ if (current_toolchain == default_toolchain) {\n }\n }\n \n-template(\"msvc_toolchain\") {\n- toolchain(target_name) {\n- toolchain_target_cpu = invoker.cpu\n- lib_switch = \"\"\n- lib_dir_switch = \"/LIBPATH:\"\n-\n- bin = \"$win_vc/Tools/MSVC/$win_toolchain_version/bin/HostX64/$toolchain_target_cpu\"\n-\n- cl_m32_flag = \"\"\n-\n- if (clang_win != \"\") {\n- if (toolchain_target_cpu == \"x86\") {\n- # cl.exe knows implicitly by the choice of executable that it's targeting\n- # x86, but clang-cl.exe needs to be told when targeting non-host\n- # platforms. (All our builders are x86-64, so x86 is always non-host.)\n- cl_m32_flag = \"-m32\"\n- }\n- if (host_os == \"win\") {\n- cl = \"\\\"$clang_win/bin/clang-cl.exe\\\"\"\n- lib = \"\\\"$clang_win/bin/lld-link.exe\\\" /lib\"\n- link = \"\\\"$clang_win/bin/lld-link.exe\\\"\"\n- } else {\n- cl = \"\\\"$clang_win/bin/clang-cl\\\"\"\n- lib = \"\\\"$clang_win/bin/lld-link\\\" /lib\"\n- link = \"\\\"$clang_win/bin/lld-link\\\"\"\n- }\n- } else {\n- cl = \"\\\"$bin/cl.exe\\\"\"\n- lib = \"\\\"$bin/lib.exe\\\"\"\n- link = \"\\\"$bin/link.exe\\\"\"\n- }\n+toolchain(\"msvc\") {\n+ lib_switch = \"\"\n+ lib_dir_switch = \"/LIBPATH:\"\n \n- tool(\"asm\") {\n- _ml = \"ml\"\n- if (toolchain_target_cpu == \"x64\") {\n- _ml += \"64\"\n- }\n- command =\n- \"\\\"$bin/$_ml.exe\\\" {{asmflags}} /nologo /c /Fo {{output}} {{source}}\"\n- outputs = [\n- \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\",\n- ]\n- description = \"assemble {{source}}\"\n- }\n+ bin = \"$win_vc/Tools/MSVC/$win_toolchain_version/bin/HostX64/$target_cpu\"\n \n- tool(\"cc\") {\n- precompiled_header_type = \"msvc\"\n- pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n-\n- # Label names may have spaces so pdbname must be quoted.\n- command = \"$cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n- depsformat = \"msvc\"\n- outputs = [\n- \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\",\n- ]\n- description = \"compile {{source}}\"\n+ if (target_cpu == \"x64\") {\n+ _target = \"amd64\"\n+ } else {\n+ _target = \"amd64_\" + target_cpu\n+ }\n+ if (is_winrt) {\n+ _target += \" uwp\"\n+ }\n+ _target += \" \" + win_sdk_version + \" -vcvars_ver=\" + win_vcvars_version\n+ _vcvarsall = \"$win_vc/Auxiliary/Build/vcvarsall.bat\"\n+ env_setup = \"cmd /c set __VSCMD_ARG_NO_LOGO=1 && set VSCMD_START_DIR=%CD% && \\\"$_vcvarsall\\\" $_target && \"\n+\n+ cl_m32_flag = \"\"\n+\n+ if (clang_win != \"\") {\n+ if (target_cpu == \"x86\") {\n+ # cl.exe knows implicitly by the choice of executable that it's targeting\n+ # x86, but clang-cl.exe needs to be told when targeting non-host\n+ # platforms. (All our builders are x86-64, so x86 is always non-host.)\n+ cl_m32_flag = \"-m32\"\n }\n-\n- tool(\"cxx\") {\n- precompiled_header_type = \"msvc\"\n- pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n-\n- # Label names may have spaces so pdbname must be quoted.\n- command = \"$cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n- depsformat = \"msvc\"\n- outputs = [\n- \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\",\n- ]\n- description = \"compile {{source}}\"\n+ if (host_os == \"win\") {\n+ cl = \"\\\"$clang_win/bin/clang-cl.exe\\\"\"\n+ lib = \"\\\"$clang_win/bin/lld-link.exe\\\" /lib\"\n+ link = \"\\\"$clang_win/bin/lld-link.exe\\\"\"\n+ } else {\n+ cl = \"\\\"$clang_win/bin/clang-cl\\\"\"\n+ lib = \"\\\"$clang_win/bin/lld-link\\\" /lib\"\n+ link = \"\\\"$clang_win/bin/lld-link\\\"\"\n }\n+ } else {\n+ cl = \"\\\"$bin/cl.exe\\\"\"\n+ lib = \"\\\"$bin/lib.exe\\\"\"\n+ link = \"\\\"$bin/link.exe\\\"\"\n+ }\n \n- tool(\"alink\") {\n- rspfile = \"{{output}}.rsp\"\n-\n- command =\n- \"$lib /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile\"\n- outputs = [\n- # Ignore {{output_extension}} and always use .lib, there's no reason to\n- # allow targets to override this extension on Windows.\n- \"{{root_out_dir}}/{{target_output_name}}{{output_extension}}\",\n- ]\n- default_output_extension = \".lib\"\n- default_output_dir = \"{{target_out_dir}}\"\n-\n- # inputs_newline works around a fixed per-line buffer size in the linker.\n- rspfile_content = \"{{inputs_newline}}\"\n- description = \"link {{output}}\"\n- if (0 <= link_pool_depth) {\n- pool = \":link_pool($default_toolchain)\"\n- }\n+ tool(\"asm\") {\n+ _ml = \"ml\"\n+ if (target_cpu == \"x64\") {\n+ _ml += \"64\"\n }\n+ command = \"$env_setup \\\"$bin/$_ml.exe\\\" {{asmflags}} /nologo /c /Fo {{output}} {{source}}\"\n+ outputs =\n+ [ \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\" ]\n+ description = \"assemble {{source}}\"\n+ }\n \n- tool(\"solink\") {\n- dllname = \"{{output_dir}}/{{target_output_name}}{{output_extension}}\"\n- libname = \"${dllname}.lib\"\n- pdbname = \"${dllname}.pdb\"\n- rspfile = \"${dllname}.rsp\"\n-\n- command = \"$link /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile\"\n- outputs = [\n- dllname,\n- libname,\n- pdbname,\n- ]\n- default_output_extension = \".dll\"\n- default_output_dir = \"{{root_out_dir}}\"\n-\n- link_output = libname\n- depend_output = libname\n- runtime_outputs = [\n- dllname,\n- pdbname,\n- ]\n-\n- # I don't quite understand this. Aping Chrome's toolchain/win/BUILD.gn.\n- restat = true\n-\n- # inputs_newline works around a fixed per-line buffer size in the linker.\n- rspfile_content = \"{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}\"\n- description = \"link {{output}}\"\n- if (0 <= link_pool_depth) {\n- pool = \":link_pool($default_toolchain)\"\n- }\n- }\n+ tool(\"cc\") {\n+ precompiled_header_type = \"msvc\"\n+ pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n \n- tool(\"link\") {\n- exename = \"{{root_out_dir}}/{{target_output_name}}{{output_extension}}\"\n- pdbname = \"$exename.pdb\"\n- rspfile = \"$exename.rsp\"\n+ # Label names may have spaces so pdbname must be quoted.\n+ command = \"$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n+ depsformat = \"msvc\"\n+ outputs =\n+ [ \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\" ]\n+ description = \"compile {{source}}\"\n+ }\n \n- command = \"$link /nologo /OUT:$exename /PDB:$pdbname @$rspfile\"\n- default_output_extension = \".exe\"\n- default_output_dir = \"{{root_out_dir}}\"\n- outputs = [ exename ]\n+ tool(\"cxx\") {\n+ precompiled_header_type = \"msvc\"\n+ pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n \n- # inputs_newline works around a fixed per-line buffer size in the linker.\n- rspfile_content = \"{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}\"\n- description = \"link {{output}}\"\n- if (0 <= link_pool_depth) {\n- pool = \":link_pool($default_toolchain)\"\n- }\n- }\n+ # Label names may have spaces so pdbname must be quoted.\n+ command = \"$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n+ depsformat = \"msvc\"\n+ outputs =\n+ [ \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\" ]\n+ description = \"compile {{source}}\"\n+ }\n \n- tool(\"stamp\") {\n- command = \"$stamp {{output}}\"\n- description = \"stamp {{output}}\"\n+ tool(\"alink\") {\n+ rspfile = \"{{output}}.rsp\"\n+\n+ command = \"$env_setup $lib /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile\"\n+ outputs = [\n+ # Ignore {{output_extension}} and always use .lib, there's no reason to\n+ # allow targets to override this extension on Windows.\n+ \"{{root_out_dir}}/{{target_output_name}}{{output_extension}}\",\n+ ]\n+ default_output_extension = \".lib\"\n+ default_output_dir = \"{{target_out_dir}}\"\n+\n+ # inputs_newline works around a fixed per-line buffer size in the linker.\n+ rspfile_content = \"{{inputs_newline}}\"\n+ description = \"link {{output}}\"\n+ if (0 <= link_pool_depth) {\n+ pool = \":link_pool($default_toolchain)\"\n }\n+ }\n \n- tool(\"copy\") {\n- cp_py = rebase_path(\"../cp.py\")\n- command = \"$shell python3 \\\"$cp_py\\\" {{source}} {{output}}\"\n- description = \"copy {{source}} {{output}}\"\n+ tool(\"solink\") {\n+ output_prefix = \"lib\"\n+ dllname_no_ext = \"{{output_dir}}/{{target_output_name}}\"\n+ dllname = \"${dllname_no_ext}{{output_extension}}\"\n+ libname = \"${dllname_no_ext}.lib\"\n+ pdbname = \"${dllname_no_ext}.pdb\"\n+ rspfile = \"${dllname_no_ext}.rsp\"\n+\n+ command = \"$env_setup $link /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile\"\n+ outputs = [\n+ dllname,\n+ libname,\n+ pdbname,\n+ ]\n+ default_output_extension = \".dll\"\n+ default_output_dir = \"{{root_out_dir}}\"\n+\n+ link_output = libname\n+ depend_output = libname\n+ runtime_outputs = [\n+ dllname,\n+ pdbname,\n+ ]\n+\n+ # I don't quite understand this. Aping Chrome's toolchain/win/BUILD.gn.\n+ restat = true\n+\n+ # inputs_newline works around a fixed per-line buffer size in the linker.\n+ rspfile_content = \"{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}\"\n+ description = \"link {{output}}\"\n+ if (0 <= link_pool_depth) {\n+ pool = \":link_pool($default_toolchain)\"\n }\n+ }\n \n- toolchain_args = {\n- current_cpu = invoker.cpu\n- current_os = invoker.os\n+ tool(\"link\") {\n+ exename = \"{{root_out_dir}}/{{target_output_name}}{{output_extension}}\"\n+ pdbname = \"$exename.pdb\"\n+ rspfile = \"$exename.rsp\"\n+\n+ command = \"$env_setup $link /nologo /OUT:$exename /PDB:$pdbname @$rspfile\"\n+ default_output_extension = \".exe\"\n+ default_output_dir = \"{{root_out_dir}}\"\n+ outputs = [ exename ]\n+\n+ # inputs_newline works around a fixed per-line buffer size in the linker.\n+ rspfile_content = \"{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}\"\n+ description = \"link {{output}}\"\n+ if (0 <= link_pool_depth) {\n+ pool = \":link_pool($default_toolchain)\"\n }\n }\n-}\n \n-msvc_toolchain(\"msvc\") {\n- cpu = current_cpu\n- os = current_os\n-}\n+ tool(\"stamp\") {\n+ command = \"$stamp {{output}}\"\n+ description = \"stamp {{output}}\"\n+ }\n \n-msvc_toolchain(\"msvc_host\") {\n- cpu = host_cpu\n- os = host_os\n+ tool(\"copy\") {\n+ cp_py = rebase_path(\"../cp.py\")\n+ command = \"$shell python3 \\\"$cp_py\\\" {{source}} {{output}}\"\n+ description = \"copy {{source}} {{output}}\"\n+ }\n }\n \n template(\"gcc_like_toolchain\") {\n@@ -324,6 +325,9 @@ template(\"gcc_like_toolchain\") {\n \n tool(\"solink\") {\n soname = \"{{target_output_name}}{{output_extension}}\"\n+ if (is_linux && linux_soname_version != \"\") {\n+ soname += \".$linux_soname_version\"\n+ }\n \n rpath = \"-Wl,-soname,$soname\"\n if (is_mac || is_ios) {", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,8 +1,8 @@\n diff --git a/gn/toolchain/BUILD.gn b/gn/toolchain/BUILD.gn\n-index 4d4abc952f..e6808f826b 100644\n+index df0bf78f55..f9e4b1f59d 100644\n --- a/gn/toolchain/BUILD.gn\n +++ b/gn/toolchain/BUILD.gn\n-@@ -22,6 +22,16 @@ declare_args() {\n+@@ -19,6 +19,16 @@ declare_args() {\n target_cc = \"$_prefix/$ndk_target$ndk_api-clang\"\n target_cxx = \"$_prefix/$ndk_target$ndk_api-clang++\"\n }\n@@ -16,10 +16,10 @@ index 4d4abc952f..e6808f826b 100644\n + target_cc = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang\"\n + target_cxx = \"$ncli/tools/llvm-${ncli_llvm_version}/bin/clang++\"\n + }\n- } else if (is_fuchsia && using_fuchsia_sdk) {\n- target_ar = rebase_path(\"$fuchsia_toolchain_path/bin/llvm-ar\")\n- target_cc = rebase_path(\"$fuchsia_toolchain_path/bin/clang\")\n-@@ -79,183 +89,166 @@ if (current_toolchain == default_toolchain) {\n+ } else {\n+ target_ar = ar\n+ target_cc = cc\n+@@ -69,175 +79,166 @@ if (current_toolchain == default_toolchain) {\n }\n }\n \n@@ -31,16 +31,6 @@ index 4d4abc952f..e6808f826b 100644\n -\n - bin = \"$win_vc/Tools/MSVC/$win_toolchain_version/bin/HostX64/$toolchain_target_cpu\"\n -\n-- env_setup = \"\"\n-- if (toolchain_target_cpu == \"x86\") {\n-- # Toolchain asset includes a script that configures for x86 building.\n-- # We don't support x86 builds with local MSVC installations.\n-- env_setup = \"$shell $win_sdk/bin/SetEnv.cmd /x86 && \"\n-- } else if (toolchain_target_cpu == \"arm64\") {\n-- # ARM64 compiler is incomplete - it relies on DLLs located in the host toolchain directory.\n-- env_setup = \"$shell set \\\"PATH=%PATH%;$win_vc\\\\Tools\\\\MSVC\\\\$win_toolchain_version\\\\bin\\\\HostX64\\\\x64\\\" && \"\n-- }\n--\n - cl_m32_flag = \"\"\n -\n - if (clang_win != \"\") {\n@@ -73,7 +63,8 @@ index 4d4abc952f..e6808f826b 100644\n - if (toolchain_target_cpu == \"x64\") {\n - _ml += \"64\"\n - }\n-- command = \"$env_setup \\\"$bin/$_ml.exe\\\" {{asmflags}} /nologo /c /Fo {{output}} {{source}}\"\n+- command =\n+- \"\\\"$bin/$_ml.exe\\\" {{asmflags}} /nologo /c /Fo {{output}} {{source}}\"\n - outputs = [\n - \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\",\n - ]\n@@ -86,7 +77,7 @@ index 4d4abc952f..e6808f826b 100644\n - pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n -\n - # Label names may have spaces so pdbname must be quoted.\n-- command = \"$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n+- command = \"$cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n - depsformat = \"msvc\"\n - outputs = [\n - \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\",\n@@ -119,7 +110,7 @@ index 4d4abc952f..e6808f826b 100644\n - pdbname = \"{{target_out_dir}}/{{label_name}}_c.pdb\"\n -\n - # Label names may have spaces so pdbname must be quoted.\n-- command = \"$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n+- command = \"$cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\\\"$pdbname\\\"\"\n - depsformat = \"msvc\"\n - outputs = [\n - \"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj\",\n@@ -143,7 +134,8 @@ index 4d4abc952f..e6808f826b 100644\n - tool(\"alink\") {\n - rspfile = \"{{output}}.rsp\"\n -\n-- command = \"$env_setup $lib /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile\"\n+- command =\n+- \"$lib /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile\"\n - outputs = [\n - # Ignore {{output_extension}} and always use .lib, there's no reason to\n - # allow targets to override this extension on Windows.\n@@ -175,7 +167,7 @@ index 4d4abc952f..e6808f826b 100644\n - pdbname = \"${dllname}.pdb\"\n - rspfile = \"${dllname}.rsp\"\n -\n-- command = \"$env_setup $link /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile\"\n+- command = \"$link /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile\"\n - outputs = [\n - dllname,\n - libname,\n@@ -217,7 +209,7 @@ index 4d4abc952f..e6808f826b 100644\n + description = \"compile {{source}}\"\n + }\n \n-- command = \"$env_setup $link /nologo /OUT:$exename /PDB:$pdbname @$rspfile\"\n+- command = \"$link /nologo /OUT:$exename /PDB:$pdbname @$rspfile\"\n - default_output_extension = \".exe\"\n - default_output_dir = \"{{root_out_dir}}\"\n - outputs = [ exename ]\n@@ -344,7 +336,7 @@ index 4d4abc952f..e6808f826b 100644\n }\n \n template(\"gcc_like_toolchain\") {\n-@@ -338,6 +331,9 @@ template(\"gcc_like_toolchain\") {\n+@@ -324,6 +325,9 @@ template(\"gcc_like_toolchain\") {\n \n tool(\"solink\") {\n soname = \"{{target_output_name}}{{output_extension}}\"", "summary": "Upstream changes: (1) Removes Fuchsia SDK toolchain configuration. (2) Adds WASM-specific output extensions (.a.wasm for static libs, .so.wasm for shared libs, .js for executables). (3) Removes is_fuchsia from linker group flag exclusions. Fork patch carried forward: Tizen CLI toolchain support (ncli_llvm_version, target_ar/cc/cxx paths), MSVC toolchain rewrite with proper Windows SDK/VC path handling, soname support for shared libraries.", "relatedFiles": [{"path": "gn/BUILDCONFIG.gn", "relationship": "related"}, {"path": "gn/skia/BUILD.gn", "relationship": "related"}]}, {"path": "gn/utils.gni", "diff": "diff --git a/gn/utils.gni b/gn/utils.gni\nindex b0fbf12a9f..3911b1f53a 100644\n--- a/gn/utils.gni\n+++ b/gn/utils.gni\n@@ -50,8 +50,7 @@ skia_utils_chromium = [ \"$_include/docs/SkMultiPictureDocument.h\" ]\n # //src/utils:multi_picture_document\n # //src/utils:clip_stack_utils\n # //src/utils:float_to_decimal\n-# //src/utils:utils_skslc_hdrs\n-# //src/utils:utils_skslc_srcs\n+# //src/utils:shader_utils\n skia_utils_private = [\n \"$_src/utils/SkBitSet.h\",\n \"$_src/utils/SkCallableTraits.h\",\n@@ -120,9 +119,10 @@ skia_utils_private = [\n \"$_src/utils/win/SkTScopedComPtr.h\",\n ]\n \n-if (!is_winrt) {\n- skia_utils_private += [\n- \"$_src/utils/win/SkWGL_win.cpp\",\n- ]\n-}\n+# Generated by Bazel rule //src/utils:clip_stack_utils\n+skia_clipstack_utils_sources = [\n+ \"$_src/utils/SkClipStackUtils.cpp\",\n+ \"$_src/utils/SkClipStackUtils.h\",\n+]\n+", "oldDiff": "diff --git a/gn/utils.gni b/gn/utils.gni\nindex 080f89c98e..b0fbf12a9f 100644\n--- a/gn/utils.gni\n+++ b/gn/utils.gni\n@@ -118,5 +118,11 @@ skia_utils_private = [\n \"$_src/utils/win/SkIStream.h\",\n \"$_src/utils/win/SkObjBase.h\",\n \"$_src/utils/win/SkTScopedComPtr.h\",\n- \"$_src/utils/win/SkWGL_win.cpp\",\n ]\n+\n+if (!is_winrt) {\n+ skia_utils_private += [\n+ \"$_src/utils/win/SkWGL_win.cpp\",\n+ ]\n+}\n+", "newDiff": "diff --git a/gn/utils.gni b/gn/utils.gni\nindex 99f8ed49b4..3911b1f53a 100644\n--- a/gn/utils.gni\n+++ b/gn/utils.gni\n@@ -124,3 +124,5 @@ skia_clipstack_utils_sources = [\n \"$_src/utils/SkClipStackUtils.cpp\",\n \"$_src/utils/SkClipStackUtils.h\",\n ]\n+\n+", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,17 +1,10 @@\n diff --git a/gn/utils.gni b/gn/utils.gni\n-index 080f89c98e..b0fbf12a9f 100644\n+index 99f8ed49b4..3911b1f53a 100644\n --- a/gn/utils.gni\n +++ b/gn/utils.gni\n-@@ -118,5 +118,11 @@ skia_utils_private = [\n- \"$_src/utils/win/SkIStream.h\",\n- \"$_src/utils/win/SkObjBase.h\",\n- \"$_src/utils/win/SkTScopedComPtr.h\",\n-- \"$_src/utils/win/SkWGL_win.cpp\",\n+@@ -124,3 +124,5 @@ skia_clipstack_utils_sources = [\n+ \"$_src/utils/SkClipStackUtils.cpp\",\n+ \"$_src/utils/SkClipStackUtils.h\",\n ]\n +\n-+if (!is_winrt) {\n-+ skia_utils_private += [\n-+ \"$_src/utils/win/SkWGL_win.cpp\",\n-+ ]\n-+}\n +\n\\ No newline at end of file", "summary": "Upstream changes: (1) Renames comment references from 'utils_skslc_hdrs/srcs' to 'shader_utils'. (2) Extracts SkClipStackUtils into a separate skia_clipstack_utils_sources list. (3) Removes SkWGL_win.cpp from the unconditional source list (it moved to tools/ganesh/gl/win/). The old fork patch (conditional WinRT exclusion of SkWGL_win.cpp) is no longer needed since the file was removed from this list entirely. The new fork patch is minimal (trailing whitespace only).", "relatedFiles": [{"path": "tools/ganesh/gl/win/SkWGL_win.cpp", "relationship": "related"}]}, {"path": "third_party/freetype2/BUILD.gn", "diff": "diff --git a/third_party/freetype2/BUILD.gn b/third_party/freetype2/BUILD.gn\nindex e89cd64b87..f11292ad43 100644\n--- a/third_party/freetype2/BUILD.gn\n+++ b/third_party/freetype2/BUILD.gn\n@@ -3,17 +3,18 @@\n # Use of this source code is governed by a BSD-style license that can be\n # found in the LICENSE file.\n \n+import(\"../../gn/skia.gni\")\n import(\"../zlib/zlib.gni\")\n \n declare_args() {\n # TODO: build from source all the time for testing?\n skia_use_system_freetype2 =\n (is_official_build || !(is_android || sanitize == \"MSAN\")) &&\n- !is_fuchsia && !is_wasm\n+ !is_canvaskit\n skia_system_freetype2_include_path = \"/usr/include/freetype2\"\n skia_system_freetype2_lib = \"freetype\"\n \n- skia_use_freetype_woff2 = is_wasm\n+ skia_use_freetype_woff2 = is_canvaskit\n skia_use_freetype_svg = true\n skia_use_freetype_zlib = true\n skia_use_freetype_zlib_bundled = !skia_use_system_zlib\n@@ -23,10 +24,18 @@ import(\"../third_party.gni\")\n \n if (skia_use_system_freetype2) {\n system(\"freetype2\") {\n- include_dirs = [ skia_system_freetype2_include_path ]\n libs = [ skia_system_freetype2_lib ]\n if (is_tizen) {\n+ # mono/skia: emit only the sysroot-relative include path on Tizen so\n+ # the cross-compile picks up the rootstrap's freetype headers, not\n+ # whatever happens to be in the build host's /usr/include/freetype2.\n+ # (Upstream's bare include_dirs= line is host-absolute and shadows\n+ # the cflags `-I=` form; we drop it for is_tizen to avoid the\n+ # version-skew that causes COLRv1 link failures when the host's\n+ # libfreetype-dev is newer than the rootstrap's libfreetype.so.)\n cflags = [ \"-I=$skia_system_freetype2_include_path\" ]\n+ } else {\n+ include_dirs = [ skia_system_freetype2_include_path ]\n }\n }\n } else {", "oldDiff": "diff --git a/third_party/freetype2/BUILD.gn b/third_party/freetype2/BUILD.gn\nindex 4951242993..e89cd64b87 100644\n--- a/third_party/freetype2/BUILD.gn\n+++ b/third_party/freetype2/BUILD.gn\n@@ -25,6 +25,9 @@ if (skia_use_system_freetype2) {\n system(\"freetype2\") {\n include_dirs = [ skia_system_freetype2_include_path ]\n libs = [ skia_system_freetype2_lib ]\n+ if (is_tizen) {\n+ cflags = [ \"-I=$skia_system_freetype2_include_path\" ]\n+ }\n }\n } else {\n third_party(\"freetype2\") {", "newDiff": "diff --git a/third_party/freetype2/BUILD.gn b/third_party/freetype2/BUILD.gn\nindex 631b9096e4..f11292ad43 100644\n--- a/third_party/freetype2/BUILD.gn\n+++ b/third_party/freetype2/BUILD.gn\n@@ -24,8 +24,19 @@ import(\"../third_party.gni\")\n \n if (skia_use_system_freetype2) {\n system(\"freetype2\") {\n- include_dirs = [ skia_system_freetype2_include_path ]\n libs = [ skia_system_freetype2_lib ]\n+ if (is_tizen) {\n+ # mono/skia: emit only the sysroot-relative include path on Tizen so\n+ # the cross-compile picks up the rootstrap's freetype headers, not\n+ # whatever happens to be in the build host's /usr/include/freetype2.\n+ # (Upstream's bare include_dirs= line is host-absolute and shadows\n+ # the cflags `-I=` form; we drop it for is_tizen to avoid the\n+ # version-skew that causes COLRv1 link failures when the host's\n+ # libfreetype-dev is newer than the rootstrap's libfreetype.so.)\n+ cflags = [ \"-I=$skia_system_freetype2_include_path\" ]\n+ } else {\n+ include_dirs = [ skia_system_freetype2_include_path ]\n+ }\n }\n } else {\n third_party(\"freetype2\") {", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,13 +1,24 @@\n diff --git a/third_party/freetype2/BUILD.gn b/third_party/freetype2/BUILD.gn\n-index 4951242993..e89cd64b87 100644\n+index 631b9096e4..f11292ad43 100644\n --- a/third_party/freetype2/BUILD.gn\n +++ b/third_party/freetype2/BUILD.gn\n-@@ -25,6 +25,9 @@ if (skia_use_system_freetype2) {\n+@@ -24,8 +24,19 @@ import(\"../third_party.gni\")\n+ \n+ if (skia_use_system_freetype2) {\n system(\"freetype2\") {\n- include_dirs = [ skia_system_freetype2_include_path ]\n+- include_dirs = [ skia_system_freetype2_include_path ]\n libs = [ skia_system_freetype2_lib ]\n + if (is_tizen) {\n++ # mono/skia: emit only the sysroot-relative include path on Tizen so\n++ # the cross-compile picks up the rootstrap's freetype headers, not\n++ # whatever happens to be in the build host's /usr/include/freetype2.\n++ # (Upstream's bare include_dirs= line is host-absolute and shadows\n++ # the cflags `-I=` form; we drop it for is_tizen to avoid the\n++ # version-skew that causes COLRv1 link failures when the host's\n++ # libfreetype-dev is newer than the rootstrap's libfreetype.so.)\n + cflags = [ \"-I=$skia_system_freetype2_include_path\" ]\n++ } else {\n++ include_dirs = [ skia_system_freetype2_include_path ]\n + }\n }\n } else {", "summary": "Upstream changes: (1) Adds import of skia.gni. (2) Changes is_fuchsia references to is_canvaskit. Fork patch updated: For Tizen cross-compilation, the freetype2 include path handling is restructured — on Tizen, uses cflags with sysroot-relative -I= to pick up the rootstrap's freetype headers instead of the host's. For non-Tizen, uses the standard include_dirs approach. This avoids version-skew that caused COLRv1 link failures when the build host's freetype-dev is newer than the Tizen rootstrap's libfreetype.so.", "relatedFiles": [{"path": "third_party/zlib/BUILD.gn", "relationship": "related"}]}, {"path": "third_party/zlib/BUILD.gn", "diff": "diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn\nindex c0835a6c95..3794a07983 100644\n--- a/third_party/zlib/BUILD.gn\n+++ b/third_party/zlib/BUILD.gn\n@@ -35,8 +35,8 @@ if (skia_use_system_zlib) {\n defines += [ \"ARMV8_OS_LINUX\" ]\n } else if (is_mac) {\n defines += [ \"ARMV8_OS_MACOS\" ]\n- } else if (is_fuchsia) {\n- defines += [ \"ARMV8_OS_FUCHSIA\" ]\n+ } else if (is_ios) {\n+ defines += [ \"ARMV8_OS_IOS\" ]\n } else if (is_win) {\n defines += [ \"ARMV8_OS_WINDOWS\" ]\n } else if (is_ios || is_mac) {", "oldDiff": "diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn\nindex f9717b7b80..c0835a6c95 100644\n--- a/third_party/zlib/BUILD.gn\n+++ b/third_party/zlib/BUILD.gn\n@@ -11,263 +11,166 @@ if (skia_use_system_zlib) {\n libs = [ \"z\" ]\n }\n } else {\n- config(\"zlib_internal_config\") {\n- defines = [ \"ZLIB_IMPLEMENTATION\" ]\n- }\n- source_set(\"zlib_common_headers\") {\n- visibility = [ \":*\" ]\n- sources = [\n- \"../externals/zlib/chromeconf.h\",\n- \"../externals/zlib/deflate.h\",\n- \"../externals/zlib/inffast.h\",\n- \"../externals/zlib/inffixed.h\",\n- \"../externals/zlib/inflate.h\",\n- \"../externals/zlib/inftrees.h\",\n- \"../externals/zlib/zconf.h\",\n- \"../externals/zlib/zlib.h\",\n- \"../externals/zlib/zutil.h\",\n- ]\n- }\n-\n+ # ARM optimizations disabled for Windows on Arm MSVC builds, see http://crbug.com/v8/10012.\n use_arm_neon_optimizations =\n- (current_cpu == \"arm\" || current_cpu == \"arm64\") && (is_clang || !is_win)\n+ (current_cpu == \"arm\" || current_cpu == \"arm64\") && !(is_win && !is_clang)\n use_x86_x64_optimizations =\n (current_cpu == \"x86\" || current_cpu == \"x64\") && !is_ios\n \n- config(\"zlib_adler32_simd_config\") {\n+ config(\"zlib_simd_config\") {\n+ defines = []\n if (use_x86_x64_optimizations) {\n- defines = [ \"ADLER32_SIMD_SSSE3\" ]\n if (is_win) {\n defines += [ \"X86_WINDOWS\" ]\n } else {\n defines += [ \"X86_NOT_WINDOWS\" ]\n }\n+ defines += [ \"ADLER32_SIMD_SSSE3\" ] # Strangely this is needed for\n+ # cpu_features.c\n }\n-\n if (use_arm_neon_optimizations) {\n- defines = [ \"ADLER32_SIMD_NEON\" ]\n- }\n- }\n-\n- source_set(\"zlib_adler32_simd\") {\n- visibility = [ \":*\" ]\n-\n- if (use_x86_x64_optimizations) {\n- sources = [\n- \"../externals/zlib/adler32_simd.c\",\n- \"../externals/zlib/adler32_simd.h\",\n- ]\n-\n- if (!is_win || is_clang) {\n- cflags = [ \"-mssse3\" ]\n- }\n- }\n-\n- if (use_arm_neon_optimizations) {\n- sources = [\n- \"../externals/zlib/adler32_simd.c\",\n- \"../externals/zlib/adler32_simd.h\",\n- ]\n- }\n-\n- configs += [ \":zlib_internal_config\" ]\n-\n- public_configs = [ \":zlib_adler32_simd_config\" ]\n-\n- public_deps = [ \":zlib_common_headers\" ]\n- }\n-\n- if (use_arm_neon_optimizations) {\n- config(\"zlib_arm_crc32_config\") {\n- defines = [ \"CRC32_ARMV8_CRC32\" ]\n if (is_android) {\n- defines += [ \"ARMV8_OS_ANDROID\" ]\n+ defines += [ \"ARMV8_OS_ANDROID\" ] # also compatible with v7\n } else if (is_linux || is_chromeos) {\n defines += [ \"ARMV8_OS_LINUX\" ]\n } else if (is_mac) {\n defines += [ \"ARMV8_OS_MACOS\" ]\n- } else if (is_ios) {\n- defines += [ \"ARMV8_OS_IOS\" ]\n } else if (is_fuchsia) {\n defines += [ \"ARMV8_OS_FUCHSIA\" ]\n } else if (is_win) {\n defines += [ \"ARMV8_OS_WINDOWS\" ]\n+ } else if (is_ios || is_mac) {\n+ # iOS@ARM is a special case where we always have NEON but don't check\n+ # for crypto extensions.\n+ defines += [ \"ARM_OS_IOS\" ]\n } else {\n assert(false, \"Unsupported ARM OS\")\n }\n }\n \n- source_set(\"zlib_arm_crc32\") {\n- visibility = [ \":*\" ]\n-\n- include_dirs = [\n- \"../externals/zlib/\",\n- \"../externals/zlib/contrib/optimizations/\",\n- ]\n+ # Warnings are just noise if we're not maintaining the code.\n+ if (is_win) {\n+ cflags = [ \"/w\" ]\n+ } else {\n+ cflags = [ \"-w\" ]\n+ }\n+ }\n \n- if (!is_win && !is_clang) {\n- cflags_c = [ \"-march=armv8-a+aes+crc\" ]\n+ source_set(\"zlib_adler32_simd\") {\n+ visibility = [ \":*\" ]\n+ configs += [ \":zlib_simd_config\" ]\n+ if (use_x86_x64_optimizations) {\n+ defines = [ \"ADLER32_SIMD_SSSE3\" ]\n+ if (!is_win || is_clang) {\n+ cflags = [ \"-mssse3\" ]\n }\n+ }\n+ if (use_arm_neon_optimizations) {\n+ defines = [ \"ADLER32_SIMD_NEON\" ]\n+ }\n+ sources = [ \"../externals/zlib/adler32_simd.c\" ]\n+ }\n \n- sources = [\n- \"../externals/zlib/crc32_simd.c\",\n- \"../externals/zlib/crc32_simd.h\",\n- ]\n+ source_set(\"zlib_crc32_simd\") {\n+ visibility = [ \":*\" ]\n+ configs += [ \":zlib_simd_config\" ]\n \n- configs += [ \":zlib_internal_config\" ]\n+ # Disabled for iPhone, as described in DDI0487C_a_armv8_arm:\n+ # \"All implementations of the ARMv8.1 architecture are required to\n+ # implement the CRC32* instructions. These are optional in ARMv8.0.\"\n+ if (!is_ios && use_arm_neon_optimizations) {\n+ defines = [ \"CRC32_ARMV8_CRC32\" ]\n \n- public_configs = [ \":zlib_arm_crc32_config\" ]\n+ # An ARMv7 GCC build will fail to compile without building this target\n+ # for ARMv8-a+crc and letting runtime cpu detection select the correct\n+ # function.\n+ if (!is_win && !is_clang) {\n+ cflags_c = [ \"-march=armv8-a+aes+crc\" ]\n+ }\n+ }\n \n- public_deps = [ \":zlib_common_headers\" ]\n+ if (use_x86_x64_optimizations) {\n+ defines = [ \"CRC32_SIMD_SSE42_PCLMUL\" ]\n+ if (!is_win || is_clang) {\n+ cflags = [\n+ \"-msse4.2\",\n+ \"-mpclmul\",\n+ ]\n+ }\n }\n+\n+ sources = [ \"../externals/zlib/crc32_simd.c\" ]\n }\n \n- config(\"zlib_inflate_chunk_simd_config\") {\n+ source_set(\"zlib_inflate_chunk_simd\") {\n+ visibility = [ \":*\" ]\n+ configs += [ \":zlib_simd_config\" ]\n if (use_x86_x64_optimizations) {\n defines = [ \"INFLATE_CHUNK_SIMD_SSE2\" ]\n-\n if (current_cpu == \"x64\") {\n defines += [ \"INFLATE_CHUNK_READ_64LE\" ]\n }\n }\n-\n if (use_arm_neon_optimizations) {\n defines = [ \"INFLATE_CHUNK_SIMD_NEON\" ]\n-\n if (current_cpu == \"arm64\") {\n defines += [ \"INFLATE_CHUNK_READ_64LE\" ]\n }\n }\n- }\n-\n- source_set(\"zlib_inflate_chunk_simd\") {\n- visibility = [ \":*\" ]\n-\n if (use_x86_x64_optimizations || use_arm_neon_optimizations) {\n include_dirs = [\n \"../externals/zlib/\",\n \"../externals/zlib/contrib/optimizations/\",\n ]\n sources = [\n- \"../externals/zlib/contrib/optimizations/chunkcopy.h\",\n \"../externals/zlib/contrib/optimizations/inffast_chunk.c\",\n- \"../externals/zlib/contrib/optimizations/inffast_chunk.h\",\n \"../externals/zlib/contrib/optimizations/inflate.c\",\n ]\n }\n-\n- configs += [ \":zlib_internal_config\" ]\n- configs += [ \":zlib_warnings\" ]\n-\n- public_configs = [ \":zlib_inflate_chunk_simd_config\" ]\n-\n- public_deps = [ \":zlib_common_headers\" ]\n }\n \n- config(\"zlib_crc32_simd_config\") {\n- if (use_x86_x64_optimizations) {\n- defines = [ \"CRC32_SIMD_SSE42_PCLMUL\" ]\n- }\n- }\n-\n- source_set(\"zlib_crc32_simd\") {\n+ source_set(\"zlib_x86_x64_simd\") {\n visibility = [ \":*\" ]\n-\n+ configs += [ \":zlib_simd_config\" ]\n if (use_x86_x64_optimizations) {\n- sources = [\n- \"../externals/zlib/crc32_simd.c\",\n- \"../externals/zlib/crc32_simd.h\",\n- \"../externals/zlib/crc_folding.c\",\n+ defines = [\n+ \"CRC32_SIMD_SSE42_PCLMUL\",\n+ \"DEFLATE_SLIDE_HASH_SSE2\",\n ]\n-\n if (!is_win || is_clang) {\n cflags = [\n \"-msse4.2\",\n \"-mpclmul\",\n ]\n }\n- }\n-\n- configs += [ \":zlib_internal_config\" ]\n-\n- public_configs = [ \":zlib_crc32_simd_config\" ]\n-\n- public_deps = [ \":zlib_common_headers\" ]\n- }\n-\n- config(\"zlib_slide_hash_simd_config\") {\n- if (use_x86_x64_optimizations) {\n- defines = [ \"DEFLATE_SLIDE_HASH_SSE2\" ]\n- }\n-\n- if (use_arm_neon_optimizations) {\n- defines = [ \"DEFLATE_SLIDE_HASH_NEON\" ]\n- }\n- }\n-\n- source_set(\"zlib_slide_hash_simd\") {\n- visibility = [ \":*\" ]\n-\n- if (use_x86_x64_optimizations) {\n- sources = [ \"../externals/zlib/slide_hash_simd.h\" ]\n- }\n-\n- if (use_arm_neon_optimizations) {\n- sources = [ \"../externals/zlib/slide_hash_simd.h\" ]\n- }\n-\n- configs += [ \":zlib_internal_config\" ]\n-\n- public_configs = [ \":zlib_slide_hash_simd_config\" ]\n-\n- public_deps = [ \":zlib_common_headers\" ]\n- }\n-\n- config(\"zlib_warnings\") {\n- if (is_clang) {\n- cflags = [\n- \"-Wno-incompatible-pointer-types\",\n- \"-Wunused-variable\",\n+ sources = [\n+ \"../externals/zlib/crc_folding.c\",\n ]\n }\n }\n \n third_party(\"zlib\") {\n public_include_dirs = [ \"../externals/zlib\" ]\n- defines = []\n+ defines = [ \"ZLIB_IMPLEMENTATION\" ]\n deps = []\n configs = []\n \n sources = [\n \"../externals/zlib/adler32.c\",\n- \"../externals/zlib/chromeconf.h\",\n \"../externals/zlib/compress.c\",\n- \"../externals/zlib/contrib/optimizations/insert_string.h\",\n \"../externals/zlib/cpu_features.c\",\n- \"../externals/zlib/cpu_features.h\",\n \"../externals/zlib/crc32.c\",\n- \"../externals/zlib/crc32.h\",\n \"../externals/zlib/deflate.c\",\n- \"../externals/zlib/deflate.h\",\n \"../externals/zlib/gzclose.c\",\n- \"../externals/zlib/gzguts.h\",\n \"../externals/zlib/gzlib.c\",\n \"../externals/zlib/gzread.c\",\n \"../externals/zlib/gzwrite.c\",\n \"../externals/zlib/infback.c\",\n \"../externals/zlib/inffast.c\",\n- \"../externals/zlib/inffast.h\",\n- \"../externals/zlib/inffixed.h\",\n- \"../externals/zlib/inflate.h\",\n \"../externals/zlib/inftrees.c\",\n- \"../externals/zlib/inftrees.h\",\n \"../externals/zlib/trees.c\",\n- \"../externals/zlib/trees.h\",\n \"../externals/zlib/uncompr.c\",\n- \"../externals/zlib/zconf.h\",\n- \"../externals/zlib/zlib.h\",\n \"../externals/zlib/zutil.c\",\n- \"../externals/zlib/zutil.h\",\n ]\n \n if (is_android) {\n@@ -276,30 +179,16 @@ if (skia_use_system_zlib) {\n \n if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {\n defines += [ \"CPU_NO_SIMD\" ]\n- }\n-\n- if (use_x86_x64_optimizations || use_arm_neon_optimizations) {\n+ sources += [ \"../externals/zlib/inflate.c\" ]\n+ } else {\n+ configs += [ \":zlib_simd_config\" ]\n deps += [\n \":zlib_adler32_simd\",\n+ \":zlib_crc32_simd\",\n \":zlib_inflate_chunk_simd\",\n- \":zlib_slide_hash_simd\",\n+ \":zlib_x86_x64_simd\",\n ]\n-\n- if (use_x86_x64_optimizations) {\n- deps += [ \":zlib_crc32_simd\" ]\n- } else if (use_arm_neon_optimizations) {\n- deps += [ \":zlib_arm_crc32\" ]\n- }\n- } else {\n- sources += [ \"../externals/zlib/inflate.c\" ]\n }\n-\n- configs += [\n- \":zlib_internal_config\",\n- \":zlib_warnings\",\n- ]\n-\n- allow_circular_includes_from = deps\n }\n }", "newDiff": "diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn\nindex 7ebdbdb0e0..3794a07983 100644\n--- a/third_party/zlib/BUILD.gn\n+++ b/third_party/zlib/BUILD.gn\n@@ -11,77 +11,26 @@ if (skia_use_system_zlib) {\n libs = [ \"z\" ]\n }\n } else {\n- config(\"zlib_internal_config\") {\n- defines = [ \"ZLIB_IMPLEMENTATION\" ]\n- }\n- source_set(\"zlib_common_headers\") {\n- visibility = [ \":*\" ]\n- sources = [\n- \"../externals/zlib/chromeconf.h\",\n- \"../externals/zlib/deflate.h\",\n- \"../externals/zlib/inffast.h\",\n- \"../externals/zlib/inffixed.h\",\n- \"../externals/zlib/inflate.h\",\n- \"../externals/zlib/inftrees.h\",\n- \"../externals/zlib/zconf.h\",\n- \"../externals/zlib/zlib.h\",\n- \"../externals/zlib/zutil.h\",\n- ]\n- }\n-\n+ # ARM optimizations disabled for Windows on Arm MSVC builds, see http://crbug.com/v8/10012.\n use_arm_neon_optimizations =\n- (current_cpu == \"arm\" || current_cpu == \"arm64\") && (is_clang || !is_win)\n+ (current_cpu == \"arm\" || current_cpu == \"arm64\") && !(is_win && !is_clang)\n use_x86_x64_optimizations =\n (current_cpu == \"x86\" || current_cpu == \"x64\") && !is_ios\n \n- config(\"zlib_adler32_simd_config\") {\n+ config(\"zlib_simd_config\") {\n+ defines = []\n if (use_x86_x64_optimizations) {\n- defines = [ \"ADLER32_SIMD_SSSE3\" ]\n if (is_win) {\n defines += [ \"X86_WINDOWS\" ]\n } else {\n defines += [ \"X86_NOT_WINDOWS\" ]\n }\n+ defines += [ \"ADLER32_SIMD_SSSE3\" ] # Strangely this is needed for\n+ # cpu_features.c\n }\n-\n if (use_arm_neon_optimizations) {\n- defines = [ \"ADLER32_SIMD_NEON\" ]\n- }\n- }\n-\n- source_set(\"zlib_adler32_simd\") {\n- visibility = [ \":*\" ]\n-\n- if (use_x86_x64_optimizations) {\n- sources = [\n- \"../externals/zlib/adler32_simd.c\",\n- \"../externals/zlib/adler32_simd.h\",\n- ]\n-\n- if (!is_win || is_clang) {\n- cflags = [ \"-mssse3\" ]\n- }\n- }\n-\n- if (use_arm_neon_optimizations) {\n- sources = [\n- \"../externals/zlib/adler32_simd.c\",\n- \"../externals/zlib/adler32_simd.h\",\n- ]\n- }\n-\n- configs += [ \":zlib_internal_config\" ]\n-\n- public_configs = [ \":zlib_adler32_simd_config\" ]\n-\n- public_deps = [ \":zlib_common_headers\" ]\n- }\n-\n- if (use_arm_neon_optimizations) {\n- config(\"zlib_arm_crc32_config\") {\n- defines = [ \"CRC32_ARMV8_CRC32\" ]\n if (is_android) {\n- defines += [ \"ARMV8_OS_ANDROID\" ]\n+ defines += [ \"ARMV8_OS_ANDROID\" ] # also compatible with v7\n } else if (is_linux || is_chromeos) {\n defines += [ \"ARMV8_OS_LINUX\" ]\n } else if (is_mac) {\n@@ -90,182 +39,138 @@ if (skia_use_system_zlib) {\n defines += [ \"ARMV8_OS_IOS\" ]\n } else if (is_win) {\n defines += [ \"ARMV8_OS_WINDOWS\" ]\n+ } else if (is_ios || is_mac) {\n+ # iOS@ARM is a special case where we always have NEON but don't check\n+ # for crypto extensions.\n+ defines += [ \"ARM_OS_IOS\" ]\n } else {\n assert(false, \"Unsupported ARM OS\")\n }\n }\n \n- source_set(\"zlib_arm_crc32\") {\n- visibility = [ \":*\" ]\n-\n- include_dirs = [\n- \"../externals/zlib/\",\n- \"../externals/zlib/contrib/optimizations/\",\n- ]\n+ # Warnings are just noise if we're not maintaining the code.\n+ if (is_win) {\n+ cflags = [ \"/w\" ]\n+ } else {\n+ cflags = [ \"-w\" ]\n+ }\n+ }\n \n- if (!is_win && !is_clang) {\n- cflags_c = [ \"-march=armv8-a+aes+crc\" ]\n+ source_set(\"zlib_adler32_simd\") {\n+ visibility = [ \":*\" ]\n+ configs += [ \":zlib_simd_config\" ]\n+ if (use_x86_x64_optimizations) {\n+ defines = [ \"ADLER32_SIMD_SSSE3\" ]\n+ if (!is_win || is_clang) {\n+ cflags = [ \"-mssse3\" ]\n }\n+ }\n+ if (use_arm_neon_optimizations) {\n+ defines = [ \"ADLER32_SIMD_NEON\" ]\n+ }\n+ sources = [ \"../externals/zlib/adler32_simd.c\" ]\n+ }\n \n- sources = [\n- \"../externals/zlib/crc32_simd.c\",\n- \"../externals/zlib/crc32_simd.h\",\n- ]\n+ source_set(\"zlib_crc32_simd\") {\n+ visibility = [ \":*\" ]\n+ configs += [ \":zlib_simd_config\" ]\n \n- configs += [ \":zlib_internal_config\" ]\n+ # Disabled for iPhone, as described in DDI0487C_a_armv8_arm:\n+ # \"All implementations of the ARMv8.1 architecture are required to\n+ # implement the CRC32* instructions. These are optional in ARMv8.0.\"\n+ if (!is_ios && use_arm_neon_optimizations) {\n+ defines = [ \"CRC32_ARMV8_CRC32\" ]\n \n- public_configs = [ \":zlib_arm_crc32_config\" ]\n+ # An ARMv7 GCC build will fail to compile without building this target\n+ # for ARMv8-a+crc and letting runtime cpu detection select the correct\n+ # function.\n+ if (!is_win && !is_clang) {\n+ cflags_c = [ \"-march=armv8-a+aes+crc\" ]\n+ }\n+ }\n \n- public_deps = [ \":zlib_common_headers\" ]\n+ if (use_x86_x64_optimizations) {\n+ defines = [ \"CRC32_SIMD_SSE42_PCLMUL\" ]\n+ if (!is_win || is_clang) {\n+ cflags = [\n+ \"-msse4.2\",\n+ \"-mpclmul\",\n+ ]\n+ }\n }\n+\n+ sources = [ \"../externals/zlib/crc32_simd.c\" ]\n }\n \n- config(\"zlib_inflate_chunk_simd_config\") {\n+ source_set(\"zlib_inflate_chunk_simd\") {\n+ visibility = [ \":*\" ]\n+ configs += [ \":zlib_simd_config\" ]\n if (use_x86_x64_optimizations) {\n defines = [ \"INFLATE_CHUNK_SIMD_SSE2\" ]\n-\n if (current_cpu == \"x64\") {\n defines += [ \"INFLATE_CHUNK_READ_64LE\" ]\n }\n }\n-\n if (use_arm_neon_optimizations) {\n defines = [ \"INFLATE_CHUNK_SIMD_NEON\" ]\n-\n if (current_cpu == \"arm64\") {\n defines += [ \"INFLATE_CHUNK_READ_64LE\" ]\n }\n }\n- }\n-\n- source_set(\"zlib_inflate_chunk_simd\") {\n- visibility = [ \":*\" ]\n-\n if (use_x86_x64_optimizations || use_arm_neon_optimizations) {\n include_dirs = [\n \"../externals/zlib/\",\n \"../externals/zlib/contrib/optimizations/\",\n ]\n sources = [\n- \"../externals/zlib/contrib/optimizations/chunkcopy.h\",\n \"../externals/zlib/contrib/optimizations/inffast_chunk.c\",\n- \"../externals/zlib/contrib/optimizations/inffast_chunk.h\",\n \"../externals/zlib/contrib/optimizations/inflate.c\",\n ]\n }\n-\n- configs += [ \":zlib_internal_config\" ]\n- configs += [ \":zlib_warnings\" ]\n-\n- public_configs = [ \":zlib_inflate_chunk_simd_config\" ]\n-\n- public_deps = [ \":zlib_common_headers\" ]\n }\n \n- config(\"zlib_crc32_simd_config\") {\n- if (use_x86_x64_optimizations) {\n- defines = [ \"CRC32_SIMD_SSE42_PCLMUL\" ]\n- }\n- }\n-\n- source_set(\"zlib_crc32_simd\") {\n+ source_set(\"zlib_x86_x64_simd\") {\n visibility = [ \":*\" ]\n-\n+ configs += [ \":zlib_simd_config\" ]\n if (use_x86_x64_optimizations) {\n- sources = [\n- \"../externals/zlib/crc32_simd.c\",\n- \"../externals/zlib/crc32_simd.h\",\n- \"../externals/zlib/crc_folding.c\",\n+ defines = [\n+ \"CRC32_SIMD_SSE42_PCLMUL\",\n+ \"DEFLATE_SLIDE_HASH_SSE2\",\n ]\n-\n if (!is_win || is_clang) {\n cflags = [\n \"-msse4.2\",\n \"-mpclmul\",\n ]\n }\n- }\n-\n- configs += [ \":zlib_internal_config\" ]\n-\n- public_configs = [ \":zlib_crc32_simd_config\" ]\n-\n- public_deps = [ \":zlib_common_headers\" ]\n- }\n-\n- config(\"zlib_slide_hash_simd_config\") {\n- if (use_x86_x64_optimizations) {\n- defines = [ \"DEFLATE_SLIDE_HASH_SSE2\" ]\n- }\n-\n- if (use_arm_neon_optimizations) {\n- defines = [ \"DEFLATE_SLIDE_HASH_NEON\" ]\n- }\n- }\n-\n- source_set(\"zlib_slide_hash_simd\") {\n- visibility = [ \":*\" ]\n-\n- if (use_x86_x64_optimizations) {\n- sources = [ \"../externals/zlib/slide_hash_simd.h\" ]\n- }\n-\n- if (use_arm_neon_optimizations) {\n- sources = [ \"../externals/zlib/slide_hash_simd.h\" ]\n- }\n-\n- configs += [ \":zlib_internal_config\" ]\n-\n- public_configs = [ \":zlib_slide_hash_simd_config\" ]\n-\n- public_deps = [ \":zlib_common_headers\" ]\n- }\n-\n- config(\"zlib_warnings\") {\n- if (is_clang) {\n- cflags = [\n- \"-Wno-incompatible-pointer-types\",\n- \"-Wunused-variable\",\n+ sources = [\n+ \"../externals/zlib/crc_folding.c\",\n ]\n }\n }\n \n third_party(\"zlib\") {\n public_include_dirs = [ \"../externals/zlib\" ]\n- defines = []\n+ defines = [ \"ZLIB_IMPLEMENTATION\" ]\n deps = []\n configs = []\n \n sources = [\n \"../externals/zlib/adler32.c\",\n- \"../externals/zlib/chromeconf.h\",\n \"../externals/zlib/compress.c\",\n- \"../externals/zlib/contrib/optimizations/insert_string.h\",\n \"../externals/zlib/cpu_features.c\",\n- \"../externals/zlib/cpu_features.h\",\n \"../externals/zlib/crc32.c\",\n- \"../externals/zlib/crc32.h\",\n \"../externals/zlib/deflate.c\",\n- \"../externals/zlib/deflate.h\",\n \"../externals/zlib/gzclose.c\",\n- \"../externals/zlib/gzguts.h\",\n \"../externals/zlib/gzlib.c\",\n \"../externals/zlib/gzread.c\",\n \"../externals/zlib/gzwrite.c\",\n \"../externals/zlib/infback.c\",\n \"../externals/zlib/inffast.c\",\n- \"../externals/zlib/inffast.h\",\n- \"../externals/zlib/inffixed.h\",\n- \"../externals/zlib/inflate.h\",\n \"../externals/zlib/inftrees.c\",\n- \"../externals/zlib/inftrees.h\",\n \"../externals/zlib/trees.c\",\n- \"../externals/zlib/trees.h\",\n \"../externals/zlib/uncompr.c\",\n- \"../externals/zlib/zconf.h\",\n- \"../externals/zlib/zlib.h\",\n \"../externals/zlib/zutil.c\",\n- \"../externals/zlib/zutil.h\",\n ]\n \n if (is_android) {\n@@ -274,30 +179,16 @@ if (skia_use_system_zlib) {\n \n if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {\n defines += [ \"CPU_NO_SIMD\" ]\n- }\n-\n- if (use_x86_x64_optimizations || use_arm_neon_optimizations) {\n+ sources += [ \"../externals/zlib/inflate.c\" ]\n+ } else {\n+ configs += [ \":zlib_simd_config\" ]\n deps += [\n \":zlib_adler32_simd\",\n+ \":zlib_crc32_simd\",\n \":zlib_inflate_chunk_simd\",\n- \":zlib_slide_hash_simd\",\n+ \":zlib_x86_x64_simd\",\n ]\n-\n- if (use_x86_x64_optimizations) {\n- deps += [ \":zlib_crc32_simd\" ]\n- } else if (use_arm_neon_optimizations) {\n- deps += [ \":zlib_arm_crc32\" ]\n- }\n- } else {\n- sources += [ \"../externals/zlib/inflate.c\" ]\n }\n-\n- configs += [\n- \":zlib_internal_config\",\n- \":zlib_warnings\",\n- ]\n-\n- allow_circular_includes_from = deps\n }\n }", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,8 +1,8 @@\n diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn\n-index f9717b7b80..c0835a6c95 100644\n+index 7ebdbdb0e0..3794a07983 100644\n --- a/third_party/zlib/BUILD.gn\n +++ b/third_party/zlib/BUILD.gn\n-@@ -11,263 +11,166 @@ if (skia_use_system_zlib) {\n+@@ -11,77 +11,26 @@ if (skia_use_system_zlib) {\n libs = [ \"z\" ]\n }\n } else {\n@@ -87,11 +87,8 @@ index f9717b7b80..c0835a6c95 100644\n } else if (is_linux || is_chromeos) {\n defines += [ \"ARMV8_OS_LINUX\" ]\n } else if (is_mac) {\n- defines += [ \"ARMV8_OS_MACOS\" ]\n-- } else if (is_ios) {\n-- defines += [ \"ARMV8_OS_IOS\" ]\n- } else if (is_fuchsia) {\n- defines += [ \"ARMV8_OS_FUCHSIA\" ]\n+@@ -90,182 +39,138 @@ if (skia_use_system_zlib) {\n+ defines += [ \"ARMV8_OS_IOS\" ]\n } else if (is_win) {\n defines += [ \"ARMV8_OS_WINDOWS\" ]\n + } else if (is_ios || is_mac) {\n@@ -333,7 +330,7 @@ index f9717b7b80..c0835a6c95 100644\n ]\n \n if (is_android) {\n-@@ -276,30 +179,16 @@ if (skia_use_system_zlib) {\n+@@ -274,30 +179,16 @@ if (skia_use_system_zlib) {\n \n if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {\n defines += [ \"CPU_NO_SIMD\" ]", "summary": "Upstream changes: (1) Replaces Fuchsia ARMV8_OS_FUCHSIA define with iOS ARMV8_OS_IOS. (2) Significant refactoring of zlib's bundled build configuration — ARM NEON/CRC optimizations, x86 SSE/AVX optimizations restructured. Fork patch carried forward: adds iOS/macOS fallback for ARMV8_OS defines, restructures the zlib source list organization with cleaner ARM/x86 optimization grouping, and handles various platform-specific compilation flags.", "relatedFiles": [{"path": "third_party/freetype2/BUILD.gn", "relationship": "related"}]}], "unchanged": 32}, "interopIntegrity": {"status": "REVIEW_REQUIRED", "summary": "25 interop items: 2 added (sk_pathbuilder.h/.cpp with 28 new functions) and 23 changed. Major themes: path mutation moved to pathbuilder, SkSpan migration across font/canvas/shader APIs, gradient API namespace move, encoder ICC removal, D3D context namespace update. sk_paint_get_fill_path and sk_pathmeasure_get_segment now take sk_pathbuilder_t* output.", "recommendations": ["Verify sk_pathbuilder function signatures match upstream SkPathBuilder exactly", "Confirm gradient shader migration (SkGradientShader → SkGradient) is complete", "Review sk_path.cpp removals — ensure all moved functions exist in sk_pathbuilder.cpp", "Check sk_types_priv.h AsPathBuilder/ToPathBuilder cast macros for correctness"], "added": [{"path": "include/c/sk_pathbuilder.h", "diff": "diff --git a/include/c/sk_pathbuilder.h b/include/c/sk_pathbuilder.h\nnew file mode 100644\nindex 0000000000..50efd9ffd8\n--- /dev/null\n+++ b/include/c/sk_pathbuilder.h\n@@ -0,0 +1,61 @@\n+/*\n+ * Copyright 2025 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#ifndef sk_pathbuilder_DEFINED\n+#define sk_pathbuilder_DEFINED\n+\n+#include \"include/c/sk_types.h\"\n+\n+SK_C_PLUS_PLUS_BEGIN_GUARD\n+\n+SK_C_API sk_pathbuilder_t* sk_pathbuilder_new(void);\n+SK_C_API sk_pathbuilder_t* sk_pathbuilder_new_from_path(const sk_path_t* path);\n+SK_C_API void sk_pathbuilder_delete(sk_pathbuilder_t* builder);\n+\n+SK_C_API void sk_pathbuilder_move_to(sk_pathbuilder_t* builder, float x, float y);\n+SK_C_API void sk_pathbuilder_line_to(sk_pathbuilder_t* builder, float x, float y);\n+SK_C_API void sk_pathbuilder_quad_to(sk_pathbuilder_t* builder, float x0, float y0, float x1, float y1);\n+SK_C_API void sk_pathbuilder_conic_to(sk_pathbuilder_t* builder, float x0, float y0, float x1, float y1, float w);\n+SK_C_API void sk_pathbuilder_cubic_to(sk_pathbuilder_t* builder, float x0, float y0, float x1, float y1, float x2, float y2);\n+SK_C_API void sk_pathbuilder_arc_to(sk_pathbuilder_t* builder, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y);\n+SK_C_API void sk_pathbuilder_arc_to_with_oval(sk_pathbuilder_t* builder, const sk_rect_t* oval, float startAngle, float sweepAngle, bool forceMoveTo);\n+SK_C_API void sk_pathbuilder_arc_to_with_points(sk_pathbuilder_t* builder, float x1, float y1, float x2, float y2, float radius);\n+SK_C_API void sk_pathbuilder_close(sk_pathbuilder_t* builder);\n+\n+SK_C_API void sk_pathbuilder_rmove_to(sk_pathbuilder_t* builder, float dx, float dy);\n+SK_C_API void sk_pathbuilder_rline_to(sk_pathbuilder_t* builder, float dx, float dy);\n+SK_C_API void sk_pathbuilder_rquad_to(sk_pathbuilder_t* builder, float dx0, float dy0, float dx1, float dy1);\n+SK_C_API void sk_pathbuilder_rconic_to(sk_pathbuilder_t* builder, float dx0, float dy0, float dx1, float dy1, float w);\n+SK_C_API void sk_pathbuilder_rcubic_to(sk_pathbuilder_t* builder, float dx0, float dy0, float dx1, float dy1, float dx2, float dy2);\n+SK_C_API void sk_pathbuilder_rarc_to(sk_pathbuilder_t* builder, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y);\n+\n+SK_C_API void sk_pathbuilder_add_rect(sk_pathbuilder_t* builder, const sk_rect_t* rect, sk_path_direction_t dir);\n+SK_C_API void sk_pathbuilder_add_rect_start(sk_pathbuilder_t* builder, const sk_rect_t* rect, sk_path_direction_t dir, uint32_t startIndex);\n+SK_C_API void sk_pathbuilder_add_rrect(sk_pathbuilder_t* builder, const sk_rrect_t* rect, sk_path_direction_t dir);\n+SK_C_API void sk_pathbuilder_add_rrect_start(sk_pathbuilder_t* builder, const sk_rrect_t* rect, sk_path_direction_t dir, uint32_t start);\n+SK_C_API void sk_pathbuilder_add_rounded_rect(sk_pathbuilder_t* builder, const sk_rect_t* rect, float rx, float ry, sk_path_direction_t dir);\n+SK_C_API void sk_pathbuilder_add_oval(sk_pathbuilder_t* builder, const sk_rect_t* rect, sk_path_direction_t dir);\n+SK_C_API void sk_pathbuilder_add_circle(sk_pathbuilder_t* builder, float x, float y, float radius, sk_path_direction_t dir);\n+SK_C_API void sk_pathbuilder_add_arc(sk_pathbuilder_t* builder, const sk_rect_t* rect, float startAngle, float sweepAngle);\n+SK_C_API void sk_pathbuilder_add_poly(sk_pathbuilder_t* builder, const sk_point_t* points, int count, bool close);\n+\n+SK_C_API void sk_pathbuilder_add_path_offset(sk_pathbuilder_t* builder, const sk_path_t* other, float dx, float dy, sk_path_add_mode_t add_mode);\n+SK_C_API void sk_pathbuilder_add_path_matrix(sk_pathbuilder_t* builder, const sk_path_t* other, sk_matrix_t* matrix, sk_path_add_mode_t add_mode);\n+SK_C_API void sk_pathbuilder_add_path(sk_pathbuilder_t* builder, const sk_path_t* other, sk_path_add_mode_t add_mode);\n+SK_C_API void sk_pathbuilder_reverse_add_path(sk_pathbuilder_t* builder, const sk_path_t* other);\n+\n+SK_C_API void sk_pathbuilder_set_filltype(sk_pathbuilder_t* builder, sk_path_filltype_t filltype);\n+SK_C_API sk_path_filltype_t sk_pathbuilder_get_filltype(const sk_pathbuilder_t* builder);\n+\n+SK_C_API void sk_pathbuilder_reset(sk_pathbuilder_t* builder);\n+\n+SK_C_API sk_path_t* sk_pathbuilder_detach_path(sk_pathbuilder_t* builder);\n+SK_C_API sk_path_t* sk_pathbuilder_snapshot_path(sk_pathbuilder_t* builder);\n+\n+SK_C_PLUS_PLUS_END_GUARD\n+\n+#endif", "summary": "New C API header declaring the sk_pathbuilder_t opaque type and 35 functions wrapping SkPathBuilder. Lifecycle: sk_pathbuilder_new, sk_pathbuilder_new_from_path, sk_pathbuilder_delete. Building verbs: sk_pathbuilder_move_to, sk_pathbuilder_line_to, sk_pathbuilder_quad_to, sk_pathbuilder_conic_to, sk_pathbuilder_cubic_to, sk_pathbuilder_arc_to (3 overloads: default, with_oval, with_points), sk_pathbuilder_close. Relative verbs: sk_pathbuilder_rmove_to, sk_pathbuilder_rline_to, sk_pathbuilder_rquad_to, sk_pathbuilder_rconic_to, sk_pathbuilder_rcubic_to, sk_pathbuilder_rarc_to. Shape helpers: sk_pathbuilder_add_rect, sk_pathbuilder_add_rect_start, sk_pathbuilder_add_rrect, sk_pathbuilder_add_rrect_start, sk_pathbuilder_add_rounded_rect, sk_pathbuilder_add_oval, sk_pathbuilder_add_circle, sk_pathbuilder_add_arc, sk_pathbuilder_add_poly. Path composition: sk_pathbuilder_add_path_offset, sk_pathbuilder_add_path_matrix, sk_pathbuilder_add_path, sk_pathbuilder_reverse_add_path. Fill type: sk_pathbuilder_set_filltype, sk_pathbuilder_get_filltype. Reset: sk_pathbuilder_reset. Output: sk_pathbuilder_detach_path (transfers ownership), sk_pathbuilder_snapshot_path (copies). These functions mirror the mutation methods previously on sk_path_t, which were removed from sk_path.h in this update.", "relatedFiles": [{"path": "src/c/sk_pathbuilder.cpp", "relationship": "Implementation of all functions declared in this header"}, {"path": "include/c/sk_types.h", "relationship": "Declares the sk_pathbuilder_t opaque type used by this header"}, {"path": "include/c/sk_path.h", "relationship": "Path mutation functions were removed from sk_path.h and moved here"}, {"path": "binding/SkiaSharp/SKPath.cs", "relationship": "C# wrapper will need updating to use SKPathBuilder for mutation operations"}]}, {"path": "src/c/sk_pathbuilder.cpp", "diff": "diff --git a/src/c/sk_pathbuilder.cpp b/src/c/sk_pathbuilder.cpp\nnew file mode 100644\nindex 0000000000..a7a172997d\n--- /dev/null\n+++ b/src/c/sk_pathbuilder.cpp\n@@ -0,0 +1,161 @@\n+/*\n+ * Copyright 2025 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#include \"include/core/SkPath.h\"\n+#include \"include/core/SkPathBuilder.h\"\n+#include \"include/core/SkRRect.h\"\n+\n+#include \"include/c/sk_pathbuilder.h\"\n+\n+#include \"src/c/sk_types_priv.h\"\n+#include \"src/core/SkPathPriv.h\"\n+\n+sk_pathbuilder_t* sk_pathbuilder_new(void) {\n+ return ToPathBuilder(new SkPathBuilder());\n+}\n+\n+sk_pathbuilder_t* sk_pathbuilder_new_from_path(const sk_path_t* path) {\n+ return ToPathBuilder(new SkPathBuilder(*AsPath(path)));\n+}\n+\n+void sk_pathbuilder_delete(sk_pathbuilder_t* builder) {\n+ delete AsPathBuilder(builder);\n+}\n+\n+void sk_pathbuilder_move_to(sk_pathbuilder_t* builder, float x, float y) {\n+ AsPathBuilder(builder)->moveTo(x, y);\n+}\n+\n+void sk_pathbuilder_line_to(sk_pathbuilder_t* builder, float x, float y) {\n+ AsPathBuilder(builder)->lineTo(x, y);\n+}\n+\n+void sk_pathbuilder_quad_to(sk_pathbuilder_t* builder, float x0, float y0, float x1, float y1) {\n+ AsPathBuilder(builder)->quadTo(x0, y0, x1, y1);\n+}\n+\n+void sk_pathbuilder_conic_to(sk_pathbuilder_t* builder, float x0, float y0, float x1, float y1, float w) {\n+ AsPathBuilder(builder)->conicTo(x0, y0, x1, y1, w);\n+}\n+\n+void sk_pathbuilder_cubic_to(sk_pathbuilder_t* builder, float x0, float y0, float x1, float y1, float x2, float y2) {\n+ AsPathBuilder(builder)->cubicTo(x0, y0, x1, y1, x2, y2);\n+}\n+\n+void sk_pathbuilder_arc_to(sk_pathbuilder_t* builder, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y) {\n+ AsPathBuilder(builder)->arcTo(SkPoint::Make(rx, ry), xAxisRotate, (SkPathBuilder::ArcSize)largeArc, (SkPathDirection)sweep, SkPoint::Make(x, y));\n+}\n+\n+void sk_pathbuilder_arc_to_with_oval(sk_pathbuilder_t* builder, const sk_rect_t* oval, float startAngle, float sweepAngle, bool forceMoveTo) {\n+ AsPathBuilder(builder)->arcTo(*AsRect(oval), startAngle, sweepAngle, forceMoveTo);\n+}\n+\n+void sk_pathbuilder_arc_to_with_points(sk_pathbuilder_t* builder, float x1, float y1, float x2, float y2, float radius) {\n+ AsPathBuilder(builder)->arcTo(SkPoint::Make(x1, y1), SkPoint::Make(x2, y2), radius);\n+}\n+\n+void sk_pathbuilder_close(sk_pathbuilder_t* builder) {\n+ AsPathBuilder(builder)->close();\n+}\n+\n+void sk_pathbuilder_rmove_to(sk_pathbuilder_t* builder, float dx, float dy) {\n+ AsPathBuilder(builder)->rMoveTo(dx, dy);\n+}\n+\n+void sk_pathbuilder_rline_to(sk_pathbuilder_t* builder, float dx, float dy) {\n+ AsPathBuilder(builder)->rLineTo(dx, dy);\n+}\n+\n+void sk_pathbuilder_rquad_to(sk_pathbuilder_t* builder, float dx0, float dy0, float dx1, float dy1) {\n+ AsPathBuilder(builder)->rQuadTo(dx0, dy0, dx1, dy1);\n+}\n+\n+void sk_pathbuilder_rconic_to(sk_pathbuilder_t* builder, float dx0, float dy0, float dx1, float dy1, float w) {\n+ AsPathBuilder(builder)->rConicTo(dx0, dy0, dx1, dy1, w);\n+}\n+\n+void sk_pathbuilder_rcubic_to(sk_pathbuilder_t* builder, float dx0, float dy0, float dx1, float dy1, float dx2, float dy2) {\n+ AsPathBuilder(builder)->rCubicTo(dx0, dy0, dx1, dy1, dx2, dy2);\n+}\n+\n+void sk_pathbuilder_rarc_to(sk_pathbuilder_t* builder, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y) {\n+ AsPathBuilder(builder)->rArcTo(SkPoint::Make(rx, ry), xAxisRotate, (SkPathBuilder::ArcSize)largeArc, (SkPathDirection)sweep, SkPoint::Make(x, y));\n+}\n+\n+void sk_pathbuilder_add_rect(sk_pathbuilder_t* builder, const sk_rect_t* rect, sk_path_direction_t dir) {\n+ AsPathBuilder(builder)->addRect(*AsRect(rect), (SkPathDirection)dir);\n+}\n+\n+void sk_pathbuilder_add_rect_start(sk_pathbuilder_t* builder, const sk_rect_t* rect, sk_path_direction_t dir, uint32_t startIndex) {\n+ AsPathBuilder(builder)->addRect(*AsRect(rect), (SkPathDirection)dir, startIndex);\n+}\n+\n+void sk_pathbuilder_add_rrect(sk_pathbuilder_t* builder, const sk_rrect_t* rect, sk_path_direction_t dir) {\n+ AsPathBuilder(builder)->addRRect(*AsRRect(rect), (SkPathDirection)dir);\n+}\n+\n+void sk_pathbuilder_add_rrect_start(sk_pathbuilder_t* builder, const sk_rrect_t* rect, sk_path_direction_t dir, uint32_t start) {\n+ AsPathBuilder(builder)->addRRect(*AsRRect(rect), (SkPathDirection)dir, start);\n+}\n+\n+void sk_pathbuilder_add_rounded_rect(sk_pathbuilder_t* builder, const sk_rect_t* rect, float rx, float ry, sk_path_direction_t dir) {\n+ SkRRect rrect;\n+ rrect.setRectXY(*AsRect(rect), rx, ry);\n+ AsPathBuilder(builder)->addRRect(rrect, (SkPathDirection)dir);\n+}\n+\n+void sk_pathbuilder_add_oval(sk_pathbuilder_t* builder, const sk_rect_t* rect, sk_path_direction_t dir) {\n+ AsPathBuilder(builder)->addOval(*AsRect(rect), (SkPathDirection)dir);\n+}\n+\n+void sk_pathbuilder_add_circle(sk_pathbuilder_t* builder, float x, float y, float radius, sk_path_direction_t dir) {\n+ AsPathBuilder(builder)->addCircle(x, y, radius, (SkPathDirection)dir);\n+}\n+\n+void sk_pathbuilder_add_arc(sk_pathbuilder_t* builder, const sk_rect_t* rect, float startAngle, float sweepAngle) {\n+ AsPathBuilder(builder)->addArc(*AsRect(rect), startAngle, sweepAngle);\n+}\n+\n+void sk_pathbuilder_add_poly(sk_pathbuilder_t* builder, const sk_point_t* points, int count, bool close) {\n+ AsPathBuilder(builder)->addPolygon(SkSpan<const SkPoint>(AsPoint(points), count), close);\n+}\n+\n+void sk_pathbuilder_add_path_offset(sk_pathbuilder_t* builder, const sk_path_t* other, float dx, float dy, sk_path_add_mode_t add_mode) {\n+ AsPathBuilder(builder)->addPath(*AsPath(other), dx, dy, (SkPath::AddPathMode)add_mode);\n+}\n+\n+void sk_pathbuilder_add_path_matrix(sk_pathbuilder_t* builder, const sk_path_t* other, sk_matrix_t* matrix, sk_path_add_mode_t add_mode) {\n+ AsPathBuilder(builder)->addPath(*AsPath(other), AsMatrix(matrix), (SkPath::AddPathMode)add_mode);\n+}\n+\n+void sk_pathbuilder_add_path(sk_pathbuilder_t* builder, const sk_path_t* other, sk_path_add_mode_t add_mode) {\n+ AsPathBuilder(builder)->addPath(*AsPath(other), (SkPath::AddPathMode)add_mode);\n+}\n+\n+void sk_pathbuilder_reverse_add_path(sk_pathbuilder_t* builder, const sk_path_t* other) {\n+ SkPathPriv::ReverseAddPath(AsPathBuilder(builder), *AsPath(other));\n+}\n+\n+void sk_pathbuilder_set_filltype(sk_pathbuilder_t* builder, sk_path_filltype_t filltype) {\n+ AsPathBuilder(builder)->setFillType((SkPathFillType)filltype);\n+}\n+\n+sk_path_filltype_t sk_pathbuilder_get_filltype(const sk_pathbuilder_t* builder) {\n+ return (sk_path_filltype_t)AsPathBuilder(builder)->fillType();\n+}\n+\n+void sk_pathbuilder_reset(sk_pathbuilder_t* builder) {\n+ AsPathBuilder(builder)->reset();\n+}\n+\n+sk_path_t* sk_pathbuilder_detach_path(sk_pathbuilder_t* builder) {\n+ return ToPath(new SkPath(AsPathBuilder(builder)->detach()));\n+}\n+\n+sk_path_t* sk_pathbuilder_snapshot_path(sk_pathbuilder_t* builder) {\n+ return ToPath(new SkPath(AsPathBuilder(builder)->snapshot()));\n+}", "summary": "Implementation of all 35 sk_pathbuilder_* functions declared in sk_pathbuilder.h. Wraps SkPathBuilder C++ class. Uses AsPathBuilder/ToPathBuilder conversion macros defined in sk_types_priv.h. Notable implementation details: sk_pathbuilder_arc_to casts to SkPathBuilder::ArcSize (moved from SkPath::ArcSize in m147). sk_pathbuilder_add_rounded_rect manually constructs SkRRect from rect+radii. sk_pathbuilder_add_poly uses SkSpan<const SkPoint>. sk_pathbuilder_reverse_add_path calls SkPathPriv::ReverseAddPath (private API). sk_pathbuilder_detach_path and sk_pathbuilder_snapshot_path allocate new SkPath objects on the heap.", "relatedFiles": [{"path": "include/c/sk_pathbuilder.h", "relationship": "Header declaring all functions implemented here"}, {"path": "src/c/sk_types_priv.h", "relationship": "Defines DEF_CLASS_MAP for SkPathBuilder <-> sk_pathbuilder_t conversion"}, {"path": "src/c/sk_linker.cpp", "relationship": "Includes sk_pathbuilder.h to ensure linker retention"}, {"path": "src/xamarin/SkiaKeeper.c", "relationship": "References sk_pathbuilder_new to prevent dead-stripping"}]}], "changed": [{"path": "include/c/sk_document.h", "diff": "diff --git a/include/c/sk_document.h b/include/c/sk_document.h\nindex a216897bb7..6eb38937ce 100644\n--- a/include/c/sk_document.h\n+++ b/include/c/sk_document.h\n@@ -20,6 +20,7 @@ SK_C_API sk_document_t* sk_document_create_pdf_from_stream(sk_wstream_t* stream)\n SK_C_API sk_document_t* sk_document_create_pdf_from_stream_with_metadata(sk_wstream_t* stream, const sk_document_pdf_metadata_t* metadata);\n \n SK_C_API sk_document_t* sk_document_create_xps_from_stream(sk_wstream_t* stream, float dpi);\n+SK_C_API sk_document_t* sk_document_create_xps_from_stream_with_options(sk_wstream_t* stream, const sk_document_xps_options_t* options);\n \n SK_C_API sk_canvas_t* sk_document_begin_page(sk_document_t* document, float width, float height, const sk_rect_t* content);\n SK_C_API void sk_document_end_page(sk_document_t* document);", "oldDiff": "diff --git a/include/c/sk_document.h b/include/c/sk_document.h\nnew file mode 100644\nindex 0000000000..a216897bb7\n--- /dev/null\n+++ b/include/c/sk_document.h\n@@ -0,0 +1,31 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#ifndef sk_document_DEFINED\n+#define sk_document_DEFINED\n+\n+#include \"include/c/sk_types.h\"\n+\n+SK_C_PLUS_PLUS_BEGIN_GUARD\n+\n+SK_C_API void sk_document_unref(sk_document_t* document);\n+\n+SK_C_API sk_document_t* sk_document_create_pdf_from_stream(sk_wstream_t* stream);\n+SK_C_API sk_document_t* sk_document_create_pdf_from_stream_with_metadata(sk_wstream_t* stream, const sk_document_pdf_metadata_t* metadata);\n+\n+SK_C_API sk_document_t* sk_document_create_xps_from_stream(sk_wstream_t* stream, float dpi);\n+\n+SK_C_API sk_canvas_t* sk_document_begin_page(sk_document_t* document, float width, float height, const sk_rect_t* content);\n+SK_C_API void sk_document_end_page(sk_document_t* document);\n+SK_C_API void sk_document_close(sk_document_t* document);\n+SK_C_API void sk_document_abort(sk_document_t* document);\n+\n+SK_C_PLUS_PLUS_END_GUARD\n+\n+#endif", "newDiff": "diff --git a/include/c/sk_document.h b/include/c/sk_document.h\nnew file mode 100644\nindex 0000000000..6eb38937ce\n--- /dev/null\n+++ b/include/c/sk_document.h\n@@ -0,0 +1,32 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#ifndef sk_document_DEFINED\n+#define sk_document_DEFINED\n+\n+#include \"include/c/sk_types.h\"\n+\n+SK_C_PLUS_PLUS_BEGIN_GUARD\n+\n+SK_C_API void sk_document_unref(sk_document_t* document);\n+\n+SK_C_API sk_document_t* sk_document_create_pdf_from_stream(sk_wstream_t* stream);\n+SK_C_API sk_document_t* sk_document_create_pdf_from_stream_with_metadata(sk_wstream_t* stream, const sk_document_pdf_metadata_t* metadata);\n+\n+SK_C_API sk_document_t* sk_document_create_xps_from_stream(sk_wstream_t* stream, float dpi);\n+SK_C_API sk_document_t* sk_document_create_xps_from_stream_with_options(sk_wstream_t* stream, const sk_document_xps_options_t* options);\n+\n+SK_C_API sk_canvas_t* sk_document_begin_page(sk_document_t* document, float width, float height, const sk_rect_t* content);\n+SK_C_API void sk_document_end_page(sk_document_t* document);\n+SK_C_API void sk_document_close(sk_document_t* document);\n+SK_C_API void sk_document_abort(sk_document_t* document);\n+\n+SK_C_PLUS_PLUS_END_GUARD\n+\n+#endif", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,9 +1,9 @@\n diff --git a/include/c/sk_document.h b/include/c/sk_document.h\n new file mode 100644\n-index 0000000000..a216897bb7\n+index 0000000000..6eb38937ce\n --- /dev/null\n +++ b/include/c/sk_document.h\n-@@ -0,0 +1,31 @@\n+@@ -0,0 +1,32 @@\n +/*\n + * Copyright 2014 Google Inc.\n + * Copyright 2015 Xamarin Inc.\n@@ -26,6 +26,7 @@ index 0000000000..a216897bb7\n +SK_C_API sk_document_t* sk_document_create_pdf_from_stream_with_metadata(sk_wstream_t* stream, const sk_document_pdf_metadata_t* metadata);\n +\n +SK_C_API sk_document_t* sk_document_create_xps_from_stream(sk_wstream_t* stream, float dpi);\n++SK_C_API sk_document_t* sk_document_create_xps_from_stream_with_options(sk_wstream_t* stream, const sk_document_xps_options_t* options);\n +\n +SK_C_API sk_canvas_t* sk_document_begin_page(sk_document_t* document, float width, float height, const sk_rect_t* content);\n +SK_C_API void sk_document_end_page(sk_document_t* document);", "summary": "Added one new function declaration: sk_document_create_xps_from_stream_with_options, which takes sk_document_xps_options_t* (new struct with fDPI and fAllowNoPngs fields). The existing sk_document_create_xps_from_stream (dpi-only) is preserved for backward compatibility.", "relatedFiles": [{"path": "src/c/sk_document.cpp", "relationship": "Implementation of the new function"}, {"path": "include/c/sk_types.h", "relationship": "Defines the new sk_document_xps_options_t struct"}]}, {"path": "include/c/sk_paint.h", "diff": "diff --git a/include/c/sk_paint.h b/include/c/sk_paint.h\nindex feda20b2b2..e6142cbadd 100644\n--- a/include/c/sk_paint.h\n+++ b/include/c/sk_paint.h\n@@ -50,7 +50,7 @@ SK_C_API sk_blendmode_t sk_paint_get_blendmode(sk_paint_t*);\n SK_C_API sk_blender_t* sk_paint_get_blender(sk_paint_t* cpaint);\n SK_C_API sk_path_effect_t* sk_paint_get_path_effect(sk_paint_t* cpaint);\n SK_C_API void sk_paint_set_path_effect(sk_paint_t* cpaint, sk_path_effect_t* effect); \n-SK_C_API bool sk_paint_get_fill_path(const sk_paint_t* cpaint, const sk_path_t* src, sk_path_t* dst, const sk_rect_t* cullRect, const sk_matrix_t* cmatrix);\n+SK_C_API bool sk_paint_get_fill_path(const sk_paint_t* cpaint, const sk_path_t* src, sk_pathbuilder_t* dst, const sk_rect_t* cullRect, const sk_matrix_t* cmatrix);\n \n SK_C_PLUS_PLUS_END_GUARD", "oldDiff": "diff --git a/include/c/sk_paint.h b/include/c/sk_paint.h\nnew file mode 100644\nindex 0000000000..feda20b2b2\n--- /dev/null\n+++ b/include/c/sk_paint.h\n@@ -0,0 +1,57 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#ifndef sk_paint_DEFINED\n+#define sk_paint_DEFINED\n+\n+#include \"include/c/sk_types.h\"\n+\n+SK_C_PLUS_PLUS_BEGIN_GUARD\n+\n+SK_C_API sk_paint_t* sk_paint_new(void);\n+SK_C_API sk_paint_t* sk_paint_clone(sk_paint_t*);\n+SK_C_API void sk_paint_delete(sk_paint_t*);\n+SK_C_API void sk_paint_reset(sk_paint_t*);\n+SK_C_API bool sk_paint_is_antialias(const sk_paint_t*);\n+SK_C_API void sk_paint_set_antialias(sk_paint_t*, bool);\n+SK_C_API sk_color_t sk_paint_get_color(const sk_paint_t*);\n+SK_C_API void sk_paint_get_color4f(const sk_paint_t* paint, sk_color4f_t* color);\n+SK_C_API void sk_paint_set_color(sk_paint_t*, sk_color_t);\n+SK_C_API void sk_paint_set_color4f(sk_paint_t* paint, sk_color4f_t* color, sk_colorspace_t* colorspace);\n+SK_C_API sk_paint_style_t sk_paint_get_style(const sk_paint_t*);\n+SK_C_API void sk_paint_set_style(sk_paint_t*, sk_paint_style_t);\n+SK_C_API float sk_paint_get_stroke_width(const sk_paint_t*);\n+SK_C_API void sk_paint_set_stroke_width(sk_paint_t*, float width);\n+SK_C_API float sk_paint_get_stroke_miter(const sk_paint_t*);\n+SK_C_API void sk_paint_set_stroke_miter(sk_paint_t*, float miter);\n+SK_C_API sk_stroke_cap_t sk_paint_get_stroke_cap(const sk_paint_t*);\n+SK_C_API void sk_paint_set_stroke_cap(sk_paint_t*, sk_stroke_cap_t);\n+SK_C_API sk_stroke_join_t sk_paint_get_stroke_join(const sk_paint_t*);\n+SK_C_API void sk_paint_set_stroke_join(sk_paint_t*, sk_stroke_join_t);\n+SK_C_API void sk_paint_set_shader(sk_paint_t*, sk_shader_t*);\n+SK_C_API void sk_paint_set_maskfilter(sk_paint_t*, sk_maskfilter_t*);\n+SK_C_API void sk_paint_set_blendmode(sk_paint_t*, sk_blendmode_t);\n+SK_C_API void sk_paint_set_blender(sk_paint_t* paint, sk_blender_t* blender);\n+SK_C_API bool sk_paint_is_dither(const sk_paint_t*);\n+SK_C_API void sk_paint_set_dither(sk_paint_t*, bool);\n+SK_C_API sk_shader_t* sk_paint_get_shader(sk_paint_t*);\n+SK_C_API sk_maskfilter_t* sk_paint_get_maskfilter(sk_paint_t*);\n+SK_C_API void sk_paint_set_colorfilter(sk_paint_t*, sk_colorfilter_t*);\n+SK_C_API sk_colorfilter_t* sk_paint_get_colorfilter(sk_paint_t*);\n+SK_C_API void sk_paint_set_imagefilter(sk_paint_t*, sk_imagefilter_t*);\n+SK_C_API sk_imagefilter_t* sk_paint_get_imagefilter(sk_paint_t*);\n+SK_C_API sk_blendmode_t sk_paint_get_blendmode(sk_paint_t*);\n+SK_C_API sk_blender_t* sk_paint_get_blender(sk_paint_t* cpaint);\n+SK_C_API sk_path_effect_t* sk_paint_get_path_effect(sk_paint_t* cpaint);\n+SK_C_API void sk_paint_set_path_effect(sk_paint_t* cpaint, sk_path_effect_t* effect); \n+SK_C_API bool sk_paint_get_fill_path(const sk_paint_t* cpaint, const sk_path_t* src, sk_path_t* dst, const sk_rect_t* cullRect, const sk_matrix_t* cmatrix);\n+\n+SK_C_PLUS_PLUS_END_GUARD\n+\n+#endif", "newDiff": "diff --git a/include/c/sk_paint.h b/include/c/sk_paint.h\nnew file mode 100644\nindex 0000000000..e6142cbadd\n--- /dev/null\n+++ b/include/c/sk_paint.h\n@@ -0,0 +1,57 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#ifndef sk_paint_DEFINED\n+#define sk_paint_DEFINED\n+\n+#include \"include/c/sk_types.h\"\n+\n+SK_C_PLUS_PLUS_BEGIN_GUARD\n+\n+SK_C_API sk_paint_t* sk_paint_new(void);\n+SK_C_API sk_paint_t* sk_paint_clone(sk_paint_t*);\n+SK_C_API void sk_paint_delete(sk_paint_t*);\n+SK_C_API void sk_paint_reset(sk_paint_t*);\n+SK_C_API bool sk_paint_is_antialias(const sk_paint_t*);\n+SK_C_API void sk_paint_set_antialias(sk_paint_t*, bool);\n+SK_C_API sk_color_t sk_paint_get_color(const sk_paint_t*);\n+SK_C_API void sk_paint_get_color4f(const sk_paint_t* paint, sk_color4f_t* color);\n+SK_C_API void sk_paint_set_color(sk_paint_t*, sk_color_t);\n+SK_C_API void sk_paint_set_color4f(sk_paint_t* paint, sk_color4f_t* color, sk_colorspace_t* colorspace);\n+SK_C_API sk_paint_style_t sk_paint_get_style(const sk_paint_t*);\n+SK_C_API void sk_paint_set_style(sk_paint_t*, sk_paint_style_t);\n+SK_C_API float sk_paint_get_stroke_width(const sk_paint_t*);\n+SK_C_API void sk_paint_set_stroke_width(sk_paint_t*, float width);\n+SK_C_API float sk_paint_get_stroke_miter(const sk_paint_t*);\n+SK_C_API void sk_paint_set_stroke_miter(sk_paint_t*, float miter);\n+SK_C_API sk_stroke_cap_t sk_paint_get_stroke_cap(const sk_paint_t*);\n+SK_C_API void sk_paint_set_stroke_cap(sk_paint_t*, sk_stroke_cap_t);\n+SK_C_API sk_stroke_join_t sk_paint_get_stroke_join(const sk_paint_t*);\n+SK_C_API void sk_paint_set_stroke_join(sk_paint_t*, sk_stroke_join_t);\n+SK_C_API void sk_paint_set_shader(sk_paint_t*, sk_shader_t*);\n+SK_C_API void sk_paint_set_maskfilter(sk_paint_t*, sk_maskfilter_t*);\n+SK_C_API void sk_paint_set_blendmode(sk_paint_t*, sk_blendmode_t);\n+SK_C_API void sk_paint_set_blender(sk_paint_t* paint, sk_blender_t* blender);\n+SK_C_API bool sk_paint_is_dither(const sk_paint_t*);\n+SK_C_API void sk_paint_set_dither(sk_paint_t*, bool);\n+SK_C_API sk_shader_t* sk_paint_get_shader(sk_paint_t*);\n+SK_C_API sk_maskfilter_t* sk_paint_get_maskfilter(sk_paint_t*);\n+SK_C_API void sk_paint_set_colorfilter(sk_paint_t*, sk_colorfilter_t*);\n+SK_C_API sk_colorfilter_t* sk_paint_get_colorfilter(sk_paint_t*);\n+SK_C_API void sk_paint_set_imagefilter(sk_paint_t*, sk_imagefilter_t*);\n+SK_C_API sk_imagefilter_t* sk_paint_get_imagefilter(sk_paint_t*);\n+SK_C_API sk_blendmode_t sk_paint_get_blendmode(sk_paint_t*);\n+SK_C_API sk_blender_t* sk_paint_get_blender(sk_paint_t* cpaint);\n+SK_C_API sk_path_effect_t* sk_paint_get_path_effect(sk_paint_t* cpaint);\n+SK_C_API void sk_paint_set_path_effect(sk_paint_t* cpaint, sk_path_effect_t* effect); \n+SK_C_API bool sk_paint_get_fill_path(const sk_paint_t* cpaint, const sk_path_t* src, sk_pathbuilder_t* dst, const sk_rect_t* cullRect, const sk_matrix_t* cmatrix);\n+\n+SK_C_PLUS_PLUS_END_GUARD\n+\n+#endif", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,6 +1,6 @@\n diff --git a/include/c/sk_paint.h b/include/c/sk_paint.h\n new file mode 100644\n-index 0000000000..feda20b2b2\n+index 0000000000..e6142cbadd\n --- /dev/null\n +++ b/include/c/sk_paint.h\n @@ -0,0 +1,57 @@\n@@ -56,7 +56,7 @@ index 0000000000..feda20b2b2\n +SK_C_API sk_blender_t* sk_paint_get_blender(sk_paint_t* cpaint);\n +SK_C_API sk_path_effect_t* sk_paint_get_path_effect(sk_paint_t* cpaint);\n +SK_C_API void sk_paint_set_path_effect(sk_paint_t* cpaint, sk_path_effect_t* effect); \n-+SK_C_API bool sk_paint_get_fill_path(const sk_paint_t* cpaint, const sk_path_t* src, sk_path_t* dst, const sk_rect_t* cullRect, const sk_matrix_t* cmatrix);\n++SK_C_API bool sk_paint_get_fill_path(const sk_paint_t* cpaint, const sk_path_t* src, sk_pathbuilder_t* dst, const sk_rect_t* cullRect, const sk_matrix_t* cmatrix);\n +\n +SK_C_PLUS_PLUS_END_GUARD\n +", "summary": "Signature change to sk_paint_get_fill_path: the 'dst' parameter type changed from sk_path_t* to sk_pathbuilder_t*. This reflects upstream Skia's move of skpathutils::FillPathWithPaint to accept SkPathBuilder* instead of SkPath*. This is an ABI-breaking change for this function.", "relatedFiles": [{"path": "src/c/sk_paint.cpp", "relationship": "Implementation updated to pass AsPathBuilder(dst)"}, {"path": "include/c/sk_pathbuilder.h", "relationship": "Defines the sk_pathbuilder_t type now used in the signature"}, {"path": "binding/SkiaSharp/SKPaint.cs", "relationship": "C# wrapper for GetFillPath will need updating"}]}, {"path": "include/c/sk_path.h", "diff": "diff --git a/include/c/sk_path.h b/include/c/sk_path.h\nindex 4214d8a0c5..f04770168f 100644\n--- a/include/c/sk_path.h\n+++ b/include/c/sk_path.h\n@@ -17,40 +17,13 @@ SK_C_PLUS_PLUS_BEGIN_GUARD\n /* Path */\n SK_C_API sk_path_t* sk_path_new(void);\n SK_C_API void sk_path_delete(sk_path_t*);\n-SK_C_API void sk_path_move_to(sk_path_t*, float x, float y);\n-SK_C_API void sk_path_line_to(sk_path_t*, float x, float y);\n-SK_C_API void sk_path_quad_to(sk_path_t*, float x0, float y0, float x1, float y1);\n-SK_C_API void sk_path_conic_to(sk_path_t*, float x0, float y0, float x1, float y1, float w);\n-SK_C_API void sk_path_cubic_to(sk_path_t*, float x0, float y0, float x1, float y1, float x2, float y2);\n-SK_C_API void sk_path_arc_to(sk_path_t*, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y);\n-SK_C_API void sk_path_rarc_to(sk_path_t*, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y);\n-SK_C_API void sk_path_arc_to_with_oval(sk_path_t*, const sk_rect_t* oval, float startAngle, float sweepAngle, bool forceMoveTo);\n-SK_C_API void sk_path_arc_to_with_points(sk_path_t*, float x1, float y1, float x2, float y2, float radius);\n-SK_C_API void sk_path_close(sk_path_t*);\n-SK_C_API void sk_path_add_rect(sk_path_t*, const sk_rect_t*, sk_path_direction_t);\n-SK_C_API void sk_path_add_rrect(sk_path_t*, const sk_rrect_t*, sk_path_direction_t);\n-SK_C_API void sk_path_add_rrect_start(sk_path_t*, const sk_rrect_t*, sk_path_direction_t, uint32_t);\n-SK_C_API void sk_path_add_rounded_rect(sk_path_t*, const sk_rect_t*, float, float, sk_path_direction_t);\n-SK_C_API void sk_path_add_oval(sk_path_t*, const sk_rect_t*, sk_path_direction_t);\n-SK_C_API void sk_path_add_circle(sk_path_t*, float x, float y, float radius, sk_path_direction_t dir);\n+SK_C_API sk_path_t* sk_path_clone(const sk_path_t* cpath);\n SK_C_API void sk_path_get_bounds(const sk_path_t*, sk_rect_t*);\n SK_C_API void sk_path_compute_tight_bounds(const sk_path_t*, sk_rect_t*);\n-SK_C_API void sk_path_rmove_to(sk_path_t*, float dx, float dy);\n-SK_C_API void sk_path_rline_to(sk_path_t*, float dx, float yd);\n-SK_C_API void sk_path_rquad_to(sk_path_t*, float dx0, float dy0, float dx1, float dy1);\n-SK_C_API void sk_path_rconic_to(sk_path_t*, float dx0, float dy0, float dx1, float dy1, float w);\n-SK_C_API void sk_path_rcubic_to(sk_path_t*, float dx0, float dy0, float dx1, float dy1, float dx2, float dy2);\n-SK_C_API void sk_path_add_rect_start(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir, uint32_t startIndex);\n-SK_C_API void sk_path_add_arc(sk_path_t* cpath, const sk_rect_t* crect, float startAngle, float sweepAngle);\n SK_C_API sk_path_filltype_t sk_path_get_filltype(sk_path_t*);\n SK_C_API void sk_path_set_filltype(sk_path_t*, sk_path_filltype_t);\n SK_C_API void sk_path_transform(sk_path_t* cpath, const sk_matrix_t* cmatrix);\n SK_C_API void sk_path_transform_to_dest(const sk_path_t* cpath, const sk_matrix_t* cmatrix, sk_path_t* destination);\n-SK_C_API sk_path_t* sk_path_clone(const sk_path_t* cpath);\n-SK_C_API void sk_path_add_path_offset (sk_path_t* cpath, sk_path_t* other, float dx, float dy, sk_path_add_mode_t add_mode);\n-SK_C_API void sk_path_add_path_matrix (sk_path_t* cpath, sk_path_t* other, sk_matrix_t *matrix, sk_path_add_mode_t add_mode);\n-SK_C_API void sk_path_add_path (sk_path_t* cpath, sk_path_t* other, sk_path_add_mode_t add_mode);\n-SK_C_API void sk_path_add_path_reverse (sk_path_t* cpath, sk_path_t* other);\n SK_C_API void sk_path_reset (sk_path_t* cpath);\n SK_C_API void sk_path_rewind (sk_path_t* cpath);\n SK_C_API int sk_path_count_points (const sk_path_t* cpath);\n@@ -62,7 +35,6 @@ SK_C_API bool sk_path_parse_svg_string (sk_path_t* cpath, const char* str);\n SK_C_API void sk_path_to_svg_string (const sk_path_t* cpath, sk_string_t* str);\n SK_C_API bool sk_path_get_last_point (const sk_path_t* cpath, sk_point_t* point);\n SK_C_API int sk_path_convert_conic_to_quads(const sk_point_t* p0, const sk_point_t* p1, const sk_point_t* p2, float w, sk_point_t* pts, int pow2);\n-SK_C_API void sk_path_add_poly(sk_path_t* cpath, const sk_point_t* points, int count, bool close);\n SK_C_API uint32_t sk_path_get_segment_masks(sk_path_t* cpath);\n SK_C_API bool sk_path_is_oval(sk_path_t* cpath, sk_rect_t* bounds);\n SK_C_API bool sk_path_is_rrect(sk_path_t* cpath, sk_rrect_t* bounds);\n@@ -105,7 +77,7 @@ SK_C_API void sk_pathmeasure_set_path(sk_pathmeasure_t* pathMeasure, const sk_pa\n SK_C_API float sk_pathmeasure_get_length(sk_pathmeasure_t* pathMeasure);\n SK_C_API bool sk_pathmeasure_get_pos_tan(sk_pathmeasure_t* pathMeasure, float distance, sk_point_t* position, sk_vector_t* tangent);\n SK_C_API bool sk_pathmeasure_get_matrix(sk_pathmeasure_t* pathMeasure, float distance, sk_matrix_t* matrix, sk_pathmeasure_matrixflags_t flags);\n-SK_C_API bool sk_pathmeasure_get_segment(sk_pathmeasure_t* pathMeasure, float start, float stop, sk_path_t* dst, bool startWithMoveTo);\n+SK_C_API bool sk_pathmeasure_get_segment(sk_pathmeasure_t* pathMeasure, float start, float stop, sk_pathbuilder_t* dst, bool startWithMoveTo);\n SK_C_API bool sk_pathmeasure_is_closed(sk_pathmeasure_t* pathMeasure);\n SK_C_API bool sk_pathmeasure_next_contour(sk_pathmeasure_t* pathMeasure);", "oldDiff": "diff --git a/include/c/sk_path.h b/include/c/sk_path.h\nnew file mode 100644\nindex 0000000000..4214d8a0c5\n--- /dev/null\n+++ b/include/c/sk_path.h\n@@ -0,0 +1,114 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#ifndef sk_path_DEFINED\n+#define sk_path_DEFINED\n+\n+#include \"include/c/sk_types.h\"\n+\n+SK_C_PLUS_PLUS_BEGIN_GUARD\n+\n+/* Path */\n+SK_C_API sk_path_t* sk_path_new(void);\n+SK_C_API void sk_path_delete(sk_path_t*);\n+SK_C_API void sk_path_move_to(sk_path_t*, float x, float y);\n+SK_C_API void sk_path_line_to(sk_path_t*, float x, float y);\n+SK_C_API void sk_path_quad_to(sk_path_t*, float x0, float y0, float x1, float y1);\n+SK_C_API void sk_path_conic_to(sk_path_t*, float x0, float y0, float x1, float y1, float w);\n+SK_C_API void sk_path_cubic_to(sk_path_t*, float x0, float y0, float x1, float y1, float x2, float y2);\n+SK_C_API void sk_path_arc_to(sk_path_t*, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y);\n+SK_C_API void sk_path_rarc_to(sk_path_t*, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y);\n+SK_C_API void sk_path_arc_to_with_oval(sk_path_t*, const sk_rect_t* oval, float startAngle, float sweepAngle, bool forceMoveTo);\n+SK_C_API void sk_path_arc_to_with_points(sk_path_t*, float x1, float y1, float x2, float y2, float radius);\n+SK_C_API void sk_path_close(sk_path_t*);\n+SK_C_API void sk_path_add_rect(sk_path_t*, const sk_rect_t*, sk_path_direction_t);\n+SK_C_API void sk_path_add_rrect(sk_path_t*, const sk_rrect_t*, sk_path_direction_t);\n+SK_C_API void sk_path_add_rrect_start(sk_path_t*, const sk_rrect_t*, sk_path_direction_t, uint32_t);\n+SK_C_API void sk_path_add_rounded_rect(sk_path_t*, const sk_rect_t*, float, float, sk_path_direction_t);\n+SK_C_API void sk_path_add_oval(sk_path_t*, const sk_rect_t*, sk_path_direction_t);\n+SK_C_API void sk_path_add_circle(sk_path_t*, float x, float y, float radius, sk_path_direction_t dir);\n+SK_C_API void sk_path_get_bounds(const sk_path_t*, sk_rect_t*);\n+SK_C_API void sk_path_compute_tight_bounds(const sk_path_t*, sk_rect_t*);\n+SK_C_API void sk_path_rmove_to(sk_path_t*, float dx, float dy);\n+SK_C_API void sk_path_rline_to(sk_path_t*, float dx, float yd);\n+SK_C_API void sk_path_rquad_to(sk_path_t*, float dx0, float dy0, float dx1, float dy1);\n+SK_C_API void sk_path_rconic_to(sk_path_t*, float dx0, float dy0, float dx1, float dy1, float w);\n+SK_C_API void sk_path_rcubic_to(sk_path_t*, float dx0, float dy0, float dx1, float dy1, float dx2, float dy2);\n+SK_C_API void sk_path_add_rect_start(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir, uint32_t startIndex);\n+SK_C_API void sk_path_add_arc(sk_path_t* cpath, const sk_rect_t* crect, float startAngle, float sweepAngle);\n+SK_C_API sk_path_filltype_t sk_path_get_filltype(sk_path_t*);\n+SK_C_API void sk_path_set_filltype(sk_path_t*, sk_path_filltype_t);\n+SK_C_API void sk_path_transform(sk_path_t* cpath, const sk_matrix_t* cmatrix);\n+SK_C_API void sk_path_transform_to_dest(const sk_path_t* cpath, const sk_matrix_t* cmatrix, sk_path_t* destination);\n+SK_C_API sk_path_t* sk_path_clone(const sk_path_t* cpath);\n+SK_C_API void sk_path_add_path_offset (sk_path_t* cpath, sk_path_t* other, float dx, float dy, sk_path_add_mode_t add_mode);\n+SK_C_API void sk_path_add_path_matrix (sk_path_t* cpath, sk_path_t* other, sk_matrix_t *matrix, sk_path_add_mode_t add_mode);\n+SK_C_API void sk_path_add_path (sk_path_t* cpath, sk_path_t* other, sk_path_add_mode_t add_mode);\n+SK_C_API void sk_path_add_path_reverse (sk_path_t* cpath, sk_path_t* other);\n+SK_C_API void sk_path_reset (sk_path_t* cpath);\n+SK_C_API void sk_path_rewind (sk_path_t* cpath);\n+SK_C_API int sk_path_count_points (const sk_path_t* cpath);\n+SK_C_API int sk_path_count_verbs (const sk_path_t* cpath);\n+SK_C_API void sk_path_get_point (const sk_path_t* cpath, int index, sk_point_t* point);\n+SK_C_API int sk_path_get_points (const sk_path_t* cpath, sk_point_t* points, int max);\n+SK_C_API bool sk_path_contains (const sk_path_t* cpath, float x, float y);\n+SK_C_API bool sk_path_parse_svg_string (sk_path_t* cpath, const char* str);\n+SK_C_API void sk_path_to_svg_string (const sk_path_t* cpath, sk_string_t* str);\n+SK_C_API bool sk_path_get_last_point (const sk_path_t* cpath, sk_point_t* point);\n+SK_C_API int sk_path_convert_conic_to_quads(const sk_point_t* p0, const sk_point_t* p1, const sk_point_t* p2, float w, sk_point_t* pts, int pow2);\n+SK_C_API void sk_path_add_poly(sk_path_t* cpath, const sk_point_t* points, int count, bool close);\n+SK_C_API uint32_t sk_path_get_segment_masks(sk_path_t* cpath);\n+SK_C_API bool sk_path_is_oval(sk_path_t* cpath, sk_rect_t* bounds);\n+SK_C_API bool sk_path_is_rrect(sk_path_t* cpath, sk_rrect_t* bounds);\n+SK_C_API bool sk_path_is_line(sk_path_t* cpath, sk_point_t line [2]);\n+SK_C_API bool sk_path_is_rect(sk_path_t* cpath, sk_rect_t* rect, bool* isClosed, sk_path_direction_t* direction);\n+SK_C_API bool sk_path_is_convex(const sk_path_t* cpath);\n+\n+/* Iterators */\n+SK_C_API sk_path_iterator_t* sk_path_create_iter (sk_path_t *cpath, int forceClose);\n+SK_C_API sk_path_verb_t sk_path_iter_next (sk_path_iterator_t *iterator, sk_point_t points [4]);\n+SK_C_API float sk_path_iter_conic_weight (sk_path_iterator_t *iterator);\n+SK_C_API int sk_path_iter_is_close_line (sk_path_iterator_t *iterator);\n+SK_C_API int sk_path_iter_is_closed_contour (sk_path_iterator_t *iterator);\n+SK_C_API void sk_path_iter_destroy (sk_path_iterator_t *iterator);\n+\n+/* Raw iterators */\n+SK_C_API sk_path_rawiterator_t* sk_path_create_rawiter (sk_path_t *cpath);\n+SK_C_API sk_path_verb_t sk_path_rawiter_peek (sk_path_rawiterator_t *iterator);\n+SK_C_API sk_path_verb_t sk_path_rawiter_next (sk_path_rawiterator_t *iterator, sk_point_t points [4]);\n+SK_C_API float sk_path_rawiter_conic_weight (sk_path_rawiterator_t *iterator);\n+SK_C_API void sk_path_rawiter_destroy (sk_path_rawiterator_t *iterator);\n+\n+/* Path Ops */\n+SK_C_API bool sk_pathop_op(const sk_path_t* one, const sk_path_t* two, sk_pathop_t op, sk_path_t* result);\n+SK_C_API bool sk_pathop_simplify(const sk_path_t* path, sk_path_t* result);\n+SK_C_API bool sk_pathop_tight_bounds(const sk_path_t* path, sk_rect_t* result);\n+SK_C_API bool sk_pathop_as_winding(const sk_path_t* path, sk_path_t* result);\n+\n+/* Path Op Builder */\n+SK_C_API sk_opbuilder_t* sk_opbuilder_new(void);\n+SK_C_API void sk_opbuilder_destroy(sk_opbuilder_t* builder);\n+SK_C_API void sk_opbuilder_add(sk_opbuilder_t* builder, const sk_path_t* path, sk_pathop_t op);\n+SK_C_API bool sk_opbuilder_resolve(sk_opbuilder_t* builder, sk_path_t* result);\n+\n+/* Path Measure */\n+SK_C_API sk_pathmeasure_t* sk_pathmeasure_new(void);\n+SK_C_API sk_pathmeasure_t* sk_pathmeasure_new_with_path(const sk_path_t* path, bool forceClosed, float resScale);\n+SK_C_API void sk_pathmeasure_destroy(sk_pathmeasure_t* pathMeasure);\n+SK_C_API void sk_pathmeasure_set_path(sk_pathmeasure_t* pathMeasure, const sk_path_t* path, bool forceClosed);\n+SK_C_API float sk_pathmeasure_get_length(sk_pathmeasure_t* pathMeasure);\n+SK_C_API bool sk_pathmeasure_get_pos_tan(sk_pathmeasure_t* pathMeasure, float distance, sk_point_t* position, sk_vector_t* tangent);\n+SK_C_API bool sk_pathmeasure_get_matrix(sk_pathmeasure_t* pathMeasure, float distance, sk_matrix_t* matrix, sk_pathmeasure_matrixflags_t flags);\n+SK_C_API bool sk_pathmeasure_get_segment(sk_pathmeasure_t* pathMeasure, float start, float stop, sk_path_t* dst, bool startWithMoveTo);\n+SK_C_API bool sk_pathmeasure_is_closed(sk_pathmeasure_t* pathMeasure);\n+SK_C_API bool sk_pathmeasure_next_contour(sk_pathmeasure_t* pathMeasure);\n+\n+SK_C_PLUS_PLUS_END_GUARD\n+\n+#endif", "newDiff": "diff --git a/include/c/sk_path.h b/include/c/sk_path.h\nnew file mode 100644\nindex 0000000000..f04770168f\n--- /dev/null\n+++ b/include/c/sk_path.h\n@@ -0,0 +1,86 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#ifndef sk_path_DEFINED\n+#define sk_path_DEFINED\n+\n+#include \"include/c/sk_types.h\"\n+\n+SK_C_PLUS_PLUS_BEGIN_GUARD\n+\n+/* Path */\n+SK_C_API sk_path_t* sk_path_new(void);\n+SK_C_API void sk_path_delete(sk_path_t*);\n+SK_C_API sk_path_t* sk_path_clone(const sk_path_t* cpath);\n+SK_C_API void sk_path_get_bounds(const sk_path_t*, sk_rect_t*);\n+SK_C_API void sk_path_compute_tight_bounds(const sk_path_t*, sk_rect_t*);\n+SK_C_API sk_path_filltype_t sk_path_get_filltype(sk_path_t*);\n+SK_C_API void sk_path_set_filltype(sk_path_t*, sk_path_filltype_t);\n+SK_C_API void sk_path_transform(sk_path_t* cpath, const sk_matrix_t* cmatrix);\n+SK_C_API void sk_path_transform_to_dest(const sk_path_t* cpath, const sk_matrix_t* cmatrix, sk_path_t* destination);\n+SK_C_API void sk_path_reset (sk_path_t* cpath);\n+SK_C_API void sk_path_rewind (sk_path_t* cpath);\n+SK_C_API int sk_path_count_points (const sk_path_t* cpath);\n+SK_C_API int sk_path_count_verbs (const sk_path_t* cpath);\n+SK_C_API void sk_path_get_point (const sk_path_t* cpath, int index, sk_point_t* point);\n+SK_C_API int sk_path_get_points (const sk_path_t* cpath, sk_point_t* points, int max);\n+SK_C_API bool sk_path_contains (const sk_path_t* cpath, float x, float y);\n+SK_C_API bool sk_path_parse_svg_string (sk_path_t* cpath, const char* str);\n+SK_C_API void sk_path_to_svg_string (const sk_path_t* cpath, sk_string_t* str);\n+SK_C_API bool sk_path_get_last_point (const sk_path_t* cpath, sk_point_t* point);\n+SK_C_API int sk_path_convert_conic_to_quads(const sk_point_t* p0, const sk_point_t* p1, const sk_point_t* p2, float w, sk_point_t* pts, int pow2);\n+SK_C_API uint32_t sk_path_get_segment_masks(sk_path_t* cpath);\n+SK_C_API bool sk_path_is_oval(sk_path_t* cpath, sk_rect_t* bounds);\n+SK_C_API bool sk_path_is_rrect(sk_path_t* cpath, sk_rrect_t* bounds);\n+SK_C_API bool sk_path_is_line(sk_path_t* cpath, sk_point_t line [2]);\n+SK_C_API bool sk_path_is_rect(sk_path_t* cpath, sk_rect_t* rect, bool* isClosed, sk_path_direction_t* direction);\n+SK_C_API bool sk_path_is_convex(const sk_path_t* cpath);\n+\n+/* Iterators */\n+SK_C_API sk_path_iterator_t* sk_path_create_iter (sk_path_t *cpath, int forceClose);\n+SK_C_API sk_path_verb_t sk_path_iter_next (sk_path_iterator_t *iterator, sk_point_t points [4]);\n+SK_C_API float sk_path_iter_conic_weight (sk_path_iterator_t *iterator);\n+SK_C_API int sk_path_iter_is_close_line (sk_path_iterator_t *iterator);\n+SK_C_API int sk_path_iter_is_closed_contour (sk_path_iterator_t *iterator);\n+SK_C_API void sk_path_iter_destroy (sk_path_iterator_t *iterator);\n+\n+/* Raw iterators */\n+SK_C_API sk_path_rawiterator_t* sk_path_create_rawiter (sk_path_t *cpath);\n+SK_C_API sk_path_verb_t sk_path_rawiter_peek (sk_path_rawiterator_t *iterator);\n+SK_C_API sk_path_verb_t sk_path_rawiter_next (sk_path_rawiterator_t *iterator, sk_point_t points [4]);\n+SK_C_API float sk_path_rawiter_conic_weight (sk_path_rawiterator_t *iterator);\n+SK_C_API void sk_path_rawiter_destroy (sk_path_rawiterator_t *iterator);\n+\n+/* Path Ops */\n+SK_C_API bool sk_pathop_op(const sk_path_t* one, const sk_path_t* two, sk_pathop_t op, sk_path_t* result);\n+SK_C_API bool sk_pathop_simplify(const sk_path_t* path, sk_path_t* result);\n+SK_C_API bool sk_pathop_tight_bounds(const sk_path_t* path, sk_rect_t* result);\n+SK_C_API bool sk_pathop_as_winding(const sk_path_t* path, sk_path_t* result);\n+\n+/* Path Op Builder */\n+SK_C_API sk_opbuilder_t* sk_opbuilder_new(void);\n+SK_C_API void sk_opbuilder_destroy(sk_opbuilder_t* builder);\n+SK_C_API void sk_opbuilder_add(sk_opbuilder_t* builder, const sk_path_t* path, sk_pathop_t op);\n+SK_C_API bool sk_opbuilder_resolve(sk_opbuilder_t* builder, sk_path_t* result);\n+\n+/* Path Measure */\n+SK_C_API sk_pathmeasure_t* sk_pathmeasure_new(void);\n+SK_C_API sk_pathmeasure_t* sk_pathmeasure_new_with_path(const sk_path_t* path, bool forceClosed, float resScale);\n+SK_C_API void sk_pathmeasure_destroy(sk_pathmeasure_t* pathMeasure);\n+SK_C_API void sk_pathmeasure_set_path(sk_pathmeasure_t* pathMeasure, const sk_path_t* path, bool forceClosed);\n+SK_C_API float sk_pathmeasure_get_length(sk_pathmeasure_t* pathMeasure);\n+SK_C_API bool sk_pathmeasure_get_pos_tan(sk_pathmeasure_t* pathMeasure, float distance, sk_point_t* position, sk_vector_t* tangent);\n+SK_C_API bool sk_pathmeasure_get_matrix(sk_pathmeasure_t* pathMeasure, float distance, sk_matrix_t* matrix, sk_pathmeasure_matrixflags_t flags);\n+SK_C_API bool sk_pathmeasure_get_segment(sk_pathmeasure_t* pathMeasure, float start, float stop, sk_pathbuilder_t* dst, bool startWithMoveTo);\n+SK_C_API bool sk_pathmeasure_is_closed(sk_pathmeasure_t* pathMeasure);\n+SK_C_API bool sk_pathmeasure_next_contour(sk_pathmeasure_t* pathMeasure);\n+\n+SK_C_PLUS_PLUS_END_GUARD\n+\n+#endif", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,9 +1,9 @@\n diff --git a/include/c/sk_path.h b/include/c/sk_path.h\n new file mode 100644\n-index 0000000000..4214d8a0c5\n+index 0000000000..f04770168f\n --- /dev/null\n +++ b/include/c/sk_path.h\n-@@ -0,0 +1,114 @@\n+@@ -0,0 +1,86 @@\n +/*\n + * Copyright 2014 Google Inc.\n + * Copyright 2015 Xamarin Inc.\n@@ -23,40 +23,13 @@ index 0000000000..4214d8a0c5\n +/* Path */\n +SK_C_API sk_path_t* sk_path_new(void);\n +SK_C_API void sk_path_delete(sk_path_t*);\n-+SK_C_API void sk_path_move_to(sk_path_t*, float x, float y);\n-+SK_C_API void sk_path_line_to(sk_path_t*, float x, float y);\n-+SK_C_API void sk_path_quad_to(sk_path_t*, float x0, float y0, float x1, float y1);\n-+SK_C_API void sk_path_conic_to(sk_path_t*, float x0, float y0, float x1, float y1, float w);\n-+SK_C_API void sk_path_cubic_to(sk_path_t*, float x0, float y0, float x1, float y1, float x2, float y2);\n-+SK_C_API void sk_path_arc_to(sk_path_t*, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y);\n-+SK_C_API void sk_path_rarc_to(sk_path_t*, float rx, float ry, float xAxisRotate, sk_path_arc_size_t largeArc, sk_path_direction_t sweep, float x, float y);\n-+SK_C_API void sk_path_arc_to_with_oval(sk_path_t*, const sk_rect_t* oval, float startAngle, float sweepAngle, bool forceMoveTo);\n-+SK_C_API void sk_path_arc_to_with_points(sk_path_t*, float x1, float y1, float x2, float y2, float radius);\n-+SK_C_API void sk_path_close(sk_path_t*);\n-+SK_C_API void sk_path_add_rect(sk_path_t*, const sk_rect_t*, sk_path_direction_t);\n-+SK_C_API void sk_path_add_rrect(sk_path_t*, const sk_rrect_t*, sk_path_direction_t);\n-+SK_C_API void sk_path_add_rrect_start(sk_path_t*, const sk_rrect_t*, sk_path_direction_t, uint32_t);\n-+SK_C_API void sk_path_add_rounded_rect(sk_path_t*, const sk_rect_t*, float, float, sk_path_direction_t);\n-+SK_C_API void sk_path_add_oval(sk_path_t*, const sk_rect_t*, sk_path_direction_t);\n-+SK_C_API void sk_path_add_circle(sk_path_t*, float x, float y, float radius, sk_path_direction_t dir);\n++SK_C_API sk_path_t* sk_path_clone(const sk_path_t* cpath);\n +SK_C_API void sk_path_get_bounds(const sk_path_t*, sk_rect_t*);\n +SK_C_API void sk_path_compute_tight_bounds(const sk_path_t*, sk_rect_t*);\n-+SK_C_API void sk_path_rmove_to(sk_path_t*, float dx, float dy);\n-+SK_C_API void sk_path_rline_to(sk_path_t*, float dx, float yd);\n-+SK_C_API void sk_path_rquad_to(sk_path_t*, float dx0, float dy0, float dx1, float dy1);\n-+SK_C_API void sk_path_rconic_to(sk_path_t*, float dx0, float dy0, float dx1, float dy1, float w);\n-+SK_C_API void sk_path_rcubic_to(sk_path_t*, float dx0, float dy0, float dx1, float dy1, float dx2, float dy2);\n-+SK_C_API void sk_path_add_rect_start(sk_path_t* cpath, const sk_rect_t* crect, sk_path_direction_t cdir, uint32_t startIndex);\n-+SK_C_API void sk_path_add_arc(sk_path_t* cpath, const sk_rect_t* crect, float startAngle, float sweepAngle);\n +SK_C_API sk_path_filltype_t sk_path_get_filltype(sk_path_t*);\n +SK_C_API void sk_path_set_filltype(sk_path_t*, sk_path_filltype_t);\n +SK_C_API void sk_path_transform(sk_path_t* cpath, const sk_matrix_t* cmatrix);\n +SK_C_API void sk_path_transform_to_dest(const sk_path_t* cpath, const sk_matrix_t* cmatrix, sk_path_t* destination);\n-+SK_C_API sk_path_t* sk_path_clone(const sk_path_t* cpath);\n-+SK_C_API void sk_path_add_path_offset (sk_path_t* cpath, sk_path_t* other, float dx, float dy, sk_path_add_mode_t add_mode);\n-+SK_C_API void sk_path_add_path_matrix (sk_path_t* cpath, sk_path_t* other, sk_matrix_t *matrix, sk_path_add_mode_t add_mode);\n-+SK_C_API void sk_path_add_path (sk_path_t* cpath, sk_path_t* other, sk_path_add_mode_t add_mode);\n-+SK_C_API void sk_path_add_path_reverse (sk_path_t* cpath, sk_path_t* other);\n +SK_C_API void sk_path_reset (sk_path_t* cpath);\n +SK_C_API void sk_path_rewind (sk_path_t* cpath);\n +SK_C_API int sk_path_count_points (const sk_path_t* cpath);\n@@ -68,7 +41,6 @@ index 0000000000..4214d8a0c5\n +SK_C_API void sk_path_to_svg_string (const sk_path_t* cpath, sk_string_t* str);\n +SK_C_API bool sk_path_get_last_point (const sk_path_t* cpath, sk_point_t* point);\n +SK_C_API int sk_path_convert_conic_to_quads(const sk_point_t* p0, const sk_point_t* p1, const sk_point_t* p2, float w, sk_point_t* pts, int pow2);\n-+SK_C_API void sk_path_add_poly(sk_path_t* cpath, const sk_point_t* points, int count, bool close);\n +SK_C_API uint32_t sk_path_get_segment_masks(sk_path_t* cpath);\n +SK_C_API bool sk_path_is_oval(sk_path_t* cpath, sk_rect_t* bounds);\n +SK_C_API bool sk_path_is_rrect(sk_path_t* cpath, sk_rrect_t* bounds);\n@@ -111,7 +83,7 @@ index 0000000000..4214d8a0c5\n +SK_C_API float sk_pathmeasure_get_length(sk_pathmeasure_t* pathMeasure);\n +SK_C_API bool sk_pathmeasure_get_pos_tan(sk_pathmeasure_t* pathMeasure, float distance, sk_point_t* position, sk_vector_t* tangent);\n +SK_C_API bool sk_pathmeasure_get_matrix(sk_pathmeasure_t* pathMeasure, float distance, sk_matrix_t* matrix, sk_pathmeasure_matrixflags_t flags);\n-+SK_C_API bool sk_pathmeasure_get_segment(sk_pathmeasure_t* pathMeasure, float start, float stop, sk_path_t* dst, bool startWithMoveTo);\n++SK_C_API bool sk_pathmeasure_get_segment(sk_pathmeasure_t* pathMeasure, float start, float stop, sk_pathbuilder_t* dst, bool startWithMoveTo);\n +SK_C_API bool sk_pathmeasure_is_closed(sk_pathmeasure_t* pathMeasure);\n +SK_C_API bool sk_pathmeasure_next_contour(sk_pathmeasure_t* pathMeasure);\n +", "summary": "Major restructuring: 28 mutation functions removed from sk_path_t (moved to sk_pathbuilder_t). Removed: sk_path_move_to, sk_path_line_to, sk_path_quad_to, sk_path_conic_to, sk_path_cubic_to, sk_path_arc_to, sk_path_rarc_to, sk_path_arc_to_with_oval, sk_path_arc_to_with_points, sk_path_close, sk_path_add_rect, sk_path_add_rrect, sk_path_add_rrect_start, sk_path_add_rounded_rect, sk_path_add_oval, sk_path_add_circle, sk_path_rmove_to, sk_path_rline_to, sk_path_rquad_to, sk_path_rconic_to, sk_path_rcubic_to, sk_path_add_rect_start, sk_path_add_arc, sk_path_add_path_offset, sk_path_add_path_matrix, sk_path_add_path, sk_path_add_path_reverse, sk_path_add_poly. sk_path_clone was repositioned (not added/removed). sk_pathmeasure_get_segment signature changed: dst parameter from sk_path_t* to sk_pathbuilder_t*. Remaining sk_path_t functions are all query/read-only operations.", "relatedFiles": [{"path": "src/c/sk_path.cpp", "relationship": "Implementation updated with matching removals"}, {"path": "include/c/sk_pathbuilder.h", "relationship": "All removed mutation functions now live here on sk_pathbuilder_t"}, {"path": "binding/SkiaSharp/SKPath.cs", "relationship": "C# SKPath class will need major refactoring"}]}, {"path": "include/c/sk_types.h", "diff": "diff --git a/include/c/sk_types.h b/include/c/sk_types.h\nindex 4601183057..75e5113365 100644\n--- a/include/c/sk_types.h\n+++ b/include/c/sk_types.h\n@@ -121,6 +121,7 @@ typedef enum {\n A16_FLOAT_SK_COLORTYPE,\n R16G16_FLOAT_SK_COLORTYPE,\n A16_UNORM_SK_COLORTYPE,\n+ R16_UNORM_SK_COLORTYPE,\n R16G16_UNORM_SK_COLORTYPE,\n R16G16B16A16_UNORM_SK_COLORTYPE,\n SRGBA_8888_SK_COLORTYPE,\n@@ -231,6 +232,7 @@ typedef struct sk_font_t sk_font_t;\n cubic curves.\n */\n typedef struct sk_path_t sk_path_t;\n+typedef struct sk_pathbuilder_t sk_pathbuilder_t;\n /**\n A sk_picture_t holds recorded canvas drawing commands to be played\n back at a later time.\n@@ -514,6 +516,7 @@ typedef struct {\n sk_irect_t* fSubset;\n int fFrameIndex;\n int fPriorFrame;\n+ size_t fMaxDecodeMemory;\n } sk_codec_options_t;\n \n typedef enum {\n@@ -724,8 +727,9 @@ typedef struct {\n uint32_t fYChromaOffset;\n uint32_t fChromaFilter;\n uint32_t fForceExplicitReconstruction;\n- uint32_t fFormatFeatures;\n gr_vk_ycbcr_components_t fComponents;\n+ bool fSamplerFilterMustMatchChromaFilter;\n+ bool fSupportsLinearFilter;\n } gr_vk_ycbcrconversioninfo_t;\n \n typedef struct {\n@@ -834,6 +838,11 @@ typedef struct {\n int fEncodingQuality;\n } sk_document_pdf_metadata_t;\n \n+typedef struct {\n+ float fDPI;\n+ bool fAllowNoPngs;\n+} sk_document_xps_options_t;\n+\n typedef struct {\n sk_colorspace_t* colorspace;\n int32_t width;\n@@ -971,8 +980,6 @@ typedef struct {\n sk_pngencoder_filterflags_t fFilterFlags;\n int fZLibLevel;\n void* fComments;\n- const sk_colorspace_icc_profile_t* fICCProfile;\n- const char* fICCProfileDescription;\n const void* fGainmap;\n const void* fGainmapInfo;\n } sk_pngencoder_options_t;\n@@ -993,8 +1000,6 @@ typedef struct {\n sk_jpegencoder_downsample_t fDownsample;\n sk_jpegencoder_alphaoption_t fAlphaOption;\n const sk_data_t* xmpMetadata;\n- const sk_colorspace_icc_profile_t* fICCProfile;\n- const char* fICCProfileDescription;\n int32_t fOrigin;\n bool fHasOrigin;\n } sk_jpegencoder_options_t;\n@@ -1007,8 +1012,6 @@ typedef enum {\n typedef struct {\n sk_webpencoder_compression_t fCompression;\n float fQuality;\n- const sk_colorspace_icc_profile_t* fICCProfile;\n- const char* fICCProfileDescription;\n } sk_webpencoder_options_t;\n \n typedef struct sk_rrect_t sk_rrect_t;", "oldDiff": "diff --git a/include/c/sk_types.h b/include/c/sk_types.h\nnew file mode 100644\nindex 0000000000..4601183057\n--- /dev/null\n+++ b/include/c/sk_types.h\n@@ -0,0 +1,1200 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#ifndef sk_types_DEFINED\n+#define sk_types_DEFINED\n+\n+#include <stdint.h>\n+#include <stddef.h>\n+\n+#ifdef __cplusplus\n+ #define SK_C_PLUS_PLUS_BEGIN_GUARD extern \"C\" {\n+ #define SK_C_PLUS_PLUS_END_GUARD }\n+#else\n+ #include <stdbool.h>\n+ #define SK_C_PLUS_PLUS_BEGIN_GUARD\n+ #define SK_C_PLUS_PLUS_END_GUARD\n+#endif\n+\n+#if !defined(SK_C_API)\n+ #if defined(SKIA_C_DLL)\n+ #if defined(_MSC_VER)\n+ #if SKIA_IMPLEMENTATION\n+ #define SK_C_API __declspec(dllexport)\n+ #else\n+ #define SK_C_API __declspec(dllimport)\n+ #endif\n+ #else\n+ #define SK_C_API __attribute__((visibility(\"default\")))\n+ #endif\n+ #else\n+ #define SK_C_API\n+ #endif\n+#endif\n+\n+#if defined(_WIN32)\n+ // On Windows, Vulkan commands use the stdcall convention\n+ #define VKAPI_ATTR\n+ #define VKAPI_CALL __stdcall\n+ #define VKAPI_PTR VKAPI_CALL\n+#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7\n+ #error \"Vulkan isn't supported for the 'armeabi' NDK ABI\"\n+#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE)\n+ // On Android 32-bit ARM targets, Vulkan functions use the \"hardfloat\"\n+ // calling convention, i.e. float parameters are passed in registers. This\n+ // is true even if the rest of the application passes floats on the stack,\n+ // as it does by default when compiling for the armeabi-v7a NDK ABI.\n+ #define VKAPI_ATTR __attribute__((pcs(\"aapcs-vfp\")))\n+ #define VKAPI_CALL\n+ #define VKAPI_PTR VKAPI_ATTR\n+#else\n+ // On other platforms, use the default calling convention\n+ #define VKAPI_ATTR\n+ #define VKAPI_CALL\n+ #define VKAPI_PTR\n+#endif\n+\n+#if !defined(SK_TO_STRING)\n+ #define SK_TO_STRING(X) SK_TO_STRING_IMPL(X)\n+ #define SK_TO_STRING_IMPL(X) #X\n+#endif\n+\n+#ifndef SK_C_INCREMENT\n+#define SK_C_INCREMENT 0\n+#endif\n+\n+///////////////////////////////////////////////////////////////////////////////////////\n+\n+SK_C_PLUS_PLUS_BEGIN_GUARD\n+\n+typedef struct sk_refcnt_t sk_refcnt_t;\n+typedef struct sk_nvrefcnt_t sk_nvrefcnt_t;\n+\n+typedef struct sk_flattenable_t sk_flattenable_t;\n+\n+typedef uint32_t sk_color_t;\n+typedef uint32_t sk_pmcolor_t;\n+\n+/* This macro assumes all arguments are >=0 and <=255. */\n+#define sk_color_set_argb(a, r, g, b) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))\n+#define sk_color_get_a(c) (((c) >> 24) & 0xFF)\n+#define sk_color_get_r(c) (((c) >> 16) & 0xFF)\n+#define sk_color_get_g(c) (((c) >> 8) & 0xFF)\n+#define sk_color_get_b(c) (((c) >> 0) & 0xFF)\n+\n+typedef struct sk_color4f_t {\n+ float fR;\n+ float fG;\n+ float fB;\n+ float fA;\n+} sk_color4f_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_COLORTYPE = 0,\n+ ALPHA_8_SK_COLORTYPE,\n+ RGB_565_SK_COLORTYPE,\n+ ARGB_4444_SK_COLORTYPE,\n+ RGBA_8888_SK_COLORTYPE,\n+ RGB_888X_SK_COLORTYPE,\n+ BGRA_8888_SK_COLORTYPE,\n+ RGBA_1010102_SK_COLORTYPE,\n+ BGRA_1010102_SK_COLORTYPE,\n+ RGB_101010X_SK_COLORTYPE,\n+ BGR_101010X_SK_COLORTYPE,\n+ BGR_101010X_XR_SK_COLORTYPE,\n+ BGRA_10101010_XR_SK_COLORTYPE,\n+ RGBA_10X6_SK_COLORTYPE,\n+ GRAY_8_SK_COLORTYPE,\n+ RGBA_F16_NORM_SK_COLORTYPE,\n+ RGBA_F16_SK_COLORTYPE,\n+ RGB_F16F16F16X_SK_COLORTYPE,\n+ RGBA_F32_SK_COLORTYPE,\n+\n+ // READONLY\n+ R8G8_UNORM_SK_COLORTYPE,\n+ A16_FLOAT_SK_COLORTYPE,\n+ R16G16_FLOAT_SK_COLORTYPE,\n+ A16_UNORM_SK_COLORTYPE,\n+ R16G16_UNORM_SK_COLORTYPE,\n+ R16G16B16A16_UNORM_SK_COLORTYPE,\n+ SRGBA_8888_SK_COLORTYPE,\n+ R8_UNORM_SK_COLORTYPE,\n+} sk_colortype_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_ALPHATYPE,\n+ OPAQUE_SK_ALPHATYPE,\n+ PREMUL_SK_ALPHATYPE,\n+ UNPREMUL_SK_ALPHATYPE,\n+} sk_alphatype_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_PIXELGEOMETRY,\n+ RGB_H_SK_PIXELGEOMETRY,\n+ BGR_H_SK_PIXELGEOMETRY,\n+ RGB_V_SK_PIXELGEOMETRY,\n+ BGR_V_SK_PIXELGEOMETRY,\n+} sk_pixelgeometry_t;\n+\n+typedef enum {\n+ NONE_SK_SURFACE_PROPS_FLAGS = 0,\n+ USE_DEVICE_INDEPENDENT_FONTS_SK_SURFACE_PROPS_FLAGS = 1 << 0,\n+} sk_surfaceprops_flags_t;\n+\n+typedef struct sk_surfaceprops_t sk_surfaceprops_t;\n+\n+typedef struct {\n+ float x;\n+ float y;\n+} sk_point_t;\n+\n+typedef sk_point_t sk_vector_t;\n+\n+typedef struct {\n+ int32_t left;\n+ int32_t top;\n+ int32_t right;\n+ int32_t bottom;\n+} sk_irect_t;\n+\n+typedef struct {\n+ float left;\n+ float top;\n+ float right;\n+ float bottom;\n+} sk_rect_t;\n+\n+typedef struct {\n+ float scaleX, skewX, transX;\n+ float skewY, scaleY, transY;\n+ float persp0, persp1, persp2;\n+} sk_matrix_t;\n+\n+// row major\n+typedef struct {\n+ // name: m<row><col>\n+ float m00, m01, m02, m03; // row 0\n+ float m10, m11, m12, m13; // row 1\n+ float m20, m21, m22, m23; // row 2\n+ float m30, m31, m32, m33; // row 3\n+} sk_matrix44_t;\n+\n+/**\n+ A sk_canvas_t encapsulates all of the state about drawing into a\n+ destination This includes a reference to the destination itself,\n+ and a stack of matrix/clip values.\n+*/\n+typedef struct sk_canvas_t sk_canvas_t;\n+typedef struct sk_nodraw_canvas_t sk_nodraw_canvas_t;\n+typedef struct sk_nway_canvas_t sk_nway_canvas_t;\n+typedef struct sk_overdraw_canvas_t sk_overdraw_canvas_t;\n+/**\n+ A sk_data_ holds an immutable data buffer.\n+*/\n+typedef struct sk_data_t sk_data_t;\n+/**\n+ A sk_drawable_t is a abstraction for drawings that changed while\n+ drawing.\n+*/\n+typedef struct sk_drawable_t sk_drawable_t;\n+/**\n+ A sk_image_t is an abstraction for drawing a rectagle of pixels.\n+ The content of the image is always immutable, though the actual\n+ storage may change, if for example that image can be re-created via\n+ encoded data or other means.\n+*/\n+typedef struct sk_image_t sk_image_t;\n+/**\n+ A sk_maskfilter_t is an object that perform transformations on an\n+ alpha-channel mask before drawing it; it may be installed into a\n+ sk_paint_t. Each time a primitive is drawn, it is first\n+ scan-converted into a alpha mask, which os handed to the\n+ maskfilter, which may create a new mask is to render into the\n+ destination.\n+ */\n+typedef struct sk_maskfilter_t sk_maskfilter_t;\n+/**\n+ A sk_paint_t holds the style and color information about how to\n+ draw geometries, text and bitmaps.\n+*/\n+typedef struct sk_paint_t sk_paint_t;\n+typedef struct sk_font_t sk_font_t;\n+/**\n+ A sk_path_t encapsulates compound (multiple contour) geometric\n+ paths consisting of straight line segments, quadratic curves, and\n+ cubic curves.\n+*/\n+typedef struct sk_path_t sk_path_t;\n+/**\n+ A sk_picture_t holds recorded canvas drawing commands to be played\n+ back at a later time.\n+*/\n+typedef struct sk_picture_t sk_picture_t;\n+/**\n+ A sk_picture_recorder_t holds a sk_canvas_t that records commands\n+ to create a sk_picture_t.\n+*/\n+typedef struct sk_picture_recorder_t sk_picture_recorder_t;\n+/**\n+ A sk_bbh_factory_t generates an sk_bbox_hierarchy as a display optimization\n+ for culling invisible calls recorded by a sk_picture_recorder. It may\n+ be passed in to sk_picture_recorder_begin_recording_with_bbh_factory,\n+ typically as an instance of the subclass sk_rtree_factory_t.\n+*/\n+typedef struct sk_bbh_factory_t sk_bbh_factory_t;\n+/**\n+ A sk_rtree_factory_t generates a sk_rtree as a display optimization\n+ for culling invisible calls recorded by a sk_picture_recorder_t. Inherits\n+ from sk_bbh_factory_t.\n+*/\n+typedef struct sk_rtree_factory_t sk_rtree_factory_t;\n+/**\n+ A sk_shader_t specifies the source color(s) for what is being drawn. If a\n+ paint has no shader, then the paint's color is used. If the paint\n+ has a shader, then the shader's color(s) are use instead, but they\n+ are modulated by the paint's alpha.\n+*/\n+typedef struct sk_shader_t sk_shader_t;\n+/**\n+ A sk_surface_t holds the destination for drawing to a canvas. For\n+ raster drawing, the destination is an array of pixels in memory.\n+ For GPU drawing, the destination is a texture or a framebuffer.\n+*/\n+typedef struct sk_surface_t sk_surface_t;\n+/**\n+ The sk_region encapsulates the geometric region used to specify\n+ clipping areas for drawing.\n+*/\n+typedef struct sk_region_t sk_region_t;\n+typedef struct sk_region_iterator_t sk_region_iterator_t;\n+typedef struct sk_region_cliperator_t sk_region_cliperator_t;\n+typedef struct sk_region_spanerator_t sk_region_spanerator_t;\n+\n+typedef enum {\n+ CLEAR_SK_BLENDMODE,\n+ SRC_SK_BLENDMODE,\n+ DST_SK_BLENDMODE,\n+ SRCOVER_SK_BLENDMODE,\n+ DSTOVER_SK_BLENDMODE,\n+ SRCIN_SK_BLENDMODE,\n+ DSTIN_SK_BLENDMODE,\n+ SRCOUT_SK_BLENDMODE,\n+ DSTOUT_SK_BLENDMODE,\n+ SRCATOP_SK_BLENDMODE,\n+ DSTATOP_SK_BLENDMODE,\n+ XOR_SK_BLENDMODE,\n+ PLUS_SK_BLENDMODE,\n+ MODULATE_SK_BLENDMODE,\n+ SCREEN_SK_BLENDMODE,\n+ OVERLAY_SK_BLENDMODE,\n+ DARKEN_SK_BLENDMODE,\n+ LIGHTEN_SK_BLENDMODE,\n+ COLORDODGE_SK_BLENDMODE,\n+ COLORBURN_SK_BLENDMODE,\n+ HARDLIGHT_SK_BLENDMODE,\n+ SOFTLIGHT_SK_BLENDMODE,\n+ DIFFERENCE_SK_BLENDMODE,\n+ EXCLUSION_SK_BLENDMODE,\n+ MULTIPLY_SK_BLENDMODE,\n+ HUE_SK_BLENDMODE,\n+ SATURATION_SK_BLENDMODE,\n+ COLOR_SK_BLENDMODE,\n+ LUMINOSITY_SK_BLENDMODE,\n+} sk_blendmode_t;\n+\n+//////////////////////////////////////////////////////////////////////////////////////////\n+\n+typedef struct {\n+ float x;\n+ float y;\n+ float z;\n+} sk_point3_t;\n+\n+typedef struct {\n+ int32_t x;\n+ int32_t y;\n+} sk_ipoint_t;\n+\n+typedef struct {\n+ float w;\n+ float h;\n+} sk_size_t;\n+\n+typedef struct {\n+ int32_t w;\n+ int32_t h;\n+} sk_isize_t;\n+\n+typedef struct {\n+ uint32_t fFlags;\n+ float fTop;\n+ float fAscent;\n+ float fDescent;\n+ float fBottom;\n+ float fLeading;\n+ float fAvgCharWidth;\n+ float fMaxCharWidth;\n+ float fXMin;\n+ float fXMax;\n+ float fXHeight;\n+ float fCapHeight;\n+ float fUnderlineThickness;\n+ float fUnderlinePosition;\n+ float fStrikeoutThickness;\n+ float fStrikeoutPosition;\n+} sk_fontmetrics_t;\n+\n+// Flags for fFlags member of sk_fontmetrics_t\n+#define FONTMETRICS_FLAGS_UNDERLINE_THICKNESS_IS_VALID (1U << 0)\n+#define FONTMETRICS_FLAGS_UNDERLINE_POSITION_IS_VALID (1U << 1)\n+\n+/**\n+ A lightweight managed string.\n+*/\n+typedef struct sk_string_t sk_string_t;\n+/**\n+\n+ A sk_bitmap_t is an abstraction that specifies a raster bitmap.\n+*/\n+typedef struct sk_bitmap_t sk_bitmap_t;\n+typedef struct sk_pixmap_t sk_pixmap_t;\n+typedef struct sk_colorfilter_t sk_colorfilter_t;\n+typedef struct sk_imagefilter_t sk_imagefilter_t;\n+\n+typedef struct sk_blender_t sk_blender_t;\n+\n+/**\n+ A sk_typeface_t pecifies the typeface and intrinsic style of a font.\n+ This is used in the paint, along with optionally algorithmic settings like\n+ textSize, textSkewX, textScaleX, kFakeBoldText_Mask, to specify\n+ how text appears when drawn (and measured).\n+\n+ Typeface objects are immutable, and so they can be shared between threads.\n+*/\n+typedef struct sk_typeface_t sk_typeface_t;\n+typedef uint32_t sk_font_table_tag_t;\n+typedef struct sk_fontmgr_t sk_fontmgr_t;\n+typedef struct sk_fontstyle_t sk_fontstyle_t;\n+typedef struct sk_fontstyleset_t sk_fontstyleset_t;\n+/**\n+ * Abstraction layer directly on top of an image codec.\n+ */\n+typedef struct sk_codec_t sk_codec_t;\n+typedef struct sk_colorspace_t sk_colorspace_t;\n+/**\n+ Various stream types\n+*/\n+typedef struct sk_stream_t sk_stream_t;\n+typedef struct sk_stream_filestream_t sk_stream_filestream_t;\n+typedef struct sk_stream_asset_t sk_stream_asset_t;\n+typedef struct sk_stream_memorystream_t sk_stream_memorystream_t;\n+typedef struct sk_stream_streamrewindable_t sk_stream_streamrewindable_t;\n+typedef struct sk_wstream_t sk_wstream_t;\n+typedef struct sk_wstream_filestream_t sk_wstream_filestream_t;\n+typedef struct sk_wstream_dynamicmemorystream_t sk_wstream_dynamicmemorystream_t;\n+/**\n+ High-level API for creating a document-based canvas.\n+*/\n+typedef struct sk_document_t sk_document_t;\n+\n+typedef enum {\n+ POINTS_SK_POINT_MODE,\n+ LINES_SK_POINT_MODE,\n+ POLYGON_SK_POINT_MODE\n+} sk_point_mode_t;\n+\n+typedef enum {\n+ LEFT_SK_TEXT_ALIGN,\n+ CENTER_SK_TEXT_ALIGN,\n+ RIGHT_SK_TEXT_ALIGN\n+} sk_text_align_t;\n+\n+typedef enum {\n+ UTF8_SK_TEXT_ENCODING,\n+ UTF16_SK_TEXT_ENCODING,\n+ UTF32_SK_TEXT_ENCODING,\n+ GLYPH_ID_SK_TEXT_ENCODING\n+} sk_text_encoding_t;\n+\n+typedef enum {\n+ WINDING_SK_PATH_FILLTYPE,\n+ EVENODD_SK_PATH_FILLTYPE,\n+ INVERSE_WINDING_SK_PATH_FILLTYPE,\n+ INVERSE_EVENODD_SK_PATH_FILLTYPE,\n+} sk_path_filltype_t;\n+\n+typedef enum {\n+ UPRIGHT_SK_FONT_STYLE_SLANT = 0,\n+ ITALIC_SK_FONT_STYLE_SLANT = 1,\n+ OBLIQUE_SK_FONT_STYLE_SLANT = 2,\n+} sk_font_style_slant_t;\n+\n+typedef enum {\n+ R_SK_COLOR_CHANNEL,\n+ G_SK_COLOR_CHANNEL,\n+ B_SK_COLOR_CHANNEL,\n+ A_SK_COLOR_CHANNEL,\n+} sk_color_channel_t;\n+\n+/**\n+ The logical operations that can be performed when combining two regions.\n+*/\n+typedef enum {\n+ DIFFERENCE_SK_REGION_OP, //!< subtract the op region from the first region\n+ INTERSECT_SK_REGION_OP, //!< intersect the two regions\n+ UNION_SK_REGION_OP, //!< union (inclusive-or) the two regions\n+ XOR_SK_REGION_OP, //!< exclusive-or the two regions\n+ REVERSE_DIFFERENCE_SK_REGION_OP, //!< subtract the first region from the op region\n+ REPLACE_SK_REGION_OP, //!< replace the dst region with the op region\n+} sk_region_op_t;\n+\n+typedef enum {\n+ DIFFERENCE_SK_CLIPOP,\n+ INTERSECT_SK_CLIPOP,\n+} sk_clipop_t;\n+\n+/**\n+ * Enum describing format of encoded data.\n+ */\n+typedef enum {\n+ BMP_SK_ENCODED_FORMAT,\n+ GIF_SK_ENCODED_FORMAT,\n+ ICO_SK_ENCODED_FORMAT,\n+ JPEG_SK_ENCODED_FORMAT,\n+ PNG_SK_ENCODED_FORMAT,\n+ WBMP_SK_ENCODED_FORMAT,\n+ WEBP_SK_ENCODED_FORMAT,\n+ PKM_SK_ENCODED_FORMAT,\n+ KTX_SK_ENCODED_FORMAT,\n+ ASTC_SK_ENCODED_FORMAT,\n+ DNG_SK_ENCODED_FORMAT,\n+ HEIF_SK_ENCODED_FORMAT,\n+ AVIF_SK_ENCODED_FORMAT,\n+ JPEGXL_SK_ENCODED_FORMAT,\n+} sk_encoded_image_format_t;\n+\n+typedef enum {\n+ TOP_LEFT_SK_ENCODED_ORIGIN = 1, // Default\n+ TOP_RIGHT_SK_ENCODED_ORIGIN = 2, // Reflected across y-axis\n+ BOTTOM_RIGHT_SK_ENCODED_ORIGIN = 3, // Rotated 180\n+ BOTTOM_LEFT_SK_ENCODED_ORIGIN = 4, // Reflected across x-axis\n+ LEFT_TOP_SK_ENCODED_ORIGIN = 5, // Reflected across x-axis, Rotated 90 CCW\n+ RIGHT_TOP_SK_ENCODED_ORIGIN = 6, // Rotated 90 CW\n+ RIGHT_BOTTOM_SK_ENCODED_ORIGIN = 7, // Reflected across x-axis, Rotated 90 CW\n+ LEFT_BOTTOM_SK_ENCODED_ORIGIN = 8, // Rotated 90 CCW\n+ DEFAULT_SK_ENCODED_ORIGIN = TOP_LEFT_SK_ENCODED_ORIGIN,\n+} sk_encodedorigin_t;\n+\n+typedef enum {\n+ SUCCESS_SK_CODEC_RESULT,\n+ INCOMPLETE_INPUT_SK_CODEC_RESULT,\n+ ERROR_IN_INPUT_SK_CODEC_RESULT,\n+ INVALID_CONVERSION_SK_CODEC_RESULT,\n+ INVALID_SCALE_SK_CODEC_RESULT,\n+ INVALID_PARAMETERS_SK_CODEC_RESULT,\n+ INVALID_INPUT_SK_CODEC_RESULT,\n+ COULD_NOT_REWIND_SK_CODEC_RESULT,\n+ INTERNAL_ERROR_SK_CODEC_RESULT,\n+ UNIMPLEMENTED_SK_CODEC_RESULT,\n+} sk_codec_result_t;\n+\n+typedef enum {\n+ YES_SK_CODEC_ZERO_INITIALIZED,\n+ NO_SK_CODEC_ZERO_INITIALIZED,\n+} sk_codec_zero_initialized_t;\n+\n+typedef struct {\n+ sk_codec_zero_initialized_t fZeroInitialized;\n+ sk_irect_t* fSubset;\n+ int fFrameIndex;\n+ int fPriorFrame;\n+} sk_codec_options_t;\n+\n+typedef enum {\n+ TOP_DOWN_SK_CODEC_SCANLINE_ORDER,\n+ BOTTOM_UP_SK_CODEC_SCANLINE_ORDER,\n+} sk_codec_scanline_order_t;\n+\n+// The verbs that can be foudn on a path\n+typedef enum {\n+ MOVE_SK_PATH_VERB,\n+ LINE_SK_PATH_VERB,\n+ QUAD_SK_PATH_VERB,\n+ CONIC_SK_PATH_VERB,\n+ CUBIC_SK_PATH_VERB,\n+ CLOSE_SK_PATH_VERB,\n+ DONE_SK_PATH_VERB\n+} sk_path_verb_t;\n+\n+typedef struct sk_path_iterator_t sk_path_iterator_t;\n+typedef struct sk_path_rawiterator_t sk_path_rawiterator_t;\n+\n+typedef enum {\n+ APPEND_SK_PATH_ADD_MODE,\n+ EXTEND_SK_PATH_ADD_MODE,\n+} sk_path_add_mode_t;\n+\n+typedef enum {\n+ LINE_SK_PATH_SEGMENT_MASK = 1 << 0,\n+ QUAD_SK_PATH_SEGMENT_MASK = 1 << 1,\n+ CONIC_SK_PATH_SEGMENT_MASK = 1 << 2,\n+ CUBIC_SK_PATH_SEGMENT_MASK = 1 << 3,\n+} sk_path_segment_mask_t;\n+\n+typedef enum {\n+ TRANSLATE_SK_PATH_EFFECT_1D_STYLE,\n+ ROTATE_SK_PATH_EFFECT_1D_STYLE,\n+ MORPH_SK_PATH_EFFECT_1D_STYLE,\n+} sk_path_effect_1d_style_t;\n+\n+typedef enum {\n+ NORMAL_SK_PATH_EFFECT_TRIM_MODE,\n+ INVERTED_SK_PATH_EFFECT_TRIM_MODE,\n+} sk_path_effect_trim_mode_t;\n+\n+typedef struct sk_path_effect_t sk_path_effect_t;\n+\n+typedef enum {\n+ BUTT_SK_STROKE_CAP,\n+ ROUND_SK_STROKE_CAP,\n+ SQUARE_SK_STROKE_CAP\n+} sk_stroke_cap_t;\n+\n+typedef enum {\n+ MITER_SK_STROKE_JOIN,\n+ ROUND_SK_STROKE_JOIN,\n+ BEVEL_SK_STROKE_JOIN\n+} sk_stroke_join_t;\n+\n+typedef enum {\n+ CLAMP_SK_SHADER_TILEMODE,\n+ REPEAT_SK_SHADER_TILEMODE,\n+ MIRROR_SK_SHADER_TILEMODE,\n+ DECAL_SK_SHADER_TILEMODE,\n+} sk_shader_tilemode_t;\n+\n+typedef enum {\n+ NORMAL_SK_BLUR_STYLE, //!< fuzzy inside and outside\n+ SOLID_SK_BLUR_STYLE, //!< solid inside, fuzzy outside\n+ OUTER_SK_BLUR_STYLE, //!< nothing inside, fuzzy outside\n+ INNER_SK_BLUR_STYLE, //!< fuzzy inside, nothing outside\n+} sk_blurstyle_t;\n+\n+typedef enum {\n+ CW_SK_PATH_DIRECTION,\n+ CCW_SK_PATH_DIRECTION,\n+} sk_path_direction_t;\n+\n+typedef enum {\n+ SMALL_SK_PATH_ARC_SIZE,\n+ LARGE_SK_PATH_ARC_SIZE,\n+} sk_path_arc_size_t;\n+\n+typedef enum {\n+ FILL_SK_PAINT_STYLE,\n+ STROKE_SK_PAINT_STYLE,\n+ STROKE_AND_FILL_SK_PAINT_STYLE,\n+} sk_paint_style_t;\n+\n+typedef enum {\n+ NONE_SK_FONT_HINTING,\n+ SLIGHT_SK_FONT_HINTING,\n+ NORMAL_SK_FONT_HINTING,\n+ FULL_SK_FONT_HINTING,\n+} sk_font_hinting_t;\n+\n+typedef enum {\n+ ALIAS_SK_FONT_EDGING,\n+ ANTIALIAS_SK_FONT_EDGING,\n+ SUBPIXEL_ANTIALIAS_SK_FONT_EDGING,\n+} sk_font_edging_t;\n+\n+typedef struct sk_pixelref_factory_t sk_pixelref_factory_t;\n+\n+typedef enum {\n+ TOP_LEFT_GR_SURFACE_ORIGIN,\n+ BOTTOM_LEFT_GR_SURFACE_ORIGIN,\n+} gr_surfaceorigin_t;\n+\n+typedef struct {\n+ bool fAvoidStencilBuffers;\n+ int fRuntimeProgramCacheSize;\n+ size_t fGlyphCacheTextureMaximumBytes;\n+ bool fAllowPathMaskCaching;\n+ bool fDoManualMipmapping;\n+ int fBufferMapThreshold;\n+} gr_context_options_t;\n+\n+typedef intptr_t gr_backendobject_t;\n+\n+typedef struct gr_backendrendertarget_t gr_backendrendertarget_t;\n+typedef struct gr_backendtexture_t gr_backendtexture_t;\n+\n+typedef struct gr_direct_context_t gr_direct_context_t;\n+typedef struct gr_recording_context_t gr_recording_context_t;\n+\n+typedef enum {\n+ OPENGL_GR_BACKEND = 0,\n+ VULKAN_GR_BACKEND = 1,\n+ METAL_GR_BACKEND = 2,\n+ DIRECT3D_GR_BACKEND = 3,\n+ UNSUPPORTED_GR_BACKEND = 5,\n+} gr_backend_t;\n+\n+typedef intptr_t gr_backendcontext_t;\n+\n+typedef struct gr_glinterface_t gr_glinterface_t;\n+\n+typedef void (*gr_gl_func_ptr)(void);\n+typedef gr_gl_func_ptr (*gr_gl_get_proc)(void* ctx, const char* name);\n+\n+typedef struct {\n+ unsigned int fTarget;\n+ unsigned int fID;\n+ unsigned int fFormat;\n+ bool fProtected;\n+} gr_gl_textureinfo_t;\n+\n+typedef struct {\n+ unsigned int fFBOID;\n+ unsigned int fFormat;\n+ bool fProtected;\n+} gr_gl_framebufferinfo_t;\n+\n+typedef struct vk_instance_t vk_instance_t;\n+typedef struct gr_vkinterface_t gr_vkinterface_t;\n+typedef struct vk_physical_device_t vk_physical_device_t;\n+typedef struct vk_physical_device_features_t vk_physical_device_features_t;\n+typedef struct vk_physical_device_features_2_t vk_physical_device_features_2_t;\n+typedef struct vk_device_t vk_device_t;\n+typedef struct vk_queue_t vk_queue_t;\n+\n+typedef struct gr_vk_extensions_t gr_vk_extensions_t;\n+typedef struct gr_vk_memory_allocator_t gr_vk_memory_allocator_t;\n+\n+typedef VKAPI_ATTR void (VKAPI_CALL *gr_vk_func_ptr)(void);\n+typedef gr_vk_func_ptr (*gr_vk_get_proc)(void* ctx, const char* name, vk_instance_t* instance, vk_device_t* device);\n+\n+typedef struct {\n+ vk_instance_t* fInstance;\n+ vk_physical_device_t* fPhysicalDevice;\n+ vk_device_t* fDevice;\n+ vk_queue_t* fQueue;\n+ uint32_t fGraphicsQueueIndex;\n+ uint32_t fMaxAPIVersion;\n+ const gr_vk_extensions_t* fVkExtensions;\n+ const vk_physical_device_features_t* fDeviceFeatures;\n+ const vk_physical_device_features_2_t* fDeviceFeatures2;\n+ gr_vk_memory_allocator_t* fMemoryAllocator;\n+ gr_vk_get_proc fGetProc;\n+ void* fGetProcUserData;\n+ bool fProtectedContext;\n+} gr_vk_backendcontext_t;\n+\n+typedef intptr_t gr_vk_backendmemory_t;\n+\n+typedef struct {\n+ uint64_t fMemory;\n+ uint64_t fOffset;\n+ uint64_t fSize;\n+ uint32_t fFlags;\n+ gr_vk_backendmemory_t fBackendMemory;\n+ bool _private_fUsesSystemHeap;\n+} gr_vk_alloc_t;\n+\n+typedef struct {\n+ uint32_t r;\n+ uint32_t g;\n+ uint32_t b;\n+ uint32_t a;\n+} gr_vk_ycbcr_components_t;\n+\n+typedef struct {\n+ uint32_t fFormat;\n+ uint64_t fExternalFormat;\n+ uint32_t fYcbcrModel;\n+ uint32_t fYcbcrRange;\n+ uint32_t fXChromaOffset;\n+ uint32_t fYChromaOffset;\n+ uint32_t fChromaFilter;\n+ uint32_t fForceExplicitReconstruction;\n+ uint32_t fFormatFeatures;\n+ gr_vk_ycbcr_components_t fComponents;\n+} gr_vk_ycbcrconversioninfo_t;\n+\n+typedef struct {\n+ uint64_t fImage;\n+ gr_vk_alloc_t fAlloc;\n+ uint32_t fImageTiling;\n+ uint32_t fImageLayout;\n+ uint32_t fFormat;\n+ uint32_t fImageUsageFlags;\n+ uint32_t fSampleCount;\n+ uint32_t fLevelCount;\n+ uint32_t fCurrentQueueFamily;\n+ bool fProtected;\n+ gr_vk_ycbcrconversioninfo_t fYcbcrConversionInfo;\n+ uint32_t fSharingMode;\n+} gr_vk_imageinfo_t;\n+\n+typedef struct vk_instance_t vk_instance_t;\n+typedef struct vk_physical_device_t vk_physical_device_t;\n+typedef struct vk_device_t vk_device_t;\n+typedef struct vk_queue_t vk_queue_t;\n+\n+#define gr_mtl_handle_t const void*\n+\n+typedef struct {\n+ const void* fTexture;\n+} gr_mtl_textureinfo_t;\n+\n+typedef enum {\n+ DIFFERENCE_SK_PATHOP,\n+ INTERSECT_SK_PATHOP,\n+ UNION_SK_PATHOP,\n+ XOR_SK_PATHOP,\n+ REVERSE_DIFFERENCE_SK_PATHOP,\n+} sk_pathop_t;\n+\n+typedef struct sk_opbuilder_t sk_opbuilder_t;\n+\n+typedef enum {\n+ DEFAULT_SK_LATTICE_RECT_TYPE,\n+ TRANSPARENT_SK_LATTICE_RECT_TYPE,\n+ FIXED_COLOR_SK_LATTICE_RECT_TYPE,\n+} sk_lattice_recttype_t;\n+\n+typedef struct {\n+ const int* fXDivs;\n+ const int* fYDivs;\n+ const sk_lattice_recttype_t* fRectTypes;\n+ int fXCount;\n+ int fYCount;\n+ const sk_irect_t* fBounds;\n+ const sk_color_t* fColors;\n+} sk_lattice_t;\n+\n+typedef struct sk_pathmeasure_t sk_pathmeasure_t;\n+\n+typedef enum {\n+ GET_POSITION_SK_PATHMEASURE_MATRIXFLAGS = 0x01,\n+ GET_TANGENT_SK_PATHMEASURE_MATRIXFLAGS = 0x02,\n+ GET_POS_AND_TAN_SK_PATHMEASURE_MATRIXFLAGS = GET_POSITION_SK_PATHMEASURE_MATRIXFLAGS | GET_TANGENT_SK_PATHMEASURE_MATRIXFLAGS,\n+} sk_pathmeasure_matrixflags_t;\n+\n+typedef void (*sk_bitmap_release_proc)(void* addr, void* context);\n+\n+typedef void (*sk_data_release_proc)(const void* ptr, void* context);\n+\n+typedef void (*sk_image_raster_release_proc)(const void* addr, void* context);\n+typedef void (*sk_image_texture_release_proc)(void* context);\n+\n+typedef void (*sk_surface_raster_release_proc)(void* addr, void* context);\n+\n+typedef void (*sk_glyph_path_proc)(const sk_path_t* pathOrNull, const sk_matrix_t* matrix, void* context);\n+\n+typedef enum {\n+ ALLOW_SK_IMAGE_CACHING_HINT,\n+ DISALLOW_SK_IMAGE_CACHING_HINT,\n+} sk_image_caching_hint_t;\n+\n+typedef enum {\n+ NONE_SK_BITMAP_ALLOC_FLAGS = 0,\n+ ZERO_PIXELS_SK_BITMAP_ALLOC_FLAGS = 1 << 0,\n+} sk_bitmap_allocflags_t;\n+\n+typedef struct {\n+ int16_t fTimeZoneMinutes;\n+ uint16_t fYear;\n+ uint8_t fMonth;\n+ uint8_t fDayOfWeek;\n+ uint8_t fDay;\n+ uint8_t fHour;\n+ uint8_t fMinute;\n+ uint8_t fSecond;\n+} sk_document_pdf_datetime_t;\n+\n+typedef struct {\n+ sk_string_t* fTitle;\n+ sk_string_t* fAuthor;\n+ sk_string_t* fSubject;\n+ sk_string_t* fKeywords;\n+ sk_string_t* fCreator;\n+ sk_string_t* fProducer;\n+ sk_document_pdf_datetime_t* fCreation;\n+ sk_document_pdf_datetime_t* fModified;\n+ float fRasterDPI;\n+ bool fPDFA;\n+ int fEncodingQuality;\n+} sk_document_pdf_metadata_t;\n+\n+typedef struct {\n+ sk_colorspace_t* colorspace;\n+ int32_t width;\n+ int32_t height;\n+ sk_colortype_t colorType;\n+ sk_alphatype_t alphaType;\n+} sk_imageinfo_t;\n+\n+typedef enum {\n+ KEEP_SK_CODEC_ANIMATION_DISPOSAL_METHOD = 1,\n+ RESTORE_BG_COLOR_SK_CODEC_ANIMATION_DISPOSAL_METHOD = 2,\n+ RESTORE_PREVIOUS_SK_CODEC_ANIMATION_DISPOSAL_METHOD = 3,\n+} sk_codecanimation_disposalmethod_t;\n+\n+typedef enum {\n+ SRC_OVER_SK_CODEC_ANIMATION_BLEND = 0,\n+ SRC_SK_CODEC_ANIMATION_BLEND = 1,\n+} sk_codecanimation_blend_t;\n+\n+typedef struct {\n+ int fRequiredFrame;\n+ int fDuration;\n+ bool fFullyReceived;\n+ sk_alphatype_t fAlphaType;\n+ bool fHasAlphaWithinBounds;\n+ sk_codecanimation_disposalmethod_t fDisposalMethod;\n+ sk_codecanimation_blend_t fBlend;\n+ sk_irect_t fFrameRect;\n+} sk_codec_frameinfo_t;\n+\n+typedef struct sk_svgcanvas_t sk_svgcanvas_t;\n+\n+typedef enum {\n+ TRIANGLES_SK_VERTICES_VERTEX_MODE,\n+ TRIANGLE_STRIP_SK_VERTICES_VERTEX_MODE,\n+ TRIANGLE_FAN_SK_VERTICES_VERTEX_MODE,\n+} sk_vertices_vertex_mode_t;\n+\n+typedef struct sk_vertices_t sk_vertices_t;\n+\n+typedef struct sk_colorspace_transfer_fn_t {\n+ float fG;\n+ float fA;\n+ float fB;\n+ float fC;\n+ float fD;\n+ float fE;\n+ float fF;\n+} sk_colorspace_transfer_fn_t;\n+\n+typedef struct sk_colorspace_primaries_t {\n+ float fRX;\n+ float fRY;\n+ float fGX;\n+ float fGY;\n+ float fBX;\n+ float fBY;\n+ float fWX;\n+ float fWY;\n+} sk_colorspace_primaries_t;\n+\n+typedef struct sk_colorspace_xyz_t {\n+ float fM00;\n+ float fM01;\n+ float fM02;\n+ float fM10;\n+ float fM11;\n+ float fM12;\n+ float fM20;\n+ float fM21;\n+ float fM22;\n+} sk_colorspace_xyz_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_COLORSPACE_PRIMARIES_CICP = 0,\n+ REC709_SK_COLORSPACE_PRIMARIES_CICP = 1,\n+ REC470_SYSTEM_M_SK_COLORSPACE_PRIMARIES_CICP = 4,\n+ REC470_SYSTEM_BG_SK_COLORSPACE_PRIMARIES_CICP = 5,\n+ REC601_SK_COLORSPACE_PRIMARIES_CICP = 6,\n+ SMPTE_ST240_SK_COLORSPACE_PRIMARIES_CICP = 7,\n+ GENERIC_FILM_SK_COLORSPACE_PRIMARIES_CICP = 8,\n+ REC2020_SK_COLORSPACE_PRIMARIES_CICP = 9,\n+ SMPTE_ST428_1_SK_COLORSPACE_PRIMARIES_CICP = 10,\n+ SMPTE_RP431_2_SK_COLORSPACE_PRIMARIES_CICP = 11,\n+ SMPTE_EG432_1_SK_COLORSPACE_PRIMARIES_CICP = 12,\n+ ITU_T_H273_VALUE22_SK_COLORSPACE_PRIMARIES_CICP = 22,\n+} sk_colorspace_primaries_cicp_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_COLORSPACE_TRANSFER_FN_CICP = 0,\n+ REC709_SK_COLORSPACE_TRANSFER_FN_CICP = 1,\n+ REC470_SYSTEM_M_SK_COLORSPACE_TRANSFER_FN_CICP = 4,\n+ REC470_SYSTEM_BG_SK_COLORSPACE_TRANSFER_FN_CICP = 5,\n+ REC601_SK_COLORSPACE_TRANSFER_FN_CICP = 6,\n+ SMPTE_ST240_SK_COLORSPACE_TRANSFER_FN_CICP = 7,\n+ LINEAR_SK_COLORSPACE_TRANSFER_FN_CICP = 8,\n+ IEC61966_2_4_SK_COLORSPACE_TRANSFER_FN_CICP = 11,\n+ IEC61966_2_1_SK_COLORSPACE_TRANSFER_FN_CICP = 13,\n+ REC2020_10BIT_SK_COLORSPACE_TRANSFER_FN_CICP = 14,\n+ REC2020_12BIT_SK_COLORSPACE_TRANSFER_FN_CICP = 15,\n+ PQ_SK_COLORSPACE_TRANSFER_FN_CICP = 16,\n+ SMPTE_ST428_1_SK_COLORSPACE_TRANSFER_FN_CICP = 17,\n+ HLG_SK_COLORSPACE_TRANSFER_FN_CICP = 18,\n+} sk_colorspace_transfer_fn_cicp_t;\n+\n+typedef struct sk_colorspace_icc_profile_t sk_colorspace_icc_profile_t;\n+\n+typedef enum {\n+ NO_INVERT_SK_HIGH_CONTRAST_CONFIG_INVERT_STYLE,\n+ INVERT_BRIGHTNESS_SK_HIGH_CONTRAST_CONFIG_INVERT_STYLE,\n+ INVERT_LIGHTNESS_SK_HIGH_CONTRAST_CONFIG_INVERT_STYLE,\n+} sk_highcontrastconfig_invertstyle_t;\n+\n+typedef struct {\n+ bool fGrayscale;\n+ sk_highcontrastconfig_invertstyle_t fInvertStyle;\n+ float fContrast;\n+} sk_highcontrastconfig_t;\n+\n+typedef enum {\n+ ZERO_SK_PNGENCODER_FILTER_FLAGS = 0x00,\n+ NONE_SK_PNGENCODER_FILTER_FLAGS = 0x08,\n+ SUB_SK_PNGENCODER_FILTER_FLAGS = 0x10,\n+ UP_SK_PNGENCODER_FILTER_FLAGS = 0x20,\n+ AVG_SK_PNGENCODER_FILTER_FLAGS = 0x40,\n+ PAETH_SK_PNGENCODER_FILTER_FLAGS = 0x80,\n+ ALL_SK_PNGENCODER_FILTER_FLAGS = NONE_SK_PNGENCODER_FILTER_FLAGS |\n+ SUB_SK_PNGENCODER_FILTER_FLAGS |\n+ UP_SK_PNGENCODER_FILTER_FLAGS |\n+ AVG_SK_PNGENCODER_FILTER_FLAGS |\n+ PAETH_SK_PNGENCODER_FILTER_FLAGS,\n+} sk_pngencoder_filterflags_t;\n+\n+typedef struct {\n+ sk_pngencoder_filterflags_t fFilterFlags;\n+ int fZLibLevel;\n+ void* fComments;\n+ const sk_colorspace_icc_profile_t* fICCProfile;\n+ const char* fICCProfileDescription;\n+ const void* fGainmap;\n+ const void* fGainmapInfo;\n+} sk_pngencoder_options_t;\n+\n+typedef enum {\n+ DOWNSAMPLE_420_SK_JPEGENCODER_DOWNSAMPLE,\n+ DOWNSAMPLE_422_SK_JPEGENCODER_DOWNSAMPLE,\n+ DOWNSAMPLE_444_SK_JPEGENCODER_DOWNSAMPLE,\n+} sk_jpegencoder_downsample_t;\n+\n+typedef enum {\n+ IGNORE_SK_JPEGENCODER_ALPHA_OPTION,\n+ BLEND_ON_BLACK_SK_JPEGENCODER_ALPHA_OPTION,\n+} sk_jpegencoder_alphaoption_t;\n+\n+typedef struct {\n+ int fQuality;\n+ sk_jpegencoder_downsample_t fDownsample;\n+ sk_jpegencoder_alphaoption_t fAlphaOption;\n+ const sk_data_t* xmpMetadata;\n+ const sk_colorspace_icc_profile_t* fICCProfile;\n+ const char* fICCProfileDescription;\n+ int32_t fOrigin;\n+ bool fHasOrigin;\n+} sk_jpegencoder_options_t;\n+\n+typedef enum {\n+ LOSSY_SK_WEBPENCODER_COMPTRESSION,\n+ LOSSLESS_SK_WEBPENCODER_COMPTRESSION,\n+} sk_webpencoder_compression_t;\n+\n+typedef struct {\n+ sk_webpencoder_compression_t fCompression;\n+ float fQuality;\n+ const sk_colorspace_icc_profile_t* fICCProfile;\n+ const char* fICCProfileDescription;\n+} sk_webpencoder_options_t;\n+\n+typedef struct sk_rrect_t sk_rrect_t;\n+\n+typedef enum {\n+ EMPTY_SK_RRECT_TYPE,\n+ RECT_SK_RRECT_TYPE,\n+ OVAL_SK_RRECT_TYPE,\n+ SIMPLE_SK_RRECT_TYPE,\n+ NINE_PATCH_SK_RRECT_TYPE,\n+ COMPLEX_SK_RRECT_TYPE,\n+} sk_rrect_type_t;\n+\n+typedef enum {\n+ UPPER_LEFT_SK_RRECT_CORNER,\n+ UPPER_RIGHT_SK_RRECT_CORNER,\n+ LOWER_RIGHT_SK_RRECT_CORNER,\n+ LOWER_LEFT_SK_RRECT_CORNER,\n+} sk_rrect_corner_t;\n+\n+typedef struct sk_textblob_t sk_textblob_t;\n+typedef struct sk_textblob_builder_t sk_textblob_builder_t;\n+\n+typedef struct {\n+ void* glyphs;\n+ void* pos;\n+ void* utf8text;\n+ void* clusters;\n+} sk_textblob_builder_runbuffer_t;\n+\n+typedef struct {\n+ float fSCos;\n+ float fSSin;\n+ float fTX;\n+ float fTY;\n+} sk_rsxform_t;\n+\n+typedef struct sk_tracememorydump_t sk_tracememorydump_t;\n+\n+typedef struct sk_runtimeeffect_t sk_runtimeeffect_t;\n+\n+typedef enum {\n+ FLOAT_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT2_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT3_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT4_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT2X2_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT3X3_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT4X4_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ INT_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ INT2_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ INT3_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ INT4_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+} sk_runtimeeffect_uniform_type_t;\n+\n+typedef enum {\n+ SHADER_SK_RUNTIMEEFFECT_CHILD_TYPE,\n+ COLOR_FILTER_SK_RUNTIMEEFFECT_CHILD_TYPE,\n+ BLENDER_SK_RUNTIMEEFFECT_CHILD_TYPE,\n+} sk_runtimeeffect_child_type_t;\n+\n+typedef enum {\n+ NONE_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x00,\n+ ARRAY_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x01,\n+ COLOR_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x02,\n+ VERTEX_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x04,\n+ FRAGMENT_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x08,\n+ HALF_PRECISION_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x10,\n+} sk_runtimeeffect_uniform_flags_t;\n+\n+typedef struct {\n+ const char* fName;\n+ size_t fNameLength;\n+ size_t fOffset;\n+ sk_runtimeeffect_uniform_type_t fType;\n+ int fCount;\n+ sk_runtimeeffect_uniform_flags_t fFlags;\n+} sk_runtimeeffect_uniform_t;\n+\n+typedef struct {\n+ const char* fName;\n+ size_t fNameLength;\n+ sk_runtimeeffect_child_type_t fType;\n+ int fIndex;\n+} sk_runtimeeffect_child_t;\n+\n+typedef enum {\n+ NEAREST_SK_FILTER_MODE,\n+ LINEAR_SK_FILTER_MODE,\n+} sk_filter_mode_t;\n+\n+typedef enum {\n+ NONE_SK_MIPMAP_MODE,\n+ NEAREST_SK_MIPMAP_MODE,\n+ LINEAR_SK_MIPMAP_MODE,\n+} sk_mipmap_mode_t;\n+\n+typedef struct {\n+ float fB;\n+ float fC;\n+} sk_cubic_resampler_t;\n+\n+typedef struct {\n+ int fMaxAniso;\n+ bool fUseCubic;\n+ sk_cubic_resampler_t fCubic;\n+ sk_filter_mode_t fFilter;\n+ sk_mipmap_mode_t fMipmap;\n+} sk_sampling_options_t;\n+\n+typedef enum {\n+ NONE_SK_CANVAS_SAVELAYERREC_FLAGS = 0,\n+ PRESERVE_LCD_TEXT_SK_CANVAS_SAVELAYERREC_FLAGS = 1 << 1,\n+ INITIALIZE_WITH_PREVIOUS_SK_CANVAS_SAVELAYERREC_FLAGS = 1 << 2,\n+ F16_COLOR_TYPE_SK_CANVAS_SAVELAYERREC_FLAGS = 1 << 4,\n+} sk_canvas_savelayerrec_flags_t;\n+\n+typedef struct {\n+ sk_rect_t* fBounds;\n+ sk_paint_t* fPaint;\n+ sk_imagefilter_t* fBackdrop;\n+ sk_canvas_savelayerrec_flags_t fFlags;\n+} sk_canvas_savelayerrec_t;\n+\n+/*\n+ * Skottie Animation\n+ */\n+typedef struct skottie_animation_t skottie_animation_t;\n+typedef struct skottie_animation_builder_t skottie_animation_builder_t;\n+typedef struct skottie_resource_provider_t skottie_resource_provider_t;\n+typedef struct skottie_property_observer_t skottie_property_observer_t;\n+typedef struct skottie_logger_t skottie_logger_t;\n+typedef struct skottie_marker_observer_t skottie_marker_observer_t;\n+\n+typedef struct sksg_invalidation_controller_t sksg_invalidation_controller_t;\n+\n+typedef enum {\n+ SKIP_TOP_LEVEL_ISOLATION = 0x01,\n+ DISABLE_TOP_LEVEL_CLIPPING = 0x02,\n+} skottie_animation_renderflags_t;\n+\n+typedef enum {\n+ NONE_SKOTTIE_ANIMATION_BUILDER_FLAGS = 0,\n+ DEFER_IMAGE_LOADING_SKOTTIE_ANIMATION_BUILDER_FLAGS = 0x01,\n+ PREFER_EMBEDDED_FONTS_SKOTTIE_ANIMATION_BUILDER_FLAGS = 0x02,\n+} skottie_animation_builder_flags_t;\n+\n+typedef struct {\n+ float fTotalLoadTimeMS;\n+ float fJsonParseTimeMS;\n+ float fSceneParseTimeMS;\n+ size_t fJsonSize;\n+ size_t fAnimatorCount;\n+} skottie_animation_builder_stats_t;\n+\n+typedef struct skresources_image_asset_t skresources_image_asset_t;\n+typedef struct skresources_multi_frame_image_asset_t skresources_multi_frame_image_asset_t;\n+typedef struct skresources_external_track_asset_t skresources_external_track_asset_t;\n+\n+typedef struct skresources_resource_provider_t skresources_resource_provider_t;\n+\n+SK_C_PLUS_PLUS_END_GUARD\n+\n+typedef struct d3d_dxgi_adapter_t d3d_dxgi_adapter_t;\n+typedef struct d3d_d12_device_t d3d_d12_device_t;\n+typedef struct d3d_d12_command_queue_t d3d_d12_command_queue_t;\n+typedef struct gr_d3d_memory_allocator_t gr_d3d_memory_allocator_t;\n+typedef struct {\n+ d3d_dxgi_adapter_t* fAdapter;\n+ d3d_d12_device_t* fDevice;\n+ d3d_d12_command_queue_t* fQueue;\n+ gr_d3d_memory_allocator_t* fMemoryAllocator;\n+ bool fProtectedContext;\n+} gr_d3d_backendcontext_t;\n+\n+typedef struct d3d_d12_resource_t d3d_d12_resource_t;\n+typedef struct d3d_alloc_t d3d_alloc_t;\n+typedef struct {\n+ d3d_d12_resource_t* fResource;\n+ d3d_alloc_t* fAlloc;\n+ uint32_t fResourceState;\n+ uint32_t fFormat;\n+ uint32_t fSampleCount;\n+ uint32_t fLevelCount;\n+ unsigned int fSampleQualityPattern;\n+ bool fProtected;\n+} gr_d3d_textureresourceinfo_t;\n+\n+#endif", "newDiff": "diff --git a/include/c/sk_types.h b/include/c/sk_types.h\nnew file mode 100644\nindex 0000000000..75e5113365\n--- /dev/null\n+++ b/include/c/sk_types.h\n@@ -0,0 +1,1203 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#ifndef sk_types_DEFINED\n+#define sk_types_DEFINED\n+\n+#include <stdint.h>\n+#include <stddef.h>\n+\n+#ifdef __cplusplus\n+ #define SK_C_PLUS_PLUS_BEGIN_GUARD extern \"C\" {\n+ #define SK_C_PLUS_PLUS_END_GUARD }\n+#else\n+ #include <stdbool.h>\n+ #define SK_C_PLUS_PLUS_BEGIN_GUARD\n+ #define SK_C_PLUS_PLUS_END_GUARD\n+#endif\n+\n+#if !defined(SK_C_API)\n+ #if defined(SKIA_C_DLL)\n+ #if defined(_MSC_VER)\n+ #if SKIA_IMPLEMENTATION\n+ #define SK_C_API __declspec(dllexport)\n+ #else\n+ #define SK_C_API __declspec(dllimport)\n+ #endif\n+ #else\n+ #define SK_C_API __attribute__((visibility(\"default\")))\n+ #endif\n+ #else\n+ #define SK_C_API\n+ #endif\n+#endif\n+\n+#if defined(_WIN32)\n+ // On Windows, Vulkan commands use the stdcall convention\n+ #define VKAPI_ATTR\n+ #define VKAPI_CALL __stdcall\n+ #define VKAPI_PTR VKAPI_CALL\n+#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7\n+ #error \"Vulkan isn't supported for the 'armeabi' NDK ABI\"\n+#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE)\n+ // On Android 32-bit ARM targets, Vulkan functions use the \"hardfloat\"\n+ // calling convention, i.e. float parameters are passed in registers. This\n+ // is true even if the rest of the application passes floats on the stack,\n+ // as it does by default when compiling for the armeabi-v7a NDK ABI.\n+ #define VKAPI_ATTR __attribute__((pcs(\"aapcs-vfp\")))\n+ #define VKAPI_CALL\n+ #define VKAPI_PTR VKAPI_ATTR\n+#else\n+ // On other platforms, use the default calling convention\n+ #define VKAPI_ATTR\n+ #define VKAPI_CALL\n+ #define VKAPI_PTR\n+#endif\n+\n+#if !defined(SK_TO_STRING)\n+ #define SK_TO_STRING(X) SK_TO_STRING_IMPL(X)\n+ #define SK_TO_STRING_IMPL(X) #X\n+#endif\n+\n+#ifndef SK_C_INCREMENT\n+#define SK_C_INCREMENT 0\n+#endif\n+\n+///////////////////////////////////////////////////////////////////////////////////////\n+\n+SK_C_PLUS_PLUS_BEGIN_GUARD\n+\n+typedef struct sk_refcnt_t sk_refcnt_t;\n+typedef struct sk_nvrefcnt_t sk_nvrefcnt_t;\n+\n+typedef struct sk_flattenable_t sk_flattenable_t;\n+\n+typedef uint32_t sk_color_t;\n+typedef uint32_t sk_pmcolor_t;\n+\n+/* This macro assumes all arguments are >=0 and <=255. */\n+#define sk_color_set_argb(a, r, g, b) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))\n+#define sk_color_get_a(c) (((c) >> 24) & 0xFF)\n+#define sk_color_get_r(c) (((c) >> 16) & 0xFF)\n+#define sk_color_get_g(c) (((c) >> 8) & 0xFF)\n+#define sk_color_get_b(c) (((c) >> 0) & 0xFF)\n+\n+typedef struct sk_color4f_t {\n+ float fR;\n+ float fG;\n+ float fB;\n+ float fA;\n+} sk_color4f_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_COLORTYPE = 0,\n+ ALPHA_8_SK_COLORTYPE,\n+ RGB_565_SK_COLORTYPE,\n+ ARGB_4444_SK_COLORTYPE,\n+ RGBA_8888_SK_COLORTYPE,\n+ RGB_888X_SK_COLORTYPE,\n+ BGRA_8888_SK_COLORTYPE,\n+ RGBA_1010102_SK_COLORTYPE,\n+ BGRA_1010102_SK_COLORTYPE,\n+ RGB_101010X_SK_COLORTYPE,\n+ BGR_101010X_SK_COLORTYPE,\n+ BGR_101010X_XR_SK_COLORTYPE,\n+ BGRA_10101010_XR_SK_COLORTYPE,\n+ RGBA_10X6_SK_COLORTYPE,\n+ GRAY_8_SK_COLORTYPE,\n+ RGBA_F16_NORM_SK_COLORTYPE,\n+ RGBA_F16_SK_COLORTYPE,\n+ RGB_F16F16F16X_SK_COLORTYPE,\n+ RGBA_F32_SK_COLORTYPE,\n+\n+ // READONLY\n+ R8G8_UNORM_SK_COLORTYPE,\n+ A16_FLOAT_SK_COLORTYPE,\n+ R16G16_FLOAT_SK_COLORTYPE,\n+ A16_UNORM_SK_COLORTYPE,\n+ R16_UNORM_SK_COLORTYPE,\n+ R16G16_UNORM_SK_COLORTYPE,\n+ R16G16B16A16_UNORM_SK_COLORTYPE,\n+ SRGBA_8888_SK_COLORTYPE,\n+ R8_UNORM_SK_COLORTYPE,\n+} sk_colortype_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_ALPHATYPE,\n+ OPAQUE_SK_ALPHATYPE,\n+ PREMUL_SK_ALPHATYPE,\n+ UNPREMUL_SK_ALPHATYPE,\n+} sk_alphatype_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_PIXELGEOMETRY,\n+ RGB_H_SK_PIXELGEOMETRY,\n+ BGR_H_SK_PIXELGEOMETRY,\n+ RGB_V_SK_PIXELGEOMETRY,\n+ BGR_V_SK_PIXELGEOMETRY,\n+} sk_pixelgeometry_t;\n+\n+typedef enum {\n+ NONE_SK_SURFACE_PROPS_FLAGS = 0,\n+ USE_DEVICE_INDEPENDENT_FONTS_SK_SURFACE_PROPS_FLAGS = 1 << 0,\n+} sk_surfaceprops_flags_t;\n+\n+typedef struct sk_surfaceprops_t sk_surfaceprops_t;\n+\n+typedef struct {\n+ float x;\n+ float y;\n+} sk_point_t;\n+\n+typedef sk_point_t sk_vector_t;\n+\n+typedef struct {\n+ int32_t left;\n+ int32_t top;\n+ int32_t right;\n+ int32_t bottom;\n+} sk_irect_t;\n+\n+typedef struct {\n+ float left;\n+ float top;\n+ float right;\n+ float bottom;\n+} sk_rect_t;\n+\n+typedef struct {\n+ float scaleX, skewX, transX;\n+ float skewY, scaleY, transY;\n+ float persp0, persp1, persp2;\n+} sk_matrix_t;\n+\n+// row major\n+typedef struct {\n+ // name: m<row><col>\n+ float m00, m01, m02, m03; // row 0\n+ float m10, m11, m12, m13; // row 1\n+ float m20, m21, m22, m23; // row 2\n+ float m30, m31, m32, m33; // row 3\n+} sk_matrix44_t;\n+\n+/**\n+ A sk_canvas_t encapsulates all of the state about drawing into a\n+ destination This includes a reference to the destination itself,\n+ and a stack of matrix/clip values.\n+*/\n+typedef struct sk_canvas_t sk_canvas_t;\n+typedef struct sk_nodraw_canvas_t sk_nodraw_canvas_t;\n+typedef struct sk_nway_canvas_t sk_nway_canvas_t;\n+typedef struct sk_overdraw_canvas_t sk_overdraw_canvas_t;\n+/**\n+ A sk_data_ holds an immutable data buffer.\n+*/\n+typedef struct sk_data_t sk_data_t;\n+/**\n+ A sk_drawable_t is a abstraction for drawings that changed while\n+ drawing.\n+*/\n+typedef struct sk_drawable_t sk_drawable_t;\n+/**\n+ A sk_image_t is an abstraction for drawing a rectagle of pixels.\n+ The content of the image is always immutable, though the actual\n+ storage may change, if for example that image can be re-created via\n+ encoded data or other means.\n+*/\n+typedef struct sk_image_t sk_image_t;\n+/**\n+ A sk_maskfilter_t is an object that perform transformations on an\n+ alpha-channel mask before drawing it; it may be installed into a\n+ sk_paint_t. Each time a primitive is drawn, it is first\n+ scan-converted into a alpha mask, which os handed to the\n+ maskfilter, which may create a new mask is to render into the\n+ destination.\n+ */\n+typedef struct sk_maskfilter_t sk_maskfilter_t;\n+/**\n+ A sk_paint_t holds the style and color information about how to\n+ draw geometries, text and bitmaps.\n+*/\n+typedef struct sk_paint_t sk_paint_t;\n+typedef struct sk_font_t sk_font_t;\n+/**\n+ A sk_path_t encapsulates compound (multiple contour) geometric\n+ paths consisting of straight line segments, quadratic curves, and\n+ cubic curves.\n+*/\n+typedef struct sk_path_t sk_path_t;\n+typedef struct sk_pathbuilder_t sk_pathbuilder_t;\n+/**\n+ A sk_picture_t holds recorded canvas drawing commands to be played\n+ back at a later time.\n+*/\n+typedef struct sk_picture_t sk_picture_t;\n+/**\n+ A sk_picture_recorder_t holds a sk_canvas_t that records commands\n+ to create a sk_picture_t.\n+*/\n+typedef struct sk_picture_recorder_t sk_picture_recorder_t;\n+/**\n+ A sk_bbh_factory_t generates an sk_bbox_hierarchy as a display optimization\n+ for culling invisible calls recorded by a sk_picture_recorder. It may\n+ be passed in to sk_picture_recorder_begin_recording_with_bbh_factory,\n+ typically as an instance of the subclass sk_rtree_factory_t.\n+*/\n+typedef struct sk_bbh_factory_t sk_bbh_factory_t;\n+/**\n+ A sk_rtree_factory_t generates a sk_rtree as a display optimization\n+ for culling invisible calls recorded by a sk_picture_recorder_t. Inherits\n+ from sk_bbh_factory_t.\n+*/\n+typedef struct sk_rtree_factory_t sk_rtree_factory_t;\n+/**\n+ A sk_shader_t specifies the source color(s) for what is being drawn. If a\n+ paint has no shader, then the paint's color is used. If the paint\n+ has a shader, then the shader's color(s) are use instead, but they\n+ are modulated by the paint's alpha.\n+*/\n+typedef struct sk_shader_t sk_shader_t;\n+/**\n+ A sk_surface_t holds the destination for drawing to a canvas. For\n+ raster drawing, the destination is an array of pixels in memory.\n+ For GPU drawing, the destination is a texture or a framebuffer.\n+*/\n+typedef struct sk_surface_t sk_surface_t;\n+/**\n+ The sk_region encapsulates the geometric region used to specify\n+ clipping areas for drawing.\n+*/\n+typedef struct sk_region_t sk_region_t;\n+typedef struct sk_region_iterator_t sk_region_iterator_t;\n+typedef struct sk_region_cliperator_t sk_region_cliperator_t;\n+typedef struct sk_region_spanerator_t sk_region_spanerator_t;\n+\n+typedef enum {\n+ CLEAR_SK_BLENDMODE,\n+ SRC_SK_BLENDMODE,\n+ DST_SK_BLENDMODE,\n+ SRCOVER_SK_BLENDMODE,\n+ DSTOVER_SK_BLENDMODE,\n+ SRCIN_SK_BLENDMODE,\n+ DSTIN_SK_BLENDMODE,\n+ SRCOUT_SK_BLENDMODE,\n+ DSTOUT_SK_BLENDMODE,\n+ SRCATOP_SK_BLENDMODE,\n+ DSTATOP_SK_BLENDMODE,\n+ XOR_SK_BLENDMODE,\n+ PLUS_SK_BLENDMODE,\n+ MODULATE_SK_BLENDMODE,\n+ SCREEN_SK_BLENDMODE,\n+ OVERLAY_SK_BLENDMODE,\n+ DARKEN_SK_BLENDMODE,\n+ LIGHTEN_SK_BLENDMODE,\n+ COLORDODGE_SK_BLENDMODE,\n+ COLORBURN_SK_BLENDMODE,\n+ HARDLIGHT_SK_BLENDMODE,\n+ SOFTLIGHT_SK_BLENDMODE,\n+ DIFFERENCE_SK_BLENDMODE,\n+ EXCLUSION_SK_BLENDMODE,\n+ MULTIPLY_SK_BLENDMODE,\n+ HUE_SK_BLENDMODE,\n+ SATURATION_SK_BLENDMODE,\n+ COLOR_SK_BLENDMODE,\n+ LUMINOSITY_SK_BLENDMODE,\n+} sk_blendmode_t;\n+\n+//////////////////////////////////////////////////////////////////////////////////////////\n+\n+typedef struct {\n+ float x;\n+ float y;\n+ float z;\n+} sk_point3_t;\n+\n+typedef struct {\n+ int32_t x;\n+ int32_t y;\n+} sk_ipoint_t;\n+\n+typedef struct {\n+ float w;\n+ float h;\n+} sk_size_t;\n+\n+typedef struct {\n+ int32_t w;\n+ int32_t h;\n+} sk_isize_t;\n+\n+typedef struct {\n+ uint32_t fFlags;\n+ float fTop;\n+ float fAscent;\n+ float fDescent;\n+ float fBottom;\n+ float fLeading;\n+ float fAvgCharWidth;\n+ float fMaxCharWidth;\n+ float fXMin;\n+ float fXMax;\n+ float fXHeight;\n+ float fCapHeight;\n+ float fUnderlineThickness;\n+ float fUnderlinePosition;\n+ float fStrikeoutThickness;\n+ float fStrikeoutPosition;\n+} sk_fontmetrics_t;\n+\n+// Flags for fFlags member of sk_fontmetrics_t\n+#define FONTMETRICS_FLAGS_UNDERLINE_THICKNESS_IS_VALID (1U << 0)\n+#define FONTMETRICS_FLAGS_UNDERLINE_POSITION_IS_VALID (1U << 1)\n+\n+/**\n+ A lightweight managed string.\n+*/\n+typedef struct sk_string_t sk_string_t;\n+/**\n+\n+ A sk_bitmap_t is an abstraction that specifies a raster bitmap.\n+*/\n+typedef struct sk_bitmap_t sk_bitmap_t;\n+typedef struct sk_pixmap_t sk_pixmap_t;\n+typedef struct sk_colorfilter_t sk_colorfilter_t;\n+typedef struct sk_imagefilter_t sk_imagefilter_t;\n+\n+typedef struct sk_blender_t sk_blender_t;\n+\n+/**\n+ A sk_typeface_t pecifies the typeface and intrinsic style of a font.\n+ This is used in the paint, along with optionally algorithmic settings like\n+ textSize, textSkewX, textScaleX, kFakeBoldText_Mask, to specify\n+ how text appears when drawn (and measured).\n+\n+ Typeface objects are immutable, and so they can be shared between threads.\n+*/\n+typedef struct sk_typeface_t sk_typeface_t;\n+typedef uint32_t sk_font_table_tag_t;\n+typedef struct sk_fontmgr_t sk_fontmgr_t;\n+typedef struct sk_fontstyle_t sk_fontstyle_t;\n+typedef struct sk_fontstyleset_t sk_fontstyleset_t;\n+/**\n+ * Abstraction layer directly on top of an image codec.\n+ */\n+typedef struct sk_codec_t sk_codec_t;\n+typedef struct sk_colorspace_t sk_colorspace_t;\n+/**\n+ Various stream types\n+*/\n+typedef struct sk_stream_t sk_stream_t;\n+typedef struct sk_stream_filestream_t sk_stream_filestream_t;\n+typedef struct sk_stream_asset_t sk_stream_asset_t;\n+typedef struct sk_stream_memorystream_t sk_stream_memorystream_t;\n+typedef struct sk_stream_streamrewindable_t sk_stream_streamrewindable_t;\n+typedef struct sk_wstream_t sk_wstream_t;\n+typedef struct sk_wstream_filestream_t sk_wstream_filestream_t;\n+typedef struct sk_wstream_dynamicmemorystream_t sk_wstream_dynamicmemorystream_t;\n+/**\n+ High-level API for creating a document-based canvas.\n+*/\n+typedef struct sk_document_t sk_document_t;\n+\n+typedef enum {\n+ POINTS_SK_POINT_MODE,\n+ LINES_SK_POINT_MODE,\n+ POLYGON_SK_POINT_MODE\n+} sk_point_mode_t;\n+\n+typedef enum {\n+ LEFT_SK_TEXT_ALIGN,\n+ CENTER_SK_TEXT_ALIGN,\n+ RIGHT_SK_TEXT_ALIGN\n+} sk_text_align_t;\n+\n+typedef enum {\n+ UTF8_SK_TEXT_ENCODING,\n+ UTF16_SK_TEXT_ENCODING,\n+ UTF32_SK_TEXT_ENCODING,\n+ GLYPH_ID_SK_TEXT_ENCODING\n+} sk_text_encoding_t;\n+\n+typedef enum {\n+ WINDING_SK_PATH_FILLTYPE,\n+ EVENODD_SK_PATH_FILLTYPE,\n+ INVERSE_WINDING_SK_PATH_FILLTYPE,\n+ INVERSE_EVENODD_SK_PATH_FILLTYPE,\n+} sk_path_filltype_t;\n+\n+typedef enum {\n+ UPRIGHT_SK_FONT_STYLE_SLANT = 0,\n+ ITALIC_SK_FONT_STYLE_SLANT = 1,\n+ OBLIQUE_SK_FONT_STYLE_SLANT = 2,\n+} sk_font_style_slant_t;\n+\n+typedef enum {\n+ R_SK_COLOR_CHANNEL,\n+ G_SK_COLOR_CHANNEL,\n+ B_SK_COLOR_CHANNEL,\n+ A_SK_COLOR_CHANNEL,\n+} sk_color_channel_t;\n+\n+/**\n+ The logical operations that can be performed when combining two regions.\n+*/\n+typedef enum {\n+ DIFFERENCE_SK_REGION_OP, //!< subtract the op region from the first region\n+ INTERSECT_SK_REGION_OP, //!< intersect the two regions\n+ UNION_SK_REGION_OP, //!< union (inclusive-or) the two regions\n+ XOR_SK_REGION_OP, //!< exclusive-or the two regions\n+ REVERSE_DIFFERENCE_SK_REGION_OP, //!< subtract the first region from the op region\n+ REPLACE_SK_REGION_OP, //!< replace the dst region with the op region\n+} sk_region_op_t;\n+\n+typedef enum {\n+ DIFFERENCE_SK_CLIPOP,\n+ INTERSECT_SK_CLIPOP,\n+} sk_clipop_t;\n+\n+/**\n+ * Enum describing format of encoded data.\n+ */\n+typedef enum {\n+ BMP_SK_ENCODED_FORMAT,\n+ GIF_SK_ENCODED_FORMAT,\n+ ICO_SK_ENCODED_FORMAT,\n+ JPEG_SK_ENCODED_FORMAT,\n+ PNG_SK_ENCODED_FORMAT,\n+ WBMP_SK_ENCODED_FORMAT,\n+ WEBP_SK_ENCODED_FORMAT,\n+ PKM_SK_ENCODED_FORMAT,\n+ KTX_SK_ENCODED_FORMAT,\n+ ASTC_SK_ENCODED_FORMAT,\n+ DNG_SK_ENCODED_FORMAT,\n+ HEIF_SK_ENCODED_FORMAT,\n+ AVIF_SK_ENCODED_FORMAT,\n+ JPEGXL_SK_ENCODED_FORMAT,\n+} sk_encoded_image_format_t;\n+\n+typedef enum {\n+ TOP_LEFT_SK_ENCODED_ORIGIN = 1, // Default\n+ TOP_RIGHT_SK_ENCODED_ORIGIN = 2, // Reflected across y-axis\n+ BOTTOM_RIGHT_SK_ENCODED_ORIGIN = 3, // Rotated 180\n+ BOTTOM_LEFT_SK_ENCODED_ORIGIN = 4, // Reflected across x-axis\n+ LEFT_TOP_SK_ENCODED_ORIGIN = 5, // Reflected across x-axis, Rotated 90 CCW\n+ RIGHT_TOP_SK_ENCODED_ORIGIN = 6, // Rotated 90 CW\n+ RIGHT_BOTTOM_SK_ENCODED_ORIGIN = 7, // Reflected across x-axis, Rotated 90 CW\n+ LEFT_BOTTOM_SK_ENCODED_ORIGIN = 8, // Rotated 90 CCW\n+ DEFAULT_SK_ENCODED_ORIGIN = TOP_LEFT_SK_ENCODED_ORIGIN,\n+} sk_encodedorigin_t;\n+\n+typedef enum {\n+ SUCCESS_SK_CODEC_RESULT,\n+ INCOMPLETE_INPUT_SK_CODEC_RESULT,\n+ ERROR_IN_INPUT_SK_CODEC_RESULT,\n+ INVALID_CONVERSION_SK_CODEC_RESULT,\n+ INVALID_SCALE_SK_CODEC_RESULT,\n+ INVALID_PARAMETERS_SK_CODEC_RESULT,\n+ INVALID_INPUT_SK_CODEC_RESULT,\n+ COULD_NOT_REWIND_SK_CODEC_RESULT,\n+ INTERNAL_ERROR_SK_CODEC_RESULT,\n+ UNIMPLEMENTED_SK_CODEC_RESULT,\n+} sk_codec_result_t;\n+\n+typedef enum {\n+ YES_SK_CODEC_ZERO_INITIALIZED,\n+ NO_SK_CODEC_ZERO_INITIALIZED,\n+} sk_codec_zero_initialized_t;\n+\n+typedef struct {\n+ sk_codec_zero_initialized_t fZeroInitialized;\n+ sk_irect_t* fSubset;\n+ int fFrameIndex;\n+ int fPriorFrame;\n+ size_t fMaxDecodeMemory;\n+} sk_codec_options_t;\n+\n+typedef enum {\n+ TOP_DOWN_SK_CODEC_SCANLINE_ORDER,\n+ BOTTOM_UP_SK_CODEC_SCANLINE_ORDER,\n+} sk_codec_scanline_order_t;\n+\n+// The verbs that can be foudn on a path\n+typedef enum {\n+ MOVE_SK_PATH_VERB,\n+ LINE_SK_PATH_VERB,\n+ QUAD_SK_PATH_VERB,\n+ CONIC_SK_PATH_VERB,\n+ CUBIC_SK_PATH_VERB,\n+ CLOSE_SK_PATH_VERB,\n+ DONE_SK_PATH_VERB\n+} sk_path_verb_t;\n+\n+typedef struct sk_path_iterator_t sk_path_iterator_t;\n+typedef struct sk_path_rawiterator_t sk_path_rawiterator_t;\n+\n+typedef enum {\n+ APPEND_SK_PATH_ADD_MODE,\n+ EXTEND_SK_PATH_ADD_MODE,\n+} sk_path_add_mode_t;\n+\n+typedef enum {\n+ LINE_SK_PATH_SEGMENT_MASK = 1 << 0,\n+ QUAD_SK_PATH_SEGMENT_MASK = 1 << 1,\n+ CONIC_SK_PATH_SEGMENT_MASK = 1 << 2,\n+ CUBIC_SK_PATH_SEGMENT_MASK = 1 << 3,\n+} sk_path_segment_mask_t;\n+\n+typedef enum {\n+ TRANSLATE_SK_PATH_EFFECT_1D_STYLE,\n+ ROTATE_SK_PATH_EFFECT_1D_STYLE,\n+ MORPH_SK_PATH_EFFECT_1D_STYLE,\n+} sk_path_effect_1d_style_t;\n+\n+typedef enum {\n+ NORMAL_SK_PATH_EFFECT_TRIM_MODE,\n+ INVERTED_SK_PATH_EFFECT_TRIM_MODE,\n+} sk_path_effect_trim_mode_t;\n+\n+typedef struct sk_path_effect_t sk_path_effect_t;\n+\n+typedef enum {\n+ BUTT_SK_STROKE_CAP,\n+ ROUND_SK_STROKE_CAP,\n+ SQUARE_SK_STROKE_CAP\n+} sk_stroke_cap_t;\n+\n+typedef enum {\n+ MITER_SK_STROKE_JOIN,\n+ ROUND_SK_STROKE_JOIN,\n+ BEVEL_SK_STROKE_JOIN\n+} sk_stroke_join_t;\n+\n+typedef enum {\n+ CLAMP_SK_SHADER_TILEMODE,\n+ REPEAT_SK_SHADER_TILEMODE,\n+ MIRROR_SK_SHADER_TILEMODE,\n+ DECAL_SK_SHADER_TILEMODE,\n+} sk_shader_tilemode_t;\n+\n+typedef enum {\n+ NORMAL_SK_BLUR_STYLE, //!< fuzzy inside and outside\n+ SOLID_SK_BLUR_STYLE, //!< solid inside, fuzzy outside\n+ OUTER_SK_BLUR_STYLE, //!< nothing inside, fuzzy outside\n+ INNER_SK_BLUR_STYLE, //!< fuzzy inside, nothing outside\n+} sk_blurstyle_t;\n+\n+typedef enum {\n+ CW_SK_PATH_DIRECTION,\n+ CCW_SK_PATH_DIRECTION,\n+} sk_path_direction_t;\n+\n+typedef enum {\n+ SMALL_SK_PATH_ARC_SIZE,\n+ LARGE_SK_PATH_ARC_SIZE,\n+} sk_path_arc_size_t;\n+\n+typedef enum {\n+ FILL_SK_PAINT_STYLE,\n+ STROKE_SK_PAINT_STYLE,\n+ STROKE_AND_FILL_SK_PAINT_STYLE,\n+} sk_paint_style_t;\n+\n+typedef enum {\n+ NONE_SK_FONT_HINTING,\n+ SLIGHT_SK_FONT_HINTING,\n+ NORMAL_SK_FONT_HINTING,\n+ FULL_SK_FONT_HINTING,\n+} sk_font_hinting_t;\n+\n+typedef enum {\n+ ALIAS_SK_FONT_EDGING,\n+ ANTIALIAS_SK_FONT_EDGING,\n+ SUBPIXEL_ANTIALIAS_SK_FONT_EDGING,\n+} sk_font_edging_t;\n+\n+typedef struct sk_pixelref_factory_t sk_pixelref_factory_t;\n+\n+typedef enum {\n+ TOP_LEFT_GR_SURFACE_ORIGIN,\n+ BOTTOM_LEFT_GR_SURFACE_ORIGIN,\n+} gr_surfaceorigin_t;\n+\n+typedef struct {\n+ bool fAvoidStencilBuffers;\n+ int fRuntimeProgramCacheSize;\n+ size_t fGlyphCacheTextureMaximumBytes;\n+ bool fAllowPathMaskCaching;\n+ bool fDoManualMipmapping;\n+ int fBufferMapThreshold;\n+} gr_context_options_t;\n+\n+typedef intptr_t gr_backendobject_t;\n+\n+typedef struct gr_backendrendertarget_t gr_backendrendertarget_t;\n+typedef struct gr_backendtexture_t gr_backendtexture_t;\n+\n+typedef struct gr_direct_context_t gr_direct_context_t;\n+typedef struct gr_recording_context_t gr_recording_context_t;\n+\n+typedef enum {\n+ OPENGL_GR_BACKEND = 0,\n+ VULKAN_GR_BACKEND = 1,\n+ METAL_GR_BACKEND = 2,\n+ DIRECT3D_GR_BACKEND = 3,\n+ UNSUPPORTED_GR_BACKEND = 5,\n+} gr_backend_t;\n+\n+typedef intptr_t gr_backendcontext_t;\n+\n+typedef struct gr_glinterface_t gr_glinterface_t;\n+\n+typedef void (*gr_gl_func_ptr)(void);\n+typedef gr_gl_func_ptr (*gr_gl_get_proc)(void* ctx, const char* name);\n+\n+typedef struct {\n+ unsigned int fTarget;\n+ unsigned int fID;\n+ unsigned int fFormat;\n+ bool fProtected;\n+} gr_gl_textureinfo_t;\n+\n+typedef struct {\n+ unsigned int fFBOID;\n+ unsigned int fFormat;\n+ bool fProtected;\n+} gr_gl_framebufferinfo_t;\n+\n+typedef struct vk_instance_t vk_instance_t;\n+typedef struct gr_vkinterface_t gr_vkinterface_t;\n+typedef struct vk_physical_device_t vk_physical_device_t;\n+typedef struct vk_physical_device_features_t vk_physical_device_features_t;\n+typedef struct vk_physical_device_features_2_t vk_physical_device_features_2_t;\n+typedef struct vk_device_t vk_device_t;\n+typedef struct vk_queue_t vk_queue_t;\n+\n+typedef struct gr_vk_extensions_t gr_vk_extensions_t;\n+typedef struct gr_vk_memory_allocator_t gr_vk_memory_allocator_t;\n+\n+typedef VKAPI_ATTR void (VKAPI_CALL *gr_vk_func_ptr)(void);\n+typedef gr_vk_func_ptr (*gr_vk_get_proc)(void* ctx, const char* name, vk_instance_t* instance, vk_device_t* device);\n+\n+typedef struct {\n+ vk_instance_t* fInstance;\n+ vk_physical_device_t* fPhysicalDevice;\n+ vk_device_t* fDevice;\n+ vk_queue_t* fQueue;\n+ uint32_t fGraphicsQueueIndex;\n+ uint32_t fMaxAPIVersion;\n+ const gr_vk_extensions_t* fVkExtensions;\n+ const vk_physical_device_features_t* fDeviceFeatures;\n+ const vk_physical_device_features_2_t* fDeviceFeatures2;\n+ gr_vk_memory_allocator_t* fMemoryAllocator;\n+ gr_vk_get_proc fGetProc;\n+ void* fGetProcUserData;\n+ bool fProtectedContext;\n+} gr_vk_backendcontext_t;\n+\n+typedef intptr_t gr_vk_backendmemory_t;\n+\n+typedef struct {\n+ uint64_t fMemory;\n+ uint64_t fOffset;\n+ uint64_t fSize;\n+ uint32_t fFlags;\n+ gr_vk_backendmemory_t fBackendMemory;\n+ bool _private_fUsesSystemHeap;\n+} gr_vk_alloc_t;\n+\n+typedef struct {\n+ uint32_t r;\n+ uint32_t g;\n+ uint32_t b;\n+ uint32_t a;\n+} gr_vk_ycbcr_components_t;\n+\n+typedef struct {\n+ uint32_t fFormat;\n+ uint64_t fExternalFormat;\n+ uint32_t fYcbcrModel;\n+ uint32_t fYcbcrRange;\n+ uint32_t fXChromaOffset;\n+ uint32_t fYChromaOffset;\n+ uint32_t fChromaFilter;\n+ uint32_t fForceExplicitReconstruction;\n+ gr_vk_ycbcr_components_t fComponents;\n+ bool fSamplerFilterMustMatchChromaFilter;\n+ bool fSupportsLinearFilter;\n+} gr_vk_ycbcrconversioninfo_t;\n+\n+typedef struct {\n+ uint64_t fImage;\n+ gr_vk_alloc_t fAlloc;\n+ uint32_t fImageTiling;\n+ uint32_t fImageLayout;\n+ uint32_t fFormat;\n+ uint32_t fImageUsageFlags;\n+ uint32_t fSampleCount;\n+ uint32_t fLevelCount;\n+ uint32_t fCurrentQueueFamily;\n+ bool fProtected;\n+ gr_vk_ycbcrconversioninfo_t fYcbcrConversionInfo;\n+ uint32_t fSharingMode;\n+} gr_vk_imageinfo_t;\n+\n+typedef struct vk_instance_t vk_instance_t;\n+typedef struct vk_physical_device_t vk_physical_device_t;\n+typedef struct vk_device_t vk_device_t;\n+typedef struct vk_queue_t vk_queue_t;\n+\n+#define gr_mtl_handle_t const void*\n+\n+typedef struct {\n+ const void* fTexture;\n+} gr_mtl_textureinfo_t;\n+\n+typedef enum {\n+ DIFFERENCE_SK_PATHOP,\n+ INTERSECT_SK_PATHOP,\n+ UNION_SK_PATHOP,\n+ XOR_SK_PATHOP,\n+ REVERSE_DIFFERENCE_SK_PATHOP,\n+} sk_pathop_t;\n+\n+typedef struct sk_opbuilder_t sk_opbuilder_t;\n+\n+typedef enum {\n+ DEFAULT_SK_LATTICE_RECT_TYPE,\n+ TRANSPARENT_SK_LATTICE_RECT_TYPE,\n+ FIXED_COLOR_SK_LATTICE_RECT_TYPE,\n+} sk_lattice_recttype_t;\n+\n+typedef struct {\n+ const int* fXDivs;\n+ const int* fYDivs;\n+ const sk_lattice_recttype_t* fRectTypes;\n+ int fXCount;\n+ int fYCount;\n+ const sk_irect_t* fBounds;\n+ const sk_color_t* fColors;\n+} sk_lattice_t;\n+\n+typedef struct sk_pathmeasure_t sk_pathmeasure_t;\n+\n+typedef enum {\n+ GET_POSITION_SK_PATHMEASURE_MATRIXFLAGS = 0x01,\n+ GET_TANGENT_SK_PATHMEASURE_MATRIXFLAGS = 0x02,\n+ GET_POS_AND_TAN_SK_PATHMEASURE_MATRIXFLAGS = GET_POSITION_SK_PATHMEASURE_MATRIXFLAGS | GET_TANGENT_SK_PATHMEASURE_MATRIXFLAGS,\n+} sk_pathmeasure_matrixflags_t;\n+\n+typedef void (*sk_bitmap_release_proc)(void* addr, void* context);\n+\n+typedef void (*sk_data_release_proc)(const void* ptr, void* context);\n+\n+typedef void (*sk_image_raster_release_proc)(const void* addr, void* context);\n+typedef void (*sk_image_texture_release_proc)(void* context);\n+\n+typedef void (*sk_surface_raster_release_proc)(void* addr, void* context);\n+\n+typedef void (*sk_glyph_path_proc)(const sk_path_t* pathOrNull, const sk_matrix_t* matrix, void* context);\n+\n+typedef enum {\n+ ALLOW_SK_IMAGE_CACHING_HINT,\n+ DISALLOW_SK_IMAGE_CACHING_HINT,\n+} sk_image_caching_hint_t;\n+\n+typedef enum {\n+ NONE_SK_BITMAP_ALLOC_FLAGS = 0,\n+ ZERO_PIXELS_SK_BITMAP_ALLOC_FLAGS = 1 << 0,\n+} sk_bitmap_allocflags_t;\n+\n+typedef struct {\n+ int16_t fTimeZoneMinutes;\n+ uint16_t fYear;\n+ uint8_t fMonth;\n+ uint8_t fDayOfWeek;\n+ uint8_t fDay;\n+ uint8_t fHour;\n+ uint8_t fMinute;\n+ uint8_t fSecond;\n+} sk_document_pdf_datetime_t;\n+\n+typedef struct {\n+ sk_string_t* fTitle;\n+ sk_string_t* fAuthor;\n+ sk_string_t* fSubject;\n+ sk_string_t* fKeywords;\n+ sk_string_t* fCreator;\n+ sk_string_t* fProducer;\n+ sk_document_pdf_datetime_t* fCreation;\n+ sk_document_pdf_datetime_t* fModified;\n+ float fRasterDPI;\n+ bool fPDFA;\n+ int fEncodingQuality;\n+} sk_document_pdf_metadata_t;\n+\n+typedef struct {\n+ float fDPI;\n+ bool fAllowNoPngs;\n+} sk_document_xps_options_t;\n+\n+typedef struct {\n+ sk_colorspace_t* colorspace;\n+ int32_t width;\n+ int32_t height;\n+ sk_colortype_t colorType;\n+ sk_alphatype_t alphaType;\n+} sk_imageinfo_t;\n+\n+typedef enum {\n+ KEEP_SK_CODEC_ANIMATION_DISPOSAL_METHOD = 1,\n+ RESTORE_BG_COLOR_SK_CODEC_ANIMATION_DISPOSAL_METHOD = 2,\n+ RESTORE_PREVIOUS_SK_CODEC_ANIMATION_DISPOSAL_METHOD = 3,\n+} sk_codecanimation_disposalmethod_t;\n+\n+typedef enum {\n+ SRC_OVER_SK_CODEC_ANIMATION_BLEND = 0,\n+ SRC_SK_CODEC_ANIMATION_BLEND = 1,\n+} sk_codecanimation_blend_t;\n+\n+typedef struct {\n+ int fRequiredFrame;\n+ int fDuration;\n+ bool fFullyReceived;\n+ sk_alphatype_t fAlphaType;\n+ bool fHasAlphaWithinBounds;\n+ sk_codecanimation_disposalmethod_t fDisposalMethod;\n+ sk_codecanimation_blend_t fBlend;\n+ sk_irect_t fFrameRect;\n+} sk_codec_frameinfo_t;\n+\n+typedef struct sk_svgcanvas_t sk_svgcanvas_t;\n+\n+typedef enum {\n+ TRIANGLES_SK_VERTICES_VERTEX_MODE,\n+ TRIANGLE_STRIP_SK_VERTICES_VERTEX_MODE,\n+ TRIANGLE_FAN_SK_VERTICES_VERTEX_MODE,\n+} sk_vertices_vertex_mode_t;\n+\n+typedef struct sk_vertices_t sk_vertices_t;\n+\n+typedef struct sk_colorspace_transfer_fn_t {\n+ float fG;\n+ float fA;\n+ float fB;\n+ float fC;\n+ float fD;\n+ float fE;\n+ float fF;\n+} sk_colorspace_transfer_fn_t;\n+\n+typedef struct sk_colorspace_primaries_t {\n+ float fRX;\n+ float fRY;\n+ float fGX;\n+ float fGY;\n+ float fBX;\n+ float fBY;\n+ float fWX;\n+ float fWY;\n+} sk_colorspace_primaries_t;\n+\n+typedef struct sk_colorspace_xyz_t {\n+ float fM00;\n+ float fM01;\n+ float fM02;\n+ float fM10;\n+ float fM11;\n+ float fM12;\n+ float fM20;\n+ float fM21;\n+ float fM22;\n+} sk_colorspace_xyz_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_COLORSPACE_PRIMARIES_CICP = 0,\n+ REC709_SK_COLORSPACE_PRIMARIES_CICP = 1,\n+ REC470_SYSTEM_M_SK_COLORSPACE_PRIMARIES_CICP = 4,\n+ REC470_SYSTEM_BG_SK_COLORSPACE_PRIMARIES_CICP = 5,\n+ REC601_SK_COLORSPACE_PRIMARIES_CICP = 6,\n+ SMPTE_ST240_SK_COLORSPACE_PRIMARIES_CICP = 7,\n+ GENERIC_FILM_SK_COLORSPACE_PRIMARIES_CICP = 8,\n+ REC2020_SK_COLORSPACE_PRIMARIES_CICP = 9,\n+ SMPTE_ST428_1_SK_COLORSPACE_PRIMARIES_CICP = 10,\n+ SMPTE_RP431_2_SK_COLORSPACE_PRIMARIES_CICP = 11,\n+ SMPTE_EG432_1_SK_COLORSPACE_PRIMARIES_CICP = 12,\n+ ITU_T_H273_VALUE22_SK_COLORSPACE_PRIMARIES_CICP = 22,\n+} sk_colorspace_primaries_cicp_t;\n+\n+typedef enum {\n+ UNKNOWN_SK_COLORSPACE_TRANSFER_FN_CICP = 0,\n+ REC709_SK_COLORSPACE_TRANSFER_FN_CICP = 1,\n+ REC470_SYSTEM_M_SK_COLORSPACE_TRANSFER_FN_CICP = 4,\n+ REC470_SYSTEM_BG_SK_COLORSPACE_TRANSFER_FN_CICP = 5,\n+ REC601_SK_COLORSPACE_TRANSFER_FN_CICP = 6,\n+ SMPTE_ST240_SK_COLORSPACE_TRANSFER_FN_CICP = 7,\n+ LINEAR_SK_COLORSPACE_TRANSFER_FN_CICP = 8,\n+ IEC61966_2_4_SK_COLORSPACE_TRANSFER_FN_CICP = 11,\n+ IEC61966_2_1_SK_COLORSPACE_TRANSFER_FN_CICP = 13,\n+ REC2020_10BIT_SK_COLORSPACE_TRANSFER_FN_CICP = 14,\n+ REC2020_12BIT_SK_COLORSPACE_TRANSFER_FN_CICP = 15,\n+ PQ_SK_COLORSPACE_TRANSFER_FN_CICP = 16,\n+ SMPTE_ST428_1_SK_COLORSPACE_TRANSFER_FN_CICP = 17,\n+ HLG_SK_COLORSPACE_TRANSFER_FN_CICP = 18,\n+} sk_colorspace_transfer_fn_cicp_t;\n+\n+typedef struct sk_colorspace_icc_profile_t sk_colorspace_icc_profile_t;\n+\n+typedef enum {\n+ NO_INVERT_SK_HIGH_CONTRAST_CONFIG_INVERT_STYLE,\n+ INVERT_BRIGHTNESS_SK_HIGH_CONTRAST_CONFIG_INVERT_STYLE,\n+ INVERT_LIGHTNESS_SK_HIGH_CONTRAST_CONFIG_INVERT_STYLE,\n+} sk_highcontrastconfig_invertstyle_t;\n+\n+typedef struct {\n+ bool fGrayscale;\n+ sk_highcontrastconfig_invertstyle_t fInvertStyle;\n+ float fContrast;\n+} sk_highcontrastconfig_t;\n+\n+typedef enum {\n+ ZERO_SK_PNGENCODER_FILTER_FLAGS = 0x00,\n+ NONE_SK_PNGENCODER_FILTER_FLAGS = 0x08,\n+ SUB_SK_PNGENCODER_FILTER_FLAGS = 0x10,\n+ UP_SK_PNGENCODER_FILTER_FLAGS = 0x20,\n+ AVG_SK_PNGENCODER_FILTER_FLAGS = 0x40,\n+ PAETH_SK_PNGENCODER_FILTER_FLAGS = 0x80,\n+ ALL_SK_PNGENCODER_FILTER_FLAGS = NONE_SK_PNGENCODER_FILTER_FLAGS |\n+ SUB_SK_PNGENCODER_FILTER_FLAGS |\n+ UP_SK_PNGENCODER_FILTER_FLAGS |\n+ AVG_SK_PNGENCODER_FILTER_FLAGS |\n+ PAETH_SK_PNGENCODER_FILTER_FLAGS,\n+} sk_pngencoder_filterflags_t;\n+\n+typedef struct {\n+ sk_pngencoder_filterflags_t fFilterFlags;\n+ int fZLibLevel;\n+ void* fComments;\n+ const void* fGainmap;\n+ const void* fGainmapInfo;\n+} sk_pngencoder_options_t;\n+\n+typedef enum {\n+ DOWNSAMPLE_420_SK_JPEGENCODER_DOWNSAMPLE,\n+ DOWNSAMPLE_422_SK_JPEGENCODER_DOWNSAMPLE,\n+ DOWNSAMPLE_444_SK_JPEGENCODER_DOWNSAMPLE,\n+} sk_jpegencoder_downsample_t;\n+\n+typedef enum {\n+ IGNORE_SK_JPEGENCODER_ALPHA_OPTION,\n+ BLEND_ON_BLACK_SK_JPEGENCODER_ALPHA_OPTION,\n+} sk_jpegencoder_alphaoption_t;\n+\n+typedef struct {\n+ int fQuality;\n+ sk_jpegencoder_downsample_t fDownsample;\n+ sk_jpegencoder_alphaoption_t fAlphaOption;\n+ const sk_data_t* xmpMetadata;\n+ int32_t fOrigin;\n+ bool fHasOrigin;\n+} sk_jpegencoder_options_t;\n+\n+typedef enum {\n+ LOSSY_SK_WEBPENCODER_COMPTRESSION,\n+ LOSSLESS_SK_WEBPENCODER_COMPTRESSION,\n+} sk_webpencoder_compression_t;\n+\n+typedef struct {\n+ sk_webpencoder_compression_t fCompression;\n+ float fQuality;\n+} sk_webpencoder_options_t;\n+\n+typedef struct sk_rrect_t sk_rrect_t;\n+\n+typedef enum {\n+ EMPTY_SK_RRECT_TYPE,\n+ RECT_SK_RRECT_TYPE,\n+ OVAL_SK_RRECT_TYPE,\n+ SIMPLE_SK_RRECT_TYPE,\n+ NINE_PATCH_SK_RRECT_TYPE,\n+ COMPLEX_SK_RRECT_TYPE,\n+} sk_rrect_type_t;\n+\n+typedef enum {\n+ UPPER_LEFT_SK_RRECT_CORNER,\n+ UPPER_RIGHT_SK_RRECT_CORNER,\n+ LOWER_RIGHT_SK_RRECT_CORNER,\n+ LOWER_LEFT_SK_RRECT_CORNER,\n+} sk_rrect_corner_t;\n+\n+typedef struct sk_textblob_t sk_textblob_t;\n+typedef struct sk_textblob_builder_t sk_textblob_builder_t;\n+\n+typedef struct {\n+ void* glyphs;\n+ void* pos;\n+ void* utf8text;\n+ void* clusters;\n+} sk_textblob_builder_runbuffer_t;\n+\n+typedef struct {\n+ float fSCos;\n+ float fSSin;\n+ float fTX;\n+ float fTY;\n+} sk_rsxform_t;\n+\n+typedef struct sk_tracememorydump_t sk_tracememorydump_t;\n+\n+typedef struct sk_runtimeeffect_t sk_runtimeeffect_t;\n+\n+typedef enum {\n+ FLOAT_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT2_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT3_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT4_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT2X2_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT3X3_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ FLOAT4X4_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ INT_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ INT2_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ INT3_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+ INT4_SK_RUNTIMEEFFECT_UNIFORM_TYPE,\n+} sk_runtimeeffect_uniform_type_t;\n+\n+typedef enum {\n+ SHADER_SK_RUNTIMEEFFECT_CHILD_TYPE,\n+ COLOR_FILTER_SK_RUNTIMEEFFECT_CHILD_TYPE,\n+ BLENDER_SK_RUNTIMEEFFECT_CHILD_TYPE,\n+} sk_runtimeeffect_child_type_t;\n+\n+typedef enum {\n+ NONE_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x00,\n+ ARRAY_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x01,\n+ COLOR_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x02,\n+ VERTEX_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x04,\n+ FRAGMENT_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x08,\n+ HALF_PRECISION_SK_RUNTIMEEFFECT_UNIFORM_FLAGS = 0x10,\n+} sk_runtimeeffect_uniform_flags_t;\n+\n+typedef struct {\n+ const char* fName;\n+ size_t fNameLength;\n+ size_t fOffset;\n+ sk_runtimeeffect_uniform_type_t fType;\n+ int fCount;\n+ sk_runtimeeffect_uniform_flags_t fFlags;\n+} sk_runtimeeffect_uniform_t;\n+\n+typedef struct {\n+ const char* fName;\n+ size_t fNameLength;\n+ sk_runtimeeffect_child_type_t fType;\n+ int fIndex;\n+} sk_runtimeeffect_child_t;\n+\n+typedef enum {\n+ NEAREST_SK_FILTER_MODE,\n+ LINEAR_SK_FILTER_MODE,\n+} sk_filter_mode_t;\n+\n+typedef enum {\n+ NONE_SK_MIPMAP_MODE,\n+ NEAREST_SK_MIPMAP_MODE,\n+ LINEAR_SK_MIPMAP_MODE,\n+} sk_mipmap_mode_t;\n+\n+typedef struct {\n+ float fB;\n+ float fC;\n+} sk_cubic_resampler_t;\n+\n+typedef struct {\n+ int fMaxAniso;\n+ bool fUseCubic;\n+ sk_cubic_resampler_t fCubic;\n+ sk_filter_mode_t fFilter;\n+ sk_mipmap_mode_t fMipmap;\n+} sk_sampling_options_t;\n+\n+typedef enum {\n+ NONE_SK_CANVAS_SAVELAYERREC_FLAGS = 0,\n+ PRESERVE_LCD_TEXT_SK_CANVAS_SAVELAYERREC_FLAGS = 1 << 1,\n+ INITIALIZE_WITH_PREVIOUS_SK_CANVAS_SAVELAYERREC_FLAGS = 1 << 2,\n+ F16_COLOR_TYPE_SK_CANVAS_SAVELAYERREC_FLAGS = 1 << 4,\n+} sk_canvas_savelayerrec_flags_t;\n+\n+typedef struct {\n+ sk_rect_t* fBounds;\n+ sk_paint_t* fPaint;\n+ sk_imagefilter_t* fBackdrop;\n+ sk_canvas_savelayerrec_flags_t fFlags;\n+} sk_canvas_savelayerrec_t;\n+\n+/*\n+ * Skottie Animation\n+ */\n+typedef struct skottie_animation_t skottie_animation_t;\n+typedef struct skottie_animation_builder_t skottie_animation_builder_t;\n+typedef struct skottie_resource_provider_t skottie_resource_provider_t;\n+typedef struct skottie_property_observer_t skottie_property_observer_t;\n+typedef struct skottie_logger_t skottie_logger_t;\n+typedef struct skottie_marker_observer_t skottie_marker_observer_t;\n+\n+typedef struct sksg_invalidation_controller_t sksg_invalidation_controller_t;\n+\n+typedef enum {\n+ SKIP_TOP_LEVEL_ISOLATION = 0x01,\n+ DISABLE_TOP_LEVEL_CLIPPING = 0x02,\n+} skottie_animation_renderflags_t;\n+\n+typedef enum {\n+ NONE_SKOTTIE_ANIMATION_BUILDER_FLAGS = 0,\n+ DEFER_IMAGE_LOADING_SKOTTIE_ANIMATION_BUILDER_FLAGS = 0x01,\n+ PREFER_EMBEDDED_FONTS_SKOTTIE_ANIMATION_BUILDER_FLAGS = 0x02,\n+} skottie_animation_builder_flags_t;\n+\n+typedef struct {\n+ float fTotalLoadTimeMS;\n+ float fJsonParseTimeMS;\n+ float fSceneParseTimeMS;\n+ size_t fJsonSize;\n+ size_t fAnimatorCount;\n+} skottie_animation_builder_stats_t;\n+\n+typedef struct skresources_image_asset_t skresources_image_asset_t;\n+typedef struct skresources_multi_frame_image_asset_t skresources_multi_frame_image_asset_t;\n+typedef struct skresources_external_track_asset_t skresources_external_track_asset_t;\n+\n+typedef struct skresources_resource_provider_t skresources_resource_provider_t;\n+\n+SK_C_PLUS_PLUS_END_GUARD\n+\n+typedef struct d3d_dxgi_adapter_t d3d_dxgi_adapter_t;\n+typedef struct d3d_d12_device_t d3d_d12_device_t;\n+typedef struct d3d_d12_command_queue_t d3d_d12_command_queue_t;\n+typedef struct gr_d3d_memory_allocator_t gr_d3d_memory_allocator_t;\n+typedef struct {\n+ d3d_dxgi_adapter_t* fAdapter;\n+ d3d_d12_device_t* fDevice;\n+ d3d_d12_command_queue_t* fQueue;\n+ gr_d3d_memory_allocator_t* fMemoryAllocator;\n+ bool fProtectedContext;\n+} gr_d3d_backendcontext_t;\n+\n+typedef struct d3d_d12_resource_t d3d_d12_resource_t;\n+typedef struct d3d_alloc_t d3d_alloc_t;\n+typedef struct {\n+ d3d_d12_resource_t* fResource;\n+ d3d_alloc_t* fAlloc;\n+ uint32_t fResourceState;\n+ uint32_t fFormat;\n+ uint32_t fSampleCount;\n+ uint32_t fLevelCount;\n+ unsigned int fSampleQualityPattern;\n+ bool fProtected;\n+} gr_d3d_textureresourceinfo_t;\n+\n+#endif", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,9 +1,9 @@\n diff --git a/include/c/sk_types.h b/include/c/sk_types.h\n new file mode 100644\n-index 0000000000..4601183057\n+index 0000000000..75e5113365\n --- /dev/null\n +++ b/include/c/sk_types.h\n-@@ -0,0 +1,1200 @@\n+@@ -0,0 +1,1203 @@\n +/*\n + * Copyright 2014 Google Inc.\n + * Copyright 2015 Xamarin Inc.\n@@ -127,6 +127,7 @@ index 0000000000..4601183057\n + A16_FLOAT_SK_COLORTYPE,\n + R16G16_FLOAT_SK_COLORTYPE,\n + A16_UNORM_SK_COLORTYPE,\n++ R16_UNORM_SK_COLORTYPE,\n + R16G16_UNORM_SK_COLORTYPE,\n + R16G16B16A16_UNORM_SK_COLORTYPE,\n + SRGBA_8888_SK_COLORTYPE,\n@@ -237,6 +238,7 @@ index 0000000000..4601183057\n + cubic curves.\n +*/\n +typedef struct sk_path_t sk_path_t;\n++typedef struct sk_pathbuilder_t sk_pathbuilder_t;\n +/**\n + A sk_picture_t holds recorded canvas drawing commands to be played\n + back at a later time.\n@@ -520,6 +522,7 @@ index 0000000000..4601183057\n + sk_irect_t* fSubset;\n + int fFrameIndex;\n + int fPriorFrame;\n++ size_t fMaxDecodeMemory;\n +} sk_codec_options_t;\n +\n +typedef enum {\n@@ -730,8 +733,9 @@ index 0000000000..4601183057\n + uint32_t fYChromaOffset;\n + uint32_t fChromaFilter;\n + uint32_t fForceExplicitReconstruction;\n-+ uint32_t fFormatFeatures;\n + gr_vk_ycbcr_components_t fComponents;\n++ bool fSamplerFilterMustMatchChromaFilter;\n++ bool fSupportsLinearFilter;\n +} gr_vk_ycbcrconversioninfo_t;\n +\n +typedef struct {\n@@ -841,6 +845,11 @@ index 0000000000..4601183057\n +} sk_document_pdf_metadata_t;\n +\n +typedef struct {\n++ float fDPI;\n++ bool fAllowNoPngs;\n++} sk_document_xps_options_t;\n++\n++typedef struct {\n + sk_colorspace_t* colorspace;\n + int32_t width;\n + int32_t height;\n@@ -977,8 +986,6 @@ index 0000000000..4601183057\n + sk_pngencoder_filterflags_t fFilterFlags;\n + int fZLibLevel;\n + void* fComments;\n-+ const sk_colorspace_icc_profile_t* fICCProfile;\n-+ const char* fICCProfileDescription;\n + const void* fGainmap;\n + const void* fGainmapInfo;\n +} sk_pngencoder_options_t;\n@@ -999,8 +1006,6 @@ index 0000000000..4601183057\n + sk_jpegencoder_downsample_t fDownsample;\n + sk_jpegencoder_alphaoption_t fAlphaOption;\n + const sk_data_t* xmpMetadata;\n-+ const sk_colorspace_icc_profile_t* fICCProfile;\n-+ const char* fICCProfileDescription;\n + int32_t fOrigin;\n + bool fHasOrigin;\n +} sk_jpegencoder_options_t;\n@@ -1013,8 +1018,6 @@ index 0000000000..4601183057\n +typedef struct {\n + sk_webpencoder_compression_t fCompression;\n + float fQuality;\n-+ const sk_colorspace_icc_profile_t* fICCProfile;\n-+ const char* fICCProfileDescription;\n +} sk_webpencoder_options_t;\n +\n +typedef struct sk_rrect_t sk_rrect_t;", "summary": "Multiple type changes: (1) New enum value R16_UNORM_SK_COLORTYPE added to sk_colortype_t. (2) New opaque type: typedef struct sk_pathbuilder_t. (3) New field fMaxDecodeMemory (size_t) added to sk_codec_options_t. (4) gr_vk_ycbcrconversioninfo_t restructured: fFormatFeatures (uint32_t) removed, fSamplerFilterMustMatchChromaFilter (bool) and fSupportsLinearFilter (bool) added, fComponents repositioned. (5) New struct sk_document_xps_options_t with fDPI (float) and fAllowNoPngs (bool). (6) fICCProfile and fICCProfileDescription fields removed from sk_pngencoder_options_t, sk_jpegencoder_options_t, and sk_webpencoder_options_t (3 structs affected). These struct layout changes are ABI-breaking for the affected encoder options and Vulkan YCbCr structs.", "relatedFiles": [{"path": "src/c/sk_enums.cpp", "relationship": "Adds static_assert for R16_UNORM_SK_COLORTYPE"}, {"path": "src/c/sk_structs.cpp", "relationship": "Removes size assertions for png/webp encoder options"}, {"path": "src/c/sk_types_priv.h", "relationship": "Updates conversion functions for encoder options"}, {"path": "binding/SkiaSharp/SKColorType.cs", "relationship": "C# enum needs new R16Unorm value"}]}, {"path": "src/c/gr_context.cpp", "diff": "diff --git a/src/c/gr_context.cpp b/src/c/gr_context.cpp\nindex 6ddad599f1..45c6dc800f 100644\n--- a/src/c/gr_context.cpp\n+++ b/src/c/gr_context.cpp\n@@ -19,6 +19,10 @@\n #include \"include/gpu/ganesh/mtl/GrMtlBackendContext.h\"\n #include \"include/gpu/ganesh/mtl/GrMtlDirectContext.h\"\n #endif\n+#if SK_DIRECT3D\n+#include \"include/gpu/ganesh/d3d/GrD3DDirectContext.h\"\n+#include \"include/gpu/ganesh/d3d/GrD3DBackendSurface.h\"\n+#endif\n \n #include \"include/c/gr_context.h\"\n \n@@ -105,7 +109,7 @@ gr_direct_context_t* gr_direct_context_make_metal_with_options(void* device, voi\n gr_direct_context_t* gr_direct_context_make_direct3d(const gr_d3d_backendcontext_t d3dBackendContext) {\n return SK_ONLY_DIRECT3D(\n ToGrDirectContext(\n- GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(d3dBackendContext)).release()),\n+ GrDirectContexts::MakeD3D(AsGrD3DBackendContext(d3dBackendContext)).release()),\n nullptr);\n }\n \n@@ -113,7 +117,7 @@ gr_direct_context_t* gr_direct_context_make_direct3d_with_options(const gr_d3d_b\n const gr_context_options_t* options) {\n SK_ONLY_DIRECT3D(GrContextOptions opts; if (options) { opts = AsGrContextOptions(options); })\n return SK_ONLY_DIRECT3D(\n- ToGrDirectContext(GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(d3dBackendContext), opts)\n+ ToGrDirectContext(GrDirectContexts::MakeD3D(AsGrD3DBackendContext(d3dBackendContext), opts)\n .release()),\n nullptr);\n }\n@@ -261,7 +265,7 @@ gr_backendtexture_t* gr_backendtexture_new_metal(int width, int height, bool mip\n }\n \n gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) {\n- return SK_ONLY_DIRECT3D(ToGrBackendTexture(new GrBackendTexture(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr);\n+ return SK_ONLY_DIRECT3D(ToGrBackendTexture(new GrBackendTexture(GrBackendTextures::MakeD3D(width, height, *AsGrD3DTextureResourceInfo(d3dInfo)))), nullptr);\n }\n \n void gr_backendtexture_delete(gr_backendtexture_t* texture) {\n@@ -308,7 +312,7 @@ gr_backendrendertarget_t* gr_backendrendertarget_new_metal(int width, int height\n }\n \n gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) {\n- return SK_ONLY_DIRECT3D(ToGrBackendRenderTarget(new GrBackendRenderTarget(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr);\n+ return SK_ONLY_DIRECT3D(ToGrBackendRenderTarget(new GrBackendRenderTarget(GrBackendRenderTargets::MakeD3D(width, height, *AsGrD3DTextureResourceInfo(d3dInfo)))), nullptr);\n }\n \n void gr_backendrendertarget_delete(gr_backendrendertarget_t* rendertarget) {", "oldDiff": "diff --git a/src/c/gr_context.cpp b/src/c/gr_context.cpp\nnew file mode 100644\nindex 0000000000..6ddad599f1\n--- /dev/null\n+++ b/src/c/gr_context.cpp\n@@ -0,0 +1,344 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#include \"include/core/SkImage.h\"\n+#include \"include/core/SkSurface.h\"\n+#include \"include/gpu/ganesh/gl/GrGLBackendSurface.h\"\n+#include \"include/gpu/ganesh/gl/GrGLDirectContext.h\"\n+#if SK_VULKAN\n+#include \"include/gpu/ganesh/vk/GrVkBackendSurface.h\"\n+#include \"include/gpu/ganesh/vk/GrVkDirectContext.h\"\n+#endif\n+#if SK_METAL\n+#include \"include/gpu/ganesh/mtl/GrMtlBackendContext.h\"\n+#include \"include/gpu/ganesh/mtl/GrMtlDirectContext.h\"\n+#endif\n+\n+#include \"include/c/gr_context.h\"\n+\n+#include \"src/c/sk_types_priv.h\"\n+\n+// GrRecordingContext\n+\n+void gr_recording_context_unref(gr_recording_context_t* context) {\n+ SK_ONLY_GPU(SkSafeUnref(AsGrRecordingContext(context)));\n+}\n+\n+int gr_recording_context_get_max_surface_sample_count_for_color_type(gr_recording_context_t* context, sk_colortype_t colorType) {\n+ return SK_ONLY_GPU(AsGrRecordingContext(context)->maxSurfaceSampleCountForColorType((SkColorType)colorType), 0);\n+}\n+\n+gr_backend_t gr_recording_context_get_backend(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU((gr_backend_t)AsGrRecordingContext(context)->backend(), (gr_backend_t)0);\n+}\n+\n+bool gr_recording_context_is_abandoned(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU(AsGrRecordingContext(context)->abandoned(), true);\n+}\n+\n+int gr_recording_context_max_texture_size(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU(AsGrRecordingContext(context)->maxTextureSize(), 0);\n+}\n+\n+int gr_recording_context_max_render_target_size(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU(AsGrRecordingContext(context)->maxRenderTargetSize(), 0);\n+}\n+\n+gr_direct_context_t* gr_recording_context_get_direct_context(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU(ToGrDirectContext(GrAsDirectContext(AsGrRecordingContext(context))));\n+}\n+\n+// GrDirectContext\n+\n+gr_direct_context_t* gr_direct_context_make_gl(const gr_glinterface_t* glInterface) {\n+ return SK_ONLY_GPU(ToGrDirectContext(GrDirectContexts::MakeGL(sk_ref_sp(AsGrGLInterface(glInterface))).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_gl_with_options(const gr_glinterface_t* glInterface, const gr_context_options_t* options) {\n+ SK_ONLY_GPU(\n+ GrContextOptions opts;\n+ if (options) {\n+ opts = AsGrContextOptions(options);\n+ })\n+ return SK_ONLY_GPU(ToGrDirectContext(GrDirectContexts::MakeGL(sk_ref_sp(AsGrGLInterface(glInterface)), opts).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_vulkan(const gr_vk_backendcontext_t vkBackendContext) {\n+ return SK_ONLY_VULKAN(ToGrDirectContext(GrDirectContexts::MakeVulkan(AsGrVkBackendContext(&vkBackendContext)).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_vulkan_with_options(const gr_vk_backendcontext_t vkBackendContext, const gr_context_options_t* options) {\n+ SK_ONLY_VULKAN(\n+ GrContextOptions opts;\n+ if (options) {\n+ opts = AsGrContextOptions(options);\n+ })\n+ return SK_ONLY_VULKAN(ToGrDirectContext(GrDirectContexts::MakeVulkan(AsGrVkBackendContext(&vkBackendContext), opts).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_metal(void* device, void* queue) {\n+ SK_ONLY_METAL(\n+ GrMtlBackendContext backendContext;\n+ backendContext.fDevice.retain(device);\n+ backendContext.fQueue.retain(queue);)\n+ return SK_ONLY_METAL(ToGrDirectContext(GrDirectContexts::MakeMetal(backendContext).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_metal_with_options(void* device, void* queue, const gr_context_options_t* options) {\n+ SK_ONLY_METAL(\n+ GrMtlBackendContext backendContext;\n+ backendContext.fDevice.retain(device);\n+ backendContext.fQueue.retain(queue);\n+ GrContextOptions opts;\n+ if (options) {\n+ opts = AsGrContextOptions(options);\n+ })\n+ return SK_ONLY_METAL(ToGrDirectContext(GrDirectContexts::MakeMetal(backendContext, opts).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_direct3d(const gr_d3d_backendcontext_t d3dBackendContext) {\n+ return SK_ONLY_DIRECT3D(\n+ ToGrDirectContext(\n+ GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(d3dBackendContext)).release()),\n+ nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_direct3d_with_options(const gr_d3d_backendcontext_t d3dBackendContext,\n+ const gr_context_options_t* options) {\n+ SK_ONLY_DIRECT3D(GrContextOptions opts; if (options) { opts = AsGrContextOptions(options); })\n+ return SK_ONLY_DIRECT3D(\n+ ToGrDirectContext(GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(d3dBackendContext), opts)\n+ .release()),\n+ nullptr);\n+}\n+\n+bool gr_direct_context_is_abandoned(gr_direct_context_t* context) {\n+ return SK_ONLY_GPU(AsGrDirectContext(context)->abandoned(), true);\n+}\n+\n+void gr_direct_context_abandon_context(gr_direct_context_t* context) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->abandonContext());\n+}\n+\n+void gr_direct_context_release_resources_and_abandon_context(gr_direct_context_t* context) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->releaseResourcesAndAbandonContext());\n+}\n+\n+size_t gr_direct_context_get_resource_cache_limit(gr_direct_context_t* context) {\n+ return SK_ONLY_GPU(AsGrDirectContext(context)->getResourceCacheLimit(), 0);\n+}\n+\n+void gr_direct_context_set_resource_cache_limit(gr_direct_context_t* context, size_t maxResourceBytes) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->setResourceCacheLimit(maxResourceBytes));\n+}\n+\n+void gr_direct_context_get_resource_cache_usage(gr_direct_context_t* context, int* maxResources, size_t* maxResourceBytes) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->getResourceCacheUsage(maxResources, maxResourceBytes));\n+}\n+\n+void gr_direct_context_flush(gr_direct_context_t* context) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->flush(GrFlushInfo()));\n+}\n+\n+bool gr_direct_context_submit(gr_direct_context_t* context, bool syncCpu) {\n+ return SK_ONLY_GPU(AsGrDirectContext(context)->submit((GrSyncCpu)syncCpu), false);\n+}\n+\n+void gr_direct_context_flush_and_submit(gr_direct_context_t* context, bool syncCpu) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->flushAndSubmit((GrSyncCpu)syncCpu));\n+}\n+\n+void gr_direct_context_flush_image(gr_direct_context_t* context, const sk_image_t* image) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->flush(sk_ref_sp(AsImage(image)), GrFlushInfo()));\n+}\n+\n+void gr_direct_context_flush_surface(gr_direct_context_t* context, sk_surface_t* surface) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->flush(AsSurface(surface), GrFlushInfo()));\n+}\n+\n+void gr_direct_context_reset_context(gr_direct_context_t* context, uint32_t state) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->resetContext(state));\n+}\n+\n+void gr_direct_context_dump_memory_statistics(const gr_direct_context_t* context, sk_tracememorydump_t* dump) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->dumpMemoryStatistics(AsTraceMemoryDump(dump)));\n+}\n+\n+void gr_direct_context_free_gpu_resources(gr_direct_context_t* context) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->freeGpuResources());\n+}\n+\n+void gr_direct_context_perform_deferred_cleanup(gr_direct_context_t* context, long long ms) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->performDeferredCleanup(std::chrono::milliseconds(ms)));\n+}\n+\n+void gr_direct_context_purge_unlocked_resources_bytes(gr_direct_context_t* context, size_t bytesToPurge, bool preferScratchResources) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->purgeUnlockedResources(bytesToPurge, preferScratchResources));\n+}\n+\n+void gr_direct_context_purge_unlocked_resources(gr_direct_context_t* context, bool scratchResourcesOnly) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->purgeUnlockedResources(scratchResourcesOnly ? GrPurgeResourceOptions::kScratchResourcesOnly : GrPurgeResourceOptions::kAllResources));\n+}\n+\n+\n+// GrGLInterface\n+\n+const gr_glinterface_t* gr_glinterface_create_native_interface(void) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeNativeInterface().release()), nullptr);\n+}\n+\n+const gr_glinterface_t* gr_glinterface_assemble_interface(void* ctx, gr_gl_get_proc get) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeAssembledInterface(ctx, get).release()), nullptr);\n+}\n+\n+const gr_glinterface_t* gr_glinterface_assemble_gl_interface(void* ctx, gr_gl_get_proc get) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeAssembledGLInterface(ctx, get).release()), nullptr);\n+}\n+\n+const gr_glinterface_t* gr_glinterface_assemble_gles_interface(void* ctx, gr_gl_get_proc get) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeAssembledGLESInterface(ctx, get).release()), nullptr);\n+}\n+\n+const gr_glinterface_t* gr_glinterface_assemble_webgl_interface(void* ctx, gr_gl_get_proc get) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeAssembledWebGLInterface(ctx, get).release()), nullptr);\n+}\n+\n+void gr_glinterface_unref(const gr_glinterface_t* glInterface) {\n+ SK_ONLY_GPU(SkSafeUnref(AsGrGLInterface(glInterface)));\n+}\n+\n+bool gr_glinterface_validate(const gr_glinterface_t* glInterface) {\n+ return SK_ONLY_GPU(AsGrGLInterface(glInterface)->validate(), false);\n+}\n+\n+bool gr_glinterface_has_extension(const gr_glinterface_t* glInterface, const char* extension) {\n+ return SK_ONLY_GPU(AsGrGLInterface(glInterface)->hasExtension(extension), false);\n+}\n+\n+// GrVkExtensions\n+\n+gr_vk_extensions_t* gr_vk_extensions_new(void) {\n+ return SK_ONLY_VULKAN(ToGrVkExtensions(new skgpu::VulkanExtensions()), nullptr);\n+}\n+\n+void gr_vk_extensions_delete(gr_vk_extensions_t* extensions) {\n+ SK_ONLY_VULKAN(delete AsGrVkExtensions(extensions));\n+}\n+\n+void gr_vk_extensions_init(gr_vk_extensions_t* extensions, gr_vk_get_proc getProc, void* userData, vk_instance_t* instance, vk_physical_device_t* physDev, uint32_t instanceExtensionCount, const char** instanceExtensions, uint32_t deviceExtensionCount, const char** deviceExtensions) {\n+ SK_ONLY_VULKAN(AsGrVkExtensions(extensions)->init(\n+ [userData, getProc](const char* name, VkInstance instance, VkDevice device) -> PFN_vkVoidFunction {\n+ return getProc(userData, name, ToVkInstance(instance), ToVkDevice(device));\n+ },\n+ AsVkInstance(instance),\n+ AsVkPhysicalDevice(physDev),\n+ instanceExtensionCount, instanceExtensions,\n+ deviceExtensionCount, deviceExtensions));\n+}\n+\n+bool gr_vk_extensions_has_extension(gr_vk_extensions_t* extensions, const char* ext, uint32_t minVersion) {\n+ return SK_ONLY_VULKAN(AsGrVkExtensions(extensions)->hasExtension(ext, minVersion), false);\n+}\n+\n+// GrBackendTexture\n+\n+gr_backendtexture_t* gr_backendtexture_new_gl(int width, int height, bool mipmapped, const gr_gl_textureinfo_t* glInfo) {\n+ return SK_ONLY_GPU(ToGrBackendTexture(new GrBackendTexture(GrBackendTextures::MakeGL(width, height, (skgpu::Mipmapped)mipmapped, *AsGrGLTextureInfo(glInfo)))), nullptr);\n+}\n+\n+gr_backendtexture_t* gr_backendtexture_new_vulkan(int width, int height, const gr_vk_imageinfo_t* vkInfo) {\n+ return SK_ONLY_VULKAN(ToGrBackendTexture(new GrBackendTexture(GrBackendTextures::MakeVk(width, height, *AsGrVkImageInfo(vkInfo)))), nullptr);\n+}\n+\n+gr_backendtexture_t* gr_backendtexture_new_metal(int width, int height, bool mipmapped, const gr_mtl_textureinfo_t* mtlInfo) {\n+ return SK_ONLY_METAL(ToGrBackendTexture(new GrBackendTexture(GrBackendTextures::MakeMtl(width, height, (skgpu::Mipmapped)mipmapped, AsGrMtlTextureInfo(mtlInfo)))), nullptr);\n+}\n+\n+gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) {\n+ return SK_ONLY_DIRECT3D(ToGrBackendTexture(new GrBackendTexture(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr);\n+}\n+\n+void gr_backendtexture_delete(gr_backendtexture_t* texture) {\n+ SK_ONLY_GPU(delete AsGrBackendTexture(texture));\n+}\n+\n+bool gr_backendtexture_is_valid(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU(AsGrBackendTexture(texture)->isValid(), false);\n+}\n+\n+int gr_backendtexture_get_width(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU(AsGrBackendTexture(texture)->width(), 0);\n+}\n+\n+int gr_backendtexture_get_height(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU(AsGrBackendTexture(texture)->height(), 0);\n+}\n+\n+bool gr_backendtexture_has_mipmaps(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU(AsGrBackendTexture(texture)->hasMipmaps(), false);\n+}\n+\n+gr_backend_t gr_backendtexture_get_backend(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU((gr_backend_t)AsGrBackendTexture(texture)->backend(), (gr_backend_t)0);\n+}\n+\n+bool gr_backendtexture_get_gl_textureinfo(const gr_backendtexture_t* texture, gr_gl_textureinfo_t* glInfo) {\n+ return SK_ONLY_GPU(GrBackendTextures::GetGLTextureInfo(*AsGrBackendTexture(texture), AsGrGLTextureInfo(glInfo)), false);\n+}\n+\n+\n+// GrBackendRenderTarget\n+\n+gr_backendrendertarget_t* gr_backendrendertarget_new_gl(int width, int height, int samples, int stencils, const gr_gl_framebufferinfo_t* glInfo) {\n+ return SK_ONLY_GPU(ToGrBackendRenderTarget(new GrBackendRenderTarget(GrBackendRenderTargets::MakeGL(width, height, samples, stencils, *AsGrGLFramebufferInfo(glInfo)))), nullptr);\n+}\n+\n+gr_backendrendertarget_t* gr_backendrendertarget_new_vulkan(int width, int height, const gr_vk_imageinfo_t* vkImageInfo) {\n+ return SK_ONLY_VULKAN(ToGrBackendRenderTarget(new GrBackendRenderTarget(GrBackendRenderTargets::MakeVk(width, height, *AsGrVkImageInfo(vkImageInfo)))), nullptr);\n+}\n+\n+gr_backendrendertarget_t* gr_backendrendertarget_new_metal(int width, int height, const gr_mtl_textureinfo_t* mtlInfo) {\n+ return SK_ONLY_METAL(ToGrBackendRenderTarget(new GrBackendRenderTarget(GrBackendRenderTargets::MakeMtl(width, height, AsGrMtlTextureInfo(mtlInfo)))), nullptr);\n+}\n+\n+gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) {\n+ return SK_ONLY_DIRECT3D(ToGrBackendRenderTarget(new GrBackendRenderTarget(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr);\n+}\n+\n+void gr_backendrendertarget_delete(gr_backendrendertarget_t* rendertarget) {\n+ SK_ONLY_GPU(delete AsGrBackendRenderTarget(rendertarget));\n+}\n+\n+bool gr_backendrendertarget_is_valid(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->isValid(), false);\n+}\n+\n+int gr_backendrendertarget_get_width(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->width(), 0);\n+}\n+\n+int gr_backendrendertarget_get_height(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->height(), 0);\n+}\n+\n+int gr_backendrendertarget_get_samples(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->sampleCnt(), 0);\n+}\n+\n+int gr_backendrendertarget_get_stencils(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->stencilBits(), 0);\n+}\n+\n+gr_backend_t gr_backendrendertarget_get_backend(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU((gr_backend_t)AsGrBackendRenderTarget(rendertarget)->backend(), (gr_backend_t)0);\n+}\n+\n+bool gr_backendrendertarget_get_gl_framebufferinfo(const gr_backendrendertarget_t* rendertarget, gr_gl_framebufferinfo_t* glInfo) {\n+ return SK_ONLY_GPU(GrBackendRenderTargets::GetGLFramebufferInfo(*AsGrBackendRenderTarget(rendertarget), AsGrGLFramebufferInfo(glInfo)), false);\n+}", "newDiff": "diff --git a/src/c/gr_context.cpp b/src/c/gr_context.cpp\nnew file mode 100644\nindex 0000000000..45c6dc800f\n--- /dev/null\n+++ b/src/c/gr_context.cpp\n@@ -0,0 +1,348 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#include \"include/core/SkImage.h\"\n+#include \"include/core/SkSurface.h\"\n+#include \"include/gpu/ganesh/gl/GrGLBackendSurface.h\"\n+#include \"include/gpu/ganesh/gl/GrGLDirectContext.h\"\n+#if SK_VULKAN\n+#include \"include/gpu/ganesh/vk/GrVkBackendSurface.h\"\n+#include \"include/gpu/ganesh/vk/GrVkDirectContext.h\"\n+#endif\n+#if SK_METAL\n+#include \"include/gpu/ganesh/mtl/GrMtlBackendContext.h\"\n+#include \"include/gpu/ganesh/mtl/GrMtlDirectContext.h\"\n+#endif\n+#if SK_DIRECT3D\n+#include \"include/gpu/ganesh/d3d/GrD3DDirectContext.h\"\n+#include \"include/gpu/ganesh/d3d/GrD3DBackendSurface.h\"\n+#endif\n+\n+#include \"include/c/gr_context.h\"\n+\n+#include \"src/c/sk_types_priv.h\"\n+\n+// GrRecordingContext\n+\n+void gr_recording_context_unref(gr_recording_context_t* context) {\n+ SK_ONLY_GPU(SkSafeUnref(AsGrRecordingContext(context)));\n+}\n+\n+int gr_recording_context_get_max_surface_sample_count_for_color_type(gr_recording_context_t* context, sk_colortype_t colorType) {\n+ return SK_ONLY_GPU(AsGrRecordingContext(context)->maxSurfaceSampleCountForColorType((SkColorType)colorType), 0);\n+}\n+\n+gr_backend_t gr_recording_context_get_backend(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU((gr_backend_t)AsGrRecordingContext(context)->backend(), (gr_backend_t)0);\n+}\n+\n+bool gr_recording_context_is_abandoned(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU(AsGrRecordingContext(context)->abandoned(), true);\n+}\n+\n+int gr_recording_context_max_texture_size(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU(AsGrRecordingContext(context)->maxTextureSize(), 0);\n+}\n+\n+int gr_recording_context_max_render_target_size(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU(AsGrRecordingContext(context)->maxRenderTargetSize(), 0);\n+}\n+\n+gr_direct_context_t* gr_recording_context_get_direct_context(gr_recording_context_t* context) {\n+ return SK_ONLY_GPU(ToGrDirectContext(GrAsDirectContext(AsGrRecordingContext(context))));\n+}\n+\n+// GrDirectContext\n+\n+gr_direct_context_t* gr_direct_context_make_gl(const gr_glinterface_t* glInterface) {\n+ return SK_ONLY_GPU(ToGrDirectContext(GrDirectContexts::MakeGL(sk_ref_sp(AsGrGLInterface(glInterface))).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_gl_with_options(const gr_glinterface_t* glInterface, const gr_context_options_t* options) {\n+ SK_ONLY_GPU(\n+ GrContextOptions opts;\n+ if (options) {\n+ opts = AsGrContextOptions(options);\n+ })\n+ return SK_ONLY_GPU(ToGrDirectContext(GrDirectContexts::MakeGL(sk_ref_sp(AsGrGLInterface(glInterface)), opts).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_vulkan(const gr_vk_backendcontext_t vkBackendContext) {\n+ return SK_ONLY_VULKAN(ToGrDirectContext(GrDirectContexts::MakeVulkan(AsGrVkBackendContext(&vkBackendContext)).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_vulkan_with_options(const gr_vk_backendcontext_t vkBackendContext, const gr_context_options_t* options) {\n+ SK_ONLY_VULKAN(\n+ GrContextOptions opts;\n+ if (options) {\n+ opts = AsGrContextOptions(options);\n+ })\n+ return SK_ONLY_VULKAN(ToGrDirectContext(GrDirectContexts::MakeVulkan(AsGrVkBackendContext(&vkBackendContext), opts).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_metal(void* device, void* queue) {\n+ SK_ONLY_METAL(\n+ GrMtlBackendContext backendContext;\n+ backendContext.fDevice.retain(device);\n+ backendContext.fQueue.retain(queue);)\n+ return SK_ONLY_METAL(ToGrDirectContext(GrDirectContexts::MakeMetal(backendContext).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_metal_with_options(void* device, void* queue, const gr_context_options_t* options) {\n+ SK_ONLY_METAL(\n+ GrMtlBackendContext backendContext;\n+ backendContext.fDevice.retain(device);\n+ backendContext.fQueue.retain(queue);\n+ GrContextOptions opts;\n+ if (options) {\n+ opts = AsGrContextOptions(options);\n+ })\n+ return SK_ONLY_METAL(ToGrDirectContext(GrDirectContexts::MakeMetal(backendContext, opts).release()), nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_direct3d(const gr_d3d_backendcontext_t d3dBackendContext) {\n+ return SK_ONLY_DIRECT3D(\n+ ToGrDirectContext(\n+ GrDirectContexts::MakeD3D(AsGrD3DBackendContext(d3dBackendContext)).release()),\n+ nullptr);\n+}\n+\n+gr_direct_context_t* gr_direct_context_make_direct3d_with_options(const gr_d3d_backendcontext_t d3dBackendContext,\n+ const gr_context_options_t* options) {\n+ SK_ONLY_DIRECT3D(GrContextOptions opts; if (options) { opts = AsGrContextOptions(options); })\n+ return SK_ONLY_DIRECT3D(\n+ ToGrDirectContext(GrDirectContexts::MakeD3D(AsGrD3DBackendContext(d3dBackendContext), opts)\n+ .release()),\n+ nullptr);\n+}\n+\n+bool gr_direct_context_is_abandoned(gr_direct_context_t* context) {\n+ return SK_ONLY_GPU(AsGrDirectContext(context)->abandoned(), true);\n+}\n+\n+void gr_direct_context_abandon_context(gr_direct_context_t* context) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->abandonContext());\n+}\n+\n+void gr_direct_context_release_resources_and_abandon_context(gr_direct_context_t* context) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->releaseResourcesAndAbandonContext());\n+}\n+\n+size_t gr_direct_context_get_resource_cache_limit(gr_direct_context_t* context) {\n+ return SK_ONLY_GPU(AsGrDirectContext(context)->getResourceCacheLimit(), 0);\n+}\n+\n+void gr_direct_context_set_resource_cache_limit(gr_direct_context_t* context, size_t maxResourceBytes) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->setResourceCacheLimit(maxResourceBytes));\n+}\n+\n+void gr_direct_context_get_resource_cache_usage(gr_direct_context_t* context, int* maxResources, size_t* maxResourceBytes) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->getResourceCacheUsage(maxResources, maxResourceBytes));\n+}\n+\n+void gr_direct_context_flush(gr_direct_context_t* context) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->flush(GrFlushInfo()));\n+}\n+\n+bool gr_direct_context_submit(gr_direct_context_t* context, bool syncCpu) {\n+ return SK_ONLY_GPU(AsGrDirectContext(context)->submit((GrSyncCpu)syncCpu), false);\n+}\n+\n+void gr_direct_context_flush_and_submit(gr_direct_context_t* context, bool syncCpu) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->flushAndSubmit((GrSyncCpu)syncCpu));\n+}\n+\n+void gr_direct_context_flush_image(gr_direct_context_t* context, const sk_image_t* image) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->flush(sk_ref_sp(AsImage(image)), GrFlushInfo()));\n+}\n+\n+void gr_direct_context_flush_surface(gr_direct_context_t* context, sk_surface_t* surface) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->flush(AsSurface(surface), GrFlushInfo()));\n+}\n+\n+void gr_direct_context_reset_context(gr_direct_context_t* context, uint32_t state) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->resetContext(state));\n+}\n+\n+void gr_direct_context_dump_memory_statistics(const gr_direct_context_t* context, sk_tracememorydump_t* dump) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->dumpMemoryStatistics(AsTraceMemoryDump(dump)));\n+}\n+\n+void gr_direct_context_free_gpu_resources(gr_direct_context_t* context) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->freeGpuResources());\n+}\n+\n+void gr_direct_context_perform_deferred_cleanup(gr_direct_context_t* context, long long ms) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->performDeferredCleanup(std::chrono::milliseconds(ms)));\n+}\n+\n+void gr_direct_context_purge_unlocked_resources_bytes(gr_direct_context_t* context, size_t bytesToPurge, bool preferScratchResources) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->purgeUnlockedResources(bytesToPurge, preferScratchResources));\n+}\n+\n+void gr_direct_context_purge_unlocked_resources(gr_direct_context_t* context, bool scratchResourcesOnly) {\n+ SK_ONLY_GPU(AsGrDirectContext(context)->purgeUnlockedResources(scratchResourcesOnly ? GrPurgeResourceOptions::kScratchResourcesOnly : GrPurgeResourceOptions::kAllResources));\n+}\n+\n+\n+// GrGLInterface\n+\n+const gr_glinterface_t* gr_glinterface_create_native_interface(void) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeNativeInterface().release()), nullptr);\n+}\n+\n+const gr_glinterface_t* gr_glinterface_assemble_interface(void* ctx, gr_gl_get_proc get) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeAssembledInterface(ctx, get).release()), nullptr);\n+}\n+\n+const gr_glinterface_t* gr_glinterface_assemble_gl_interface(void* ctx, gr_gl_get_proc get) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeAssembledGLInterface(ctx, get).release()), nullptr);\n+}\n+\n+const gr_glinterface_t* gr_glinterface_assemble_gles_interface(void* ctx, gr_gl_get_proc get) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeAssembledGLESInterface(ctx, get).release()), nullptr);\n+}\n+\n+const gr_glinterface_t* gr_glinterface_assemble_webgl_interface(void* ctx, gr_gl_get_proc get) {\n+ return SK_ONLY_GPU(ToGrGLInterface(GrGLMakeAssembledWebGLInterface(ctx, get).release()), nullptr);\n+}\n+\n+void gr_glinterface_unref(const gr_glinterface_t* glInterface) {\n+ SK_ONLY_GPU(SkSafeUnref(AsGrGLInterface(glInterface)));\n+}\n+\n+bool gr_glinterface_validate(const gr_glinterface_t* glInterface) {\n+ return SK_ONLY_GPU(AsGrGLInterface(glInterface)->validate(), false);\n+}\n+\n+bool gr_glinterface_has_extension(const gr_glinterface_t* glInterface, const char* extension) {\n+ return SK_ONLY_GPU(AsGrGLInterface(glInterface)->hasExtension(extension), false);\n+}\n+\n+// GrVkExtensions\n+\n+gr_vk_extensions_t* gr_vk_extensions_new(void) {\n+ return SK_ONLY_VULKAN(ToGrVkExtensions(new skgpu::VulkanExtensions()), nullptr);\n+}\n+\n+void gr_vk_extensions_delete(gr_vk_extensions_t* extensions) {\n+ SK_ONLY_VULKAN(delete AsGrVkExtensions(extensions));\n+}\n+\n+void gr_vk_extensions_init(gr_vk_extensions_t* extensions, gr_vk_get_proc getProc, void* userData, vk_instance_t* instance, vk_physical_device_t* physDev, uint32_t instanceExtensionCount, const char** instanceExtensions, uint32_t deviceExtensionCount, const char** deviceExtensions) {\n+ SK_ONLY_VULKAN(AsGrVkExtensions(extensions)->init(\n+ [userData, getProc](const char* name, VkInstance instance, VkDevice device) -> PFN_vkVoidFunction {\n+ return getProc(userData, name, ToVkInstance(instance), ToVkDevice(device));\n+ },\n+ AsVkInstance(instance),\n+ AsVkPhysicalDevice(physDev),\n+ instanceExtensionCount, instanceExtensions,\n+ deviceExtensionCount, deviceExtensions));\n+}\n+\n+bool gr_vk_extensions_has_extension(gr_vk_extensions_t* extensions, const char* ext, uint32_t minVersion) {\n+ return SK_ONLY_VULKAN(AsGrVkExtensions(extensions)->hasExtension(ext, minVersion), false);\n+}\n+\n+// GrBackendTexture\n+\n+gr_backendtexture_t* gr_backendtexture_new_gl(int width, int height, bool mipmapped, const gr_gl_textureinfo_t* glInfo) {\n+ return SK_ONLY_GPU(ToGrBackendTexture(new GrBackendTexture(GrBackendTextures::MakeGL(width, height, (skgpu::Mipmapped)mipmapped, *AsGrGLTextureInfo(glInfo)))), nullptr);\n+}\n+\n+gr_backendtexture_t* gr_backendtexture_new_vulkan(int width, int height, const gr_vk_imageinfo_t* vkInfo) {\n+ return SK_ONLY_VULKAN(ToGrBackendTexture(new GrBackendTexture(GrBackendTextures::MakeVk(width, height, *AsGrVkImageInfo(vkInfo)))), nullptr);\n+}\n+\n+gr_backendtexture_t* gr_backendtexture_new_metal(int width, int height, bool mipmapped, const gr_mtl_textureinfo_t* mtlInfo) {\n+ return SK_ONLY_METAL(ToGrBackendTexture(new GrBackendTexture(GrBackendTextures::MakeMtl(width, height, (skgpu::Mipmapped)mipmapped, AsGrMtlTextureInfo(mtlInfo)))), nullptr);\n+}\n+\n+gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) {\n+ return SK_ONLY_DIRECT3D(ToGrBackendTexture(new GrBackendTexture(GrBackendTextures::MakeD3D(width, height, *AsGrD3DTextureResourceInfo(d3dInfo)))), nullptr);\n+}\n+\n+void gr_backendtexture_delete(gr_backendtexture_t* texture) {\n+ SK_ONLY_GPU(delete AsGrBackendTexture(texture));\n+}\n+\n+bool gr_backendtexture_is_valid(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU(AsGrBackendTexture(texture)->isValid(), false);\n+}\n+\n+int gr_backendtexture_get_width(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU(AsGrBackendTexture(texture)->width(), 0);\n+}\n+\n+int gr_backendtexture_get_height(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU(AsGrBackendTexture(texture)->height(), 0);\n+}\n+\n+bool gr_backendtexture_has_mipmaps(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU(AsGrBackendTexture(texture)->hasMipmaps(), false);\n+}\n+\n+gr_backend_t gr_backendtexture_get_backend(const gr_backendtexture_t* texture) {\n+ return SK_ONLY_GPU((gr_backend_t)AsGrBackendTexture(texture)->backend(), (gr_backend_t)0);\n+}\n+\n+bool gr_backendtexture_get_gl_textureinfo(const gr_backendtexture_t* texture, gr_gl_textureinfo_t* glInfo) {\n+ return SK_ONLY_GPU(GrBackendTextures::GetGLTextureInfo(*AsGrBackendTexture(texture), AsGrGLTextureInfo(glInfo)), false);\n+}\n+\n+\n+// GrBackendRenderTarget\n+\n+gr_backendrendertarget_t* gr_backendrendertarget_new_gl(int width, int height, int samples, int stencils, const gr_gl_framebufferinfo_t* glInfo) {\n+ return SK_ONLY_GPU(ToGrBackendRenderTarget(new GrBackendRenderTarget(GrBackendRenderTargets::MakeGL(width, height, samples, stencils, *AsGrGLFramebufferInfo(glInfo)))), nullptr);\n+}\n+\n+gr_backendrendertarget_t* gr_backendrendertarget_new_vulkan(int width, int height, const gr_vk_imageinfo_t* vkImageInfo) {\n+ return SK_ONLY_VULKAN(ToGrBackendRenderTarget(new GrBackendRenderTarget(GrBackendRenderTargets::MakeVk(width, height, *AsGrVkImageInfo(vkImageInfo)))), nullptr);\n+}\n+\n+gr_backendrendertarget_t* gr_backendrendertarget_new_metal(int width, int height, const gr_mtl_textureinfo_t* mtlInfo) {\n+ return SK_ONLY_METAL(ToGrBackendRenderTarget(new GrBackendRenderTarget(GrBackendRenderTargets::MakeMtl(width, height, AsGrMtlTextureInfo(mtlInfo)))), nullptr);\n+}\n+\n+gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) {\n+ return SK_ONLY_DIRECT3D(ToGrBackendRenderTarget(new GrBackendRenderTarget(GrBackendRenderTargets::MakeD3D(width, height, *AsGrD3DTextureResourceInfo(d3dInfo)))), nullptr);\n+}\n+\n+void gr_backendrendertarget_delete(gr_backendrendertarget_t* rendertarget) {\n+ SK_ONLY_GPU(delete AsGrBackendRenderTarget(rendertarget));\n+}\n+\n+bool gr_backendrendertarget_is_valid(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->isValid(), false);\n+}\n+\n+int gr_backendrendertarget_get_width(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->width(), 0);\n+}\n+\n+int gr_backendrendertarget_get_height(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->height(), 0);\n+}\n+\n+int gr_backendrendertarget_get_samples(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->sampleCnt(), 0);\n+}\n+\n+int gr_backendrendertarget_get_stencils(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU(AsGrBackendRenderTarget(rendertarget)->stencilBits(), 0);\n+}\n+\n+gr_backend_t gr_backendrendertarget_get_backend(const gr_backendrendertarget_t* rendertarget) {\n+ return SK_ONLY_GPU((gr_backend_t)AsGrBackendRenderTarget(rendertarget)->backend(), (gr_backend_t)0);\n+}\n+\n+bool gr_backendrendertarget_get_gl_framebufferinfo(const gr_backendrendertarget_t* rendertarget, gr_gl_framebufferinfo_t* glInfo) {\n+ return SK_ONLY_GPU(GrBackendRenderTargets::GetGLFramebufferInfo(*AsGrBackendRenderTarget(rendertarget), AsGrGLFramebufferInfo(glInfo)), false);\n+}", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,9 +1,9 @@\n diff --git a/src/c/gr_context.cpp b/src/c/gr_context.cpp\n new file mode 100644\n-index 0000000000..6ddad599f1\n+index 0000000000..45c6dc800f\n --- /dev/null\n +++ b/src/c/gr_context.cpp\n-@@ -0,0 +1,344 @@\n+@@ -0,0 +1,348 @@\n +/*\n + * Copyright 2014 Google Inc.\n + * Copyright 2015 Xamarin Inc.\n@@ -25,6 +25,10 @@ index 0000000000..6ddad599f1\n +#include \"include/gpu/ganesh/mtl/GrMtlBackendContext.h\"\n +#include \"include/gpu/ganesh/mtl/GrMtlDirectContext.h\"\n +#endif\n++#if SK_DIRECT3D\n++#include \"include/gpu/ganesh/d3d/GrD3DDirectContext.h\"\n++#include \"include/gpu/ganesh/d3d/GrD3DBackendSurface.h\"\n++#endif\n +\n +#include \"include/c/gr_context.h\"\n +\n@@ -111,7 +115,7 @@ index 0000000000..6ddad599f1\n +gr_direct_context_t* gr_direct_context_make_direct3d(const gr_d3d_backendcontext_t d3dBackendContext) {\n + return SK_ONLY_DIRECT3D(\n + ToGrDirectContext(\n-+ GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(d3dBackendContext)).release()),\n++ GrDirectContexts::MakeD3D(AsGrD3DBackendContext(d3dBackendContext)).release()),\n + nullptr);\n +}\n +\n@@ -119,7 +123,7 @@ index 0000000000..6ddad599f1\n + const gr_context_options_t* options) {\n + SK_ONLY_DIRECT3D(GrContextOptions opts; if (options) { opts = AsGrContextOptions(options); })\n + return SK_ONLY_DIRECT3D(\n-+ ToGrDirectContext(GrDirectContext::MakeDirect3D(AsGrD3DBackendContext(d3dBackendContext), opts)\n++ ToGrDirectContext(GrDirectContexts::MakeD3D(AsGrD3DBackendContext(d3dBackendContext), opts)\n + .release()),\n + nullptr);\n +}\n@@ -267,7 +271,7 @@ index 0000000000..6ddad599f1\n +}\n +\n +gr_backendtexture_t* gr_backendtexture_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) {\n-+ return SK_ONLY_DIRECT3D(ToGrBackendTexture(new GrBackendTexture(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr);\n++ return SK_ONLY_DIRECT3D(ToGrBackendTexture(new GrBackendTexture(GrBackendTextures::MakeD3D(width, height, *AsGrD3DTextureResourceInfo(d3dInfo)))), nullptr);\n +}\n +\n +void gr_backendtexture_delete(gr_backendtexture_t* texture) {\n@@ -314,7 +318,7 @@ index 0000000000..6ddad599f1\n +}\n +\n +gr_backendrendertarget_t* gr_backendrendertarget_new_direct3d(int width, int height, const gr_d3d_textureresourceinfo_t* d3dInfo) {\n-+ return SK_ONLY_DIRECT3D(ToGrBackendRenderTarget(new GrBackendRenderTarget(width, height, *AsGrD3DTextureResourceInfo(d3dInfo))), nullptr);\n++ return SK_ONLY_DIRECT3D(ToGrBackendRenderTarget(new GrBackendRenderTarget(GrBackendRenderTargets::MakeD3D(width, height, *AsGrD3DTextureResourceInfo(d3dInfo)))), nullptr);\n +}\n +\n +void gr_backendrendertarget_delete(gr_backendrendertarget_t* rendertarget) {", "summary": "Direct3D backend API updates to match upstream Skia namespace changes. (1) Added #include for GrD3DDirectContext.h and GrD3DBackendSurface.h. (2) gr_direct_context_make_direct3d: GrDirectContext::MakeDirect3D → GrDirectContexts::MakeD3D. (3) gr_direct_context_make_direct3d_with_options: same namespace change. (4) gr_backendtexture_new_direct3d: GrBackendTexture constructor → GrBackendTextures::MakeD3D factory. (5) gr_backendrendertarget_new_direct3d: GrBackendRenderTarget constructor → GrBackendRenderTargets::MakeD3D factory. No C API signature changes; all changes are internal implementation updates.", "relatedFiles": [{"path": "include/c/gr_context.h", "relationship": "Header declaring these functions (unchanged)"}]}, {"path": "src/c/sk_bitmap.cpp", "diff": "diff --git a/src/c/sk_bitmap.cpp b/src/c/sk_bitmap.cpp\nindex 0e53a9236a..711b2a5426 100644\n--- a/src/c/sk_bitmap.cpp\n+++ b/src/c/sk_bitmap.cpp\n@@ -9,7 +9,7 @@\n \n #include \"include/core/SkBitmap.h\"\n #include \"include/core/SkColor.h\"\n-#include \"include/core/SkColorPriv.h\"\n+#include \"src/core/SkColorPriv.h\"\n #include \"include/core/SkImageInfo.h\"\n #include \"include/core/SkShader.h\"\n #include \"include/core/SkUnPreMultiply.h\"", "oldDiff": "diff --git a/src/c/sk_bitmap.cpp b/src/c/sk_bitmap.cpp\nnew file mode 100644\nindex 0000000000..0e53a9236a\n--- /dev/null\n+++ b/src/c/sk_bitmap.cpp\n@@ -0,0 +1,153 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#include \"include/core/SkBitmap.h\"\n+#include \"include/core/SkColor.h\"\n+#include \"include/core/SkColorPriv.h\"\n+#include \"include/core/SkImageInfo.h\"\n+#include \"include/core/SkShader.h\"\n+#include \"include/core/SkUnPreMultiply.h\"\n+\n+#include \"include/c/sk_bitmap.h\"\n+\n+#include \"src/c/sk_types_priv.h\"\n+\n+void sk_bitmap_destructor(sk_bitmap_t* cbitmap) {\n+ delete AsBitmap(cbitmap);\n+}\n+\n+sk_bitmap_t* sk_bitmap_new(void) {\n+ return ToBitmap(new SkBitmap());\n+}\n+\n+void sk_bitmap_get_info(sk_bitmap_t* cbitmap, sk_imageinfo_t* info) {\n+ *info = ToImageInfo(AsBitmap(cbitmap)->info());\n+}\n+\n+void* sk_bitmap_get_pixels(sk_bitmap_t* cbitmap, size_t* length) {\n+ SkBitmap* bmp = AsBitmap(cbitmap);\n+ *length = bmp->computeByteSize();\n+ return bmp->getPixels();\n+}\n+\n+size_t sk_bitmap_get_row_bytes(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->rowBytes();\n+}\n+\n+size_t sk_bitmap_get_byte_count(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->computeByteSize();\n+}\n+\n+void sk_bitmap_reset(sk_bitmap_t* cbitmap) {\n+ AsBitmap(cbitmap)->reset();\n+}\n+\n+bool sk_bitmap_is_null(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->isNull();\n+}\n+\n+bool sk_bitmap_is_immutable(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->isImmutable();\n+}\n+\n+void sk_bitmap_set_immutable(sk_bitmap_t* cbitmap) {\n+ AsBitmap(cbitmap)->setImmutable();\n+}\n+\n+void sk_bitmap_erase(sk_bitmap_t* cbitmap, sk_color_t color) {\n+ AsBitmap(cbitmap)->eraseColor(color);\n+}\n+\n+void sk_bitmap_erase_rect(sk_bitmap_t* cbitmap, sk_color_t color, sk_irect_t* rect) {\n+ AsBitmap(cbitmap)->erase(color, *AsIRect(rect));\n+}\n+\n+uint8_t* sk_bitmap_get_addr_8(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getAddr8(x, y);\n+}\n+\n+uint16_t* sk_bitmap_get_addr_16(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getAddr16(x, y);\n+}\n+\n+uint32_t* sk_bitmap_get_addr_32(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getAddr32(x, y);\n+}\n+\n+void* sk_bitmap_get_addr(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getAddr(x, y);\n+}\n+\n+sk_color_t sk_bitmap_get_pixel_color(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getColor(x, y);\n+}\n+\n+bool sk_bitmap_ready_to_draw(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->readyToDraw();\n+}\n+\n+void sk_bitmap_get_pixel_colors(sk_bitmap_t* cbitmap, sk_color_t* colors) {\n+ SkBitmap* bmp = AsBitmap(cbitmap);\n+ int w = bmp->width();\n+ int h = bmp->height();\n+ for (int y = 0; y < h; y++) {\n+ for (int x = 0; x < w; x++) {\n+ *colors = bmp->getColor(x, y);\n+ colors++;\n+ }\n+ }\n+}\n+\n+bool sk_bitmap_install_pixels(sk_bitmap_t* cbitmap, const sk_imageinfo_t* cinfo, void* pixels, size_t rowBytes, const sk_bitmap_release_proc releaseProc, void* context) {\n+ return AsBitmap(cbitmap)->installPixels(AsImageInfo(cinfo), pixels, rowBytes, releaseProc, context);\n+}\n+\n+bool sk_bitmap_install_pixels_with_pixmap(sk_bitmap_t* cbitmap, const sk_pixmap_t* cpixmap) {\n+ return AsBitmap(cbitmap)->installPixels(*AsPixmap(cpixmap));\n+}\n+\n+bool sk_bitmap_try_alloc_pixels(sk_bitmap_t* cbitmap, const sk_imageinfo_t* requestedInfo, size_t rowBytes) {\n+ return AsBitmap(cbitmap)->tryAllocPixels(AsImageInfo(requestedInfo), rowBytes);\n+}\n+\n+bool sk_bitmap_try_alloc_pixels_with_flags(sk_bitmap_t* cbitmap, const sk_imageinfo_t* requestedInfo, uint32_t flags) {\n+ return AsBitmap(cbitmap)->tryAllocPixelsFlags(AsImageInfo(requestedInfo), flags);\n+}\n+\n+void sk_bitmap_set_pixels(sk_bitmap_t* cbitmap, void* pixels) {\n+ AsBitmap(cbitmap)->setPixels(pixels);\n+}\n+\n+bool sk_bitmap_peek_pixels(sk_bitmap_t* cbitmap, sk_pixmap_t* cpixmap) {\n+ return AsBitmap(cbitmap)->peekPixels(AsPixmap(cpixmap));\n+}\n+\n+bool sk_bitmap_extract_subset(sk_bitmap_t* cbitmap, sk_bitmap_t* cdst, sk_irect_t* subset) {\n+ return AsBitmap(cbitmap)->extractSubset(AsBitmap(cdst), *AsIRect(subset));\n+}\n+\n+bool sk_bitmap_extract_alpha(sk_bitmap_t* cbitmap, sk_bitmap_t* cdst, const sk_paint_t* paint, sk_ipoint_t* offset) {\n+ return AsBitmap(cbitmap)->extractAlpha(AsBitmap(cdst), AsPaint(paint), AsIPoint(offset));\n+}\n+\n+void sk_bitmap_notify_pixels_changed(sk_bitmap_t* cbitmap) {\n+ AsBitmap(cbitmap)->notifyPixelsChanged();\n+}\n+\n+void sk_bitmap_swap(sk_bitmap_t* cbitmap, sk_bitmap_t* cother) {\n+ AsBitmap(cbitmap)->swap(*AsBitmap(cother));\n+}\n+\n+sk_shader_t* sk_bitmap_make_shader(sk_bitmap_t* cbitmap, sk_shader_tilemode_t tmx, sk_shader_tilemode_t tmy, sk_sampling_options_t* sampling, const sk_matrix_t* cmatrix) {\n+ SkMatrix m;\n+ if (cmatrix) {\n+ m = AsMatrix(cmatrix);\n+ }\n+ return ToShader(AsBitmap(cbitmap)->makeShader((SkTileMode)tmx, (SkTileMode)tmy, *AsSamplingOptions(sampling), cmatrix ? &m : nullptr).release());\n+}", "newDiff": "diff --git a/src/c/sk_bitmap.cpp b/src/c/sk_bitmap.cpp\nnew file mode 100644\nindex 0000000000..711b2a5426\n--- /dev/null\n+++ b/src/c/sk_bitmap.cpp\n@@ -0,0 +1,153 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#include \"include/core/SkBitmap.h\"\n+#include \"include/core/SkColor.h\"\n+#include \"src/core/SkColorPriv.h\"\n+#include \"include/core/SkImageInfo.h\"\n+#include \"include/core/SkShader.h\"\n+#include \"include/core/SkUnPreMultiply.h\"\n+\n+#include \"include/c/sk_bitmap.h\"\n+\n+#include \"src/c/sk_types_priv.h\"\n+\n+void sk_bitmap_destructor(sk_bitmap_t* cbitmap) {\n+ delete AsBitmap(cbitmap);\n+}\n+\n+sk_bitmap_t* sk_bitmap_new(void) {\n+ return ToBitmap(new SkBitmap());\n+}\n+\n+void sk_bitmap_get_info(sk_bitmap_t* cbitmap, sk_imageinfo_t* info) {\n+ *info = ToImageInfo(AsBitmap(cbitmap)->info());\n+}\n+\n+void* sk_bitmap_get_pixels(sk_bitmap_t* cbitmap, size_t* length) {\n+ SkBitmap* bmp = AsBitmap(cbitmap);\n+ *length = bmp->computeByteSize();\n+ return bmp->getPixels();\n+}\n+\n+size_t sk_bitmap_get_row_bytes(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->rowBytes();\n+}\n+\n+size_t sk_bitmap_get_byte_count(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->computeByteSize();\n+}\n+\n+void sk_bitmap_reset(sk_bitmap_t* cbitmap) {\n+ AsBitmap(cbitmap)->reset();\n+}\n+\n+bool sk_bitmap_is_null(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->isNull();\n+}\n+\n+bool sk_bitmap_is_immutable(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->isImmutable();\n+}\n+\n+void sk_bitmap_set_immutable(sk_bitmap_t* cbitmap) {\n+ AsBitmap(cbitmap)->setImmutable();\n+}\n+\n+void sk_bitmap_erase(sk_bitmap_t* cbitmap, sk_color_t color) {\n+ AsBitmap(cbitmap)->eraseColor(color);\n+}\n+\n+void sk_bitmap_erase_rect(sk_bitmap_t* cbitmap, sk_color_t color, sk_irect_t* rect) {\n+ AsBitmap(cbitmap)->erase(color, *AsIRect(rect));\n+}\n+\n+uint8_t* sk_bitmap_get_addr_8(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getAddr8(x, y);\n+}\n+\n+uint16_t* sk_bitmap_get_addr_16(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getAddr16(x, y);\n+}\n+\n+uint32_t* sk_bitmap_get_addr_32(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getAddr32(x, y);\n+}\n+\n+void* sk_bitmap_get_addr(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getAddr(x, y);\n+}\n+\n+sk_color_t sk_bitmap_get_pixel_color(sk_bitmap_t* cbitmap, int x, int y) {\n+ return AsBitmap(cbitmap)->getColor(x, y);\n+}\n+\n+bool sk_bitmap_ready_to_draw(sk_bitmap_t* cbitmap) {\n+ return AsBitmap(cbitmap)->readyToDraw();\n+}\n+\n+void sk_bitmap_get_pixel_colors(sk_bitmap_t* cbitmap, sk_color_t* colors) {\n+ SkBitmap* bmp = AsBitmap(cbitmap);\n+ int w = bmp->width();\n+ int h = bmp->height();\n+ for (int y = 0; y < h; y++) {\n+ for (int x = 0; x < w; x++) {\n+ *colors = bmp->getColor(x, y);\n+ colors++;\n+ }\n+ }\n+}\n+\n+bool sk_bitmap_install_pixels(sk_bitmap_t* cbitmap, const sk_imageinfo_t* cinfo, void* pixels, size_t rowBytes, const sk_bitmap_release_proc releaseProc, void* context) {\n+ return AsBitmap(cbitmap)->installPixels(AsImageInfo(cinfo), pixels, rowBytes, releaseProc, context);\n+}\n+\n+bool sk_bitmap_install_pixels_with_pixmap(sk_bitmap_t* cbitmap, const sk_pixmap_t* cpixmap) {\n+ return AsBitmap(cbitmap)->installPixels(*AsPixmap(cpixmap));\n+}\n+\n+bool sk_bitmap_try_alloc_pixels(sk_bitmap_t* cbitmap, const sk_imageinfo_t* requestedInfo, size_t rowBytes) {\n+ return AsBitmap(cbitmap)->tryAllocPixels(AsImageInfo(requestedInfo), rowBytes);\n+}\n+\n+bool sk_bitmap_try_alloc_pixels_with_flags(sk_bitmap_t* cbitmap, const sk_imageinfo_t* requestedInfo, uint32_t flags) {\n+ return AsBitmap(cbitmap)->tryAllocPixelsFlags(AsImageInfo(requestedInfo), flags);\n+}\n+\n+void sk_bitmap_set_pixels(sk_bitmap_t* cbitmap, void* pixels) {\n+ AsBitmap(cbitmap)->setPixels(pixels);\n+}\n+\n+bool sk_bitmap_peek_pixels(sk_bitmap_t* cbitmap, sk_pixmap_t* cpixmap) {\n+ return AsBitmap(cbitmap)->peekPixels(AsPixmap(cpixmap));\n+}\n+\n+bool sk_bitmap_extract_subset(sk_bitmap_t* cbitmap, sk_bitmap_t* cdst, sk_irect_t* subset) {\n+ return AsBitmap(cbitmap)->extractSubset(AsBitmap(cdst), *AsIRect(subset));\n+}\n+\n+bool sk_bitmap_extract_alpha(sk_bitmap_t* cbitmap, sk_bitmap_t* cdst, const sk_paint_t* paint, sk_ipoint_t* offset) {\n+ return AsBitmap(cbitmap)->extractAlpha(AsBitmap(cdst), AsPaint(paint), AsIPoint(offset));\n+}\n+\n+void sk_bitmap_notify_pixels_changed(sk_bitmap_t* cbitmap) {\n+ AsBitmap(cbitmap)->notifyPixelsChanged();\n+}\n+\n+void sk_bitmap_swap(sk_bitmap_t* cbitmap, sk_bitmap_t* cother) {\n+ AsBitmap(cbitmap)->swap(*AsBitmap(cother));\n+}\n+\n+sk_shader_t* sk_bitmap_make_shader(sk_bitmap_t* cbitmap, sk_shader_tilemode_t tmx, sk_shader_tilemode_t tmy, sk_sampling_options_t* sampling, const sk_matrix_t* cmatrix) {\n+ SkMatrix m;\n+ if (cmatrix) {\n+ m = AsMatrix(cmatrix);\n+ }\n+ return ToShader(AsBitmap(cbitmap)->makeShader((SkTileMode)tmx, (SkTileMode)tmy, *AsSamplingOptions(sampling), cmatrix ? &m : nullptr).release());\n+}", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,6 +1,6 @@\n diff --git a/src/c/sk_bitmap.cpp b/src/c/sk_bitmap.cpp\n new file mode 100644\n-index 0000000000..0e53a9236a\n+index 0000000000..711b2a5426\n --- /dev/null\n +++ b/src/c/sk_bitmap.cpp\n @@ -0,0 +1,153 @@\n@@ -15,7 +15,7 @@ index 0000000000..0e53a9236a\n +\n +#include \"include/core/SkBitmap.h\"\n +#include \"include/core/SkColor.h\"\n-+#include \"include/core/SkColorPriv.h\"\n++#include \"src/core/SkColorPriv.h\"\n +#include \"include/core/SkImageInfo.h\"\n +#include \"include/core/SkShader.h\"\n +#include \"include/core/SkUnPreMultiply.h\"", "summary": "Include path change only: SkColorPriv.h moved from include/core/ to src/core/ (upstream reorganization). No functional changes to any C API functions."}, {"path": "src/c/sk_canvas.cpp", "diff": "diff --git a/src/c/sk_canvas.cpp b/src/c/sk_canvas.cpp\nindex 4d23244854..8d7a0d25eb 100644\n--- a/src/c/sk_canvas.cpp\n+++ b/src/c/sk_canvas.cpp\n@@ -9,6 +9,7 @@\n \n #include \"include/core/SkAnnotation.h\"\n #include \"include/core/SkCanvas.h\"\n+#include \"include/core/SkSpan.h\"\n #include \"include/core/SkOverdrawCanvas.h\"\n #include \"include/utils/SkNoDrawCanvas.h\"\n #include \"include/utils/SkNWayCanvas.h\"\n@@ -50,7 +51,7 @@ void sk_canvas_draw_color4f(sk_canvas_t* ccanvas, sk_color4f_t color, sk_blendmo\n }\n \n void sk_canvas_draw_points(sk_canvas_t* ccanvas, sk_point_mode_t pointMode, size_t count, const sk_point_t points [], const sk_paint_t* cpaint) {\n- AsCanvas(ccanvas)->drawPoints ((SkCanvas::PointMode)pointMode, count, AsPoint(points), *AsPaint(cpaint));\n+ AsCanvas(ccanvas)->drawPoints((SkCanvas::PointMode)pointMode, SkSpan<const SkPoint>(AsPoint(points), count), *AsPaint(cpaint));\n }\n \n void sk_canvas_draw_point(sk_canvas_t* ccanvas, float x, float y, const sk_paint_t* cpaint) {\n@@ -254,7 +255,11 @@ void sk_canvas_draw_drrect(sk_canvas_t* ccanvas, const sk_rrect_t* outer, const\n }\n \n void sk_canvas_draw_atlas(sk_canvas_t* ccanvas, const sk_image_t* atlas, const sk_rsxform_t* xform, const sk_rect_t* tex, const sk_color_t* colors, int count, sk_blendmode_t mode, const sk_sampling_options_t* sampling, const sk_rect_t* cullRect, const sk_paint_t* paint) {\n- AsCanvas(ccanvas)->drawAtlas(AsImage(atlas), AsRSXform(xform), AsRect(tex), colors, count, (SkBlendMode)mode, *AsSamplingOptions(sampling), AsRect(cullRect), AsPaint(paint));\n+ AsCanvas(ccanvas)->drawAtlas(AsImage(atlas),\n+ SkSpan<const SkRSXform>(AsRSXform(xform), count),\n+ SkSpan<const SkRect>(AsRect(tex), count),\n+ colors ? SkSpan<const SkColor>(colors, count) : SkSpan<const SkColor>(),\n+ (SkBlendMode)mode, *AsSamplingOptions(sampling), AsRect(cullRect), AsPaint(paint));\n }\n \n void sk_canvas_draw_patch(sk_canvas_t* ccanvas, const sk_point_t* cubics, const sk_color_t* colors, const sk_point_t* texCoords, sk_blendmode_t mode, const sk_paint_t* paint) {", "oldDiff": "diff --git a/src/c/sk_canvas.cpp b/src/c/sk_canvas.cpp\nnew file mode 100644\nindex 0000000000..4d23244854\n--- /dev/null\n+++ b/src/c/sk_canvas.cpp\n@@ -0,0 +1,314 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#include \"include/core/SkAnnotation.h\"\n+#include \"include/core/SkCanvas.h\"\n+#include \"include/core/SkOverdrawCanvas.h\"\n+#include \"include/utils/SkNoDrawCanvas.h\"\n+#include \"include/utils/SkNWayCanvas.h\"\n+\n+#include \"include/c/sk_canvas.h\"\n+\n+#include \"src/c/sk_types_priv.h\"\n+\n+void sk_canvas_destroy(sk_canvas_t* ccanvas) {\n+ delete AsCanvas(ccanvas);\n+}\n+\n+void sk_canvas_clear(sk_canvas_t* ccanvas, sk_color_t color) {\n+ AsCanvas(ccanvas)->clear(color);\n+}\n+\n+void sk_canvas_clear_color4f(sk_canvas_t* ccanvas, sk_color4f_t color) {\n+ AsCanvas(ccanvas)->clear(AsColor4f(color));\n+}\n+\n+void sk_canvas_discard(sk_canvas_t* ccanvas) {\n+ AsCanvas(ccanvas)->discard();\n+}\n+\n+int sk_canvas_get_save_count(sk_canvas_t* ccanvas) {\n+ return AsCanvas(ccanvas)->getSaveCount();\n+}\n+\n+void sk_canvas_restore_to_count(sk_canvas_t* ccanvas, int saveCount) {\n+ AsCanvas(ccanvas)->restoreToCount(saveCount);\n+}\n+\n+void sk_canvas_draw_color(sk_canvas_t* ccanvas, sk_color_t color, sk_blendmode_t cmode) {\n+ AsCanvas(ccanvas)->drawColor(color, (SkBlendMode)cmode);\n+}\n+\n+void sk_canvas_draw_color4f(sk_canvas_t* ccanvas, sk_color4f_t color, sk_blendmode_t cmode) {\n+ AsCanvas(ccanvas)->drawColor(AsColor4f(color), (SkBlendMode)cmode);\n+}\n+\n+void sk_canvas_draw_points(sk_canvas_t* ccanvas, sk_point_mode_t pointMode, size_t count, const sk_point_t points [], const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawPoints ((SkCanvas::PointMode)pointMode, count, AsPoint(points), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_point(sk_canvas_t* ccanvas, float x, float y, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawPoint (x, y, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_line(sk_canvas_t* ccanvas, float x0, float y0, float x1, float y1, sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawLine(x0, y0, x1, y1, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_simple_text(sk_canvas_t* ccanvas, const void* text, size_t byte_length, sk_text_encoding_t encoding, float x, float y, const sk_font_t* cfont, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawSimpleText(text, byte_length, (SkTextEncoding)encoding, x, y, *AsFont(cfont), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_text_blob (sk_canvas_t* ccanvas, sk_textblob_t* text, float x, float y, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawTextBlob(AsTextBlob(text), x, y, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_reset_matrix(sk_canvas_t* ccanvas) {\n+ AsCanvas(ccanvas)->resetMatrix();\n+}\n+\n+void sk_canvas_set_matrix(sk_canvas_t* ccanvas, const sk_matrix44_t* cmatrix) {\n+ AsCanvas(ccanvas)->setMatrix(*AsM44(cmatrix));\n+}\n+\n+void sk_canvas_get_matrix(sk_canvas_t* ccanvas, sk_matrix44_t* cmatrix) {\n+ *cmatrix = ToM44(AsCanvas(ccanvas)->getLocalToDevice());\n+}\n+\n+void sk_canvas_draw_round_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect, float rx, float ry, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawRoundRect(*AsRect(crect), rx, ry, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_clip_rect_with_operation(sk_canvas_t* ccanvas, const sk_rect_t* crect, sk_clipop_t op, bool doAA) {\n+ AsCanvas(ccanvas)->clipRect(*AsRect(crect), (SkClipOp)op, doAA);\n+}\n+\n+void sk_canvas_clip_path_with_operation(sk_canvas_t* ccanvas, const sk_path_t* cpath, sk_clipop_t op, bool doAA) {\n+ AsCanvas(ccanvas)->clipPath(*AsPath(cpath), (SkClipOp)op, doAA);\n+}\n+\n+void sk_canvas_clip_rrect_with_operation(sk_canvas_t* ccanvas, const sk_rrect_t* crect, sk_clipop_t op, bool doAA) {\n+ AsCanvas(ccanvas)->clipRRect(*AsRRect(crect), (SkClipOp)op, doAA);\n+}\n+\n+bool sk_canvas_get_local_clip_bounds(sk_canvas_t* ccanvas, sk_rect_t* cbounds) {\n+ return AsCanvas(ccanvas)->getLocalClipBounds(AsRect(cbounds));\n+}\n+\n+bool sk_canvas_get_device_clip_bounds(sk_canvas_t* ccanvas, sk_irect_t* cbounds) {\n+ return AsCanvas(ccanvas)->getDeviceClipBounds(AsIRect(cbounds));\n+}\n+\n+int sk_canvas_save(sk_canvas_t* ccanvas) {\n+ return AsCanvas(ccanvas)->save();\n+}\n+\n+int sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {\n+ return AsCanvas(ccanvas)->saveLayer(AsRect(crect), AsPaint(cpaint));\n+}\n+\n+int sk_canvas_save_layer_rec(sk_canvas_t* ccanvas, const sk_canvas_savelayerrec_t* crec) {\n+ return AsCanvas(ccanvas)->saveLayer(AsCanvasSaveLayerRec(crec));\n+}\n+\n+void sk_canvas_restore(sk_canvas_t* ccanvas) {\n+ AsCanvas(ccanvas)->restore();\n+}\n+\n+void sk_canvas_translate(sk_canvas_t* ccanvas, float dx, float dy) {\n+ AsCanvas(ccanvas)->translate(dx, dy);\n+}\n+\n+void sk_canvas_scale(sk_canvas_t* ccanvas, float sx, float sy) {\n+ AsCanvas(ccanvas)->scale(sx, sy);\n+}\n+\n+void sk_canvas_rotate_degrees(sk_canvas_t* ccanvas, float degrees) {\n+ AsCanvas(ccanvas)->rotate(degrees);\n+}\n+\n+void sk_canvas_rotate_radians(sk_canvas_t* ccanvas, float radians) {\n+ AsCanvas(ccanvas)->rotate(SkRadiansToDegrees(radians));\n+}\n+\n+void sk_canvas_skew(sk_canvas_t* ccanvas, float sx, float sy) {\n+ AsCanvas(ccanvas)->skew(sx, sy);\n+}\n+\n+void sk_canvas_concat(sk_canvas_t* ccanvas, const sk_matrix44_t* cmatrix) {\n+ AsCanvas(ccanvas)->concat(*AsM44(cmatrix));\n+}\n+\n+bool sk_canvas_quick_reject(sk_canvas_t* ccanvas, const sk_rect_t* crect) {\n+ return AsCanvas(ccanvas)->quickReject(*AsRect(crect));\n+}\n+\n+void sk_canvas_clip_region(sk_canvas_t* ccanvas, const sk_region_t* region, sk_clipop_t op) {\n+ AsCanvas(ccanvas)->clipRegion(*AsRegion(region), (SkClipOp)op);\n+}\n+\n+void sk_canvas_draw_paint(sk_canvas_t* ccanvas, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawPaint(*AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_region(sk_canvas_t* ccanvas, const sk_region_t* cregion, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawRegion(*AsRegion(cregion), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawRect(*AsRect(crect), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_rrect(sk_canvas_t* ccanvas, const sk_rrect_t* crect, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawRRect(*AsRRect(crect), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_circle(sk_canvas_t* ccanvas, float cx, float cy, float rad, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawCircle(cx, cy, rad, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_oval(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawOval(*AsRect(crect), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_path(sk_canvas_t* ccanvas, const sk_path_t* cpath, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawPath(*AsPath(cpath), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_image(sk_canvas_t* ccanvas, const sk_image_t* cimage, float x, float y, const sk_sampling_options_t* sampling, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawImage(AsImage(cimage), x, y, *AsSamplingOptions(sampling), AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_image_rect(sk_canvas_t* ccanvas, const sk_image_t* cimage, const sk_rect_t* csrcR, const sk_rect_t* cdstR, const sk_sampling_options_t* sampling, const sk_paint_t* cpaint) {\n+ if (csrcR) {\n+ AsCanvas(ccanvas)->drawImageRect(AsImage(cimage), *AsRect(csrcR), *AsRect(cdstR), *AsSamplingOptions(sampling), AsPaint(cpaint), SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint);\n+ } else {\n+ AsCanvas(ccanvas)->drawImageRect(AsImage(cimage), *AsRect(cdstR), *AsSamplingOptions(sampling), AsPaint(cpaint));\n+ }\n+}\n+\n+void sk_canvas_draw_picture(sk_canvas_t* ccanvas, const sk_picture_t* cpicture, const sk_matrix_t* cmatrix, const sk_paint_t* cpaint) {\n+ SkMatrix m;\n+ if (cmatrix) {\n+ m = AsMatrix(cmatrix);\n+ }\n+ AsCanvas(ccanvas)->drawPicture(AsPicture(cpicture), cmatrix ? &m : nullptr, AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_drawable(sk_canvas_t* ccanvas, sk_drawable_t* cdrawable, const sk_matrix_t* cmatrix) {\n+ SkMatrix m;\n+ if (cmatrix) {\n+ m = AsMatrix(cmatrix);\n+ }\n+ AsCanvas(ccanvas)->drawDrawable(AsDrawable(cdrawable), cmatrix ? &m : nullptr);\n+}\n+\n+sk_canvas_t* sk_canvas_new_from_bitmap(const sk_bitmap_t* bitmap) {\n+ return ToCanvas(new SkCanvas(*AsBitmap(bitmap)));\n+}\n+\n+sk_canvas_t* sk_canvas_new_from_raster(const sk_imageinfo_t* cinfo, void* pixels, size_t rowBytes, const sk_surfaceprops_t* props) {\n+ return ToCanvas(SkCanvas::MakeRasterDirect(AsImageInfo(cinfo), pixels, rowBytes, AsSurfaceProps(props)).release());\n+}\n+\n+void sk_canvas_draw_annotation(sk_canvas_t* t, const sk_rect_t* rect, const char* key, sk_data_t* value) {\n+ AsCanvas(t)->drawAnnotation(*AsRect(rect), key, AsData(value));\n+}\n+\n+void sk_canvas_draw_url_annotation(sk_canvas_t* t, const sk_rect_t* rect, sk_data_t* value) {\n+ SkAnnotateRectWithURL(AsCanvas(t), *AsRect(rect), AsData(value));\n+}\n+\n+void sk_canvas_draw_named_destination_annotation(sk_canvas_t* t, const sk_point_t* point, sk_data_t* value) {\n+ SkAnnotateNamedDestination(AsCanvas(t), *AsPoint(point), AsData(value));\n+}\n+\n+void sk_canvas_draw_link_destination_annotation(sk_canvas_t* t, const sk_rect_t* rect, sk_data_t* value) {\n+ SkAnnotateLinkToDestination(AsCanvas(t), *AsRect(rect), AsData(value));\n+}\n+\n+void sk_canvas_draw_image_lattice(sk_canvas_t* ccanvas, const sk_image_t* image, const sk_lattice_t* lattice, const sk_rect_t* dst, sk_filter_mode_t mode, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawImageLattice(AsImage(image), *AsLattice(lattice), *AsRect(dst), (SkFilterMode)mode, AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_image_nine(sk_canvas_t* ccanvas, const sk_image_t* image, const sk_irect_t* center, const sk_rect_t* dst, sk_filter_mode_t mode, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawImageNine(AsImage(image), *AsIRect(center), *AsRect(dst), (SkFilterMode)mode, AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_vertices(sk_canvas_t* ccanvas, const sk_vertices_t* vertices, sk_blendmode_t mode, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawVertices(AsVertices(vertices), (SkBlendMode)mode, *AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_arc(sk_canvas_t* ccanvas, const sk_rect_t* oval, float startAngle, float sweepAngle, bool useCenter, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawArc(*AsRect(oval), startAngle, sweepAngle, useCenter, *AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_drrect(sk_canvas_t* ccanvas, const sk_rrect_t* outer, const sk_rrect_t* inner, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawDRRect(*AsRRect(outer), *AsRRect(inner), *AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_atlas(sk_canvas_t* ccanvas, const sk_image_t* atlas, const sk_rsxform_t* xform, const sk_rect_t* tex, const sk_color_t* colors, int count, sk_blendmode_t mode, const sk_sampling_options_t* sampling, const sk_rect_t* cullRect, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawAtlas(AsImage(atlas), AsRSXform(xform), AsRect(tex), colors, count, (SkBlendMode)mode, *AsSamplingOptions(sampling), AsRect(cullRect), AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_patch(sk_canvas_t* ccanvas, const sk_point_t* cubics, const sk_color_t* colors, const sk_point_t* texCoords, sk_blendmode_t mode, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawPatch(AsPoint(cubics), colors, AsPoint(texCoords), (SkBlendMode)mode, *AsPaint(paint));\n+}\n+\n+bool sk_canvas_is_clip_empty(sk_canvas_t* ccanvas) {\n+ return AsCanvas(ccanvas)->isClipEmpty();\n+}\n+\n+bool sk_canvas_is_clip_rect(sk_canvas_t* ccanvas) {\n+ return AsCanvas(ccanvas)->isClipRect();\n+}\n+\n+sk_nodraw_canvas_t* sk_nodraw_canvas_new(int width, int height) {\n+ return ToNoDrawCanvas(new SkNoDrawCanvas(width, height));\n+}\n+\n+void sk_nodraw_canvas_destroy(sk_nodraw_canvas_t* t) {\n+ delete AsNoDrawCanvas(t);\n+}\n+\n+sk_nway_canvas_t* sk_nway_canvas_new(int width, int height) {\n+ return ToNWayCanvas(new SkNWayCanvas(width, height));\n+}\n+\n+void sk_nway_canvas_destroy(sk_nway_canvas_t* t) {\n+ delete AsNWayCanvas(t);\n+}\n+\n+void sk_nway_canvas_add_canvas(sk_nway_canvas_t* t, sk_canvas_t* canvas) {\n+ AsNWayCanvas(t)->addCanvas(AsCanvas(canvas));\n+}\n+\n+void sk_nway_canvas_remove_canvas(sk_nway_canvas_t* t, sk_canvas_t* canvas) {\n+ AsNWayCanvas(t)->removeCanvas(AsCanvas(canvas));\n+}\n+\n+void sk_nway_canvas_remove_all(sk_nway_canvas_t* t) {\n+ AsNWayCanvas(t)->removeAll();\n+}\n+\n+sk_overdraw_canvas_t* sk_overdraw_canvas_new(sk_canvas_t* canvas) {\n+ return ToOverdrawCanvas(new SkOverdrawCanvas(AsCanvas(canvas)));\n+}\n+\n+void sk_overdraw_canvas_destroy(sk_overdraw_canvas_t* canvas) {\n+ delete AsOverdrawCanvas(canvas);\n+}\n+\n+gr_recording_context_t* sk_get_recording_context(sk_canvas_t* canvas) {\n+ return ToGrRecordingContext(AsCanvas(canvas)->recordingContext());\n+}\n+\n+sk_surface_t* sk_get_surface(sk_canvas_t* canvas) {\n+ return ToSurface(AsCanvas(canvas)->getSurface());\n+}", "newDiff": "diff --git a/src/c/sk_canvas.cpp b/src/c/sk_canvas.cpp\nnew file mode 100644\nindex 0000000000..8d7a0d25eb\n--- /dev/null\n+++ b/src/c/sk_canvas.cpp\n@@ -0,0 +1,319 @@\n+/*\n+ * Copyright 2014 Google Inc.\n+ * Copyright 2015 Xamarin Inc.\n+ * Copyright 2017 Microsoft Corporation. All rights reserved.\n+ *\n+ * Use of this source code is governed by a BSD-style license that can be\n+ * found in the LICENSE file.\n+ */\n+\n+#include \"include/core/SkAnnotation.h\"\n+#include \"include/core/SkCanvas.h\"\n+#include \"include/core/SkSpan.h\"\n+#include \"include/core/SkOverdrawCanvas.h\"\n+#include \"include/utils/SkNoDrawCanvas.h\"\n+#include \"include/utils/SkNWayCanvas.h\"\n+\n+#include \"include/c/sk_canvas.h\"\n+\n+#include \"src/c/sk_types_priv.h\"\n+\n+void sk_canvas_destroy(sk_canvas_t* ccanvas) {\n+ delete AsCanvas(ccanvas);\n+}\n+\n+void sk_canvas_clear(sk_canvas_t* ccanvas, sk_color_t color) {\n+ AsCanvas(ccanvas)->clear(color);\n+}\n+\n+void sk_canvas_clear_color4f(sk_canvas_t* ccanvas, sk_color4f_t color) {\n+ AsCanvas(ccanvas)->clear(AsColor4f(color));\n+}\n+\n+void sk_canvas_discard(sk_canvas_t* ccanvas) {\n+ AsCanvas(ccanvas)->discard();\n+}\n+\n+int sk_canvas_get_save_count(sk_canvas_t* ccanvas) {\n+ return AsCanvas(ccanvas)->getSaveCount();\n+}\n+\n+void sk_canvas_restore_to_count(sk_canvas_t* ccanvas, int saveCount) {\n+ AsCanvas(ccanvas)->restoreToCount(saveCount);\n+}\n+\n+void sk_canvas_draw_color(sk_canvas_t* ccanvas, sk_color_t color, sk_blendmode_t cmode) {\n+ AsCanvas(ccanvas)->drawColor(color, (SkBlendMode)cmode);\n+}\n+\n+void sk_canvas_draw_color4f(sk_canvas_t* ccanvas, sk_color4f_t color, sk_blendmode_t cmode) {\n+ AsCanvas(ccanvas)->drawColor(AsColor4f(color), (SkBlendMode)cmode);\n+}\n+\n+void sk_canvas_draw_points(sk_canvas_t* ccanvas, sk_point_mode_t pointMode, size_t count, const sk_point_t points [], const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawPoints((SkCanvas::PointMode)pointMode, SkSpan<const SkPoint>(AsPoint(points), count), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_point(sk_canvas_t* ccanvas, float x, float y, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawPoint (x, y, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_line(sk_canvas_t* ccanvas, float x0, float y0, float x1, float y1, sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawLine(x0, y0, x1, y1, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_simple_text(sk_canvas_t* ccanvas, const void* text, size_t byte_length, sk_text_encoding_t encoding, float x, float y, const sk_font_t* cfont, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawSimpleText(text, byte_length, (SkTextEncoding)encoding, x, y, *AsFont(cfont), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_text_blob (sk_canvas_t* ccanvas, sk_textblob_t* text, float x, float y, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawTextBlob(AsTextBlob(text), x, y, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_reset_matrix(sk_canvas_t* ccanvas) {\n+ AsCanvas(ccanvas)->resetMatrix();\n+}\n+\n+void sk_canvas_set_matrix(sk_canvas_t* ccanvas, const sk_matrix44_t* cmatrix) {\n+ AsCanvas(ccanvas)->setMatrix(*AsM44(cmatrix));\n+}\n+\n+void sk_canvas_get_matrix(sk_canvas_t* ccanvas, sk_matrix44_t* cmatrix) {\n+ *cmatrix = ToM44(AsCanvas(ccanvas)->getLocalToDevice());\n+}\n+\n+void sk_canvas_draw_round_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect, float rx, float ry, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawRoundRect(*AsRect(crect), rx, ry, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_clip_rect_with_operation(sk_canvas_t* ccanvas, const sk_rect_t* crect, sk_clipop_t op, bool doAA) {\n+ AsCanvas(ccanvas)->clipRect(*AsRect(crect), (SkClipOp)op, doAA);\n+}\n+\n+void sk_canvas_clip_path_with_operation(sk_canvas_t* ccanvas, const sk_path_t* cpath, sk_clipop_t op, bool doAA) {\n+ AsCanvas(ccanvas)->clipPath(*AsPath(cpath), (SkClipOp)op, doAA);\n+}\n+\n+void sk_canvas_clip_rrect_with_operation(sk_canvas_t* ccanvas, const sk_rrect_t* crect, sk_clipop_t op, bool doAA) {\n+ AsCanvas(ccanvas)->clipRRect(*AsRRect(crect), (SkClipOp)op, doAA);\n+}\n+\n+bool sk_canvas_get_local_clip_bounds(sk_canvas_t* ccanvas, sk_rect_t* cbounds) {\n+ return AsCanvas(ccanvas)->getLocalClipBounds(AsRect(cbounds));\n+}\n+\n+bool sk_canvas_get_device_clip_bounds(sk_canvas_t* ccanvas, sk_irect_t* cbounds) {\n+ return AsCanvas(ccanvas)->getDeviceClipBounds(AsIRect(cbounds));\n+}\n+\n+int sk_canvas_save(sk_canvas_t* ccanvas) {\n+ return AsCanvas(ccanvas)->save();\n+}\n+\n+int sk_canvas_save_layer(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {\n+ return AsCanvas(ccanvas)->saveLayer(AsRect(crect), AsPaint(cpaint));\n+}\n+\n+int sk_canvas_save_layer_rec(sk_canvas_t* ccanvas, const sk_canvas_savelayerrec_t* crec) {\n+ return AsCanvas(ccanvas)->saveLayer(AsCanvasSaveLayerRec(crec));\n+}\n+\n+void sk_canvas_restore(sk_canvas_t* ccanvas) {\n+ AsCanvas(ccanvas)->restore();\n+}\n+\n+void sk_canvas_translate(sk_canvas_t* ccanvas, float dx, float dy) {\n+ AsCanvas(ccanvas)->translate(dx, dy);\n+}\n+\n+void sk_canvas_scale(sk_canvas_t* ccanvas, float sx, float sy) {\n+ AsCanvas(ccanvas)->scale(sx, sy);\n+}\n+\n+void sk_canvas_rotate_degrees(sk_canvas_t* ccanvas, float degrees) {\n+ AsCanvas(ccanvas)->rotate(degrees);\n+}\n+\n+void sk_canvas_rotate_radians(sk_canvas_t* ccanvas, float radians) {\n+ AsCanvas(ccanvas)->rotate(SkRadiansToDegrees(radians));\n+}\n+\n+void sk_canvas_skew(sk_canvas_t* ccanvas, float sx, float sy) {\n+ AsCanvas(ccanvas)->skew(sx, sy);\n+}\n+\n+void sk_canvas_concat(sk_canvas_t* ccanvas, const sk_matrix44_t* cmatrix) {\n+ AsCanvas(ccanvas)->concat(*AsM44(cmatrix));\n+}\n+\n+bool sk_canvas_quick_reject(sk_canvas_t* ccanvas, const sk_rect_t* crect) {\n+ return AsCanvas(ccanvas)->quickReject(*AsRect(crect));\n+}\n+\n+void sk_canvas_clip_region(sk_canvas_t* ccanvas, const sk_region_t* region, sk_clipop_t op) {\n+ AsCanvas(ccanvas)->clipRegion(*AsRegion(region), (SkClipOp)op);\n+}\n+\n+void sk_canvas_draw_paint(sk_canvas_t* ccanvas, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawPaint(*AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_region(sk_canvas_t* ccanvas, const sk_region_t* cregion, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawRegion(*AsRegion(cregion), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_rect(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawRect(*AsRect(crect), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_rrect(sk_canvas_t* ccanvas, const sk_rrect_t* crect, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawRRect(*AsRRect(crect), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_circle(sk_canvas_t* ccanvas, float cx, float cy, float rad, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawCircle(cx, cy, rad, *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_oval(sk_canvas_t* ccanvas, const sk_rect_t* crect, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawOval(*AsRect(crect), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_path(sk_canvas_t* ccanvas, const sk_path_t* cpath, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawPath(*AsPath(cpath), *AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_image(sk_canvas_t* ccanvas, const sk_image_t* cimage, float x, float y, const sk_sampling_options_t* sampling, const sk_paint_t* cpaint) {\n+ AsCanvas(ccanvas)->drawImage(AsImage(cimage), x, y, *AsSamplingOptions(sampling), AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_image_rect(sk_canvas_t* ccanvas, const sk_image_t* cimage, const sk_rect_t* csrcR, const sk_rect_t* cdstR, const sk_sampling_options_t* sampling, const sk_paint_t* cpaint) {\n+ if (csrcR) {\n+ AsCanvas(ccanvas)->drawImageRect(AsImage(cimage), *AsRect(csrcR), *AsRect(cdstR), *AsSamplingOptions(sampling), AsPaint(cpaint), SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint);\n+ } else {\n+ AsCanvas(ccanvas)->drawImageRect(AsImage(cimage), *AsRect(cdstR), *AsSamplingOptions(sampling), AsPaint(cpaint));\n+ }\n+}\n+\n+void sk_canvas_draw_picture(sk_canvas_t* ccanvas, const sk_picture_t* cpicture, const sk_matrix_t* cmatrix, const sk_paint_t* cpaint) {\n+ SkMatrix m;\n+ if (cmatrix) {\n+ m = AsMatrix(cmatrix);\n+ }\n+ AsCanvas(ccanvas)->drawPicture(AsPicture(cpicture), cmatrix ? &m : nullptr, AsPaint(cpaint));\n+}\n+\n+void sk_canvas_draw_drawable(sk_canvas_t* ccanvas, sk_drawable_t* cdrawable, const sk_matrix_t* cmatrix) {\n+ SkMatrix m;\n+ if (cmatrix) {\n+ m = AsMatrix(cmatrix);\n+ }\n+ AsCanvas(ccanvas)->drawDrawable(AsDrawable(cdrawable), cmatrix ? &m : nullptr);\n+}\n+\n+sk_canvas_t* sk_canvas_new_from_bitmap(const sk_bitmap_t* bitmap) {\n+ return ToCanvas(new SkCanvas(*AsBitmap(bitmap)));\n+}\n+\n+sk_canvas_t* sk_canvas_new_from_raster(const sk_imageinfo_t* cinfo, void* pixels, size_t rowBytes, const sk_surfaceprops_t* props) {\n+ return ToCanvas(SkCanvas::MakeRasterDirect(AsImageInfo(cinfo), pixels, rowBytes, AsSurfaceProps(props)).release());\n+}\n+\n+void sk_canvas_draw_annotation(sk_canvas_t* t, const sk_rect_t* rect, const char* key, sk_data_t* value) {\n+ AsCanvas(t)->drawAnnotation(*AsRect(rect), key, AsData(value));\n+}\n+\n+void sk_canvas_draw_url_annotation(sk_canvas_t* t, const sk_rect_t* rect, sk_data_t* value) {\n+ SkAnnotateRectWithURL(AsCanvas(t), *AsRect(rect), AsData(value));\n+}\n+\n+void sk_canvas_draw_named_destination_annotation(sk_canvas_t* t, const sk_point_t* point, sk_data_t* value) {\n+ SkAnnotateNamedDestination(AsCanvas(t), *AsPoint(point), AsData(value));\n+}\n+\n+void sk_canvas_draw_link_destination_annotation(sk_canvas_t* t, const sk_rect_t* rect, sk_data_t* value) {\n+ SkAnnotateLinkToDestination(AsCanvas(t), *AsRect(rect), AsData(value));\n+}\n+\n+void sk_canvas_draw_image_lattice(sk_canvas_t* ccanvas, const sk_image_t* image, const sk_lattice_t* lattice, const sk_rect_t* dst, sk_filter_mode_t mode, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawImageLattice(AsImage(image), *AsLattice(lattice), *AsRect(dst), (SkFilterMode)mode, AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_image_nine(sk_canvas_t* ccanvas, const sk_image_t* image, const sk_irect_t* center, const sk_rect_t* dst, sk_filter_mode_t mode, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawImageNine(AsImage(image), *AsIRect(center), *AsRect(dst), (SkFilterMode)mode, AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_vertices(sk_canvas_t* ccanvas, const sk_vertices_t* vertices, sk_blendmode_t mode, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawVertices(AsVertices(vertices), (SkBlendMode)mode, *AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_arc(sk_canvas_t* ccanvas, const sk_rect_t* oval, float startAngle, float sweepAngle, bool useCenter, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawArc(*AsRect(oval), startAngle, sweepAngle, useCenter, *AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_drrect(sk_canvas_t* ccanvas, const sk_rrect_t* outer, const sk_rrect_t* inner, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawDRRect(*AsRRect(outer), *AsRRect(inner), *AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_atlas(sk_canvas_t* ccanvas, const sk_image_t* atlas, const sk_rsxform_t* xform, const sk_rect_t* tex, const sk_color_t* colors, int count, sk_blendmode_t mode, const sk_sampling_options_t* sampling, const sk_rect_t* cullRect, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawAtlas(AsImage(atlas),\n+ SkSpan<const SkRSXform>(AsRSXform(xform), count),\n+ SkSpan<const SkRect>(AsRect(tex), count),\n+ colors ? SkSpan<const SkColor>(colors, count) : SkSpan<const SkColor>(),\n+ (SkBlendMode)mode, *AsSamplingOptions(sampling), AsRect(cullRect), AsPaint(paint));\n+}\n+\n+void sk_canvas_draw_patch(sk_canvas_t* ccanvas, const sk_point_t* cubics, const sk_color_t* colors, const sk_point_t* texCoords, sk_blendmode_t mode, const sk_paint_t* paint) {\n+ AsCanvas(ccanvas)->drawPatch(AsPoint(cubics), colors, AsPoint(texCoords), (SkBlendMode)mode, *AsPaint(paint));\n+}\n+\n+bool sk_canvas_is_clip_empty(sk_canvas_t* ccanvas) {\n+ return AsCanvas(ccanvas)->isClipEmpty();\n+}\n+\n+bool sk_canvas_is_clip_rect(sk_canvas_t* ccanvas) {\n+ return AsCanvas(ccanvas)->isClipRect();\n+}\n+\n+sk_nodraw_canvas_t* sk_nodraw_canvas_new(int width, int height) {\n+ return ToNoDrawCanvas(new SkNoDrawCanvas(width, height));\n+}\n+\n+void sk_nodraw_canvas_destroy(sk_nodraw_canvas_t* t) {\n+ delete AsNoDrawCanvas(t);\n+}\n+\n+sk_nway_canvas_t* sk_nway_canvas_new(int width, int height) {\n+ return ToNWayCanvas(new SkNWayCanvas(width, height));\n+}\n+\n+void sk_nway_canvas_destroy(sk_nway_canvas_t* t) {\n+ delete AsNWayCanvas(t);\n+}\n+\n+void sk_nway_canvas_add_canvas(sk_nway_canvas_t* t, sk_canvas_t* canvas) {\n+ AsNWayCanvas(t)->addCanvas(AsCanvas(canvas));\n+}\n+\n+void sk_nway_canvas_remove_canvas(sk_nway_canvas_t* t, sk_canvas_t* canvas) {\n+ AsNWayCanvas(t)->removeCanvas(AsCanvas(canvas));\n+}\n+\n+void sk_nway_canvas_remove_all(sk_nway_canvas_t* t) {\n+ AsNWayCanvas(t)->removeAll();\n+}\n+\n+sk_overdraw_canvas_t* sk_overdraw_canvas_new(sk_canvas_t* canvas) {\n+ return ToOverdrawCanvas(new SkOverdrawCanvas(AsCanvas(canvas)));\n+}\n+\n+void sk_overdraw_canvas_destroy(sk_overdraw_canvas_t* canvas) {\n+ delete AsOverdrawCanvas(canvas);\n+}\n+\n+gr_recording_context_t* sk_get_recording_context(sk_canvas_t* canvas) {\n+ return ToGrRecordingContext(AsCanvas(canvas)->recordingContext());\n+}\n+\n+sk_surface_t* sk_get_surface(sk_canvas_t* canvas) {\n+ return ToSurface(AsCanvas(canvas)->getSurface());\n+}", "patchDiff": "--- old-patch (skiasharp vs old-upstream)\n+++ new-patch (pr-head vs new-upstream)\n@@ -1,9 +1,9 @@\n diff --git a/src/c/sk_canvas.cpp b/src/c/sk_canvas.cpp\n new file mode 100644\n-index 0000000000..4d23244854\n+index 0000000000..8d7a0d25eb\n --- /dev/null\n +++ b/src/c/sk_canvas.cpp\n-@@ -0,0 +1,314 @@\n+@@ -0,0 +1,319 @@\n +/*\n + * Copyright 2014 Google Inc.\n + * Copyright 2015 Xamarin Inc.\n@@ -15,6 +15,7 @@ index 0000000000..4d23244854\n +\n +#include \"include/core/SkAnnotation.h\"\n +#include \"include/core/SkCanvas.h\"\n++#include \"include/core/SkSpan.h\"\n +#include \"include/core/SkOverdrawCanvas.h\"\n +#include \"include/utils/SkNoDrawCanvas.h\"\n +#include \"include/utils/SkNWayCanvas.h\"\n@@ -56,7 +57,7 @@ index 0000000000..4d23244854\n +}\n +\n +void sk_canvas_draw_points(sk_canvas_t* ccanvas, sk_point_mode_t pointMode, size_t count, const sk_point_t points [], const sk_paint_t* cpaint) {\n-+ AsCanvas(ccanvas)->drawPoints ((SkCanvas::PointMode)pointMode, count, AsPoint(points), *AsPaint(cpaint));\n++ AsCanvas(ccanvas)->drawPoints((SkCanvas::PointMode)pointMode, SkSpan<const SkPoint>(AsPoint(points), count), *AsPaint(cpaint));\n +}\n +\n +void sk_canvas_draw_point(sk_canvas_t* ccanvas, float x, float y, const sk_paint_t* cpaint) {\n@@ -260,7 +261,11 @@ index 0000000000..4d23244854\n +}\n +\n +void sk_canvas_draw_atlas(sk_canvas_t* ccanvas, const sk_image_t* atlas, const sk_rsxform_t* xform, const sk_rect_t* tex, const sk_color_t* colors, int count, sk_blendmode_t mode, const sk_sampling_options_t* sampling, const sk_rect_t* cullRect, const sk_paint_t* paint) {\n-+ AsCanvas(ccanvas)->drawAtlas(AsImage(atlas), AsRSXform(xform), AsRect(tex), colors, count, (SkBlendMode)mode, *AsSamplingOptions(sampling), AsRect(cullRect), AsPaint(paint));\n++ AsCanvas(ccanvas)->drawAtlas(AsImage(atlas),\n++ SkSpan<const SkRSXform>(AsRSXform(xform), count),\n++ SkSpan<const SkRect>(AsRect(tex), count),\n++ colors ? SkSpan<const SkColor>(colors, count) : SkSpan<const SkColor>(),\n++ (SkBlendMode)mode, *AsSamplingOptions(sampling), AsRect(cullRect), AsPaint(paint));\n +}\n +\n +void sk_canvas_draw_patch(sk_canvas_t* ccanvas, const sk_point_t* cubics, const sk_color_t* colors, const sk_point_t* texCoords, sk_blendmode_t mode, const sk_paint_t* paint) {", "summary": "Internal implementation updates to use SkSpan-based APIs. (1) Added #include SkSpan.h. (2) sk_canvas_draw_points: raw pointer+count replaced with SkSpan<const SkPoint>. (3) sk_canvas_draw_atlas: raw pointer arrays replaced with SkSpan<const SkRSXform>, SkSpan<const SkRect>, and conditional SkSpan<const SkColor> (empty span when colors is null). No C API signature changes.", "relatedFiles": [{"path": "binding/SkiaSharp/SKCanvas.cs", "relationship": "C# wrapper (no changes needed, C API unchanged)"}]} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment