diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7feee8e..9337b3f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,7 +49,7 @@ jobs: run: uv run python scripts/check_engine_locks.py - name: Verify release version sources - run: uv run python scripts/release_evidence.py --tag v0.2.0 --check-version-only + run: uv run python scripts/release_evidence.py --tag v0.2.1 --check-version-only - name: Build Python distributions run: uv build @@ -111,6 +111,9 @@ jobs: - name: Verify checked catalog artifacts run: uv run python scripts/check_examples.py --check + - name: Verify public gallery matches reviewed live baselines + run: uv run python scripts/sync_dashboard_samples.py --check + - name: Generate every target variant and verify native expectations run: uv run python scripts/check_corpus.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e03bb8f..16684ce 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,6 +9,14 @@ concurrency: cancel-in-progress: false jobs: + visual-regression: + name: Release visual regression + uses: ./.github/workflows/visual-regression.yml + with: + suite: full + target: all + update_snapshots: false + official-engine: name: Release validator ${{ matrix.engine }} runs-on: ubuntu-latest @@ -78,7 +86,7 @@ jobs: build: name: Build and attest once - needs: official-engine + needs: [official-engine, visual-regression] runs-on: ubuntu-latest timeout-minutes: 20 permissions: diff --git a/.github/workflows/visual-regression.yml b/.github/workflows/visual-regression.yml new file mode 100644 index 0000000..cae04f4 --- /dev/null +++ b/.github/workflows/visual-regression.yml @@ -0,0 +1,239 @@ +name: Splunk visual regression + +on: + pull_request: + paths: + - ".github/workflows/visual-regression.yml" + - "examples/catalog/**" + - "integration/splunk-visual/**" + - "splunk_dashboard_studio/catalog.py" + - "splunk_dashboard_studio/codec.py" + - "splunk_dashboard_studio/contracts.py" + - "splunk_dashboard_studio/generation.py" + - "splunk_dashboard_studio/models.py" + - "splunk_dashboard_studio/source_templates.py" + - "splunk_dashboard_studio/template_data/**" + - "splunk_dashboard_studio/validation.py" + schedule: + - cron: "23 6 * * *" + workflow_dispatch: + inputs: + suite: + description: Render scope + required: true + default: smoke + type: choice + options: [smoke, full] + target: + description: Full-suite target selection + required: true + default: all + type: choice + options: [all, "9.4.3", "10.0.0", "10.2.0", "10.4.0"] + update_snapshots: + description: Generate candidate baselines for artifact review + required: true + default: false + type: boolean + workflow_call: + inputs: + suite: + required: true + type: string + target: + required: false + default: all + type: string + update_snapshots: + required: false + default: false + type: boolean + +permissions: + contents: read + +concurrency: + group: visual-${{ github.workflow }}-${{ github.ref }}-${{ inputs.suite || 'scheduled' }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + matrix-config: + name: Resolve target matrix + runs-on: ubuntu-24.04 + timeout-minutes: 2 + outputs: + matrix: ${{ steps.configuration.outputs.matrix }} + steps: + - name: Resolve target matrix + id: configuration + env: + REQUESTED_TARGET: ${{ inputs.target || 'all' }} + shell: bash + run: | + set -euo pipefail + case "${REQUESTED_TARGET}" in + all|"") + echo 'matrix={"target":["9.4.3","10.0.0","10.2.0","10.4.0"]}' >>"${GITHUB_OUTPUT}" + ;; + 9.4.3|10.0.0|10.2.0|10.4.0) + echo "matrix={\"target\":[\"${REQUESTED_TARGET}\"]}" >>"${GITHUB_OUTPUT}" + ;; + *) + echo "Unsupported target: ${REQUESTED_TARGET}" >&2 + exit 2 + ;; + esac + + visual-smoke: + name: Visual smoke (10.4.0) + needs: matrix-config + if: github.event_name == 'pull_request' || inputs.suite == 'smoke' + runs-on: ubuntu-24.04 + timeout-minutes: 25 + steps: + - name: Check out repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Set up Python 3.12 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6 + with: + python-version: "3.12" + + - name: Set up uv + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7 + with: + version: "0.11.25" + enable-cache: true + save-cache: false + + - name: Set up Node 24 for browser QA only + uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6 + with: + node-version: "24" + cache: npm + cache-dependency-path: integration/splunk-visual/package-lock.json + + - name: Install Python runtime and browser harness + run: | + uv sync --frozen --no-dev + npm ci --prefix integration/splunk-visual --ignore-scripts --no-audit --no-fund + npm exec --prefix integration/splunk-visual -- playwright install --with-deps chromium + + - name: Run disposable Splunk render smoke + env: + SPLUNK_PASSWORD: Visual-QA-${{ github.run_id }}-${{ github.run_attempt }}! + SPLUNK_TARGET: "10.4.0" + SPLUNK_UPDATE_SNAPSHOTS: ${{ inputs.update_snapshots && '1' || '0' }} + SPLUNK_VISUAL_ARTIFACTS: ${{ runner.temp }}/splunk-visual-10.4.0 + SPLUNK_VISUAL_OUTPUT: ${{ runner.temp }}/splunk-visual-10.4.0 + SPLUNK_VISUAL_SUITE: smoke + run: integration/splunk-visual/run.sh + + - name: Build QA overview after a partial browser failure + if: failure() + env: + SPLUNK_VISUAL_ARTIFACTS: ${{ runner.temp }}/splunk-visual-10.4.0 + SPLUNK_VISUAL_TARGET: "10.4.0" + working-directory: integration/splunk-visual + shell: bash + run: | + if find "${SPLUNK_VISUAL_ARTIFACTS}/screenshots" -name '*.png' -print -quit | grep -q .; then + npm run qa:overview + fi + + - name: Upload smoke evidence + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: splunk-visual-smoke-10.4.0 + path: ${{ runner.temp }}/splunk-visual-10.4.0 + if-no-files-found: error + retention-days: 14 + + - name: Upload candidate baselines + if: inputs.update_snapshots + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: candidate-baselines-10.4.0 + path: integration/splunk-visual/baselines/10.4.0 + if-no-files-found: error + retention-days: 14 + + visual-full: + name: Visual full (${{ matrix.target }}) + needs: matrix-config + if: github.event_name == 'schedule' || inputs.suite == 'full' + runs-on: ubuntu-24.04 + timeout-minutes: 35 + strategy: + fail-fast: false + max-parallel: 2 + matrix: ${{ fromJSON(needs.matrix-config.outputs.matrix) }} + steps: + - name: Check out repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Set up Python 3.12 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6 + with: + python-version: "3.12" + + - name: Set up uv + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7 + with: + version: "0.11.25" + enable-cache: true + save-cache: false + + - name: Set up Node 24 for browser QA only + uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6 + with: + node-version: "24" + cache: npm + cache-dependency-path: integration/splunk-visual/package-lock.json + + - name: Install Python runtime and browser harness + run: | + uv sync --frozen --no-dev + npm ci --prefix integration/splunk-visual --ignore-scripts --no-audit --no-fund + npm exec --prefix integration/splunk-visual -- playwright install --with-deps chromium + + - name: Run disposable Splunk full render suite + env: + SPLUNK_PASSWORD: Visual-QA-${{ github.run_id }}-${{ strategy.job-index }}! + SPLUNK_TARGET: ${{ matrix.target }} + SPLUNK_UPDATE_SNAPSHOTS: ${{ inputs.update_snapshots && '1' || '0' }} + SPLUNK_VISUAL_ARTIFACTS: ${{ runner.temp }}/splunk-visual-${{ matrix.target }} + SPLUNK_VISUAL_OUTPUT: ${{ runner.temp }}/splunk-visual-${{ matrix.target }} + SPLUNK_VISUAL_SUITE: full + run: integration/splunk-visual/run.sh + + - name: Build QA overview after a partial browser failure + if: failure() + env: + SPLUNK_VISUAL_ARTIFACTS: ${{ runner.temp }}/splunk-visual-${{ matrix.target }} + SPLUNK_VISUAL_TARGET: ${{ matrix.target }} + working-directory: integration/splunk-visual + shell: bash + run: | + if find "${SPLUNK_VISUAL_ARTIFACTS}/screenshots" -name '*.png' -print -quit | grep -q .; then + npm run qa:overview + fi + + - name: Upload target evidence + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: splunk-visual-full-${{ matrix.target }} + path: ${{ runner.temp }}/splunk-visual-${{ matrix.target }} + if-no-files-found: error + retention-days: 14 + + - name: Upload candidate baselines + if: inputs.update_snapshots + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: candidate-baselines-${{ matrix.target }} + path: integration/splunk-visual/baselines/${{ matrix.target }} + if-no-files-found: error + retention-days: 14 diff --git a/.gitignore b/.gitignore index 7d64c5b..13d978e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,8 @@ node_modules/ compatibility-report.json corpus.jsonl schema.json +/integration/splunk-visual/artifacts/ +/integration/splunk-visual/playwright-report/ +/integration/splunk-visual/test-results/ +/integration/splunk-visual/blob-report/ +/integration/splunk-visual/storage-state.json diff --git a/CHANGELOG.md b/CHANGELOG.md index daa0daa..846d924 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ candidate” describe repository state and do not claim a GitHub or PyPI release ## Unreleased -### 0.2.0 release candidate +### 0.2.1 release candidate Added: @@ -19,19 +19,34 @@ Added: diffs. - Engine-lock consistency, generated-example drift, release-evidence, checksum, artifact attestation, and PyPI trusted-publishing workflows. +- An auto-accepting, integration-only Splunk Free fixture for original-SPL dispatch, exact synthetic + result math, REST publish/readback, Dashboard Studio browser rendering, and state coverage. +- Locked Playwright screenshot regression, ARIA and trace evidence, QA overview generation, and a + provider-neutral advisory vision report contract. +- Reviewed full-suite render baselines for pinned Splunk Enterprise 9.4.3, 10.0.0, 10.2.0, and + 10.4.0 images, with a machine-readable provenance inventory. +- A provenance-locked source-template API and CLI for the Apache-2.0 Splunk Health dashboard from + `rcastley/splunk-custom-visualizations`, including its eight integration-only custom + visualizations and manifest-driven render contracts. +- A distinct app-free Splunk Health compatibility port using built-in visualizations, validated + with live Splunk Enterprise 9.4.3 and 10.0.0 render baselines. +- A five-image public gallery synchronized byte-for-byte from reviewed live Splunk baselines. - Operational security, skills, architecture, compatibility, and catalog documentation. Changed: -- Package and runtime version to `0.2.0`. +- Package and runtime version to `0.2.1`. - Minimum Python version from 3.14 to 3.12. - The 10.4 network graph type to the official `splunk.networkGraph` spelling. +- Native custom-visualization detection to recognize app-qualified visualization types and enforce + the Splunk Enterprise 10.2 feature boundary. - Compatibility corpus from eight generic cases per target to include every eligible catalog - definition. + definition and source template; app-free source ports run through official NPM validators while + app-qualified custom definitions remain live-fixture-only. Deferred: -- Live Splunk publish/readback fixture and HTTP adapter. +- An unattended vision provider or external screenshot-upload credential. - Machine-enforced ACL, sensitive-index, or publication policy. - Splunk Cloud, 9.2.x, and 9.3.x support. diff --git a/README.md b/README.md index afeefff..eeddd00 100644 --- a/README.md +++ b/README.md @@ -21,11 +21,11 @@ builder.add_visualization( print(canonical_json(builder.build(), indent=2)) ``` -Version 0.2.0 is an unreleased release candidate. The package is intentionally Splunk +Version 0.2.1 is an unreleased release candidate. The package is intentionally Splunk Enterprise-only. It does not claim Splunk Cloud compatibility, connect to a deployment, create saved searches, publish dashboards, or install Node at runtime. -## Included in v0.2 +## Included in v0.2.1 - Exact target profiles for the actively supported 9.4, 10.0, 10.2, and 10.4 release lines. - Deterministic builders for searches, saved-search references, chains, defaults, tokens, inputs, @@ -37,6 +37,8 @@ saved searches, publish dashboards, or install Node at runtime. - Ten packaged observability dashboards with checked definitions and manifests. - An offline codec for documented `data/ui/views` XML, including safe CDATA encoding, normalized SHA-256 comparison, and deterministic JSON-pointer diffs. +- An integration-only Splunk Free and Playwright harness for exact search math, live REST + publish/readback, browser rendering, screenshot regression, and advisory vision QA. - Locked Splunk-owned NPM validation engines in CI without redistributing them in Python artifacts. ## Development install @@ -74,6 +76,35 @@ The package deliberately ships no sample telemetry or hidden index assumptions. See [the example catalog](docs/example-catalog.md) and the checked files under [`examples/catalog/`](examples/catalog/). +## Source-derived templates + +The portable catalog is complemented by a provenance-locked source-template lane. The first entry +imports the actual Splunk Health Dashboard Studio definition and eight Canvas visualization +contracts from +[`rcastley/splunk-custom-visualizations`](https://github.com/rcastley/splunk-custom-visualizations) +at an exact Apache-2.0 revision: + +```console +uv run splunk-studio template list +uv run splunk-studio template build rcastley_splunk_health --target 10.2.0 +uv run splunk-studio template build rcastley_splunk_health_portable --target 9.4.3 +``` + +The source-faithful template requires Splunk Enterprise 10.2+ and the matching `splunk_health` +app. Its distinct portable port keeps the searches and layout but uses only built-in tables and a +single value, so it renders on Splunk Enterprise 9.4+ without the app. The Python distribution +ships both definitions and attribution, not the custom app or its JavaScript. See +[source-derived templates](docs/source-templates.md) for provenance, synchronization, and live-test +behavior. + +## Render samples + +The [dashboard gallery](docs/gallery.md) contains five 1440 by 1100 captures copied exactly from +reviewed live Splunk baselines, including the portable Splunk Health dashboard on Enterprise 9.4.3 +and the app-qualified source dashboard on 10.4.0. + +[![Splunk Health portable dashboard rendered on Splunk Enterprise 9.4.3](docs/images/dashboard-samples/splunk-health-portable-9.4.png)](docs/gallery.md) + ## CLI ```console @@ -108,9 +139,27 @@ comparison = compare_roundtrip(view, xml) assert comparison.equivalent ``` -The codec implements the documented storage envelope only. It performs no HTTP requests and has -not yet been verified against a disposable live Splunk publish/readback fixture. Treat it as an -offline serialization and drift-analysis tool, not deployment automation. +The codec implements the documented storage envelope only and performs no HTTP requests. The +separate disposable integration harness exercises that envelope against live Splunk; the runtime +package remains offline serialization and drift-analysis tooling, not deployment automation. + +## Live render regression + +The integration harness uses a pinned official Splunk Enterprise standalone in Free mode and a +locked Playwright/Chromium environment. It validates untouched catalog SPL against empty typed +indexes, exact synthetic render math, REST publish/readback, panel visibility, browser failures, +and target-specific screenshots. It also emits a QA overview and provider-neutral vision report +contract. + +Invoking the harness starts the official image and automatically passes Splunk's `--accept-license` +flag; targets that require it also receive `--accept-sgt-current-at-splunk-com`. Run it only after +reviewing the linked Splunk terms. Authentication and ACL behavior are intentionally not test +objectives. + +See [live visual regression](docs/visual-regression.md) before running the official image. The +repository includes reviewed full-suite baselines generated from every pinned target; normal local +and CI runs compare against them without rewriting snapshots. Candidate regeneration remains a +manual, review-before-commit operation. ## Validation authority @@ -120,9 +169,10 @@ The native validator and official CI engines have different jobs: - Locked Splunk NPM schemas own exact Splunk option shapes and the official DOS parser. - Release evidence is valid only when every required lane agrees with its declared expectation. -Node remains CI-only. Build inspection rejects JavaScript, NPM manifests, and `node_modules` from -both wheel and source-distribution artifacts. See [architecture](docs/architecture.md) and -[compatibility policy](docs/compatibility.md). +Node remains integration/CI-only. Build inspection rejects the entire integration harness, +JavaScript/TypeScript, NPM manifests, browser outputs, and `node_modules` from both wheel and +source-distribution artifacts. See [architecture](docs/architecture.md) and [compatibility +policy](docs/compatibility.md). ## Security and status diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md new file mode 100644 index 0000000..514654f --- /dev/null +++ b/THIRD_PARTY_NOTICES.md @@ -0,0 +1,19 @@ +# Third-party notices + +## rcastley/splunk-custom-visualizations + +This project includes an adapted Dashboard Studio definition and an integration-only source +snapshot from [rcastley/splunk-custom-visualizations](https://github.com/rcastley/splunk-custom-visualizations), +revision `7424755c461712022367c3fa081fd7e0edc91001`. + +- Upstream author: Robert Castley and repository contributors +- Upstream license: Apache License 2.0 +- Packaged Python content: the `splunk_health` Dashboard Studio JSON definition, its deterministic + built-in visualization compatibility port, and provenance metadata +- Integration-only content: the built `splunk_health` app and eight upstream `harness.json` + visualization contracts + +The upstream app, JavaScript, CSS, preview images, and harness contracts are excluded from the +Python wheel and source distribution. The repository's Apache-2.0 `LICENSE` applies to the adapted +source material; upstream origin and exact content hashes are retained in +`integration/splunk-visual/source-lock.json`. diff --git a/docs/architecture.md b/docs/architecture.md index 7551224..f88c3fa 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -16,6 +16,8 @@ authoring, evidence, official validation, and deployment. validation. 6. `codec.py` encodes and decodes the documented `data/ui/views` XML envelope without networking. 7. `cli.py` exposes these surfaces as deterministic JSON or JSONL commands. +8. `integration/splunk-visual/` is an unshipped adapter that owns disposable Splunk REST, search, + browser, screenshot, and vision-handoff evidence. Canonical dashboard JSON contains only fields Splunk owns. Telemetry assumptions, provenance, saved-search proposals, validation state, and evidence grades stay in the artifact manifest so @@ -43,7 +45,8 @@ Neither lane is a complete oracle: report official validation as `not_run`; CI output is the proof of an official-engine run. A release candidate is acceptable only when native expectations, official-engine expectations, -generated artifacts, typing, and distribution inspection all pass. +generated artifacts, typing, distribution inspection, and the required live visual target matrix +all pass. ## CI-only official engines @@ -75,13 +78,26 @@ bundle` includes dashboard, artifact, telemetry, and skill schemas in one docume descriptors declare inputs, outputs, heuristics, constraints, and tool names, but do not execute or grant authority. See [skills](skills.md). -## Offline round-trip boundary +## Live integration boundary `StudioView`, `encode_view_xml`, `decode_view_xml`, and `compare_roundtrip` implement the documented `` format. The decoder rejects DTD/entity declarations, normalizes JSON via `DashboardDefinition`, ignores unknown server-added XML fields, and reports deterministic JSON-pointer differences. -There is intentionally no HTTP client, SDK dependency, credential handling, publish command, or -live CI fixture in v0.2. A future integration extra may add a disposable publish/readback test, but -it must remain separate from the compiler runtime. +The compiler runtime still contains no HTTP client, SDK dependency, credential handling, or +publish command. The integration-only harness uses the standard library to publish generated test +views to a disposable Free-mode standalone, read them back, dispatch source and fixture searches, +and remove them. It is not installed by the wheel or sdist. + +Playwright owns the browser evidence boundary. Exact synthetic rows are validated through the +search export API before Chromium renders them; screenshots therefore cannot substitute for math. +Reviewed target-specific baselines are deterministic gates. The QA overview and vision report are +an advisory fourth-party interpretation unless a deterministic result corroborates the finding. + +The harness binds only localhost ports, uses synthetic data and a throwaway password, and destroys +the container volume. A fixture-local `server.conf` override enables Free-mode remote management +for REST validation; it is never packaged or presented as a production setting. The harness does +not test authentication, ACLs, or production deployment. Invoking it automatically passes Splunk's +license-acceptance flag and the target-specific current general-terms flag, so operators must +review the linked terms before running it. diff --git a/docs/compatibility.md b/docs/compatibility.md index d8b8a1c..cc76ce0 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -27,6 +27,23 @@ The Python runtime supports CPython 3.12, 3.13, and 3.14. Node is never a runtim Product versions and NPM package versions are independent axes. A package published near a Splunk release is not, by timing alone, proof that the product embeds it. +## Live render evidence + +The integration image registry pins exact official `splunk/splunk` manifest digests for 9.4.3, +10.0.0, 10.2.0, and 10.4.0. Live evidence has a third axis beyond product and NPM versions: the +Splunk image digest plus Playwright/Chromium baseline. Passing an NPM validator does not prove a +dashboard renders, and a browser screenshot does not prove which NPM library the product embeds. + +For each target, the live lane checks original SPL dispatch, exact synthetic result rows, REST +publish/readback equivalence, browser state, panel and full-page screenshots, and error/no-data +rendering. The repository includes reviewed full-suite baselines generated on July 22, 2026 from +each exact pinned image digest. The machine-readable inventory records the image, architecture, +browser version, suite, screenshot count, and a digest of the baseline set. Missing or changed +baselines fail normal local and CI comparison; regeneration is a separate manual review path. + +See [live visual regression](visual-regression.md) for the automatic startup flags, fixture +lifecycle, CI tiers, and evidence contract. + ## 9.4 evidence The public NPM registry has no `@splunk/dashboard-validation@24.0.0`. Public v24 validation releases diff --git a/docs/gallery.md b/docs/gallery.md new file mode 100644 index 0000000..566471d --- /dev/null +++ b/docs/gallery.md @@ -0,0 +1,39 @@ +# Dashboard render gallery + +These are deterministic Playwright captures from disposable, pinned Splunk Enterprise containers. +They are exact copies of reviewed visual-regression baselines—not mockups—and their source paths, +target versions, byte sizes, and SHA-256 hashes are recorded in +[`images/dashboard-samples/manifest.json`](images/dashboard-samples/manifest.json). + +## Splunk Health portable — Enterprise 9.4.3 + +The app-free compatibility port keeps the eight upstream health searches and dashboard layout, +then renders them with built-in tables and a single value. No custom app is installed on Splunk 9. + +![Splunk Health portable dashboard rendered on Splunk Enterprise 9.4.3](images/dashboard-samples/splunk-health-portable-9.4.png) + +## Kubernetes workload health — Enterprise 9.4.3 + +![Kubernetes workload health dashboard rendered on Splunk Enterprise 9.4.3](images/dashboard-samples/kubernetes-workload-health-9.4.png) + +## Business journey SLO — Enterprise 10.2.0 + +![Business journey SLO dashboard rendered on Splunk Enterprise 10.2.0](images/dashboard-samples/business-journey-slo-10.2.png) + +## Microservice service map — Enterprise 10.4.0 + +![Microservice service map dashboard rendered on Splunk Enterprise 10.4.0](images/dashboard-samples/microservice-service-map-10.4.png) + +## Splunk Health custom visualizations — Enterprise 10.4.0 + +This is the provenance-locked source dashboard with the matching `splunk_health` app mounted only +inside the disposable integration fixture. + +![Splunk Health custom visualization dashboard rendered on Splunk Enterprise 10.4.0](images/dashboard-samples/splunk-health-custom-10.4.png) + +Regenerate the public copies only after reviewing new baselines: + +```console +uv run python scripts/sync_dashboard_samples.py --write +uv run python scripts/sync_dashboard_samples.py --check +``` diff --git a/docs/images/dashboard-samples/business-journey-slo-10.2.png b/docs/images/dashboard-samples/business-journey-slo-10.2.png new file mode 100644 index 0000000..f46813b Binary files /dev/null and b/docs/images/dashboard-samples/business-journey-slo-10.2.png differ diff --git a/docs/images/dashboard-samples/kubernetes-workload-health-9.4.png b/docs/images/dashboard-samples/kubernetes-workload-health-9.4.png new file mode 100644 index 0000000..ee4bbb2 Binary files /dev/null and b/docs/images/dashboard-samples/kubernetes-workload-health-9.4.png differ diff --git a/docs/images/dashboard-samples/manifest.json b/docs/images/dashboard-samples/manifest.json new file mode 100644 index 0000000..c52509f --- /dev/null +++ b/docs/images/dashboard-samples/manifest.json @@ -0,0 +1,51 @@ +{ + "samples": [ + { + "baseline_path": "integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-full.png", + "bytes": 78333, + "image_sha256": "4f3508ee4948909178c99e1850351177aaa8adebb6f71a38a41d74101cff5b84", + "output_path": "docs/images/dashboard-samples/splunk-health-portable-9.4.png", + "sample_id": "splunk_health_portable_94", + "target": "9.4.3", + "title": "Splunk Health portable port" + }, + { + "baseline_path": "integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-full.png", + "bytes": 82681, + "image_sha256": "15f9a0f110535d07fd87b32bd57c3df127ceb56220bf02b61e9ef5dc35f33733", + "output_path": "docs/images/dashboard-samples/kubernetes-workload-health-9.4.png", + "sample_id": "kubernetes_workload_health_94", + "target": "9.4.3", + "title": "Kubernetes workload health" + }, + { + "baseline_path": "integration/splunk-visual/baselines/10.2.0/business-journey-slo-full.png", + "bytes": 88297, + "image_sha256": "5012afba76e96bb770cb7ed040d20f652693fffd0eea005f1b5f5578b0d4c803", + "output_path": "docs/images/dashboard-samples/business-journey-slo-10.2.png", + "sample_id": "business_journey_slo_102", + "target": "10.2.0", + "title": "Business journey SLO" + }, + { + "baseline_path": "integration/splunk-visual/baselines/10.4.0/microservice-service-map-full.png", + "bytes": 87700, + "image_sha256": "8f01705f1961ae7a3033f7eb54fdcb8091fe20a6b97a270a244b7c77a974d1a5", + "output_path": "docs/images/dashboard-samples/microservice-service-map-10.4.png", + "sample_id": "microservice_service_map_104", + "target": "10.4.0", + "title": "Microservice service map" + }, + { + "baseline_path": "integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-full.png", + "bytes": 249382, + "image_sha256": "fc8164329b62dc242f337bbefb7a4cedd754c71f06570786d68c6ee89bddcb53", + "output_path": "docs/images/dashboard-samples/splunk-health-custom-10.4.png", + "sample_id": "splunk_health_custom_104", + "target": "10.4.0", + "title": "Splunk Health custom visualization source" + } + ], + "schema_version": "dashboard-sample-gallery/v1", + "source": "reviewed live Splunk Enterprise Playwright baselines" +} diff --git a/docs/images/dashboard-samples/microservice-service-map-10.4.png b/docs/images/dashboard-samples/microservice-service-map-10.4.png new file mode 100644 index 0000000..716527c Binary files /dev/null and b/docs/images/dashboard-samples/microservice-service-map-10.4.png differ diff --git a/docs/images/dashboard-samples/splunk-health-custom-10.4.png b/docs/images/dashboard-samples/splunk-health-custom-10.4.png new file mode 100644 index 0000000..ace4f0e Binary files /dev/null and b/docs/images/dashboard-samples/splunk-health-custom-10.4.png differ diff --git a/docs/images/dashboard-samples/splunk-health-portable-9.4.png b/docs/images/dashboard-samples/splunk-health-portable-9.4.png new file mode 100644 index 0000000..81e5f33 Binary files /dev/null and b/docs/images/dashboard-samples/splunk-health-portable-9.4.png differ diff --git a/docs/source-templates.md b/docs/source-templates.md new file mode 100644 index 0000000..e759476 --- /dev/null +++ b/docs/source-templates.md @@ -0,0 +1,86 @@ +# Source-derived dashboard templates + +The source-template catalog is distinct from the project's ten portable observability examples. +Portable examples are authored against the repository's normalized telemetry contract. A +source-derived template instead preserves a named external dashboard, exact repository revision, +content hash, required Splunk app when applicable, license, and documented adaptations. + +## Splunk Health by rcastley + +`rcastley_splunk_health` imports the eight-panel Dashboard Studio definition from +[`rcastley/splunk-custom-visualizations`](https://github.com/rcastley/splunk-custom-visualizations/tree/7424755c461712022367c3fa081fd7e0edc91001). +The source dashboard covers component status, license consumption, system resources, indexing +queues, forwarders, active searches, scheduler health, and index storage. Its panels use the +upstream `splunk_health` Canvas 2D custom visualization app. + +The upstream project declares Splunk Enterprise 10.2+ or Splunk Cloud as its custom-visualization +baseline. This project validates only Splunk Enterprise and therefore rejects this template for +9.4 and 10.0 targets. Building the JSON does not install the required app; operators must install +the matching `splunk_health` app revision separately before publishing the definition. + +`rcastley_splunk_health_portable` is a separate compatibility port for Splunk Enterprise 9.4 and +later. It preserves all eight source searches, refresh settings, titles, and the 1920 by 1080 +layout. Seven custom Canvas panels become `splunk.table`; the license gauge becomes +`splunk.singlevalue`; custom options and the app dependency are removed. This is an explicit +adaptation, not a claim that the upstream custom-visualization app runs on Splunk 9. + +```console +uv run splunk-studio template list +uv run splunk-studio template build rcastley_splunk_health --target 10.2.0 +uv run splunk-studio template build rcastley_splunk_health \ + --target 10.4.0 --artifact bundle --output splunk-health.json +uv run splunk-studio template build rcastley_splunk_health_portable \ + --target 9.4.3 --artifact bundle --output splunk-health-portable.json +``` + +Python callers use `source_template_entries()`, `build_source_template()`, and +`build_source_template_bundle()`. The bundle keeps the definition and provenance contract together. + +## What is preserved + +- The source-owned panel types, titles, search strings, options, 1920 by 1080 layout, and dark + dashboard theme. +- The upstream Apache-2.0 license, author attribution, commit SHA, source paths, and normalized + definition SHA-256. +- The eight upstream `harness.json` contracts, including expected columns, sample rows, formatter + defaults, default sizes, and no-data messages. +- The built upstream app snapshot used by the disposable integration lane. +- A deterministic built-in visualization transform of the same source definition for the portable + variant; the transform changes no source SPL. + +The Python package contains only the JSON definition, provenance metadata, and attribution notice. +Custom app JavaScript, CSS, images, NPM assets, and browser tooling remain under the integration +tree and are rejected from both wheel and source-distribution artifacts. + +## Adopted engineering lessons + +The import deliberately applies the most reusable practices from the upstream +[`splunk-viz` skill](https://github.com/rcastley/splunk-custom-visualizations/blob/7424755c461712022367c3fa081fd7e0edc91001/.claude/skills/splunk-viz/SKILL.md): + +1. External dashboards are immutable source inputs. Runtime loading verifies the normalized + definition hash, while the integration lock inventories every copied app and harness file. +2. Render fixtures come from visualization-owned data contracts. The live harness converts the + upstream sample rows into deterministic `makeresults` SPL instead of inventing panel data. +3. Original SPL and render SPL remain separate. Live Splunk dispatches the original health searches + for fatal errors, then independently checks exact fixture rows before browser rendering. +4. Canvas QA needs canvas-specific evidence. Playwright requires a visible, non-zero canvas inside + every custom panel, freezes the upstream 50 ms animation loop, seeds particle randomness, and + captures panel and full-dashboard screenshots. +5. Custom visualization compatibility has two dimensions: the Enterprise feature boundary and the + installed app revision. Native validation now treats app-qualified types as a 10.2 feature. +6. A compatibility port must remain visibly distinct from its source. The portable template has a + separate ID, title, hash, adaptation list, minimum target, and empty required-app contract. + +## Reproducible import + +Maintainers update the snapshot only from an exact checkout of the pinned revision: + +```console +uv run python scripts/sync_source_templates.py \ + --source /path/to/splunk-custom-visualizations --check +``` + +Use `--write` only for an intentional source update. Changing the revision requires reviewing the +upstream license and diff, updating both package metadata hashes, regenerating 9.4/10.0 portable +and 10.2/10.4 custom visual baselines, and running the complete release evidence suite. The sync +command does not clone the repository or contact GitHub. diff --git a/docs/visual-regression.md b/docs/visual-regression.md new file mode 100644 index 0000000..39c1cee --- /dev/null +++ b/docs/visual-regression.md @@ -0,0 +1,188 @@ +# Live Splunk visual regression + +The integration harness under `integration/splunk-visual/` answers three different questions with +three independent evidence lanes: + +| Lane | Question | Gate | +|---|---|---| +| Search-result contract | Did the exact synthetic SPL return the expected rows and values? | Hard | +| Live render regression | Did Splunk ingest, read back, and render every panel without deterministic browser or image regressions? | Hard | +| Vision QA | Does the rendered dashboard show layout or chart-quality defects that deterministic checks missed? | Advisory unless a deterministic failure corroborates it | + +Model judgment never replaces search math or screenshot comparison. A vision-only observation is +a warning. A model-reported error can gate only when it cites an existing browser, query, or pixel +diff failure. + +## Startup and terms boundary + +The harness uses the official `splunk/splunk` image and `SPLUNK_LICENSE_URI=Free`. Free mode avoids +a license secret; it does not remove the software terms. Read the +[Splunk General Terms](https://www.splunk.com/en_us/legal/splunk-general-terms.html) before running +the image. Invoking `run.sh` automatically passes `--accept-license`; targets marked in +`images.json` as requiring the current general terms also receive +`--accept-sgt-current-at-splunk-com`. Local, pull-request, nightly, manual, and release runs all use +this same behavior, with no repository variable or interactive prompt. + +Authentication is plumbing only. The disposable container uses an ephemeral admin password so the +REST and browser clients can reach Splunk during initial setup. There are no authentication, role, +ACL, or publication-permission assertions. Free mode disables remote management by default, so +the container-only `defaults.yml` sets `server.conf/[general]/allowRemoteLogin = always`. Both +ports remain bound to `127.0.0.1`, and the setting is destroyed with the disposable volume. + +For 10.2 and 10.4, `prepare` also copies the provenance-locked `splunk_health` app into the run +artifact and Compose mounts that disposable copy into the standalone. The vendored source remains +unchanged, the app is absent from 9.4/10.0 runs, and no app asset enters a Python distribution. + +## Pinned targets + +`images.json` records a tag plus immutable manifest-list digest for every supported target and +declares whether the extra 10.x terms flag is required. The images are Linux amd64 because the +official Splunk Enterprise image currently publishes that architecture for these tags. + +| Target | Image manifest digest | +|---|---| +| 9.4.3 | `sha256:27344f73cbe07c3ea003164dbabef38e08e56efb193b39095cf56f8784a42dbe` | +| 10.0.0 | `sha256:10da23a5c78397b38328ed863ca2826390c329c517f9aff7a4978f30e5208e78` | +| 10.2.0 | `sha256:a7a7d800cdf470eeedf5a8eb2a4ea1bb07ade9bef5c95f1c65eabab08e7ac391` | +| 10.4.0 | `sha256:5fef7b0d2c83f6e8b3fe3cda5885e2a01e3a6eb99d8502e6333aaa64e7021f62` | + +Updating one digest is a compatibility change: regenerate and review that target's baselines even +when the visible version tag is unchanged. + +## What the harness does + +For each run, `scripts/harness.py`: + +1. Builds eligible dashboards from the production catalog and source-template registry for the + exact Enterprise target. +2. Copies the definitions and replaces only the test copy's `ds.search` query strings with fixed + `makeresults` contracts. Production catalog objects and checked examples are unchanged. +3. For the source-derived Splunk Health dashboard, preserves the upstream layout and visualization + configuration while deriving fixture rows from the eight pinned upstream `harness.json` files. +4. Adds explicit no-data and search-error state dashboards. +5. Starts one standalone Splunk instance in Free mode on localhost, waits for the official + container health check, and independently retries Splunk Web until its transient unavailable + page clears before browser work begins. +6. Creates empty event and metric indexes matching the portable telemetry contract. +7. Dispatches the original catalog and source-template SPL and rejects fatal search messages. + Empty results are valid; this lane checks the real query, not the fixture query. +8. Publishes each generated view through `servicesNS/admin/search/data/ui/views`, reads it back, and + compares the normalized Dashboard Studio XML envelope. +9. Dispatches every synthetic query and compares projected rows exactly with either `fixtures.json` + or the pinned upstream harness contract. +10. Renders each view with the locked Playwright/Chromium environment. +11. Deletes the views and removes the container and volume on exit. + +The synthetic contracts cover every visualization type currently used by the catalog: + +- line charts receive three fixed timestamped points and a target series; +- tables receive three ordered entity/status rows; +- single values receive exactly `99.95`; the API contract checks that raw value while the browser + contract checks Splunk's default rounded rendering of `100`; +- network graphs receive three explicit source/target/weight edges. + +The eight custom Canvas panels receive the exact field names and sample rows declared by their +upstream harnesses. Playwright requires each to expose a visible, non-zero canvas within its panel. +The browser seed fixes particle randomness and suppresses the upstream 50 ms animation interval in +child frames so snapshots represent the initial deterministic render rather than an arbitrary +animation frame. + +The browser uses a 1440 by 1100 CSS-pixel viewport, device scale factor 1, UTC, `en-US`, light +theme, one worker, disabled animation and transitions, and a pinned Chromium from Playwright +1.61.1. It asserts dashboard and panel titles, checks table, single-value, and network-node markers +inside their panel bounds, captures an ARIA snapshot, rejects unexpected search/browser/resource +failures, and records full-dashboard and panel screenshots. + +## Local commands + +Install the integration-only Node dependencies and Chromium once: + +```console +uv sync --frozen --no-dev +cd integration/splunk-visual +npm ci +npm exec -- playwright install chromium +cd ../.. +``` + +Generate a candidate baseline: + +```console +SPLUNK_TARGET=10.4.0 \ +SPLUNK_VISUAL_SUITE=smoke \ +SPLUNK_UPDATE_SNAPSHOTS=1 \ +./integration/splunk-visual/run.sh +``` + +Run a normal comparison: + +```console +SPLUNK_TARGET=10.4.0 \ +SPLUNK_VISUAL_SUITE=smoke \ +./integration/splunk-visual/run.sh +``` + +Use `SPLUNK_VISUAL_SUITE=full` for every target-eligible catalog dashboard. Override +`SPLUNK_VISUAL_OUTPUT`, `SPLUNK_WEB_PORT`, or `SPLUNK_MGMT_PORT` to isolate concurrent local runs. + +## Baseline policy + +Baselines live under `integration/splunk-visual/baselines//`. Panel comparisons allow at +most a 0.2 percent differing-pixel ratio; full-dashboard comparisons allow 0.5 percent. The wider +full-page threshold accounts for aggregate antialiasing while panel diffs remain strict. + +Normal local and CI runs set Playwright's update policy to `none`. They never rewrite a baseline. +A manual GitHub run with `update_snapshots=true` uploads candidate baseline artifacts but does not +commit them. Review candidates for valid data, title/panel presence, chart selection, clipping, +spacing, and unexpected product chrome before adding them to the repository. + +The repository includes reviewed full-suite baselines generated from all four pinned images: 67 +screenshots each for 9.4.3, 10.0.0, and 10.2.0, and 73 for 10.4.0. The 9.4/10.0 sets include the +app-free Splunk Health port and its eight built-in panels; the 10.2/10.4 sets include the +source-derived dashboard and its eight custom panels; 10.4 also includes the service-map +dashboard. `baselines/manifest.json` is the machine-readable inventory. A clean comparison with +snapshot updates disabled is required after any regeneration. + +## CI tiers + +`.github/workflows/visual-regression.yml` provides: + +- `visual-smoke`: relevant pull requests and manual smoke runs; Splunk 10.4.0; the business SLO, + service-map, source-derived Splunk Health, no-data, and error-state dashboards; 25-minute timeout. +- `visual-full`: nightly, manual full, and reusable release runs; 9.4.3, 10.0.0, 10.2.0, and + 10.4.0 matrix; all eligible dashboards plus state fixtures; 35 minutes per target. +- candidate-baseline mode: manual only; updates the working copy and uploads candidate files for + review without pushing or committing. + +The release workflow calls the full matrix before building distributions. The wheel still ships no +Node, browser, integration harness, screenshot, or Splunk artifact. The source distribution includes +only the five curated documentation images, not the integration baselines or harness. + +## QA and vision artifacts + +Every target artifact contains the generated definitions and XML, run manifest, exact source and +fixture search results, round-trip comparison, Playwright JSON/HTML reports, traces on failure, +ARIA snapshots, full and panel screenshots, and `qa-overview.png` plus `qa-overview.json`. + +`qa/vision-prompt.md` and `qa/vision-contract.json` define a provider-neutral inspection handoff. +The allowed categories are blank, loading, search error, overlap, clipping, contrast, wrong chart, +malformed graph, whitespace, and alignment. A vision tool writes +`splunk-vision-qa-report/v1`; `npm run qa:validate-vision -- ` checks its structure and +returns failure only for an error that names an ID already present in +`qa-overview.json#/deterministic_failures`. Invented or stale evidence IDs are rejected. + +Five reviewed full-dashboard captures are copied into the distributable documentation by +`scripts/sync_dashboard_samples.py`; see the [render gallery](gallery.md). The sample manifest +binds each public image to its target-specific baseline path and SHA-256. + +No model provider, credential, or screenshot upload is configured by default. That external-data +decision must be explicit. Codex or another vision-capable reviewer can inspect the generated +overview locally or from a CI artifact and return the same report contract. + +## Likely first-run adjustments + +Dashboard Studio's internal DOM is not a public compatibility contract. The first authorized run +may reveal a target-specific login redirect, product-tour modal, panel container boundary, or error +wording that needs a narrow selector adjustment. Do not weaken result math or image thresholds to +hide such a mismatch. Capture the trace and screenshot, adjust the smallest affected adapter, and +regenerate only the impacted target baseline. diff --git a/examples/catalog/api_gateway_overview/manifest.json b/examples/catalog/api_gateway_overview/manifest.json index 82439ca..913e295 100644 --- a/examples/catalog/api_gateway_overview/manifest.json +++ b/examples/catalog/api_gateway_overview/manifest.json @@ -8,7 +8,7 @@ "definition_sha256": "cf222473cd837762b336b9a3922b7610f027b9ade9af166b8137c64a127bf1c3", "engine_evidence": "temporal_surrogate", "example_id": "api_gateway_overview", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "9.4.3", "native_validation": "valid", "official_engine_id": "dashboard-27.5.1", diff --git a/examples/catalog/batch_cron_reliability/manifest.json b/examples/catalog/batch_cron_reliability/manifest.json index 2f8e368..9c00682 100644 --- a/examples/catalog/batch_cron_reliability/manifest.json +++ b/examples/catalog/batch_cron_reliability/manifest.json @@ -8,7 +8,7 @@ "definition_sha256": "56f3b8032e7f92b5c66a21180e730aefebc27347963ddfcb2e69e38dd204bd53", "engine_evidence": "temporal_surrogate", "example_id": "batch_cron_reliability", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "9.4.3", "native_validation": "valid", "official_engine_id": "dashboard-27.5.1", diff --git a/examples/catalog/business_journey_slo/manifest.json b/examples/catalog/business_journey_slo/manifest.json index a2c27ea..1116166 100644 --- a/examples/catalog/business_journey_slo/manifest.json +++ b/examples/catalog/business_journey_slo/manifest.json @@ -8,7 +8,7 @@ "definition_sha256": "d428c22d29130cefc79c1cac6dad3d2def073fca75539e3e0a2392199b65431d", "engine_evidence": "temporal_surrogate", "example_id": "business_journey_slo", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "9.4.3", "native_validation": "valid", "official_engine_id": "dashboard-27.5.1", diff --git a/examples/catalog/cicd_delivery_health/manifest.json b/examples/catalog/cicd_delivery_health/manifest.json index f6b0252..4fe07bf 100644 --- a/examples/catalog/cicd_delivery_health/manifest.json +++ b/examples/catalog/cicd_delivery_health/manifest.json @@ -8,7 +8,7 @@ "definition_sha256": "3f238d5f7b9655b69ed3ddc9d3bc7d7a90d2662b003eb089b9fc449feadd43c5", "engine_evidence": "temporal_surrogate", "example_id": "cicd_delivery_health", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "9.4.3", "native_validation": "valid", "official_engine_id": "dashboard-27.5.1", diff --git a/examples/catalog/ec2_host_capacity/manifest.json b/examples/catalog/ec2_host_capacity/manifest.json index aa0da13..b45cd61 100644 --- a/examples/catalog/ec2_host_capacity/manifest.json +++ b/examples/catalog/ec2_host_capacity/manifest.json @@ -8,7 +8,7 @@ "definition_sha256": "6f0b095156c743a830fc08dee8c8ac55fc9187b2f1086b04b19f589d75b30e5e", "engine_evidence": "temporal_surrogate", "example_id": "ec2_host_capacity", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "9.4.3", "native_validation": "valid", "official_engine_id": "dashboard-27.5.1", diff --git a/examples/catalog/kubernetes_workload_health/manifest.json b/examples/catalog/kubernetes_workload_health/manifest.json index 2f0609a..a830eee 100644 --- a/examples/catalog/kubernetes_workload_health/manifest.json +++ b/examples/catalog/kubernetes_workload_health/manifest.json @@ -8,7 +8,7 @@ "definition_sha256": "bf0c9e41c807b5e4a98d52ef1dd342ad3c86bb9e9c9ca9b861c9f824a4a93520", "engine_evidence": "temporal_surrogate", "example_id": "kubernetes_workload_health", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "9.4.3", "native_validation": "valid", "official_engine_id": "dashboard-27.5.1", diff --git a/examples/catalog/load_balancer_edge_health/manifest.json b/examples/catalog/load_balancer_edge_health/manifest.json index 9625612..2e8f0b4 100644 --- a/examples/catalog/load_balancer_edge_health/manifest.json +++ b/examples/catalog/load_balancer_edge_health/manifest.json @@ -8,7 +8,7 @@ "definition_sha256": "1a8fe357e0a5a648cb84e392976c61350125e35952853a6cb16dc2982e119f6c", "engine_evidence": "temporal_surrogate", "example_id": "load_balancer_edge_health", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "9.4.3", "native_validation": "valid", "official_engine_id": "dashboard-27.5.1", diff --git a/examples/catalog/microservice_service_map/dashboard.json b/examples/catalog/microservice_service_map/dashboard.json index a6d3655..1a93a36 100644 --- a/examples/catalog/microservice_service_map/dashboard.json +++ b/examples/catalog/microservice_service_map/dashboard.json @@ -18,6 +18,14 @@ }, "type": "ds.search" }, + "ds_dependency_map_nodes": { + "name": "Dependency map nodes", + "options": { + "extend": "ds_dependency_map", + "query": "| eval nodeIds=mvappend(source,target) | mvexpand nodeIds | stats sum(value) AS nodeValues by nodeIds | eval nodeTexts=nodeIds | table nodeIds nodeTexts nodeValues" + }, + "type": "ds.chain" + }, "ds_recent_deployments": { "name": "Recent deployments", "options": { @@ -161,12 +169,29 @@ "type": "splunk.table" }, "viz_dependency_map": { - "context": {}, + "context": { + "linkWidthScale": { + "outputMax": 8, + "outputMin": 2 + } + }, "dataSources": { + "nodeSource": "ds_dependency_map_nodes", "primary": "ds_dependency_map" }, "description": "Show request flow between instrumented services.", - "options": {}, + "options": { + "gridColumns": 2, + "layout": "grid", + "linkWidth": "> primary | seriesByName(\"value\") | lerp(linkWidthScale)", + "nodeIds": "> nodeSource | seriesByName(\"nodeIds\")", + "nodeSize": 24, + "nodeTexts": "> nodeSource | seriesByName(\"nodeTexts\")", + "nodeValues": "> nodeSource | seriesByName(\"nodeValues\")", + "showDirection": "oneWay", + "source": "> primary | seriesByName(\"source\")", + "target": "> primary | seriesByName(\"target\")" + }, "title": "Dependency map", "type": "splunk.networkGraph" }, diff --git a/examples/catalog/microservice_service_map/manifest.json b/examples/catalog/microservice_service_map/manifest.json index ea5b628..512abc6 100644 --- a/examples/catalog/microservice_service_map/manifest.json +++ b/examples/catalog/microservice_service_map/manifest.json @@ -4,11 +4,11 @@ "Official NPM validation is performed in CI and is not claimed by this generated file.", "Live Splunk REST ingestion and readback remain deferred." ], - "canonical_json_bytes": 3627, - "definition_sha256": "12e819987861eed98efa935036d807292abec6d45c4cdec176f276146baf5bd9", + "canonical_json_bytes": 4411, + "definition_sha256": "16746e0357c7472622605bdd0392ce5fec23d91b0f5f67abffea74068213bc72", "engine_evidence": "temporal_surrogate", "example_id": "microservice_service_map", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "10.4.0", "native_validation": "valid", "official_engine_id": "dashboard-29.8.0", @@ -38,7 +38,8 @@ }, { "data_source_ids": [ - "ds_dependency_map" + "ds_dependency_map", + "ds_dependency_map_nodes" ], "drilldown_signals": [ "log" diff --git a/examples/catalog/rds_database_health/manifest.json b/examples/catalog/rds_database_health/manifest.json index bb0564c..9236c59 100644 --- a/examples/catalog/rds_database_health/manifest.json +++ b/examples/catalog/rds_database_health/manifest.json @@ -8,7 +8,7 @@ "definition_sha256": "0d595cfa3e596b3fb6dc8cc4a9afefefd21aeb561d71ab602ea293fc057d81f5", "engine_evidence": "temporal_surrogate", "example_id": "rds_database_health", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "9.4.3", "native_validation": "valid", "official_engine_id": "dashboard-27.5.1", diff --git a/examples/catalog/security_operations_overview/manifest.json b/examples/catalog/security_operations_overview/manifest.json index dad13d5..d388f38 100644 --- a/examples/catalog/security_operations_overview/manifest.json +++ b/examples/catalog/security_operations_overview/manifest.json @@ -8,7 +8,7 @@ "definition_sha256": "dcdd9cf4cb415d22d2475de2ddc2ef7a8ec340dcd5556a1f5cea44d9916d3862", "engine_evidence": "temporal_surrogate", "example_id": "security_operations_overview", - "generator_version": "0.2.0", + "generator_version": "0.2.1", "minimum_target": "9.4.3", "native_validation": "valid", "official_engine_id": "dashboard-27.5.1", diff --git a/examples/source_templates/README.md b/examples/source_templates/README.md new file mode 100644 index 0000000..0ff4892 --- /dev/null +++ b/examples/source_templates/README.md @@ -0,0 +1,12 @@ +# Source-derived templates + +`rcastley_splunk_health.py` builds the Apache-2.0 Splunk Health template pinned from +`rcastley/splunk-custom-visualizations`. The output requires the matching `splunk_health` custom +visualization app and Splunk Enterprise 10.2 or later. + +```console +uv run python examples/source_templates/rcastley_splunk_health.py +``` + +See [source-derived templates](../../docs/source-templates.md) for provenance, installation +boundaries, and the reproducible import workflow. diff --git a/examples/source_templates/rcastley_splunk_health.py b/examples/source_templates/rcastley_splunk_health.py new file mode 100644 index 0000000..dff9214 --- /dev/null +++ b/examples/source_templates/rcastley_splunk_health.py @@ -0,0 +1,12 @@ +"""Build the pinned rcastley Splunk Health source template.""" + +from splunk_dashboard_studio import build_source_template_bundle, canonical_json + + +def main() -> None: + bundle = build_source_template_bundle("rcastley_splunk_health", "10.2.0") + print(canonical_json(bundle.model_dump(mode="json", by_alias=True), indent=2)) + + +if __name__ == "__main__": + main() diff --git a/examples/source_templates/rcastley_splunk_health_portable.py b/examples/source_templates/rcastley_splunk_health_portable.py new file mode 100644 index 0000000..cdd6f63 --- /dev/null +++ b/examples/source_templates/rcastley_splunk_health_portable.py @@ -0,0 +1,12 @@ +"""Build the app-free rcastley Splunk Health port for Splunk Enterprise 9.4.""" + +from splunk_dashboard_studio import build_source_template_bundle, canonical_json + + +def main() -> None: + bundle = build_source_template_bundle("rcastley_splunk_health_portable", "9.4.3") + print(canonical_json(bundle.model_dump(mode="json", by_alias=True), indent=2)) + + +if __name__ == "__main__": + main() diff --git a/integration/splunk-visual/README.md b/integration/splunk-visual/README.md new file mode 100644 index 0000000..4ddc2a1 --- /dev/null +++ b/integration/splunk-visual/README.md @@ -0,0 +1,62 @@ +# Disposable Splunk visual regression + +This integration-only harness starts one pinned Splunk Enterprise standalone in Free mode, +publishes test-only Dashboard Studio views, checks their search results and REST readback, renders +them in Chromium, and creates screenshot and vision-QA artifacts. It does not test authentication, +roles, ACLs, or production publication. + +On Splunk 10.2/10.4, the suite also installs a disposable copy of the pinned Apache-2.0 Splunk +Health app from `rcastley/splunk-custom-visualizations`. Its dashboard structure and fixture rows +come from the upstream source definition and eight `harness.json` contracts. The source lock and +vendored snapshot live under this integration tree and never ship in Python artifacts. + +Do not start the container until you have read and accepted the applicable +[Splunk General Terms](https://www.splunk.com/en_us/legal/splunk-general-terms.html). The official +image requires explicit license acceptance, and 10.x also requires the current-general-terms flag. +Invoking `run.sh` passes `--accept-license` automatically and adds +`--accept-sgt-current-at-splunk-com` for targets marked as requiring it in `images.json`. There is +no interactive prompt or separate environment-variable gate. + +## One-time setup + +From this directory: + +```console +npm ci +npm exec -- playwright install chromium +``` + +The repository root must also have its locked Python environment available with +`uv sync --frozen --no-dev`. + +## Run and update baselines + +Reviewed full-suite baselines for every pinned target are included. Run a normal hard comparison +without setting `SPLUNK_UPDATE_SNAPSHOTS`: + +```console +SPLUNK_TARGET=10.4.0 \ +SPLUNK_VISUAL_SUITE=smoke \ +./integration/splunk-visual/run.sh +``` + +To intentionally generate candidate screenshots from the exact pinned image: + +```console +SPLUNK_TARGET=10.4.0 \ +SPLUNK_VISUAL_SUITE=smoke \ +SPLUNK_UPDATE_SNAPSHOTS=1 \ +./integration/splunk-visual/run.sh +``` + +Review the images under `baselines/10.4.0/` and the generated `qa-overview.png`, then rerun with +snapshot updates disabled before committing a baseline. Missing or changed baselines fail normal +local and CI runs. + +`run.sh` binds ports 8000 and 8089 to `127.0.0.1`, uses a throwaway local password, removes all +test views, stops the container, and deletes its volume on exit. Override ports with +`SPLUNK_WEB_PORT` and `SPLUNK_MGMT_PORT` when they are already occupied. `defaults.yml` enables +Free-mode remote management for these localhost-only REST checks; it is not a production setting. + +See [the full workflow documentation](../../docs/visual-regression.md) for fixture semantics, CI +configuration, artifacts, and the advisory vision contract. diff --git a/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-full.png b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-full.png new file mode 100644 index 0000000..bee2d42 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-authentication-failures.png b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-authentication-failures.png new file mode 100644 index 0000000..6b78181 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-authentication-failures.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-latency-distribution.png b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-latency-distribution.png new file mode 100644 index 0000000..85dc97d Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-latency-distribution.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-route-red.png b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-route-red.png new file mode 100644 index 0000000..1106471 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-route-red.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-throttling.png b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-throttling.png new file mode 100644 index 0000000..864835d Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-throttling.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-top-tenants.png b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-top-tenants.png new file mode 100644 index 0000000..bee962d Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/api-gateway-overview-viz-top-tenants.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-full.png b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-full.png new file mode 100644 index 0000000..1832511 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-backlog.png b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-backlog.png new file mode 100644 index 0000000..8222588 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-backlog.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-duration.png b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-duration.png new file mode 100644 index 0000000..b51c0fd Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-duration.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-failures.png b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-failures.png new file mode 100644 index 0000000..8c47432 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-failures.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-freshness.png b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-freshness.png new file mode 100644 index 0000000..99709c0 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-job-freshness.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-schedule-adherence.png b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-schedule-adherence.png new file mode 100644 index 0000000..b51393d Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/batch-cron-reliability-viz-schedule-adherence.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/business-journey-slo-full.png b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-full.png new file mode 100644 index 0000000..b6c6296 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-business-freshness.png b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-business-freshness.png new file mode 100644 index 0000000..446dccb Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-business-freshness.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-error-budget-burn.png b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-error-budget-burn.png new file mode 100644 index 0000000..956942c Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-error-budget-burn.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-journey-abandonment.png b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-journey-abandonment.png new file mode 100644 index 0000000..8790f94 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-journey-abandonment.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-journey-latency.png b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-journey-latency.png new file mode 100644 index 0000000..72b652a Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-journey-latency.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-journey-success.png b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-journey-success.png new file mode 100644 index 0000000..27a759b Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/business-journey-slo-viz-journey-success.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-full.png b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-full.png new file mode 100644 index 0000000..aae0640 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-delivery-lead-time.png b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-delivery-lead-time.png new file mode 100644 index 0000000..f8914f3 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-delivery-lead-time.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-deployment-rollbacks.png b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-deployment-rollbacks.png new file mode 100644 index 0000000..937ec05 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-deployment-rollbacks.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-flaky-jobs.png b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-flaky-jobs.png new file mode 100644 index 0000000..32328ef Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-flaky-jobs.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-pipeline-failures.png b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-pipeline-failures.png new file mode 100644 index 0000000..e3c2557 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-pipeline-failures.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-pipeline-queue-time.png b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-pipeline-queue-time.png new file mode 100644 index 0000000..662d39b Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/cicd-delivery-health-viz-pipeline-queue-time.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-full.png b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-full.png new file mode 100644 index 0000000..52caa8e Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-cpu.png b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-cpu.png new file mode 100644 index 0000000..5f230c1 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-cpu.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-disk.png b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-disk.png new file mode 100644 index 0000000..90857b4 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-disk.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-errors.png b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-errors.png new file mode 100644 index 0000000..57be38d Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-errors.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-memory.png b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-memory.png new file mode 100644 index 0000000..acbafc5 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-memory.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-network-load.png b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-network-load.png new file mode 100644 index 0000000..46bf391 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/ec2-host-capacity-viz-host-network-load.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-full.png b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-full.png new file mode 100644 index 0000000..33576c9 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-failing-pods.png b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-failing-pods.png new file mode 100644 index 0000000..5cc343f Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-failing-pods.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-pod-restarts.png b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-pod-restarts.png new file mode 100644 index 0000000..7a22195 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-pod-restarts.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-resource-saturation.png b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-resource-saturation.png new file mode 100644 index 0000000..ca697ed Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-resource-saturation.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-workload-error-rate.png b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-workload-error-rate.png new file mode 100644 index 0000000..e2815cc Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-workload-error-rate.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-workload-p95-latency.png b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-workload-p95-latency.png new file mode 100644 index 0000000..c6dd5f1 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/kubernetes-workload-health-viz-workload-p95-latency.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-full.png b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-full.png new file mode 100644 index 0000000..f90856f Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-backend-failures.png b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-backend-failures.png new file mode 100644 index 0000000..9e69ae1 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-backend-failures.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-errors.png b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-errors.png new file mode 100644 index 0000000..d9b3c43 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-errors.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-latency.png b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-latency.png new file mode 100644 index 0000000..b1ea5d8 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-latency.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-saturation.png b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-saturation.png new file mode 100644 index 0000000..096e51e Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-saturation.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-traffic.png b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-traffic.png new file mode 100644 index 0000000..512a98f Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/load-balancer-edge-health-viz-edge-traffic.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-full.png b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-full.png new file mode 100644 index 0000000..53ba1ef Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-forwarder-heatmap.png b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-forwarder-heatmap.png new file mode 100644 index 0000000..11b69f0 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-forwarder-heatmap.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-index-storage.png b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-index-storage.png new file mode 100644 index 0000000..5e1c0ec Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-index-storage.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-indexing-pipeline.png b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-indexing-pipeline.png new file mode 100644 index 0000000..6a895ff Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-indexing-pipeline.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-license-gauge.png b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-license-gauge.png new file mode 100644 index 0000000..afd585b Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-license-gauge.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-resource-gauge.png b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-resource-gauge.png new file mode 100644 index 0000000..dbb3ea5 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-resource-gauge.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-scheduler-health.png b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-scheduler-health.png new file mode 100644 index 0000000..7d5ca29 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-scheduler-health.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-search-activity.png b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-search-activity.png new file mode 100644 index 0000000..8c60564 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-search-activity.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-status-board.png b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-status-board.png new file mode 100644 index 0000000..8a09001 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rcastley-splunk-health-portable-viz-status-board.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rds-database-health-full.png b/integration/splunk-visual/baselines/10.0.0/rds-database-health-full.png new file mode 100644 index 0000000..268ee16 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rds-database-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-connections.png b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-connections.png new file mode 100644 index 0000000..dc228db Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-connections.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-latency.png b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-latency.png new file mode 100644 index 0000000..45e5d34 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-latency.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-locks.png b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-locks.png new file mode 100644 index 0000000..4f4cd1f Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-locks.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-storage.png b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-storage.png new file mode 100644 index 0000000..61fa82e Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-database-storage.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-replication-lag.png b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-replication-lag.png new file mode 100644 index 0000000..39b12ee Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/rds-database-health-viz-replication-lag.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/security-operations-overview-full.png b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-full.png new file mode 100644 index 0000000..43fc467 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-auth-failures.png b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-auth-failures.png new file mode 100644 index 0000000..63497d2 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-auth-failures.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-high-risk-events.png b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-high-risk-events.png new file mode 100644 index 0000000..b46e66d Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-high-risk-events.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-ingestion-lag.png b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-ingestion-lag.png new file mode 100644 index 0000000..5bc5b5e Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-ingestion-lag.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-noisy-detections.png b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-noisy-detections.png new file mode 100644 index 0000000..ddb4117 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-noisy-detections.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-security-platform-health.png b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-security-platform-health.png new file mode 100644 index 0000000..fd7810b Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/security-operations-overview-viz-security-platform-health.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/state-no-data-full.png b/integration/splunk-visual/baselines/10.0.0/state-no-data-full.png new file mode 100644 index 0000000..448aaa0 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/state-no-data-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/state-no-data-viz-no-data.png b/integration/splunk-visual/baselines/10.0.0/state-no-data-viz-no-data.png new file mode 100644 index 0000000..3b6735e Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/state-no-data-viz-no-data.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/state-search-error-full.png b/integration/splunk-visual/baselines/10.0.0/state-search-error-full.png new file mode 100644 index 0000000..bcf93b9 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/state-search-error-full.png differ diff --git a/integration/splunk-visual/baselines/10.0.0/state-search-error-viz-search-error.png b/integration/splunk-visual/baselines/10.0.0/state-search-error-viz-search-error.png new file mode 100644 index 0000000..a1a4ea8 Binary files /dev/null and b/integration/splunk-visual/baselines/10.0.0/state-search-error-viz-search-error.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-full.png b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-full.png new file mode 100644 index 0000000..22bf33b Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-authentication-failures.png b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-authentication-failures.png new file mode 100644 index 0000000..6b78181 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-authentication-failures.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-latency-distribution.png b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-latency-distribution.png new file mode 100644 index 0000000..85dc97d Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-latency-distribution.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-route-red.png b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-route-red.png new file mode 100644 index 0000000..1106471 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-route-red.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-throttling.png b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-throttling.png new file mode 100644 index 0000000..864835d Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-throttling.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-top-tenants.png b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-top-tenants.png new file mode 100644 index 0000000..bee962d Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/api-gateway-overview-viz-top-tenants.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-full.png b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-full.png new file mode 100644 index 0000000..4ea84ce Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-backlog.png b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-backlog.png new file mode 100644 index 0000000..8222588 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-backlog.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-duration.png b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-duration.png new file mode 100644 index 0000000..b51c0fd Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-duration.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-failures.png b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-failures.png new file mode 100644 index 0000000..8c47432 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-failures.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-freshness.png b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-freshness.png new file mode 100644 index 0000000..99709c0 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-job-freshness.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-schedule-adherence.png b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-schedule-adherence.png new file mode 100644 index 0000000..b51393d Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/batch-cron-reliability-viz-schedule-adherence.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/business-journey-slo-full.png b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-full.png new file mode 100644 index 0000000..f46813b Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-business-freshness.png b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-business-freshness.png new file mode 100644 index 0000000..446dccb Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-business-freshness.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-error-budget-burn.png b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-error-budget-burn.png new file mode 100644 index 0000000..956942c Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-error-budget-burn.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-journey-abandonment.png b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-journey-abandonment.png new file mode 100644 index 0000000..8790f94 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-journey-abandonment.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-journey-latency.png b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-journey-latency.png new file mode 100644 index 0000000..72b652a Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-journey-latency.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-journey-success.png b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-journey-success.png new file mode 100644 index 0000000..27a759b Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/business-journey-slo-viz-journey-success.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-full.png b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-full.png new file mode 100644 index 0000000..f4c9375 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-delivery-lead-time.png b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-delivery-lead-time.png new file mode 100644 index 0000000..f8914f3 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-delivery-lead-time.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-deployment-rollbacks.png b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-deployment-rollbacks.png new file mode 100644 index 0000000..937ec05 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-deployment-rollbacks.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-flaky-jobs.png b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-flaky-jobs.png new file mode 100644 index 0000000..32328ef Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-flaky-jobs.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-pipeline-failures.png b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-pipeline-failures.png new file mode 100644 index 0000000..e3c2557 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-pipeline-failures.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-pipeline-queue-time.png b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-pipeline-queue-time.png new file mode 100644 index 0000000..662d39b Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/cicd-delivery-health-viz-pipeline-queue-time.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-full.png b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-full.png new file mode 100644 index 0000000..6fab523 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-cpu.png b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-cpu.png new file mode 100644 index 0000000..5f230c1 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-cpu.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-disk.png b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-disk.png new file mode 100644 index 0000000..90857b4 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-disk.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-errors.png b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-errors.png new file mode 100644 index 0000000..57be38d Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-errors.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-memory.png b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-memory.png new file mode 100644 index 0000000..acbafc5 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-memory.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-network-load.png b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-network-load.png new file mode 100644 index 0000000..46bf391 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/ec2-host-capacity-viz-host-network-load.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-full.png b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-full.png new file mode 100644 index 0000000..2287596 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-failing-pods.png b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-failing-pods.png new file mode 100644 index 0000000..5cc343f Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-failing-pods.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-pod-restarts.png b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-pod-restarts.png new file mode 100644 index 0000000..7a22195 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-pod-restarts.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-resource-saturation.png b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-resource-saturation.png new file mode 100644 index 0000000..ca697ed Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-resource-saturation.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-workload-error-rate.png b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-workload-error-rate.png new file mode 100644 index 0000000..e2815cc Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-workload-error-rate.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-workload-p95-latency.png b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-workload-p95-latency.png new file mode 100644 index 0000000..c6dd5f1 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/kubernetes-workload-health-viz-workload-p95-latency.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-full.png b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-full.png new file mode 100644 index 0000000..4178a13 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-backend-failures.png b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-backend-failures.png new file mode 100644 index 0000000..9e69ae1 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-backend-failures.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-errors.png b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-errors.png new file mode 100644 index 0000000..d9b3c43 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-errors.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-latency.png b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-latency.png new file mode 100644 index 0000000..b1ea5d8 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-latency.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-saturation.png b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-saturation.png new file mode 100644 index 0000000..096e51e Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-saturation.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-traffic.png b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-traffic.png new file mode 100644 index 0000000..512a98f Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/load-balancer-edge-health-viz-edge-traffic.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-full.png b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-full.png new file mode 100644 index 0000000..f149716 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-forwarder-heatmap.png b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-forwarder-heatmap.png new file mode 100644 index 0000000..6bb5714 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-forwarder-heatmap.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-index-storage.png b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-index-storage.png new file mode 100644 index 0000000..9724fc1 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-index-storage.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-indexing-pipeline.png b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-indexing-pipeline.png new file mode 100644 index 0000000..ab13b30 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-indexing-pipeline.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-license-gauge.png b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-license-gauge.png new file mode 100644 index 0000000..bb4f190 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-license-gauge.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-resource-gauge.png b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-resource-gauge.png new file mode 100644 index 0000000..c733e20 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-resource-gauge.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-scheduler-health.png b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-scheduler-health.png new file mode 100644 index 0000000..165e633 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-scheduler-health.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-search-activity.png b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-search-activity.png new file mode 100644 index 0000000..2ef53c4 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-search-activity.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-status-board.png b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-status-board.png new file mode 100644 index 0000000..b7fb223 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rcastley-splunk-health-viz-status-board.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rds-database-health-full.png b/integration/splunk-visual/baselines/10.2.0/rds-database-health-full.png new file mode 100644 index 0000000..9b64ebc Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rds-database-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-connections.png b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-connections.png new file mode 100644 index 0000000..dc228db Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-connections.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-latency.png b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-latency.png new file mode 100644 index 0000000..45e5d34 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-latency.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-locks.png b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-locks.png new file mode 100644 index 0000000..4f4cd1f Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-locks.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-storage.png b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-storage.png new file mode 100644 index 0000000..61fa82e Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-database-storage.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-replication-lag.png b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-replication-lag.png new file mode 100644 index 0000000..39b12ee Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/rds-database-health-viz-replication-lag.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/security-operations-overview-full.png b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-full.png new file mode 100644 index 0000000..b06aabf Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-auth-failures.png b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-auth-failures.png new file mode 100644 index 0000000..63497d2 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-auth-failures.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-high-risk-events.png b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-high-risk-events.png new file mode 100644 index 0000000..b46e66d Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-high-risk-events.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-ingestion-lag.png b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-ingestion-lag.png new file mode 100644 index 0000000..5bc5b5e Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-ingestion-lag.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-noisy-detections.png b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-noisy-detections.png new file mode 100644 index 0000000..ddb4117 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-noisy-detections.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-security-platform-health.png b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-security-platform-health.png new file mode 100644 index 0000000..fd7810b Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/security-operations-overview-viz-security-platform-health.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/state-no-data-full.png b/integration/splunk-visual/baselines/10.2.0/state-no-data-full.png new file mode 100644 index 0000000..65e7053 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/state-no-data-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/state-no-data-viz-no-data.png b/integration/splunk-visual/baselines/10.2.0/state-no-data-viz-no-data.png new file mode 100644 index 0000000..3b6735e Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/state-no-data-viz-no-data.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/state-search-error-full.png b/integration/splunk-visual/baselines/10.2.0/state-search-error-full.png new file mode 100644 index 0000000..1457cd2 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/state-search-error-full.png differ diff --git a/integration/splunk-visual/baselines/10.2.0/state-search-error-viz-search-error.png b/integration/splunk-visual/baselines/10.2.0/state-search-error-viz-search-error.png new file mode 100644 index 0000000..a1a4ea8 Binary files /dev/null and b/integration/splunk-visual/baselines/10.2.0/state-search-error-viz-search-error.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-full.png b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-full.png new file mode 100644 index 0000000..c13a916 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-authentication-failures.png b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-authentication-failures.png new file mode 100644 index 0000000..dedd3f8 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-authentication-failures.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-latency-distribution.png b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-latency-distribution.png new file mode 100644 index 0000000..1214a22 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-latency-distribution.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-route-red.png b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-route-red.png new file mode 100644 index 0000000..817e463 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-route-red.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-throttling.png b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-throttling.png new file mode 100644 index 0000000..89d872d Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-throttling.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-top-tenants.png b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-top-tenants.png new file mode 100644 index 0000000..0dd2986 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/api-gateway-overview-viz-top-tenants.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-full.png b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-full.png new file mode 100644 index 0000000..4f53117 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-backlog.png b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-backlog.png new file mode 100644 index 0000000..257fdf4 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-backlog.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-duration.png b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-duration.png new file mode 100644 index 0000000..11de06b Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-duration.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-failures.png b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-failures.png new file mode 100644 index 0000000..9c2e069 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-failures.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-freshness.png b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-freshness.png new file mode 100644 index 0000000..d42c621 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-job-freshness.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-schedule-adherence.png b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-schedule-adherence.png new file mode 100644 index 0000000..e76e88b Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/batch-cron-reliability-viz-schedule-adherence.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/business-journey-slo-full.png b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-full.png new file mode 100644 index 0000000..bdfdf17 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-business-freshness.png b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-business-freshness.png new file mode 100644 index 0000000..a108719 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-business-freshness.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-error-budget-burn.png b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-error-budget-burn.png new file mode 100644 index 0000000..3f83fe5 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-error-budget-burn.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-journey-abandonment.png b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-journey-abandonment.png new file mode 100644 index 0000000..e8eb6f9 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-journey-abandonment.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-journey-latency.png b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-journey-latency.png new file mode 100644 index 0000000..5f444dc Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-journey-latency.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-journey-success.png b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-journey-success.png new file mode 100644 index 0000000..72c6ce4 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/business-journey-slo-viz-journey-success.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-full.png b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-full.png new file mode 100644 index 0000000..ffa3ffb Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-delivery-lead-time.png b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-delivery-lead-time.png new file mode 100644 index 0000000..0114521 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-delivery-lead-time.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-deployment-rollbacks.png b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-deployment-rollbacks.png new file mode 100644 index 0000000..7cc02f2 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-deployment-rollbacks.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-flaky-jobs.png b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-flaky-jobs.png new file mode 100644 index 0000000..8e4e3f4 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-flaky-jobs.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-pipeline-failures.png b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-pipeline-failures.png new file mode 100644 index 0000000..84d7696 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-pipeline-failures.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-pipeline-queue-time.png b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-pipeline-queue-time.png new file mode 100644 index 0000000..18f15f6 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/cicd-delivery-health-viz-pipeline-queue-time.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-full.png b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-full.png new file mode 100644 index 0000000..ff15043 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-cpu.png b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-cpu.png new file mode 100644 index 0000000..de21515 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-cpu.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-disk.png b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-disk.png new file mode 100644 index 0000000..f26f5f8 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-disk.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-errors.png b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-errors.png new file mode 100644 index 0000000..bc64d6c Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-errors.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-memory.png b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-memory.png new file mode 100644 index 0000000..c24bc0d Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-memory.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-network-load.png b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-network-load.png new file mode 100644 index 0000000..64d4928 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/ec2-host-capacity-viz-host-network-load.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-full.png b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-full.png new file mode 100644 index 0000000..25863eb Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-failing-pods.png b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-failing-pods.png new file mode 100644 index 0000000..dd2b211 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-failing-pods.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-pod-restarts.png b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-pod-restarts.png new file mode 100644 index 0000000..ea71a5b Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-pod-restarts.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-resource-saturation.png b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-resource-saturation.png new file mode 100644 index 0000000..a3289d4 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-resource-saturation.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-workload-error-rate.png b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-workload-error-rate.png new file mode 100644 index 0000000..418c99d Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-workload-error-rate.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-workload-p95-latency.png b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-workload-p95-latency.png new file mode 100644 index 0000000..34949d6 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/kubernetes-workload-health-viz-workload-p95-latency.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-full.png b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-full.png new file mode 100644 index 0000000..a0e46a0 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-backend-failures.png b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-backend-failures.png new file mode 100644 index 0000000..92b431c Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-backend-failures.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-errors.png b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-errors.png new file mode 100644 index 0000000..491e4da Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-errors.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-latency.png b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-latency.png new file mode 100644 index 0000000..314ecbf Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-latency.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-saturation.png b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-saturation.png new file mode 100644 index 0000000..9e85136 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-saturation.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-traffic.png b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-traffic.png new file mode 100644 index 0000000..343f00b Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/load-balancer-edge-health-viz-edge-traffic.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/microservice-service-map-full.png b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-full.png new file mode 100644 index 0000000..716527c Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-dependency-hotspots.png b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-dependency-hotspots.png new file mode 100644 index 0000000..3d2f115 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-dependency-hotspots.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-dependency-map.png b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-dependency-map.png new file mode 100644 index 0000000..4e84ab7 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-dependency-map.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-recent-deployments.png b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-recent-deployments.png new file mode 100644 index 0000000..9ce52a2 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-recent-deployments.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-service-red.png b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-service-red.png new file mode 100644 index 0000000..3e851d2 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-service-red.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-trace-samples.png b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-trace-samples.png new file mode 100644 index 0000000..f7c3001 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/microservice-service-map-viz-trace-samples.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-full.png b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-full.png new file mode 100644 index 0000000..ace4f0e Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-forwarder-heatmap.png b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-forwarder-heatmap.png new file mode 100644 index 0000000..849f7f0 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-forwarder-heatmap.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-index-storage.png b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-index-storage.png new file mode 100644 index 0000000..4473739 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-index-storage.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-indexing-pipeline.png b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-indexing-pipeline.png new file mode 100644 index 0000000..1ff6852 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-indexing-pipeline.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-license-gauge.png b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-license-gauge.png new file mode 100644 index 0000000..57931c3 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-license-gauge.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-resource-gauge.png b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-resource-gauge.png new file mode 100644 index 0000000..9bbe5de Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-resource-gauge.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-scheduler-health.png b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-scheduler-health.png new file mode 100644 index 0000000..c440b24 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-scheduler-health.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-search-activity.png b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-search-activity.png new file mode 100644 index 0000000..7cc4fd1 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-search-activity.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-status-board.png b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-status-board.png new file mode 100644 index 0000000..9b4bb9a Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rcastley-splunk-health-viz-status-board.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rds-database-health-full.png b/integration/splunk-visual/baselines/10.4.0/rds-database-health-full.png new file mode 100644 index 0000000..d5e4d8a Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rds-database-health-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-connections.png b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-connections.png new file mode 100644 index 0000000..1cc8d12 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-connections.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-latency.png b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-latency.png new file mode 100644 index 0000000..6bba736 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-latency.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-locks.png b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-locks.png new file mode 100644 index 0000000..d7cd0a2 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-locks.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-storage.png b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-storage.png new file mode 100644 index 0000000..ff7d7be Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-database-storage.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-replication-lag.png b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-replication-lag.png new file mode 100644 index 0000000..1f76f0e Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/rds-database-health-viz-replication-lag.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/security-operations-overview-full.png b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-full.png new file mode 100644 index 0000000..e7a723c Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-auth-failures.png b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-auth-failures.png new file mode 100644 index 0000000..5106a0b Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-auth-failures.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-high-risk-events.png b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-high-risk-events.png new file mode 100644 index 0000000..da4af83 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-high-risk-events.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-ingestion-lag.png b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-ingestion-lag.png new file mode 100644 index 0000000..3ee319a Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-ingestion-lag.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-noisy-detections.png b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-noisy-detections.png new file mode 100644 index 0000000..08a9ecb Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-noisy-detections.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-security-platform-health.png b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-security-platform-health.png new file mode 100644 index 0000000..d34d217 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/security-operations-overview-viz-security-platform-health.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/state-no-data-full.png b/integration/splunk-visual/baselines/10.4.0/state-no-data-full.png new file mode 100644 index 0000000..3c3ce92 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/state-no-data-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/state-no-data-viz-no-data.png b/integration/splunk-visual/baselines/10.4.0/state-no-data-viz-no-data.png new file mode 100644 index 0000000..e6bf778 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/state-no-data-viz-no-data.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/state-search-error-full.png b/integration/splunk-visual/baselines/10.4.0/state-search-error-full.png new file mode 100644 index 0000000..01dd57b Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/state-search-error-full.png differ diff --git a/integration/splunk-visual/baselines/10.4.0/state-search-error-viz-search-error.png b/integration/splunk-visual/baselines/10.4.0/state-search-error-viz-search-error.png new file mode 100644 index 0000000..35ae4e2 Binary files /dev/null and b/integration/splunk-visual/baselines/10.4.0/state-search-error-viz-search-error.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-full.png b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-full.png new file mode 100644 index 0000000..85a7044 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-authentication-failures.png b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-authentication-failures.png new file mode 100644 index 0000000..6b78181 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-authentication-failures.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-latency-distribution.png b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-latency-distribution.png new file mode 100644 index 0000000..85dc97d Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-latency-distribution.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-route-red.png b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-route-red.png new file mode 100644 index 0000000..1106471 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-route-red.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-throttling.png b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-throttling.png new file mode 100644 index 0000000..864835d Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-throttling.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-top-tenants.png b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-top-tenants.png new file mode 100644 index 0000000..bee962d Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/api-gateway-overview-viz-top-tenants.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-full.png b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-full.png new file mode 100644 index 0000000..d7cf93d Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-backlog.png b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-backlog.png new file mode 100644 index 0000000..8222588 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-backlog.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-duration.png b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-duration.png new file mode 100644 index 0000000..b51c0fd Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-duration.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-failures.png b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-failures.png new file mode 100644 index 0000000..8c47432 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-failures.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-freshness.png b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-freshness.png new file mode 100644 index 0000000..99709c0 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-job-freshness.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-schedule-adherence.png b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-schedule-adherence.png new file mode 100644 index 0000000..b51393d Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/batch-cron-reliability-viz-schedule-adherence.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/business-journey-slo-full.png b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-full.png new file mode 100644 index 0000000..f82ead5 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-business-freshness.png b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-business-freshness.png new file mode 100644 index 0000000..446dccb Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-business-freshness.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-error-budget-burn.png b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-error-budget-burn.png new file mode 100644 index 0000000..956942c Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-error-budget-burn.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-journey-abandonment.png b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-journey-abandonment.png new file mode 100644 index 0000000..8790f94 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-journey-abandonment.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-journey-latency.png b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-journey-latency.png new file mode 100644 index 0000000..72b652a Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-journey-latency.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-journey-success.png b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-journey-success.png new file mode 100644 index 0000000..27a759b Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/business-journey-slo-viz-journey-success.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-full.png b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-full.png new file mode 100644 index 0000000..472cf2b Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-delivery-lead-time.png b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-delivery-lead-time.png new file mode 100644 index 0000000..f8914f3 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-delivery-lead-time.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-deployment-rollbacks.png b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-deployment-rollbacks.png new file mode 100644 index 0000000..937ec05 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-deployment-rollbacks.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-flaky-jobs.png b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-flaky-jobs.png new file mode 100644 index 0000000..32328ef Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-flaky-jobs.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-pipeline-failures.png b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-pipeline-failures.png new file mode 100644 index 0000000..e3c2557 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-pipeline-failures.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-pipeline-queue-time.png b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-pipeline-queue-time.png new file mode 100644 index 0000000..662d39b Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/cicd-delivery-health-viz-pipeline-queue-time.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-full.png b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-full.png new file mode 100644 index 0000000..7e447d1 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-cpu.png b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-cpu.png new file mode 100644 index 0000000..5f230c1 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-cpu.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-disk.png b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-disk.png new file mode 100644 index 0000000..90857b4 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-disk.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-errors.png b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-errors.png new file mode 100644 index 0000000..57be38d Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-errors.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-memory.png b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-memory.png new file mode 100644 index 0000000..acbafc5 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-memory.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-network-load.png b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-network-load.png new file mode 100644 index 0000000..46bf391 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/ec2-host-capacity-viz-host-network-load.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-full.png b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-full.png new file mode 100644 index 0000000..ee4bbb2 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-failing-pods.png b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-failing-pods.png new file mode 100644 index 0000000..5cc343f Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-failing-pods.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-pod-restarts.png b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-pod-restarts.png new file mode 100644 index 0000000..7a22195 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-pod-restarts.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-resource-saturation.png b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-resource-saturation.png new file mode 100644 index 0000000..ca697ed Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-resource-saturation.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-workload-error-rate.png b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-workload-error-rate.png new file mode 100644 index 0000000..e2815cc Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-workload-error-rate.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-workload-p95-latency.png b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-workload-p95-latency.png new file mode 100644 index 0000000..c6dd5f1 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/kubernetes-workload-health-viz-workload-p95-latency.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-full.png b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-full.png new file mode 100644 index 0000000..713ef48 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-backend-failures.png b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-backend-failures.png new file mode 100644 index 0000000..9e69ae1 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-backend-failures.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-errors.png b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-errors.png new file mode 100644 index 0000000..d9b3c43 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-errors.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-latency.png b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-latency.png new file mode 100644 index 0000000..b1ea5d8 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-latency.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-saturation.png b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-saturation.png new file mode 100644 index 0000000..096e51e Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-saturation.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-traffic.png b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-traffic.png new file mode 100644 index 0000000..512a98f Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/load-balancer-edge-health-viz-edge-traffic.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-full.png b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-full.png new file mode 100644 index 0000000..81e5f33 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-forwarder-heatmap.png b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-forwarder-heatmap.png new file mode 100644 index 0000000..11b69f0 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-forwarder-heatmap.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-index-storage.png b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-index-storage.png new file mode 100644 index 0000000..5e1c0ec Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-index-storage.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-indexing-pipeline.png b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-indexing-pipeline.png new file mode 100644 index 0000000..2fac97c Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-indexing-pipeline.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-license-gauge.png b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-license-gauge.png new file mode 100644 index 0000000..afd585b Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-license-gauge.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-resource-gauge.png b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-resource-gauge.png new file mode 100644 index 0000000..dbb3ea5 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-resource-gauge.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-scheduler-health.png b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-scheduler-health.png new file mode 100644 index 0000000..7d5ca29 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-scheduler-health.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-search-activity.png b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-search-activity.png new file mode 100644 index 0000000..8c60564 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-search-activity.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-status-board.png b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-status-board.png new file mode 100644 index 0000000..8a09001 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rcastley-splunk-health-portable-viz-status-board.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rds-database-health-full.png b/integration/splunk-visual/baselines/9.4.3/rds-database-health-full.png new file mode 100644 index 0000000..d61a0bb Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rds-database-health-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-connections.png b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-connections.png new file mode 100644 index 0000000..dc228db Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-connections.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-latency.png b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-latency.png new file mode 100644 index 0000000..45e5d34 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-latency.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-locks.png b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-locks.png new file mode 100644 index 0000000..4f4cd1f Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-locks.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-storage.png b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-storage.png new file mode 100644 index 0000000..61fa82e Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-database-storage.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-replication-lag.png b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-replication-lag.png new file mode 100644 index 0000000..39b12ee Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/rds-database-health-viz-replication-lag.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/security-operations-overview-full.png b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-full.png new file mode 100644 index 0000000..533db24 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-auth-failures.png b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-auth-failures.png new file mode 100644 index 0000000..63497d2 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-auth-failures.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-high-risk-events.png b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-high-risk-events.png new file mode 100644 index 0000000..b46e66d Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-high-risk-events.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-ingestion-lag.png b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-ingestion-lag.png new file mode 100644 index 0000000..5bc5b5e Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-ingestion-lag.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-noisy-detections.png b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-noisy-detections.png new file mode 100644 index 0000000..ddb4117 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-noisy-detections.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-security-platform-health.png b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-security-platform-health.png new file mode 100644 index 0000000..fd7810b Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/security-operations-overview-viz-security-platform-health.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/state-no-data-full.png b/integration/splunk-visual/baselines/9.4.3/state-no-data-full.png new file mode 100644 index 0000000..201d548 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/state-no-data-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/state-no-data-viz-no-data.png b/integration/splunk-visual/baselines/9.4.3/state-no-data-viz-no-data.png new file mode 100644 index 0000000..3b6735e Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/state-no-data-viz-no-data.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/state-search-error-full.png b/integration/splunk-visual/baselines/9.4.3/state-search-error-full.png new file mode 100644 index 0000000..03a281c Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/state-search-error-full.png differ diff --git a/integration/splunk-visual/baselines/9.4.3/state-search-error-viz-search-error.png b/integration/splunk-visual/baselines/9.4.3/state-search-error-viz-search-error.png new file mode 100644 index 0000000..a1a4ea8 Binary files /dev/null and b/integration/splunk-visual/baselines/9.4.3/state-search-error-viz-search-error.png differ diff --git a/integration/splunk-visual/baselines/README.md b/integration/splunk-visual/baselines/README.md new file mode 100644 index 0000000..998c8e1 --- /dev/null +++ b/integration/splunk-visual/baselines/README.md @@ -0,0 +1,17 @@ +# Screenshot baselines + +These reviewed target-specific Playwright baselines were generated from the exact official image +digests in `../images.json` with the full suite on July 22, 2026. + +| Target | Suite | Screenshots | +|---|---|---:| +| 9.4.3 | full | 67 | +| 10.0.0 | full | 67 | +| 10.2.0 | full | 67 | +| 10.4.0 | full | 73 | + +`manifest.json` records the image, architecture, browser harness version, expected counts, and a +SHA-256 digest over each target's sorted filename-and-file-hash inventory. +Ordinary CI uses `updateSnapshots: none` and fails if a required baseline is missing, extra, or +different. A manual candidate-baseline run uploads proposed files for human review; it never +commits them. diff --git a/integration/splunk-visual/baselines/manifest.json b/integration/splunk-visual/baselines/manifest.json new file mode 100644 index 0000000..33d833a --- /dev/null +++ b/integration/splunk-visual/baselines/manifest.json @@ -0,0 +1,37 @@ +{ + "architecture": "linux/amd64", + "generated_on": "2026-07-23", + "playwright": "1.61.1", + "review": "full-suite deterministic checks and visual QA overview", + "schema_version": "splunk-visual-baselines/v1", + "targets": { + "9.4.3": { + "baseline_set_sha256": "f446d38102139aae2e0597f1d6b21d62cee9638c6315136f5549698b74303fbd", + "image": "splunk/splunk:9.4.3@sha256:27344f73cbe07c3ea003164dbabef38e08e56efb193b39095cf56f8784a42dbe", + "result": "passed", + "screenshot_count": 67, + "suite": "full" + }, + "10.0.0": { + "baseline_set_sha256": "4ce31a8af50d0259b93049f706b0729be2051e21762541bf5e418f5c309b34bc", + "image": "splunk/splunk:10.0.0@sha256:10da23a5c78397b38328ed863ca2826390c329c517f9aff7a4978f30e5208e78", + "result": "passed", + "screenshot_count": 67, + "suite": "full" + }, + "10.2.0": { + "baseline_set_sha256": "67852f9a53c737743ef6e67414bb5e85c28c92e01a0d319fac9b51a715b9cb2c", + "image": "splunk/splunk:10.2.0@sha256:a7a7d800cdf470eeedf5a8eb2a4ea1bb07ade9bef5c95f1c65eabab08e7ac391", + "result": "passed", + "screenshot_count": 67, + "suite": "full" + }, + "10.4.0": { + "baseline_set_sha256": "fb22f7bb0b5566754cfb6207f5109c0414f1a7f77bb6b88def4904b85f9a6da7", + "image": "splunk/splunk:10.4.0@sha256:5fef7b0d2c83f6e8b3fe3cda5885e2a01e3a6eb99d8502e6333aaa64e7021f62", + "result": "passed", + "screenshot_count": 73, + "suite": "full" + } + } +} diff --git a/integration/splunk-visual/compose.source-template.yaml b/integration/splunk-visual/compose.source-template.yaml new file mode 100644 index 0000000..c1e1918 --- /dev/null +++ b/integration/splunk-visual/compose.source-template.yaml @@ -0,0 +1,4 @@ +services: + splunk: + volumes: + - ${SPLUNK_HEALTH_APP_PATH:?Prepare the pinned source-template app first}:/opt/splunk/etc/apps/splunk_health diff --git a/integration/splunk-visual/compose.yaml b/integration/splunk-visual/compose.yaml new file mode 100644 index 0000000..b308758 --- /dev/null +++ b/integration/splunk-visual/compose.yaml @@ -0,0 +1,20 @@ +name: splunk-dashboard-visual-${SPLUNK_TARGET_SLUG:-local} + +services: + splunk: + image: ${SPLUNK_IMAGE:?Resolve a pinned image with scripts/harness.py image} + platform: linux/amd64 + environment: + SPLUNK_LICENSE_URI: Free + SPLUNK_DEFAULTS_URL: file:///tmp/visual-qa-defaults.yml + SPLUNK_PASSWORD: ${SPLUNK_PASSWORD:?Set an ephemeral test password} + SPLUNK_ROLE: splunk_standalone + SPLUNK_START_ARGS: ${SPLUNK_START_ARGS:---accept-license} + SPLUNK_GENERAL_TERMS: ${SPLUNK_GENERAL_TERMS:-} + volumes: + - ./defaults.yml:/tmp/visual-qa-defaults.yml:ro + ports: + - "127.0.0.1:${SPLUNK_WEB_PORT:-8000}:8000" + - "127.0.0.1:${SPLUNK_MGMT_PORT:-8089}:8089" + shm_size: 1gb + stop_grace_period: 2m diff --git a/integration/splunk-visual/defaults.yml b/integration/splunk-visual/defaults.yml new file mode 100644 index 0000000..adf02eb --- /dev/null +++ b/integration/splunk-visual/defaults.yml @@ -0,0 +1,6 @@ +splunk: + conf: + server: + content: + general: + allowRemoteLogin: always diff --git a/integration/splunk-visual/fixtures.json b/integration/splunk-visual/fixtures.json new file mode 100644 index 0000000..9f8532d --- /dev/null +++ b/integration/splunk-visual/fixtures.json @@ -0,0 +1,89 @@ +{ + "schema_version": "splunk-render-fixtures/v1", + "fixed_epoch": 1704067200, + "suites": { + "smoke": [ + "business_journey_slo", + "microservice_service_map" + ], + "full": [ + "*" + ] + }, + "source_template_suites": { + "smoke": { + "9.4.3": ["rcastley_splunk_health_portable"], + "10.0.0": ["rcastley_splunk_health_portable"], + "10.2.0": ["rcastley_splunk_health"], + "10.4.0": ["rcastley_splunk_health"] + }, + "full": { + "9.4.3": ["rcastley_splunk_health_portable"], + "10.0.0": ["rcastley_splunk_health_portable"], + "10.2.0": ["rcastley_splunk_health"], + "10.4.0": ["rcastley_splunk_health"] + } + }, + "visualization_contracts": { + "splunk.line": { + "query": "| makeresults count=3 | streamstats count AS point | eval _time=1704067200+((point-1)*300) | eval observed=case(point=1,12.5,point=2,31.25,true(),18.75), target=20 | table _time point observed target", + "expected_rows": [ + {"point": "1", "observed": "12.5", "target": "20"}, + {"point": "2", "observed": "31.25", "target": "20"}, + {"point": "3", "observed": "18.75", "target": "20"} + ], + "ui_markers": [] + }, + "splunk.networkGraph": { + "query": "| makeresults count=3 | streamstats count AS edge | eval source=case(edge=1,\"gateway\",edge=2,\"gateway\",true(),\"checkout\"), target=case(edge=1,\"catalog\",edge=2,\"checkout\",true(),\"payments\"), value=case(edge=1,120,edge=2,95,true(),42) | table source target value", + "expected_rows": [ + {"source": "gateway", "target": "catalog", "value": "120"}, + {"source": "gateway", "target": "checkout", "value": "95"}, + {"source": "checkout", "target": "payments", "value": "42"} + ], + "ui_markers": ["gateway", "catalog", "checkout", "payments"], + "auxiliary_data_sources": { + "nodeSource": { + "expected_rows": [ + {"nodeIds": "catalog", "nodeTexts": "catalog", "nodeValues": "120"}, + {"nodeIds": "checkout", "nodeTexts": "checkout", "nodeValues": "137"}, + {"nodeIds": "gateway", "nodeTexts": "gateway", "nodeValues": "215"}, + {"nodeIds": "payments", "nodeTexts": "payments", "nodeValues": "42"} + ] + } + } + }, + "splunk.singlevalue": { + "query": "| makeresults | eval value=99.95 | table value", + "expected_rows": [ + {"value": "99.95"} + ], + "ui_markers": ["100"] + }, + "splunk.table": { + "query": "| makeresults count=3 | streamstats count AS rank | eval entity=case(rank=1,\"checkout\",rank=2,\"catalog\",true(),\"payments\"), value=case(rank=1,120,rank=2,95,true(),42), status=case(rank=1,\"healthy\",rank=2,\"warning\",true(),\"critical\") | table rank entity value status", + "expected_rows": [ + {"rank": "1", "entity": "checkout", "value": "120", "status": "healthy"}, + {"rank": "2", "entity": "catalog", "value": "95", "status": "warning"}, + {"rank": "3", "entity": "payments", "value": "42", "status": "critical"} + ], + "ui_markers": ["checkout", "catalog", "payments"] + } + }, + "state_cases": { + "no_data": { + "title": "Expected no-data state", + "visualization_type": "splunk.table", + "query": "| makeresults | where 1=0", + "expected_rows": [], + "ui_patterns": ["no search results returned", "no results", "no data"] + }, + "search_error": { + "title": "Expected search-error state", + "visualization_type": "splunk.table", + "query": "| makeresults | visual_qa_command_does_not_exist", + "expected_rows": [], + "ui_patterns": ["error", "failed"] + } + } +} diff --git a/integration/splunk-visual/images.json b/integration/splunk-visual/images.json new file mode 100644 index 0000000..8b78535 --- /dev/null +++ b/integration/splunk-visual/images.json @@ -0,0 +1,22 @@ +{ + "schema_version": "splunk-visual-images/v1", + "architecture": "linux/amd64", + "targets": { + "9.4.3": { + "image": "splunk/splunk:9.4.3@sha256:27344f73cbe07c3ea003164dbabef38e08e56efb193b39095cf56f8784a42dbe", + "requires_general_terms": false + }, + "10.0.0": { + "image": "splunk/splunk:10.0.0@sha256:10da23a5c78397b38328ed863ca2826390c329c517f9aff7a4978f30e5208e78", + "requires_general_terms": true + }, + "10.2.0": { + "image": "splunk/splunk:10.2.0@sha256:a7a7d800cdf470eeedf5a8eb2a4ea1bb07ade9bef5c95f1c65eabab08e7ac391", + "requires_general_terms": true + }, + "10.4.0": { + "image": "splunk/splunk:10.4.0@sha256:5fef7b0d2c83f6e8b3fe3cda5885e2a01e3a6eb99d8502e6333aaa64e7021f62", + "requires_general_terms": true + } + } +} diff --git a/integration/splunk-visual/package-lock.json b/integration/splunk-visual/package-lock.json new file mode 100644 index 0000000..90a532a --- /dev/null +++ b/integration/splunk-visual/package-lock.json @@ -0,0 +1,81 @@ +{ + "name": "splunk-dashboard-studio-visual-regression", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "splunk-dashboard-studio-visual-regression", + "version": "0.1.0", + "devDependencies": { + "@playwright/test": "1.61.1" + }, + "engines": { + "node": ">=24" + } + }, + "node_modules/@playwright/test": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz", + "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/integration/splunk-visual/package.json b/integration/splunk-visual/package.json new file mode 100644 index 0000000..4f2a6e9 --- /dev/null +++ b/integration/splunk-visual/package.json @@ -0,0 +1,18 @@ +{ + "name": "splunk-dashboard-studio-visual-regression", + "version": "0.1.0", + "private": true, + "type": "module", + "engines": { + "node": ">=24" + }, + "scripts": { + "test": "playwright test", + "test:list": "playwright test --list", + "qa:overview": "node scripts/render-overview.mjs", + "qa:validate-vision": "node scripts/validate-vision-report.mjs" + }, + "devDependencies": { + "@playwright/test": "1.61.1" + } +} diff --git a/integration/splunk-visual/playwright.config.ts b/integration/splunk-visual/playwright.config.ts new file mode 100644 index 0000000..54de599 --- /dev/null +++ b/integration/splunk-visual/playwright.config.ts @@ -0,0 +1,46 @@ +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { defineConfig } from "@playwright/test"; + +const root = path.dirname(fileURLToPath(import.meta.url)); +const target = (process.env.SPLUNK_VISUAL_TARGET ?? "unconfigured").replace(/[^0-9A-Za-z_.-]/g, "-"); +const artifacts = process.env.SPLUNK_VISUAL_ARTIFACTS ?? path.join(root, "artifacts", target); + +export default defineConfig({ + testDir: path.join(root, "tests"), + fullyParallel: false, + workers: 1, + timeout: 120_000, + expect: { + timeout: 30_000, + toHaveScreenshot: { + animations: "disabled", + caret: "hide", + scale: "css", + }, + }, + globalSetup: path.join(root, "tests", "global.setup.ts"), + outputDir: path.join(artifacts, "test-results"), + snapshotPathTemplate: path.join(root, "baselines", target, "{arg}{ext}"), + updateSnapshots: process.env.SPLUNK_UPDATE_SNAPSHOTS === "1" ? "all" : "none", + reporter: [ + ["line"], + ["json", { outputFile: path.join(artifacts, "playwright-results.json") }], + ["html", { outputFolder: path.join(artifacts, "playwright-report"), open: "never" }], + ], + use: { + baseURL: process.env.SPLUNK_WEB_URL ?? "http://127.0.0.1:8000", + browserName: "chromium", + colorScheme: "light", + deviceScaleFactor: 1, + ignoreHTTPSErrors: true, + locale: "en-US", + navigationTimeout: 60_000, + screenshot: "only-on-failure", + storageState: path.join(artifacts, "storage-state.json"), + timezoneId: "UTC", + trace: "retain-on-failure", + viewport: { width: 1440, height: 1100 }, + video: "off", + }, +}); diff --git a/integration/splunk-visual/qa/screenshot.css b/integration/splunk-visual/qa/screenshot.css new file mode 100644 index 0000000..81092b4 --- /dev/null +++ b/integration/splunk-visual/qa/screenshot.css @@ -0,0 +1,14 @@ +*, +*::before, +*::after { + animation-delay: 0s !important; + animation-duration: 0s !important; + caret-color: transparent !important; + scroll-behavior: auto !important; + transition-delay: 0s !important; + transition-duration: 0s !important; +} + +html { + color-scheme: light !important; +} diff --git a/integration/splunk-visual/qa/vision-contract.json b/integration/splunk-visual/qa/vision-contract.json new file mode 100644 index 0000000..bc530be --- /dev/null +++ b/integration/splunk-visual/qa/vision-contract.json @@ -0,0 +1,35 @@ +{ + "schema_version": "splunk-vision-qa-contract/v1", + "mode": "advisory", + "categories": [ + "blank", + "loading", + "search_error", + "overlap", + "clipping", + "contrast", + "wrong_chart", + "malformed_graph", + "whitespace", + "alignment" + ], + "finding": { + "required": [ + "dashboard_id", + "category", + "severity", + "confidence", + "summary", + "bounding_box", + "deterministic_evidence" + ], + "severity": ["info", "warning", "error"], + "confidence_range": [0, 1], + "bounding_box": ["x", "y", "width", "height"] + }, + "gating": { + "vision_only": "warning", + "deterministically_corroborated_error": "failure", + "evidence_source": "qa-overview.json#/deterministic_failures" + } +} diff --git a/integration/splunk-visual/qa/vision-prompt.md b/integration/splunk-visual/qa/vision-prompt.md new file mode 100644 index 0000000..bca1951 --- /dev/null +++ b/integration/splunk-visual/qa/vision-prompt.md @@ -0,0 +1,14 @@ +# Dashboard Studio visual QA prompt + +Inspect the supplied QA overview and individual dashboard screenshots as test artifacts. The data +is deterministic synthetic data; do not infer production health from it. + +Check only these categories: blank, loading, search_error, overlap, clipping, contrast, +wrong_chart, malformed_graph, whitespace, and alignment. For every finding return the dashboard +ID, category, severity, confidence from 0 through 1, a concise summary, a pixel bounding box, and +the matching deterministic evidence ID when one exists. Use `null` for deterministic evidence +when the finding is visual judgment only. + +Return JSON conforming to `splunk-vision-qa-report/v1`. Model-only findings are advisory. An error +may gate a build only when a deterministic browser, search-result, or screenshot-diff failure +corroborates it. diff --git a/integration/splunk-visual/run.sh b/integration/splunk-visual/run.sh new file mode 100755 index 0000000..6f14277 --- /dev/null +++ b/integration/splunk-visual/run.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +set -euo pipefail + +integration_root="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo_root="$(cd "${integration_root}/../.." && pwd)" +target="${SPLUNK_TARGET:-10.4.0}" +suite="${SPLUNK_VISUAL_SUITE:-smoke}" +output="${SPLUNK_VISUAL_OUTPUT:-${integration_root}/artifacts/run-${target}}" +manifest="${output}/run-manifest.json" +python_runner=(uv run --frozen --no-dev python) + +cd "${repo_root}" +export SPLUNK_IMAGE +SPLUNK_IMAGE="$("${python_runner[@]}" "${integration_root}/scripts/harness.py" image --target "${target}" --field image)" +export SPLUNK_START_ARGS="--accept-license" +requires_general_terms="$("${python_runner[@]}" "${integration_root}/scripts/harness.py" image --target "${target}" --field requires_general_terms)" +if [[ "${requires_general_terms}" == "true" ]]; then + export SPLUNK_GENERAL_TERMS="--accept-sgt-current-at-splunk-com" +else + export SPLUNK_GENERAL_TERMS="" +fi +export SPLUNK_PASSWORD="${SPLUNK_PASSWORD:-Visual-QA-Only-1234!}" +export SPLUNK_TARGET_SLUG="${target//./-}" +export SPLUNK_WEB_URL="${SPLUNK_WEB_URL:-http://127.0.0.1:${SPLUNK_WEB_PORT:-8000}}" +export SPLUNK_MGMT_URL="${SPLUNK_MGMT_URL:-https://127.0.0.1:${SPLUNK_MGMT_PORT:-8089}}" +export SPLUNK_VISUAL_MANIFEST="${manifest}" +export SPLUNK_VISUAL_TARGET="${target}" +export SPLUNK_VISUAL_ARTIFACTS="${SPLUNK_VISUAL_ARTIFACTS:-${output}}" + +compose=(docker compose --project-directory "${integration_root}" -f "${integration_root}/compose.yaml") + +cleanup() { + local status=$? + if [[ "${status}" -ne 0 ]]; then + mkdir -p "${output}" + "${compose[@]}" logs --no-color >"${output}/splunk-compose.log" 2>&1 || true + if find "${output}/screenshots" -name '*.png' -print -quit 2>/dev/null | grep -q .; then + (cd "${integration_root}" && npm run qa:overview) || true + fi + fi + "${python_runner[@]}" "${integration_root}/scripts/harness.py" cleanup --manifest "${manifest}" >/dev/null 2>&1 || true + if [[ -d "${output}/apps/splunk_health" ]]; then + "${compose[@]}" exec -T -u 0 splunk \ + chown -R "$(id -u):$(id -g)" /opt/splunk/etc/apps/splunk_health >/dev/null 2>&1 || true + fi + "${compose[@]}" down --volumes --remove-orphans >/dev/null 2>&1 || true + return "${status}" +} +trap cleanup EXIT + +"${python_runner[@]}" "${integration_root}/scripts/harness.py" prepare \ + --target "${target}" \ + --suite "${suite}" \ + --include-state-cases \ + --output "${output}" + +if [[ -d "${output}/apps/splunk_health" ]]; then + export SPLUNK_HEALTH_APP_PATH="${output}/apps/splunk_health" + compose+=( -f "${integration_root}/compose.source-template.yaml" ) +fi + +"${compose[@]}" up --detach --wait --wait-timeout 900 +"${python_runner[@]}" "${integration_root}/scripts/harness.py" wait --startup-timeout 900 +"${python_runner[@]}" "${integration_root}/scripts/harness.py" provision-indexes --manifest "${manifest}" +"${python_runner[@]}" "${integration_root}/scripts/harness.py" validate-searches --manifest "${manifest}" --kind source +"${python_runner[@]}" "${integration_root}/scripts/harness.py" publish --manifest "${manifest}" +"${python_runner[@]}" "${integration_root}/scripts/harness.py" validate-searches --manifest "${manifest}" --kind fixture + +cd "${integration_root}" +npm test +npm run qa:overview diff --git a/integration/splunk-visual/scripts/harness.py b/integration/splunk-visual/scripts/harness.py new file mode 100755 index 0000000..6c4a5e2 --- /dev/null +++ b/integration/splunk-visual/scripts/harness.py @@ -0,0 +1,1144 @@ +#!/usr/bin/env python3 +"""Prepare and operate the disposable Splunk visual-regression fixture. + +This script intentionally uses only the Python standard library and the local package. It is not +part of the distributed Python package and it never persists credentials. +""" + +from __future__ import annotations + +import argparse +import base64 +import hashlib +import json +import os +import re +import shutil +import ssl +import sys +import time +from collections.abc import Iterable, Mapping, Sequence +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Final +from urllib.error import HTTPError, URLError +from urllib.parse import quote, urlencode +from urllib.request import Request, urlopen + +from splunk_dashboard_studio import ( + DashboardBuilder, + DashboardDefinition, + EnterpriseVersion, + StudioView, + build_catalog_dashboard, + build_source_template, + canonical_json, + catalog_entries, + compare_roundtrip, + encode_view_xml, + portable_telemetry_contract, + source_template_entries, +) + +ROOT: Final = Path(__file__).resolve().parents[1] +REPO_ROOT: Final = ROOT.parents[1] +IMAGES_PATH: Final = ROOT / "images.json" +FIXTURES_PATH: Final = ROOT / "fixtures.json" +SOURCE_LOCK_PATH: Final = ROOT / "source-lock.json" +SOURCE_VENDOR_ROOT: Final = ROOT / "vendor" / "rcastley-splunk-custom-visualizations" +SCHEMA_VERSION: Final = "splunk-visual-run/v1" +RESULT_SCHEMA_VERSION: Final = "splunk-visual-results/v1" +HEALTH_HARNESS_BY_PANEL: Final = { + "viz_forwarder_heatmap": "forwarder_heatmap", + "viz_index_storage": "index_storage", + "viz_indexing_pipeline": "indexing_pipeline_flow", + "viz_license_gauge": "license_gauge", + "viz_resource_gauge": "resource_gauge", + "viz_scheduler_health": "scheduler_health", + "viz_search_activity": "search_activity", + "viz_status_board": "splunk_status_board", +} +PORTABLE_SOURCE_VISUALIZATIONS: Final = {"splunk.singlevalue", "splunk.table"} + + +class HarnessError(RuntimeError): + """A deterministic harness or Splunk API failure.""" + + +def _load_json(path: Path) -> dict[str, Any]: + try: + value = json.loads(path.read_text(encoding="utf-8")) + except (OSError, UnicodeError, json.JSONDecodeError) as error: + raise HarnessError(f"Unable to read JSON from {path}: {error}") from error + if not isinstance(value, dict): + raise HarnessError(f"Expected a JSON object in {path}") + return value + + +def _write_json(path: Path, value: Mapping[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(value, indent=2, sort_keys=True) + "\n", encoding="utf-8") + + +def _sha256(value: str) -> str: + return hashlib.sha256(value.encode("utf-8")).hexdigest() + + +def image_record(target: str) -> dict[str, Any]: + registry = _load_json(IMAGES_PATH) + targets = registry.get("targets") + if not isinstance(targets, dict) or target not in targets: + available = ", ".join(sorted(targets if isinstance(targets, dict) else ())) + raise HarnessError(f"Unsupported image target {target!r}; available targets: {available}") + record = targets[target] + if not isinstance(record, dict): + raise HarnessError(f"Invalid image record for target {target!r}") + return record + + +def _selected_ids(suite: str, target: str, fixtures: Mapping[str, Any]) -> list[str]: + suites = fixtures.get("suites") + if not isinstance(suites, dict) or suite not in suites: + available = ", ".join(sorted(suites if isinstance(suites, dict) else ())) + raise HarnessError(f"Unknown fixture suite {suite!r}; available suites: {available}") + configured = suites[suite] + if not isinstance(configured, list) or not all(isinstance(item, str) for item in configured): + raise HarnessError(f"Fixture suite {suite!r} must be a string array") + requested = ( + {entry.example_id for entry in catalog_entries()} + if configured == ["*"] + else set(configured) + ) + platform = EnterpriseVersion.parse(target) + return [ + entry.example_id + for entry in catalog_entries() + if entry.example_id in requested and platform >= entry.minimum_target + ] + + +def _selected_template_ids(suite: str, target: str, fixtures: Mapping[str, Any]) -> list[str]: + suites = fixtures.get("source_template_suites") + if not isinstance(suites, dict) or suite not in suites: + raise HarnessError(f"Fixture suite {suite!r} has no source-template selection") + configured = suites[suite] + if isinstance(configured, dict): + configured = configured.get(target) + if configured is None: + raise HarnessError( + f"Source-template suite {suite!r} has no selection for target {target!r}" + ) + if not isinstance(configured, list) or not all(isinstance(item, str) for item in configured): + raise HarnessError(f"Source-template suite {suite!r} must be a string array") + entries = source_template_entries() + requested = {entry.template_id for entry in entries} if configured == ["*"] else set(configured) + known = {entry.template_id for entry in entries} + unknown = requested - known + if unknown: + raise HarnessError(f"Unknown source-template IDs: {', '.join(sorted(unknown))}") + platform = EnterpriseVersion.parse(target) + return [ + entry.template_id + for entry in entries + if entry.template_id in requested and platform >= entry.minimum_target + ] + + +def _visualization_contracts(fixtures: Mapping[str, Any]) -> Mapping[str, Any]: + contracts = fixtures.get("visualization_contracts") + if not isinstance(contracts, dict): + raise HarnessError("fixtures.json requires visualization_contracts") + return contracts + + +def _fixture_dashboard( + example_id: str, + target: str, + fixtures: Mapping[str, Any], +) -> tuple[ + DashboardDefinition, + list[dict[str, Any]], + list[dict[str, str]], + list[dict[str, Any]], +]: + original = build_catalog_dashboard(example_id, target) + payload = json.loads(canonical_json(original)) + contracts = _visualization_contracts(fixtures) + panel_contracts: list[dict[str, Any]] = [] + fixture_searches_by_source: dict[str, dict[str, Any]] = {} + for visualization_id, visualization in payload["visualizations"].items(): + visualization_type = visualization["type"] + title = visualization.get("title", visualization_id) + contract = contracts.get(visualization_type) + if not isinstance(contract, dict): + raise HarnessError(f"No render contract for visualization type {visualization_type!r}") + source_id = visualization["dataSources"].get("primary") + if not isinstance(source_id, str): + raise HarnessError(f"{example_id}/{visualization_id} has no primary data source") + fixture_query = contract.get("query") + expected_rows = contract.get("expected_rows") + ui_markers = contract.get("ui_markers") + if not isinstance(fixture_query, str) or not isinstance(expected_rows, list): + raise HarnessError(f"Invalid render contract for {visualization_type!r}") + if not isinstance(ui_markers, list) or not all( + isinstance(item, str) for item in ui_markers + ): + raise HarnessError(f"Invalid UI markers for {visualization_type!r}") + panel_contracts.append( + { + "data_source_id": source_id, + "expected_rows": expected_rows, + "fixture_query": fixture_query, + "panel_id": visualization_id, + "title": title, + "ui_markers": ui_markers, + "visualization_type": visualization_type, + } + ) + auxiliary_contracts = contract.get("auxiliary_data_sources", {}) + if not isinstance(auxiliary_contracts, dict): + raise HarnessError(f"Invalid auxiliary contracts for {visualization_type!r}") + for role, bound_source_id in visualization["dataSources"].items(): + if not isinstance(bound_source_id, str): + raise HarnessError(f"{example_id}/{visualization_id}/{role} is not a source ID") + source_contract = contract if role == "primary" else auxiliary_contracts.get(role) + if not isinstance(source_contract, dict): + raise HarnessError( + f"No {role!r} render contract for {example_id}/{visualization_id}" + ) + bound_query = source_contract.get("query") + bound_expected_rows = source_contract.get("expected_rows") + if role == "primary" and not isinstance(bound_query, str): + raise HarnessError(f"Invalid {role!r} render query for {visualization_type!r}") + if bound_query is not None and not isinstance(bound_query, str): + raise HarnessError(f"Invalid {role!r} render query for {visualization_type!r}") + if not isinstance(bound_expected_rows, list): + raise HarnessError(f"Invalid {role!r} render contract for {visualization_type!r}") + fixture_search = { + "data_source_id": bound_source_id, + "expected_rows": bound_expected_rows, + "query_override": bound_query, + } + previous = fixture_searches_by_source.setdefault(bound_source_id, fixture_search) + if previous != fixture_search: + raise HarnessError( + f"{example_id}/{bound_source_id} has incompatible fixture contracts" + ) + + original_queries: dict[str, str] = {} + for source_id, source in payload["dataSources"].items(): + source_type = source.get("type") + if source_type not in {"ds.search", "ds.chain"}: + raise HarnessError( + f"Visual fixtures currently require ds.search or ds.chain; found {source_type}" + ) + original_query = source.get("options", {}).get("query") + if not isinstance(original_query, str): + raise HarnessError(f"{example_id}/{source_id} has no source query") + original_queries[source_id] = original_query + fixture_search = fixture_searches_by_source.get(source_id) + if fixture_search is None: + raise HarnessError(f"{example_id}/{source_id} is not bound to a visualization") + query_override = fixture_search["query_override"] + if source_type == "ds.search": + if not isinstance(query_override, str): + raise HarnessError(f"{example_id}/{source_id} requires a fixture query") + source["options"]["query"] = query_override + elif query_override is not None: + raise HarnessError( + f"{example_id}/{source_id} is a chain; fixture data must come from its parent" + ) + + def expanded_query(source_id: str, *, fixture: bool) -> str: + source = payload["dataSources"].get(source_id) + if not isinstance(source, dict): + raise HarnessError(f"{example_id}/{source_id} references an unknown source") + source_type = source.get("type") + own_query = source["options"]["query"] if fixture else original_queries[source_id] + if source_type == "ds.search": + return own_query + parent_id = source["options"].get("extend") + if not isinstance(parent_id, str): + raise HarnessError(f"{example_id}/{source_id} chain has no parent") + return f"{expanded_query(parent_id, fixture=fixture)} {own_query}".strip() + + source_queries: list[dict[str, str]] = [] + fixture_searches: list[dict[str, Any]] = [] + for source_id in payload["dataSources"]: + source_queries.append( + {"data_source_id": source_id, "query": expanded_query(source_id, fixture=False)} + ) + expectation = fixture_searches_by_source[source_id] + fixture_searches.append( + { + "data_source_id": source_id, + "expected_rows": expectation["expected_rows"], + "fixture_query": expanded_query(source_id, fixture=True), + } + ) + return ( + DashboardDefinition.model_validate(payload), + panel_contracts, + source_queries, + fixture_searches, + ) + + +def _source_snapshot() -> dict[str, Any]: + lock = _load_json(SOURCE_LOCK_PATH) + if lock.get("schema_version") != "splunk-source-template-lock/v1": + raise HarnessError("Unsupported source-template lock schema") + rcastley_ids = {"rcastley_splunk_health", "rcastley_splunk_health_portable"} + entries = tuple( + entry for entry in source_template_entries() if entry.template_id in rcastley_ids + ) + if {entry.template_id for entry in entries} != rcastley_ids: + raise HarnessError("Source-template registry is missing a rcastley Splunk Health variant") + original = next( + (entry for entry in entries if entry.template_id == "rcastley_splunk_health"), None + ) + if original is None or any( + entry.origin.revision != original.origin.revision for entry in entries + ): + raise HarnessError("Source-template revisions disagree") + if lock.get("revision") != original.origin.revision: + raise HarnessError("Source-template package metadata and integration lock disagree") + if any(entry.origin.repository != original.origin.repository for entry in entries): + raise HarnessError("Source-template repositories disagree") + if lock.get("repository") != original.origin.repository: + raise HarnessError("Source-template repository metadata and integration lock disagree") + definition = lock.get("definition") + if not isinstance(definition, dict) or definition.get("sha256") != ( + original.origin.definition_sha256 + ): + raise HarnessError("Source-template definition metadata and integration lock disagree") + + def require_digest(path: Path, expected: object) -> None: + if not isinstance(expected, str) or not path.is_file(): + raise HarnessError(f"Missing locked source-template file {path}") + actual = hashlib.sha256(path.read_bytes()).hexdigest() + if actual != expected: + raise HarnessError(f"Locked source-template file drifted: {path}") + + license_path = lock.get("license_path") + if not isinstance(license_path, str): + raise HarnessError("Source-template lock has no license path") + require_digest(REPO_ROOT / license_path, lock.get("license_sha256")) + + app = lock.get("app") + if not isinstance(app, dict) or not isinstance(app.get("files"), dict): + raise HarnessError("Source-template lock has no app file inventory") + app_hashes: dict[str, str] = {} + for source_path, expected in sorted(app["files"].items()): + if not isinstance(source_path, str) or not isinstance(expected, str): + raise HarnessError("Source-template app inventory must map paths to SHA-256 values") + require_digest(SOURCE_VENDOR_ROOT / source_path, expected) + app_hashes[source_path] = expected + tree_content = "".join( + f"{digest} {path}\n" for path, digest in sorted(app_hashes.items()) + ).encode("utf-8") + if hashlib.sha256(tree_content).hexdigest() != app.get("tree_sha256"): + raise HarnessError("Source-template app tree digest does not match its file inventory") + + harnesses = lock.get("harnesses") + if not isinstance(harnesses, list) or len(harnesses) != 8: + raise HarnessError("Source-template lock requires eight visualization harnesses") + for harness in harnesses: + if not isinstance(harness, dict) or not isinstance(harness.get("vendor_path"), str): + raise HarnessError("Invalid source-template harness lock record") + require_digest(REPO_ROOT / harness["vendor_path"], harness.get("sha256")) + return lock + + +def _harness_rows(name: str) -> tuple[list[str], list[dict[str, str]], dict[str, Any]]: + harness = _load_json(SOURCE_VENDOR_ROOT / "harness" / f"{name}.json") + data = harness.get("data") + if not isinstance(data, dict): + raise HarnessError(f"Upstream harness {name!r} has no data contract") + columns = data.get("columns") + if ( + not isinstance(columns, list) + or not columns + or not all( + isinstance(column, str) and re.fullmatch(r"[A-Za-z_][A-Za-z0-9_]*", column) + for column in columns + ) + ): + raise HarnessError(f"Upstream harness {name!r} has invalid columns") + + mode = data.get("mode") + rows: list[list[object]] + if mode == "multi_row": + raw_rows = data.get("sampleRows") + if not isinstance(raw_rows, list) or not raw_rows: + raise HarnessError(f"Upstream harness {name!r} has no sample rows") + rows = raw_rows + row_count_field = data.get("rowCountField") + if row_count_field is not None: + fields = harness.get("fields") + if not isinstance(fields, list): + raise HarnessError(f"Upstream harness {name!r} has invalid fields") + row_count = next( + ( + field.get("default") + for field in fields + if isinstance(field, dict) and field.get("name") == row_count_field + ), + None, + ) + if not isinstance(row_count, int) or row_count < 1: + raise HarnessError(f"Upstream harness {name!r} has invalid rowCountField") + rows = rows[:row_count] + elif mode == "single_row": + fields = harness.get("fields") + if not isinstance(fields, list): + raise HarnessError(f"Upstream harness {name!r} has invalid fields") + defaults = { + str(field["name"]): field.get("default") + for field in fields + if isinstance(field, dict) and isinstance(field.get("name"), str) + } + missing = [column for column in columns if column not in defaults] + if missing: + raise HarnessError( + f"Upstream harness {name!r} has no defaults for {', '.join(missing)}" + ) + rows = [[defaults[column] for column in columns]] + else: + raise HarnessError(f"Upstream harness {name!r} has unsupported data mode {mode!r}") + + expected_rows: list[dict[str, str]] = [] + for row in rows: + if not isinstance(row, list) or len(row) != len(columns): + raise HarnessError(f"Upstream harness {name!r} has a malformed sample row") + expected_rows.append( + { + column: str(value).lower() if isinstance(value, bool) else str(value) + for column, value in zip(columns, row, strict=True) + } + ) + return columns, expected_rows, harness + + +def _rows_query(columns: Sequence[str], rows: Sequence[Mapping[str, str]]) -> str: + parts = [f"| makeresults count={len(rows)}", "| streamstats count AS fixture_row"] + for column in columns: + clauses = ",".join( + f"fixture_row={index},{json.dumps(row[column], ensure_ascii=False)}" + for index, row in enumerate(rows, start=1) + ) + parts.append(f"| eval {column}=case({clauses})") + parts.append(f"| table {' '.join(columns)}") + return " ".join(parts) + + +def _fixture_source_template( + template_id: str, + target: str, +) -> tuple[ + DashboardDefinition, + list[dict[str, Any]], + list[dict[str, str]], + list[dict[str, Any]], +]: + original = build_source_template(template_id, target) + payload = json.loads(canonical_json(original)) + panel_contracts: list[dict[str, Any]] = [] + fixture_searches: list[dict[str, Any]] = [] + source_queries: list[dict[str, str]] = [] + for visualization_id, visualization in payload["visualizations"].items(): + visualization_type = visualization["type"] + name = HEALTH_HARNESS_BY_PANEL.get(visualization_id) + if name is None: + raise HarnessError( + f"Source template {template_id!r} has unexpected panel {visualization_id!r}" + ) + expected_custom_type = f"splunk_health.{name}" + custom_render = visualization_type == expected_custom_type + if not custom_render and visualization_type not in PORTABLE_SOURCE_VISUALIZATIONS: + raise HarnessError( + f"Source template {template_id!r} has unexpected type {visualization_type!r}" + ) + columns, expected_rows, harness = _harness_rows(name) + source_id = visualization.get("dataSources", {}).get("primary") + if not isinstance(source_id, str): + raise HarnessError(f"Source template panel {visualization_id!r} has no data source") + source = payload["dataSources"].get(source_id) + if not isinstance(source, dict) or source.get("type") != "ds.search": + raise HarnessError(f"Source template data source {source_id!r} is not ds.search") + original_query = source.get("options", {}).get("query") + if not isinstance(original_query, str): + raise HarnessError(f"Source template data source {source_id!r} has no query") + fixture_query = _rows_query(columns, expected_rows) + source["options"]["query"] = fixture_query + source_queries.append({"data_source_id": source_id, "query": original_query}) + fixture_searches.append( + { + "data_source_id": source_id, + "expected_rows": expected_rows, + "fixture_query": fixture_query, + } + ) + formatter = harness.get("formatter", []) + formatter_defaults = { + str(item["name"]): item.get("default") + for item in formatter + if isinstance(item, dict) and isinstance(item.get("name"), str) + } + panel_contract = { + "data_source_id": source_id, + "default_size": harness.get("defaultSize"), + "expected_rows": expected_rows, + "fixture_query": fixture_query, + "formatter_defaults": formatter_defaults, + "no_data_message": harness.get("noDataMessage"), + "panel_id": visualization_id, + "title": visualization.get("title", visualization_id), + "ui_markers": [], + "visualization_type": visualization_type, + } + if custom_render: + panel_contract["render_kind"] = "canvas" + panel_contracts.append(panel_contract) + return ( + DashboardDefinition.model_validate(payload), + panel_contracts, + source_queries, + fixture_searches, + ) + + +def _state_dashboard( + state_id: str, + target: str, + fixtures: Mapping[str, Any], +) -> tuple[DashboardDefinition, list[dict[str, Any]]]: + cases = fixtures.get("state_cases") + if not isinstance(cases, dict) or not isinstance(cases.get(state_id), dict): + raise HarnessError(f"Unknown state case {state_id!r}") + case = cases[state_id] + title = case.get("title") + query = case.get("query") + visualization_type = case.get("visualization_type") + expected_rows = case.get("expected_rows") + ui_patterns = case.get("ui_patterns") + if not all(isinstance(item, str) for item in (title, query, visualization_type)): + raise HarnessError(f"State case {state_id!r} has invalid string fields") + if not isinstance(expected_rows, list) or not isinstance(ui_patterns, list): + raise HarnessError(f"State case {state_id!r} has invalid expectations") + builder = DashboardBuilder( + title=title, description="Intentional visual-state fixture.", target=target + ) + source_id = builder.add_search(query, name=title, data_source_id=f"ds_{state_id}") + panel_id = builder.add_visualization( + visualization_type, + name=title, + visualization_id=f"viz_{state_id}", + data_sources={"primary": source_id}, + title=title, + ) + definition = builder.build(canvas_width=1440) + return definition, [ + { + "data_source_id": source_id, + "expected_rows": expected_rows, + "fixture_query": query, + "panel_id": panel_id, + "title": title, + "ui_markers": [], + "ui_patterns": ui_patterns, + "visualization_type": visualization_type, + } + ] + + +def _view_id(target: str, identifier: str) -> str: + target_slug = re.sub(r"[^0-9a-z]+", "_", target.lower()).strip("_") + identifier_slug = re.sub(r"[^0-9a-z]+", "_", identifier.lower()).strip("_") + return f"visual_qa_{target_slug}_{identifier_slug}" + + +def _title_visible(definition: DashboardDefinition) -> bool: + """Mirror Dashboard Studio's explicit title/description visibility option.""" + + return definition.layout.options.get("showTitleAndDescription") is not False + + +def _reset_generated_output(output: Path) -> None: + """Remove only artifacts owned by a previous harness run.""" + + for directory in ("apps", "playwright-report", "screenshots", "test-results"): + path = output / directory + if path.exists(): + shutil.rmtree(path) + for name in ( + "fixture-search-results.json", + "playwright-results.json", + "qa-overview.html", + "qa-overview.json", + "qa-overview.png", + "roundtrip-results.json", + "run-manifest.json", + "source-search-results.json", + "splunk-compose.log", + "storage-state.json", + "vision-contract.json", + "vision-prompt.md", + "vision-report.json", + ): + (output / name).unlink(missing_ok=True) + for pattern in ("visual_qa_*.json", "visual_qa_*.xml"): + for path in output.glob(pattern): + path.unlink() + + +def prepare( + *, + target: str, + suite: str, + output: Path, + include_state_cases: bool, +) -> Path: + image = image_record(target) + fixtures = _load_json(FIXTURES_PATH) + output.mkdir(parents=True, exist_ok=True) + _reset_generated_output(output) + dashboards: list[dict[str, Any]] = [] + for example_id in _selected_ids(suite, target, fixtures): + definition, panels, source_queries, fixture_searches = _fixture_dashboard( + example_id, target, fixtures + ) + view_id = _view_id(target, example_id) + definition_name = f"{view_id}.json" + xml_name = f"{view_id}.xml" + encoded = canonical_json(definition, indent=2) + "\n" + xml = encode_view_xml( + StudioView( + label=f"Visual QA | {definition.title}", + description="Generated deterministic render fixture; not for production use.", + definition=definition, + theme="light", + hiddenElements={"hideEdit": True, "hideExport": True, "hideOpenInSearch": True}, + ) + ) + (output / definition_name).write_text(encoded, encoding="utf-8") + (output / xml_name).write_text(xml + "\n", encoding="utf-8") + dashboards.append( + { + "definition_path": definition_name, + "definition_sha256": _sha256(canonical_json(definition)), + "example_id": example_id, + "expected_state": "ready", + "fixture_searches": fixture_searches, + "panels": panels, + "source_kind": "portable_catalog", + "source_queries": source_queries, + "title": definition.title, + "title_visible": _title_visible(definition), + "view_id": view_id, + "view_xml_path": xml_name, + } + ) + + selected_templates = _selected_template_ids(suite, target, fixtures) + entries = {entry.template_id: entry for entry in source_template_entries()} + source_snapshot: dict[str, Any] | None = None + required_apps: list[dict[str, str]] = [] + if selected_templates: + source_snapshot = _source_snapshot() + seen_apps: set[str] = set() + for template_id in selected_templates: + for app in entries[template_id].required_apps: + if app.app_id in seen_apps: + continue + if app.app_id != "splunk_health": + raise HarnessError(f"Unsupported source-template app {app.app_id!r}") + app_source = SOURCE_VENDOR_ROOT / app.app_id + app_target = output / "apps" / app.app_id + shutil.copytree(app_source, app_target) + required_apps.append( + { + "app_id": app.app_id, + "path": str(app_target.relative_to(output)), + "revision": app.revision, + } + ) + seen_apps.add(app.app_id) + for template_id in selected_templates: + definition, panels, source_queries, fixture_searches = _fixture_source_template( + template_id, target + ) + view_id = _view_id(target, template_id) + definition_name = f"{view_id}.json" + xml_name = f"{view_id}.xml" + (output / definition_name).write_text( + canonical_json(definition, indent=2) + "\n", + encoding="utf-8", + ) + xml = encode_view_xml( + StudioView( + label=f"Visual QA | {definition.title}", + description="Pinned source-derived render fixture; not for production use.", + definition=definition, + theme="dark", + hiddenElements={"hideEdit": True, "hideExport": True, "hideOpenInSearch": True}, + ) + ) + (output / xml_name).write_text(xml + "\n", encoding="utf-8") + entry = entries[template_id] + dashboards.append( + { + "definition_path": definition_name, + "definition_sha256": _sha256(canonical_json(definition)), + "example_id": template_id, + "expected_state": "ready", + "fixture_searches": fixture_searches, + "panels": panels, + "source_kind": "source_template", + "source_queries": source_queries, + "template_origin": entry.origin.model_dump(mode="json"), + "title": definition.title, + "title_visible": _title_visible(definition), + "view_id": view_id, + "view_xml_path": xml_name, + } + ) + + if include_state_cases: + cases = fixtures.get("state_cases", {}) + if not isinstance(cases, dict): + raise HarnessError("fixtures.json state_cases must be an object") + for state_id in sorted(cases): + definition, panels = _state_dashboard(state_id, target, fixtures) + view_id = _view_id(target, f"state_{state_id}") + definition_name = f"{view_id}.json" + xml_name = f"{view_id}.xml" + (output / definition_name).write_text( + canonical_json(definition, indent=2) + "\n", + encoding="utf-8", + ) + (output / xml_name).write_text( + encode_view_xml( + StudioView( + label=f"Visual QA | {definition.title}", + description="Intentional visual-state fixture; not for production use.", + definition=definition, + theme="light", + hiddenElements={ + "hideEdit": True, + "hideExport": True, + "hideOpenInSearch": True, + }, + ) + ) + + "\n", + encoding="utf-8", + ) + dashboards.append( + { + "definition_path": definition_name, + "definition_sha256": _sha256(canonical_json(definition)), + "example_id": f"state_{state_id}", + "expected_state": state_id, + "fixture_searches": [ + { + "data_source_id": panel["data_source_id"], + "expected_rows": panel["expected_rows"], + "fixture_query": panel["fixture_query"], + } + for panel in panels + ], + "panels": panels, + "source_kind": "state_fixture", + "source_queries": [], + "title": definition.title, + "title_visible": _title_visible(definition), + "view_id": view_id, + "view_xml_path": xml_name, + } + ) + + contract = portable_telemetry_contract() + manifest = { + "schema_version": SCHEMA_VERSION, + "architecture": _load_json(IMAGES_PATH)["architecture"], + "dashboards": dashboards, + "fixed_epoch": fixtures["fixed_epoch"], + "image": image["image"], + "indexes": { + name: ("metric" if str(signal) == "metric" else "event") + for name, signal in sorted(contract.logical_indexes.items()) + }, + "requires_general_terms": image["requires_general_terms"], + "required_apps": required_apps, + "source_snapshot": source_snapshot, + "suite": suite, + "target": target, + } + manifest_path = output / "run-manifest.json" + _write_json(manifest_path, manifest) + return manifest_path + + +def _ssl_context() -> ssl.SSLContext: + context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + context.check_hostname = False + context.verify_mode = ssl.CERT_NONE + return context + + +@dataclass(frozen=True) +class SplunkResponse: + status: int + body: bytes + + +class SplunkClient: + def __init__(self, base_url: str, username: str, password: str, *, timeout: float = 60) -> None: + self.base_url = base_url.rstrip("/") + credentials = base64.b64encode(f"{username}:{password}".encode()).decode() + self.headers = {"Authorization": f"Basic {credentials}"} + self.timeout = timeout + self.context = _ssl_context() + + def request( + self, + method: str, + path: str, + *, + form: Mapping[str, str] | None = None, + allowed: Iterable[int] = (200, 201), + ) -> SplunkResponse: + headers = dict(self.headers) + data: bytes | None = None + if form is not None: + data = urlencode(form).encode("utf-8") + headers["Content-Type"] = "application/x-www-form-urlencoded" + request = Request( + f"{self.base_url}{path}", + data=data, + headers=headers, + method=method, + ) + try: + with urlopen(request, context=self.context, timeout=self.timeout) as response: + result = SplunkResponse(response.status, response.read()) + except HTTPError as error: + result = SplunkResponse(error.code, error.read()) + except (TimeoutError, URLError) as error: + raise HarnessError(f"Splunk request failed for {method} {path}: {error}") from error + if result.status not in set(allowed): + body = result.body.decode("utf-8", errors="replace")[:1000] + raise HarnessError(f"Splunk returned HTTP {result.status} for {method} {path}: {body}") + return result + + +def wait_for_splunk(client: SplunkClient, timeout: float) -> None: + deadline = time.monotonic() + timeout + last_error = "not attempted" + while time.monotonic() < deadline: + try: + client.request("GET", "/services/server/info?output_mode=json") + return + except HarnessError as error: + last_error = str(error) + time.sleep(5) + raise HarnessError(f"Splunk did not become ready within {timeout:g}s: {last_error}") + + +def provision_indexes(client: SplunkClient, manifest: Mapping[str, Any]) -> None: + indexes = manifest.get("indexes") + if not isinstance(indexes, dict): + raise HarnessError("Run manifest has no index contract") + for name, datatype in sorted(indexes.items()): + client.request( + "POST", + "/services/data/indexes", + form={"name": str(name), "datatype": str(datatype), "output_mode": "json"}, + allowed=(200, 201, 409), + ) + + +def _dashboard_path(view_id: str) -> str: + return f"/servicesNS/admin/search/data/ui/views/{quote(view_id, safe='')}" + + +def publish(client: SplunkClient, manifest_path: Path) -> dict[str, Any]: + manifest = _load_json(manifest_path) + base = manifest_path.parent + comparisons: list[dict[str, Any]] = [] + for dashboard in manifest["dashboards"]: + view_id = dashboard["view_id"] + xml = (base / dashboard["view_xml_path"]).read_text(encoding="utf-8") + client.request("DELETE", _dashboard_path(view_id), allowed=(200, 404)) + client.request( + "POST", + "/servicesNS/admin/search/data/ui/views", + form={"name": view_id, "eai:data": xml, "output_mode": "json"}, + ) + response = client.request("GET", f"{_dashboard_path(view_id)}?output_mode=json") + try: + payload = json.loads(response.body) + readback = payload["entry"][0]["content"]["eai:data"] + except (json.JSONDecodeError, KeyError, IndexError, TypeError) as error: + raise HarnessError(f"Unable to read back dashboard {view_id!r}") from error + comparison = compare_roundtrip(xml, readback) + comparisons.append( + { + "actual_sha256": comparison.actual_sha256, + "differences": [item.model_dump(mode="json") for item in comparison.differences], + "equivalent": comparison.equivalent, + "expected_sha256": comparison.expected_sha256, + "view_id": view_id, + } + ) + result = {"schema_version": RESULT_SCHEMA_VERSION, "roundtrip": comparisons} + _write_json(base / "roundtrip-results.json", result) + failures = [item for item in comparisons if not item["equivalent"]] + if failures: + raise HarnessError(f"{len(failures)} dashboard readback comparisons differed") + return result + + +def cleanup(client: SplunkClient, manifest_path: Path) -> None: + manifest = _load_json(manifest_path) + for dashboard in manifest["dashboards"]: + client.request("DELETE", _dashboard_path(dashboard["view_id"]), allowed=(200, 404)) + + +def _search_value(query: str) -> str: + stripped = query.strip() + if stripped.startswith("|") or stripped.lower().startswith("search "): + return stripped + return f"search {stripped}" + + +def run_search( + client: SplunkClient, query: str +) -> tuple[list[dict[str, str]], list[dict[str, str]]]: + response = client.request( + "POST", + "/services/search/jobs/export", + form={ + "output_mode": "json", + "search": _search_value(query), + "search_mode": "normal", + }, + allowed=(200, 400), + ) + rows: list[dict[str, str]] = [] + messages: list[dict[str, str]] = [] + for line in response.body.decode("utf-8", errors="replace").splitlines(): + if not line.strip(): + continue + try: + item = json.loads(line) + except json.JSONDecodeError as error: + raise HarnessError(f"Search export returned non-JSON output: {line[:500]}") from error + result = item.get("result") + if isinstance(result, dict): + rows.append({str(key): str(value) for key, value in result.items()}) + raw_messages = item.get("messages") + if isinstance(raw_messages, list): + for message in raw_messages: + if isinstance(message, dict): + messages.append({str(key): str(value) for key, value in message.items()}) + if response.status >= 400 and not any( + message.get("type", "").upper() in {"ERROR", "FATAL"} for message in messages + ): + messages.append( + { + "type": "ERROR", + "text": f"Search export returned HTTP {response.status}", + } + ) + return rows, messages + + +def _fatal_messages(messages: Sequence[Mapping[str, str]]) -> list[Mapping[str, str]]: + return [ + message for message in messages if message.get("type", "").upper() in {"ERROR", "FATAL"} + ] + + +def _project_rows( + rows: Sequence[Mapping[str, str]], + expected: Sequence[Mapping[str, str]], +) -> list[dict[str, str]]: + keys = tuple(expected[0]) if expected else () + return [{key: row.get(key, "") for key in keys} for row in rows] + + +def validate_searches( + client: SplunkClient, + manifest_path: Path, + *, + kind: str, +) -> dict[str, Any]: + manifest = _load_json(manifest_path) + checks: list[dict[str, Any]] = [] + failures: list[str] = [] + for dashboard in manifest["dashboards"]: + if kind == "source": + queries = [ + { + "id": item["data_source_id"], + "query": item["query"], + "expected_rows": None, + } + for item in dashboard["source_queries"] + ] + else: + queries = [ + { + "id": item["data_source_id"], + "query": item["fixture_query"], + "expected_rows": item["expected_rows"], + } + for item in dashboard["fixture_searches"] + ] + for item in queries: + rows, messages = run_search(client, item["query"]) + fatal = _fatal_messages(messages) + check_id = f"{dashboard['example_id']}/{item['id']}" + passed = not fatal + expected_rows = item["expected_rows"] + projected: list[dict[str, str]] = [] + if kind == "fixture" and dashboard["expected_state"] == "search_error": + passed = bool(fatal) + elif kind == "fixture" and expected_rows is not None: + projected = _project_rows(rows, expected_rows) + passed = passed and projected == expected_rows + else: + projected = rows + if not passed: + failures.append(check_id) + checks.append( + { + "fatal_messages": fatal, + "id": check_id, + "kind": kind, + "passed": passed, + "rows": projected if kind == "fixture" else [], + } + ) + result = { + "schema_version": RESULT_SCHEMA_VERSION, + "checks": checks, + "failures": failures, + "kind": kind, + } + _write_json(manifest_path.parent / f"{kind}-search-results.json", result) + if failures: + raise HarnessError(f"{kind} search checks failed: {', '.join(failures)}") + return result + + +def _client(arguments: argparse.Namespace) -> SplunkClient: + return SplunkClient( + arguments.management_url, + arguments.username, + arguments.password, + timeout=arguments.request_timeout, + ) + + +def _add_client_arguments(parser: argparse.ArgumentParser) -> None: + parser.add_argument( + "--management-url", + default=os.environ.get("SPLUNK_MGMT_URL", "https://127.0.0.1:8089"), + ) + parser.add_argument("--username", default=os.environ.get("SPLUNK_USERNAME", "admin")) + parser.add_argument("--password", default=os.environ.get("SPLUNK_PASSWORD"), required=False) + parser.add_argument("--request-timeout", type=float, default=60) + + +def _require_password(arguments: argparse.Namespace) -> None: + if not arguments.password: + raise HarnessError("Set SPLUNK_PASSWORD or pass --password") + + +def _parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__) + commands = parser.add_subparsers(dest="command", required=True) + + image = commands.add_parser("image", help="Resolve one pinned Splunk image record") + image.add_argument("--target", required=True) + image.add_argument("--field", choices=("image", "requires_general_terms")) + + prepare_parser = commands.add_parser("prepare", help="Generate test-only dashboards") + prepare_parser.add_argument("--target", required=True) + prepare_parser.add_argument("--suite", choices=("smoke", "full"), default="smoke") + prepare_parser.add_argument("--output", type=Path, required=True) + prepare_parser.add_argument("--include-state-cases", action="store_true") + + wait_parser = commands.add_parser("wait", help="Wait for the management API") + _add_client_arguments(wait_parser) + wait_parser.add_argument("--startup-timeout", type=float, default=900) + + indexes = commands.add_parser("provision-indexes", help="Create empty logical test indexes") + _add_client_arguments(indexes) + indexes.add_argument("--manifest", type=Path, required=True) + + publish_parser = commands.add_parser("publish", help="Publish and verify dashboard readback") + _add_client_arguments(publish_parser) + publish_parser.add_argument("--manifest", type=Path, required=True) + + searches = commands.add_parser("validate-searches", help="Run source or fixture searches") + _add_client_arguments(searches) + searches.add_argument("--manifest", type=Path, required=True) + searches.add_argument("--kind", choices=("source", "fixture"), required=True) + + cleanup_parser = commands.add_parser("cleanup", help="Delete test dashboard views") + _add_client_arguments(cleanup_parser) + cleanup_parser.add_argument("--manifest", type=Path, required=True) + return parser + + +def main(argv: Sequence[str] | None = None) -> int: + arguments = _parser().parse_args(argv) + try: + if arguments.command == "image": + record = image_record(arguments.target) + if arguments.field: + value = record[arguments.field] + print(str(value).lower() if isinstance(value, bool) else value) + else: + print(json.dumps(record, indent=2, sort_keys=True)) + elif arguments.command == "prepare": + path = prepare( + target=arguments.target, + suite=arguments.suite, + output=arguments.output, + include_state_cases=arguments.include_state_cases, + ) + print(path) + else: + _require_password(arguments) + client = _client(arguments) + if arguments.command == "wait": + wait_for_splunk(client, arguments.startup_timeout) + elif arguments.command == "provision-indexes": + provision_indexes(client, _load_json(arguments.manifest)) + elif arguments.command == "publish": + print(json.dumps(publish(client, arguments.manifest), indent=2, sort_keys=True)) + elif arguments.command == "validate-searches": + print( + json.dumps( + validate_searches(client, arguments.manifest, kind=arguments.kind), + indent=2, + sort_keys=True, + ) + ) + elif arguments.command == "cleanup": + cleanup(client, arguments.manifest) + return 0 + except HarnessError as error: + print( + json.dumps({"status": "error", "message": str(error)}, sort_keys=True), file=sys.stderr + ) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/integration/splunk-visual/scripts/render-overview.mjs b/integration/splunk-visual/scripts/render-overview.mjs new file mode 100644 index 0000000..a325f31 --- /dev/null +++ b/integration/splunk-visual/scripts/render-overview.mjs @@ -0,0 +1,105 @@ +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { chromium } from "@playwright/test"; + +const root = path.dirname(path.dirname(fileURLToPath(import.meta.url))); +const target = process.env.SPLUNK_VISUAL_TARGET ?? "unconfigured"; +const artifacts = process.env.SPLUNK_VISUAL_ARTIFACTS ?? path.join(root, "artifacts", target); +const screenshotRoot = path.join(artifacts, "screenshots", target); + +function walk(directory) { + if (!fs.existsSync(directory)) return []; + return fs + .readdirSync(directory, { withFileTypes: true }) + .flatMap((entry) => { + const resolved = path.join(directory, entry.name); + return entry.isDirectory() ? walk(resolved) : [resolved]; + }) + .filter((item) => item.endsWith(".png")) + .sort(); +} + +function loadOptionalJson(file) { + if (!fs.existsSync(file)) return undefined; + return JSON.parse(fs.readFileSync(file, "utf8")); +} + +function playwrightFailures(report) { + const failures = []; + function visitSuite(suite) { + for (const spec of suite.specs ?? []) { + const failed = (spec.tests ?? []).some((test) => + (test.results ?? []).some((result) => !["passed", "skipped"].includes(result.status)), + ); + if (failed) failures.push(`playwright:${spec.title}`); + } + for (const child of suite.suites ?? []) visitSuite(child); + } + for (const suite of report?.suites ?? []) visitSuite(suite); + return failures; +} + +const screenshots = walk(screenshotRoot); +if (screenshots.length === 0) { + throw new Error(`No screenshots found under ${screenshotRoot}`); +} + +const cards = screenshots + .filter((item) => path.basename(item) === "full.png") + .map((item) => { + const dashboardId = path.basename(path.dirname(item)); + const encoded = fs.readFileSync(item).toString("base64"); + return `

${dashboardId}

${dashboardId}
`; + }) + .join("\n"); + +const html = ` +Splunk visual QA ${target} +

Splunk Dashboard Studio visual QA — ${target}

${cards}
`; + +fs.mkdirSync(artifacts, { recursive: true }); +fs.writeFileSync(path.join(artifacts, "qa-overview.html"), html); +fs.copyFileSync(path.join(root, "qa", "vision-contract.json"), path.join(artifacts, "vision-contract.json")); +fs.copyFileSync(path.join(root, "qa", "vision-prompt.md"), path.join(artifacts, "vision-prompt.md")); + +const browser = await chromium.launch(); +const page = await browser.newPage({ viewport: { width: 1600, height: 1200 }, deviceScaleFactor: 1 }); +await page.setContent(html, { waitUntil: "load" }); +await page.screenshot({ fullPage: true, path: path.join(artifacts, "qa-overview.png") }); +await browser.close(); + +const files = screenshots.map((item) => ({ + path: path.relative(artifacts, item).split(path.sep).join("/"), + sha256: crypto.createHash("sha256").update(fs.readFileSync(item)).digest("hex"), +})); +const deterministicFailures = []; +for (const kind of ["source", "fixture"]) { + const results = loadOptionalJson(path.join(artifacts, `${kind}-search-results.json`)); + for (const id of results?.failures ?? []) deterministicFailures.push(`search:${kind}:${id}`); +} +const roundtrip = loadOptionalJson(path.join(artifacts, "roundtrip-results.json")); +for (const item of roundtrip?.roundtrip ?? []) { + if (!item.equivalent) deterministicFailures.push(`roundtrip:${item.view_id}`); +} +deterministicFailures.push( + ...playwrightFailures(loadOptionalJson(path.join(artifacts, "playwright-results.json"))), +); +const report = { + schema_version: "splunk-visual-overview/v1", + target, + deterministic_failures: [...new Set(deterministicFailures)].sort(), + screenshot_count: files.length, + screenshots: files, + overview: "qa-overview.png", + vision_contract: "vision-contract.json", + vision_prompt: "vision-prompt.md", +}; +fs.writeFileSync(path.join(artifacts, "qa-overview.json"), `${JSON.stringify(report, null, 2)}\n`); +console.log(JSON.stringify(report)); diff --git a/integration/splunk-visual/scripts/validate-vision-report.mjs b/integration/splunk-visual/scripts/validate-vision-report.mjs new file mode 100644 index 0000000..c7159de --- /dev/null +++ b/integration/splunk-visual/scripts/validate-vision-report.mjs @@ -0,0 +1,56 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const root = path.dirname(path.dirname(fileURLToPath(import.meta.url))); +const target = process.env.SPLUNK_VISUAL_TARGET ?? "unconfigured"; +const artifacts = process.env.SPLUNK_VISUAL_ARTIFACTS ?? path.join(root, "artifacts", target); +const reportPath = process.argv[2] ?? path.join(artifacts, "vision-report.json"); +const contract = JSON.parse(fs.readFileSync(path.join(root, "qa", "vision-contract.json"), "utf8")); +const report = JSON.parse(fs.readFileSync(reportPath, "utf8")); +const overview = JSON.parse(fs.readFileSync(path.join(artifacts, "qa-overview.json"), "utf8")); +const deterministicFailures = new Set(overview.deterministic_failures ?? []); + +if (report.schema_version !== "splunk-vision-qa-report/v1" || !Array.isArray(report.findings)) { + throw new Error("Vision report must use splunk-vision-qa-report/v1 and contain findings[]"); +} + +for (const [index, finding] of report.findings.entries()) { + for (const field of contract.finding.required) { + if (!(field in finding)) throw new Error(`findings[${index}] is missing ${field}`); + } + if (!contract.categories.includes(finding.category)) { + throw new Error(`findings[${index}] has unsupported category ${finding.category}`); + } + if (!contract.finding.severity.includes(finding.severity)) { + throw new Error(`findings[${index}] has unsupported severity ${finding.severity}`); + } + if (typeof finding.confidence !== "number" || finding.confidence < 0 || finding.confidence > 1) { + throw new Error(`findings[${index}] confidence must be between 0 and 1`); + } + const box = finding.bounding_box; + if (!box || !contract.finding.bounding_box.every((field) => Number.isFinite(box[field]))) { + throw new Error(`findings[${index}] has an invalid bounding_box`); + } + if ( + finding.deterministic_evidence !== null && + !deterministicFailures.has(finding.deterministic_evidence) + ) { + throw new Error( + `findings[${index}] cites unknown deterministic evidence ${finding.deterministic_evidence}`, + ); + } +} + +const corroboratedErrors = report.findings.filter( + (finding) => finding.severity === "error" && finding.deterministic_evidence !== null, +); +console.log( + JSON.stringify({ + schema_version: "splunk-vision-qa-validation/v1", + findings: report.findings.length, + corroborated_errors: corroboratedErrors.length, + advisory: corroboratedErrors.length === 0, + }), +); +process.exitCode = corroboratedErrors.length > 0 ? 1 : 0; diff --git a/integration/splunk-visual/source-lock.json b/integration/splunk-visual/source-lock.json new file mode 100644 index 0000000..61fe7e7 --- /dev/null +++ b/integration/splunk-visual/source-lock.json @@ -0,0 +1,113 @@ +{ + "app": { + "app_id": "splunk_health", + "files": { + "splunk_health/README/savedsearches.conf.spec": "c6576a4e795de6f6a3b3e8901673ec38cad9e45e6d54515b60fbae0498f224f1", + "splunk_health/appserver/static/visualizations/forwarder_heatmap/formatter.html": "c876f9f5debc571bd4d8a7f99eea4d9536d855a52696f165d04eae6c8d76ecdd", + "splunk_health/appserver/static/visualizations/forwarder_heatmap/preview.png": "c9b5877c5d50c803fffff585e1cf8ee23ba5e4c1d1d47e2ac15aeb5d762dd0c1", + "splunk_health/appserver/static/visualizations/forwarder_heatmap/visualization.css": "ac925dc521b88dec6c0c027ae4edae1bee9c7d77cf3d677a5a46b38a226ebd7e", + "splunk_health/appserver/static/visualizations/forwarder_heatmap/visualization.js": "ac99f981ffcbc1ac7c4bf356cad0c5f10062f96ce7c2655bcaae0b44dabfb3ba", + "splunk_health/appserver/static/visualizations/index_storage/formatter.html": "9f0d3832c2d6e4965591537082c2b86ca5525acd8f430b7d294266bd00370106", + "splunk_health/appserver/static/visualizations/index_storage/preview.png": "9f5334e1b3a4f25ad3775907a09d981e18ac4216b30c0d262536526fe29f8bc7", + "splunk_health/appserver/static/visualizations/index_storage/visualization.css": "c616b1a2cd860a808c75b7ae6f32da425537e61059032b2593d9b17494c6955b", + "splunk_health/appserver/static/visualizations/index_storage/visualization.js": "a13c977614539e81594c8d0e4a92bc1cc25d313f5eb69c5a58586feb88bc0d33", + "splunk_health/appserver/static/visualizations/indexing_pipeline_flow/formatter.html": "0a91c94b33292766bc42454b035d5e7ca19319937c42670c4db19a1cff120df5", + "splunk_health/appserver/static/visualizations/indexing_pipeline_flow/visualization.css": "505872cd42773f6457cb2225a8e94ddaefca74b756374c8a7a81017bf3f2a46c", + "splunk_health/appserver/static/visualizations/indexing_pipeline_flow/visualization.js": "8771b405b2a41857c12f86456cc8f9ca227ecbb70c1ccbf203746396a5bddccd", + "splunk_health/appserver/static/visualizations/license_gauge/formatter.html": "b450d9cac0cd7f2921516f94eb270306739f4e9e4c758237a75c2a2193e2da06", + "splunk_health/appserver/static/visualizations/license_gauge/preview.png": "9be150b0ffc2d334d7958cf50d2a5fc967694d9460a48e44fcdc9d4381c8b4de", + "splunk_health/appserver/static/visualizations/license_gauge/visualization.css": "0697f44848245a741c8114fd213bd0578f6a5bc1f12c583d5fdb84239a5705b2", + "splunk_health/appserver/static/visualizations/license_gauge/visualization.js": "a8496a93dccb5a30f6a21a64277eb984fc506881c4523fd8d015721903890134", + "splunk_health/appserver/static/visualizations/resource_gauge/formatter.html": "c1e9f74c280a3bfd60c2d1e3741bb2870224ab2eecfab7832ec9f0924eb6e914", + "splunk_health/appserver/static/visualizations/resource_gauge/preview.png": "aeb45466bbadcfd2d87769563a7ab41230f38e0e636f61dd73d7def06bd7d28f", + "splunk_health/appserver/static/visualizations/resource_gauge/visualization.css": "92646c4f2977f978077e6e4f2f716f373e603684e144af44f5134f2a070b1f67", + "splunk_health/appserver/static/visualizations/resource_gauge/visualization.js": "3508b662999da86e83c14305cceae1f0f855c8c5179a65dd1b356daeecfd4683", + "splunk_health/appserver/static/visualizations/scheduler_health/formatter.html": "89374fd1f9ae51afb934367281dfc0310ba93f4e0581c202aecf9ae6a96e00e9", + "splunk_health/appserver/static/visualizations/scheduler_health/preview.png": "e53802c19f7f88f0a821362c8f5b128377c93f3beea030c6984499fa845d00c1", + "splunk_health/appserver/static/visualizations/scheduler_health/visualization.css": "84fbb1cca9181d28e2a5576573ea27de1dcb4173aa9405774d518aa43cd4eeee", + "splunk_health/appserver/static/visualizations/scheduler_health/visualization.js": "6482aecf636ca6743f130bdade914291e375d17d515c6e142f62222c3b62d6e7", + "splunk_health/appserver/static/visualizations/search_activity/formatter.html": "238a5edd7c9980d1d8902f549333e1e7676ee64d66c573932d54f6fb9d918f35", + "splunk_health/appserver/static/visualizations/search_activity/preview.png": "062d57c8e725932699fe4ff98bbfa17b6717b1e5f2b6513329a851d9c8791cff", + "splunk_health/appserver/static/visualizations/search_activity/visualization.css": "6361097377efb5915ef9f380c2c8152eb8fb78da158666f6613d0f65c8b0a948", + "splunk_health/appserver/static/visualizations/search_activity/visualization.js": "d14afdfdad09699b27fe26ef632e6d562346f316ffb87c0bbe1f90bfa5b27caa", + "splunk_health/appserver/static/visualizations/splunk_status_board/formatter.html": "af3e97fde02f2719a453e0d1623c52f48ae5d90cc5849bb1ebfce4c6f2cfac8d", + "splunk_health/appserver/static/visualizations/splunk_status_board/preview.png": "3135cfee8fb5dd35b4bd620c81ca5aad29ad2613ad2345b58a9e5107beeef1ef", + "splunk_health/appserver/static/visualizations/splunk_status_board/visualization.css": "376eb78755c23a809a9ccaebae31c863943ec780533c3815dacdb6c4d996d501", + "splunk_health/appserver/static/visualizations/splunk_status_board/visualization.js": "deb0128d653b8a1ca716f96f2a578889a8bd16751a086653f8fae44b665d92de", + "splunk_health/default/app.conf": "cba00c1eddac79532e6bff84f5ee991a1ff6cbdd5d20b19e337ca525da414422", + "splunk_health/default/data/ui/nav/default.xml": "9e5b30fe039768507bc53052969d4651cc506e348fc1292ab0fc8cb536bf99aa", + "splunk_health/default/data/ui/views/splunk_health.xml": "83007b44ecbeca8f171ea7f3f9d8bb37d78e646276f665d3642bbda41e7e112b", + "splunk_health/default/savedsearches.conf": "44059c5027cc1b89e12312bd738f40e3676208446a5b41ee41cf6f2ab6323f8a", + "splunk_health/default/visualizations.conf": "fca118d9f91f9226c80b5210ac9262908d1015fcd48f8f14d57b04d91a1d7411", + "splunk_health/metadata/default.meta": "68e8ec9ce33bb40c647d3a467137abda69ed617206b5c969f9ea838ab047696a", + "splunk_health/static/appIcon.png": "a73cc3898cc3e87d9d0c7d3faad5fb99a3a80c71b40a07000c397f5f2db92224", + "splunk_health/static/appIconAlt.png": "a73cc3898cc3e87d9d0c7d3faad5fb99a3a80c71b40a07000c397f5f2db92224", + "splunk_health/static/appIconAlt_2x.png": "4b18a892e505545f8890861c873d253a305a5c5917f6ee6aca36a6aa34447a13", + "splunk_health/static/appIcon_2x.png": "4b18a892e505545f8890861c873d253a305a5c5917f6ee6aca36a6aa34447a13" + }, + "source_path": "splunk_health", + "tree_sha256": "016ebc4eb95a78016ece6b8f1c78e461dad51fdffc9846626d8a622d4feae128", + "vendor_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health" + }, + "definition": { + "package_path": "splunk_dashboard_studio/template_data/rcastley_splunk_health.json", + "sha256": "0371e79ed06eb10ee6298d6e54f32d5a99b744e44d812400845ad141de72febd", + "source_path": "splunk_health/default/data/ui/views/splunk_health.xml" + }, + "harnesses": [ + { + "name": "forwarder_heatmap", + "sha256": "0aa3fc6aec918c9d0b27580387b3474bdfed2468327d190d6af5644122ecfabd", + "source_path": "examples/forwarder_heatmap/appserver/static/visualizations/forwarder_heatmap/harness.json", + "vendor_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/forwarder_heatmap.json" + }, + { + "name": "index_storage", + "sha256": "5362fcf86558d226c7fa2c449500c9b20e122c520630aee162e88aa558f43535", + "source_path": "examples/index_storage/appserver/static/visualizations/index_storage/harness.json", + "vendor_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/index_storage.json" + }, + { + "name": "indexing_pipeline_flow", + "sha256": "851fd40d8ddf89d6a638f8b70a14116d0cc2a3a1a4a69ab395e3c7fea8ced97f", + "source_path": "examples/indexing_pipeline_flow/appserver/static/visualizations/indexing_pipeline_flow/harness.json", + "vendor_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/indexing_pipeline_flow.json" + }, + { + "name": "license_gauge", + "sha256": "24ddda9c4aa973f9fc3067b73ea45a0404856b97a5b27906edcd3a51b9ad6525", + "source_path": "examples/license_gauge/appserver/static/visualizations/license_gauge/harness.json", + "vendor_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/license_gauge.json" + }, + { + "name": "resource_gauge", + "sha256": "900ce66d1ec7142350a9c7b7d9c4398f7582316a293b321ea35f6d01bcf894d0", + "source_path": "examples/resource_gauge/appserver/static/visualizations/resource_gauge/harness.json", + "vendor_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/resource_gauge.json" + }, + { + "name": "scheduler_health", + "sha256": "eaa51041411019409420ce4412805885d574487530acc0058bbfbc88364e0551", + "source_path": "examples/scheduler_health/appserver/static/visualizations/scheduler_health/harness.json", + "vendor_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/scheduler_health.json" + }, + { + "name": "search_activity", + "sha256": "941e9181e8c5f627bb6ba70b4b52d486016c049e6a451bcc854d93abd4ec1bd0", + "source_path": "examples/search_activity/appserver/static/visualizations/search_activity/harness.json", + "vendor_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/search_activity.json" + }, + { + "name": "splunk_status_board", + "sha256": "23d6aacdf19349acd9cc1386346b746455efc30ae2f6c16565461fb48d22cbd0", + "source_path": "examples/splunk_status_board/appserver/static/visualizations/splunk_status_board/harness.json", + "vendor_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/splunk_status_board.json" + } + ], + "license": "Apache-2.0", + "license_path": "integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/LICENSE", + "license_sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4", + "repository": "https://github.com/rcastley/splunk-custom-visualizations", + "revision": "7424755c461712022367c3fa081fd7e0edc91001", + "schema_version": "splunk-source-template-lock/v1" +} diff --git a/integration/splunk-visual/tests/global.setup.ts b/integration/splunk-visual/tests/global.setup.ts new file mode 100644 index 0000000..da08255 --- /dev/null +++ b/integration/splunk-visual/tests/global.setup.ts @@ -0,0 +1,63 @@ +import fs from "node:fs"; +import path from "node:path"; +import { chromium, type FullConfig, type Page } from "@playwright/test"; + +const splunkUnavailable = /network connection may have been lost|splunk may be down/i; + +async function gotoWhenSplunkWebIsReady(page: Page, url: string): Promise { + const deadline = Date.now() + 180_000; + let lastFailure = "Splunk Web returned its unavailable page"; + while (Date.now() < deadline) { + try { + await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30_000 }); + const unavailable = await page + .getByText(splunkUnavailable) + .first() + .isVisible({ timeout: 1_000 }) + .catch(() => false); + if (!unavailable) { + return; + } + } catch (error) { + lastFailure = error instanceof Error ? error.message : String(error); + } + await page.waitForTimeout(5_000); + } + throw new Error(`Splunk Web did not become ready within 180 seconds: ${lastFailure}`); +} + +export default async function globalSetup(config: FullConfig): Promise { + const manifest = process.env.SPLUNK_VISUAL_MANIFEST; + if (!manifest) { + return; + } + const project = config.projects[0]; + const baseURL = String(project.use.baseURL); + const storageState = String(project.use.storageState); + fs.mkdirSync(path.dirname(storageState), { recursive: true }); + + const browser = await chromium.launch(); + const page = await browser.newPage({ ignoreHTTPSErrors: true }); + const searchURL = `${baseURL}/en-US/app/search/search`; + await gotoWhenSplunkWebIsReady(page, searchURL); + + const username = page.locator('input[name="username"], input#username').first(); + if (await username.isVisible({ timeout: 5_000 }).catch(() => false)) { + const password = process.env.SPLUNK_PASSWORD; + if (!password) { + throw new Error("SPLUNK_PASSWORD is required when Splunk Web presents a login page"); + } + await username.fill(process.env.SPLUNK_USERNAME ?? "admin"); + await page.locator('input[name="password"], input#password').first().fill(password); + await page.locator('button[type="submit"], input[type="submit"]').first().click(); + await page.waitForURL((url) => !url.pathname.includes("/account/login"), { timeout: 60_000 }); + } + + await gotoWhenSplunkWebIsReady(page, searchURL); + if (await username.isVisible({ timeout: 1_000 }).catch(() => false)) { + throw new Error("Splunk Web remained on the login page after fixture authentication"); + } + + await page.context().storageState({ path: storageState }); + await browser.close(); +} diff --git a/integration/splunk-visual/tests/render.spec.ts b/integration/splunk-visual/tests/render.spec.ts new file mode 100644 index 0000000..6d7ad6c --- /dev/null +++ b/integration/splunk-visual/tests/render.spec.ts @@ -0,0 +1,248 @@ +import fs from "node:fs"; +import path from "node:path"; +import { expect, test, type Locator, type Page } from "@playwright/test"; + +type PanelContract = { + panel_id: string; + render_kind?: "canvas"; + title: string; + ui_markers: string[]; + ui_patterns?: string[]; + visualization_type: string; +}; + +type DashboardContract = { + example_id: string; + expected_state: "ready" | "no_data" | "search_error"; + panels: PanelContract[]; + title: string; + title_visible: boolean; + view_id: string; +}; + +type RunManifest = { + dashboards: DashboardContract[]; + schema_version: "splunk-visual-run/v1"; + target: string; +}; + +type FailedResource = { + error: string; + type: string; + url: string; +}; + +const integrationRoot = path.resolve(import.meta.dirname, ".."); +const manifestPath = process.env.SPLUNK_VISUAL_MANIFEST; +const artifactRoot = + process.env.SPLUNK_VISUAL_ARTIFACTS ?? + path.join(integrationRoot, "artifacts", process.env.SPLUNK_VISUAL_TARGET ?? "unconfigured"); + +function loadManifest(): RunManifest | undefined { + if (!manifestPath) { + return undefined; + } + const value = JSON.parse(fs.readFileSync(manifestPath, "utf8")) as RunManifest; + if (value.schema_version !== "splunk-visual-run/v1") { + throw new Error(`Unsupported visual manifest schema: ${value.schema_version}`); + } + return value; +} + +async function dismissNonProductPopups(page: Page): Promise { + for (const label of [/skip/i, /not now/i, /close/i, /dismiss/i]) { + const button = page.getByRole("button", { name: label }).first(); + if (await button.isVisible({ timeout: 500 }).catch(() => false)) { + await button.click().catch(() => undefined); + } + } +} + +async function panelContainer(page: Page, title: string): Promise { + let candidate = page.getByText(title, { exact: true }).last(); + await expect(candidate).toBeVisible(); + for (let depth = 0; depth < 8; depth += 1) { + const parent = candidate.locator(".."); + const box = await parent.boundingBox(); + if (box && box.width >= 250 && box.height >= 120 && box.width < 1435 && box.height < 1000) { + return parent; + } + candidate = parent; + } + return page.getByText(title, { exact: true }).last(); +} + +async function expectInsidePanel(marker: Locator, container: Locator): Promise { + const [markerBox, containerBox] = await Promise.all([ + marker.boundingBox(), + container.boundingBox(), + ]); + expect(markerBox, "marker bounding box").not.toBeNull(); + expect(containerBox, "panel bounding box").not.toBeNull(); + expect(markerBox!.x).toBeGreaterThanOrEqual(containerBox!.x - 1); + expect(markerBox!.y).toBeGreaterThanOrEqual(containerBox!.y - 1); + expect(markerBox!.x + markerBox!.width).toBeLessThanOrEqual( + containerBox!.x + containerBox!.width + 1, + ); + expect(markerBox!.y + markerBox!.height).toBeLessThanOrEqual( + containerBox!.y + containerBox!.height + 1, + ); +} + +async function expectCanvasInsidePanel(container: Locator): Promise { + let canvas = container.locator("canvas").first(); + if (!(await canvas.isVisible().catch(() => false))) { + const iframe = container.locator("iframe").first(); + await expect(iframe).toBeVisible({ timeout: 60_000 }); + canvas = iframe.contentFrame().locator("canvas").first(); + } + await expect(canvas).toBeVisible({ timeout: 60_000 }); + const box = await canvas.boundingBox(); + expect(box, "custom visualization canvas bounding box").not.toBeNull(); + expect(box!.width).toBeGreaterThan(10); + expect(box!.height).toBeGreaterThan(10); + await expectInsidePanel(canvas, container); +} + +async function waitForDashboardToSettle(page: Page): Promise { + await page.waitForLoadState("domcontentloaded"); + await page.waitForFunction(() => { + const text = document.body.innerText.toLowerCase(); + return !text.includes("waiting for data") && !text.includes("search is waiting"); + }, undefined, { timeout: 60_000 }); + await page.waitForTimeout(2_000); +} + +const manifest = loadManifest(); + +test.describe("Splunk Dashboard Studio rendering", () => { + test.describe.configure({ mode: "serial" }); + + if (!manifest) { + test("requires SPLUNK_VISUAL_MANIFEST for execution", async () => { + test.skip(true, "Set SPLUNK_VISUAL_MANIFEST after running scripts/harness.py prepare"); + }); + return; + } + + for (const dashboard of manifest.dashboards) { + test(`${manifest.target} ${dashboard.example_id}`, async ({ page }) => { + const pageErrors: string[] = []; + const failedResources: FailedResource[] = []; + page.on("pageerror", (error) => pageErrors.push(error.message)); + page.on("requestfailed", (request) => { + const type = request.resourceType(); + if (["document", "script", "stylesheet", "xhr", "fetch"].includes(type)) { + failedResources.push({ + error: request.failure()?.errorText ?? "failed", + type, + url: request.url(), + }); + } + }); + + await page.addInitScript(() => { + if (window.top === window) { + return; + } + let seed = 0x5eed1234; + Math.random = () => { + seed = (1664525 * seed + 1013904223) >>> 0; + return seed / 0x1_0000_0000; + }; + const nativeSetInterval = window.setInterval.bind(window); + window.setInterval = ((handler: TimerHandler, timeout?: number, ...args: unknown[]) => { + if (timeout === 50) { + return 0; + } + return nativeSetInterval(handler, timeout, ...args); + }) as typeof window.setInterval; + }); + await page.goto(`/en-US/app/search/${dashboard.view_id}`, { waitUntil: "domcontentloaded" }); + await dismissNonProductPopups(page); + if (dashboard.title_visible) { + await expect(page.getByText(dashboard.title, { exact: true }).first()).toBeVisible(); + } + for (const panel of dashboard.panels) { + await expect(page.getByText(panel.title, { exact: true }).last()).toBeVisible(); + } + await page.addStyleTag({ path: path.join(integrationRoot, "qa", "screenshot.css") }); + await waitForDashboardToSettle(page); + + if (dashboard.expected_state === "ready") { + const fatalState = page.getByText(/search (?:failed|error)|error in ['\"]search/i); + await expect(fatalState).toHaveCount(0); + for (const panel of dashboard.panels) { + const container = await panelContainer(page, panel.title); + if (panel.render_kind === "canvas") { + await expectCanvasInsidePanel(container); + } + if (panel.visualization_type === "splunk.networkGraph") { + const resetZoom = container.locator('[data-test="reset-button"]').first(); + if (await resetZoom.isVisible().catch(() => false)) { + await resetZoom.click(); + await page.waitForTimeout(750); + } + } + for (const marker of panel.ui_markers) { + const markerLocator = container.getByText(marker, { exact: true }).first(); + await expect(markerLocator).toBeVisible(); + await expectInsidePanel(markerLocator, container); + } + } + } else { + const patterns = dashboard.panels.flatMap((panel) => panel.ui_patterns ?? []); + const statePattern = new RegExp(patterns.join("|"), "i"); + await expect(page.getByText(statePattern).first()).toBeVisible(); + } + + const dashboardArtifacts = path.join( + artifactRoot, + "screenshots", + manifest.target, + dashboard.example_id, + ); + fs.mkdirSync(dashboardArtifacts, { recursive: true }); + await page.screenshot({ + animations: "disabled", + fullPage: true, + path: path.join(dashboardArtifacts, "full.png"), + }); + await fs.promises.writeFile( + path.join(dashboardArtifacts, "aria.yaml"), + await page.locator("body").ariaSnapshot(), + ); + await expect(page).toHaveScreenshot(`${dashboard.example_id}-full.png`, { + animations: "disabled", + fullPage: true, + maxDiffPixelRatio: 0.005, + }); + + for (const panel of dashboard.panels) { + const container = await panelContainer(page, panel.title); + await container.screenshot({ + animations: "disabled", + path: path.join(dashboardArtifacts, `${panel.panel_id}.png`), + }); + await expect(container).toHaveScreenshot( + `${dashboard.example_id}-${panel.panel_id}.png`, + { + animations: "disabled", + maxDiffPixelRatio: 0.002, + }, + ); + } + + expect(pageErrors, "uncaught browser errors").toEqual([]); + if (dashboard.expected_state !== "search_error") { + // Splunk 10.2 cancels superseded custom-viz iframe bootstrap subresources during mount. + // A cancelled document or any non-cancellation error remains fatal, while the panel and + // Canvas assertions above prove that every final iframe completed its render path. + const unresolvedFailures = failedResources.filter( + ({ error, type }) => type === "document" || error !== "net::ERR_ABORTED", + ); + expect(unresolvedFailures, "failed browser resources").toEqual([]); + } + }); + } +}); diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/LICENSE b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/forwarder_heatmap.json b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/forwarder_heatmap.json new file mode 100644 index 0000000..0268516 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/forwarder_heatmap.json @@ -0,0 +1,35 @@ +{ + "label": "Forwarder Heatmap", + "defaultSize": { "width": 800, "height": 400 }, + "noDataMessage": "Awaiting forwarder data", + "dependencies": [], + "fields": [], + "formatter": [ + { "name": "colorTheme", "label": "Colour Theme", "type": "select", "options": ["default", "dark", "neon"], "default": "default" }, + { "name": "showGlow", "label": "Show Glow", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "warningThreshold", "label": "Warning Threshold", "type": "text", "default": "5" }, + { "name": "criticalThreshold", "label": "Critical Threshold", "type": "text", "default": "15" }, + { "name": "showEps", "label": "Show EPS", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "animSpeed", "label": "Animation Speed", "type": "radio", "options": ["slow", "medium", "fast"], "default": "medium" }, + { "name": "cellSize", "label": "Cell Size", "type": "select", "options": ["auto", "small", "medium", "large"], "default": "auto" }, + { "name": "sortBy", "label": "Sort By", "type": "select", "options": ["status", "name", "eps"], "default": "status" } + ], + "data": { + "mode": "multi_row", + "columns": ["host", "mins_ago", "eps"], + "sampleRows": [ + ["idx-prod-01", "0.5", "1250.3"], + ["idx-prod-02", "1.2", "890.1"], + ["idx-prod-03", "3.8", "445.0"], + ["hf-web-01", "0.3", "2100.5"], + ["hf-web-02", "7.5", "120.8"], + ["hf-db-01", "12.4", "55.2"], + ["uf-app-01", "0.8", "340.0"], + ["uf-app-02", "18.6", "0.0"], + ["uf-app-03", "2.1", "780.4"], + ["uf-syslog-01", "0.1", "5200.0"], + ["uf-syslog-02", "25.3", "0.0"], + ["dc-hf-01", "4.9", "670.2"] + ] + } +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/index_storage.json b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/index_storage.json new file mode 100644 index 0000000..88c58a9 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/index_storage.json @@ -0,0 +1,28 @@ +{ + "label": "Index Storage", + "defaultSize": { "width": 800, "height": 400 }, + "noDataMessage": "Awaiting index data", + "dependencies": [], + "fields": [], + "formatter": [ + { "name": "colorTheme", "label": "Colour Theme", "type": "select", "options": ["default", "dark", "neon"], "default": "default" }, + { "name": "showGlow", "label": "Show Glow", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "animSpeed", "label": "Animation Speed", "type": "radio", "options": ["slow", "medium", "fast"], "default": "medium" }, + { "name": "cellSize", "label": "Cell Size", "type": "select", "options": ["auto", "small", "medium", "large"], "default": "auto" }, + { "name": "sortBy", "label": "Sort By", "type": "select", "options": ["size", "name"], "default": "size" } + ], + "data": { + "mode": "multi_row", + "columns": ["title", "sizeGB", "hotGB", "warmGB", "coldGB"], + "sampleRows": [ + ["main", "45.20", "8.50", "18.70", "18.00"], + ["_internal", "12.80", "3.20", "5.60", "4.00"], + ["web_logs", "38.50", "12.10", "15.40", "11.00"], + ["security", "22.30", "5.80", "9.50", "7.00"], + ["metrics", "8.90", "2.10", "3.80", "3.00"], + ["network", "31.60", "7.40", "13.20", "11.00"], + ["app_events", "5.40", "1.80", "2.10", "1.50"], + ["audit", "2.10", "0.60", "0.90", "0.60"] + ] + } +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/indexing_pipeline_flow.json b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/indexing_pipeline_flow.json new file mode 100644 index 0000000..ab5032e --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/indexing_pipeline_flow.json @@ -0,0 +1,26 @@ +{ + "label": "Indexing Pipeline Flow", + "defaultSize": { "width": 700, "height": 350 }, + "noDataMessage": "Awaiting pipeline data", + "dependencies": [], + "fields": [], + "formatter": [ + { "name": "animSpeed", "label": "Animation Speed", "type": "radio", "options": ["slow", "medium", "fast"], "default": "medium" }, + { "name": "colorTheme", "label": "Colour Theme", "type": "select", "options": ["default", "dark", "neon"], "default": "default" }, + { "name": "showLabels", "label": "Show Labels", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "showValues", "label": "Show Values", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "warningThreshold", "label": "Warning Threshold", "type": "text", "default": "70" }, + { "name": "criticalThreshold", "label": "Critical Threshold", "type": "text", "default": "85" }, + { "name": "showGlow", "label": "Show Glow", "type": "radio", "options": ["true", "false"], "default": "true" } + ], + "data": { + "mode": "multi_row", + "columns": ["name", "fill_pct", "avg_size", "capacity"], + "sampleRows": [ + ["parsingqueue", "25", "128", "500"], + ["mergingqueue", "40", "200", "500"], + ["typingqueue", "15", "75", "500"], + ["indexqueue", "60", "300", "500"] + ] + } +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/license_gauge.json b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/license_gauge.json new file mode 100644 index 0000000..6db51f0 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/license_gauge.json @@ -0,0 +1,26 @@ +{ + "label": "License Gauge", + "defaultSize": { "width": 500, "height": 400 }, + "noDataMessage": "Awaiting license data", + "dependencies": [], + "fields": [ + { "name": "used_gb", "label": "Used GB", "type": "slider", "min": 0, "max": 200, "step": 0.5, "default": 42.5 }, + { "name": "quota_gb", "label": "Quota GB", "type": "slider", "min": 1, "max": 200, "step": 1, "default": 100 } + ], + "formatter": [ + { "name": "colorTheme", "label": "Colour Theme", "type": "select", "options": ["default", "dark", "neon"], "default": "default" }, + { "name": "animSpeed", "label": "Animation Speed", "type": "radio", "options": ["slow", "medium", "fast"], "default": "medium" }, + { "name": "showGlow", "label": "Show Glow", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "showLabel", "label": "Show Label", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "warningThreshold", "label": "Warning Threshold", "type": "text", "default": "80" }, + { "name": "criticalThreshold", "label": "Critical Threshold", "type": "text", "default": "90" }, + { "name": "usedField", "label": "Used Field", "type": "text", "default": "used_gb" }, + { "name": "quotaField", "label": "Quota Field", "type": "text", "default": "quota_gb" }, + { "name": "unit", "label": "Unit", "type": "text", "default": "GB" } + ], + "data": { + "mode": "single_row", + "columns": ["used_gb", "quota_gb"], + "dynamicColumnName": { "column": "used_gb", "configKey": "usedField" } + } +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/resource_gauge.json b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/resource_gauge.json new file mode 100644 index 0000000..57b912d --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/resource_gauge.json @@ -0,0 +1,26 @@ +{ + "label": "Resource Gauge", + "defaultSize": { "width": 500, "height": 400 }, + "noDataMessage": "Awaiting resource data", + "dependencies": [], + "fields": [ + { "name": "cpu_pct", "label": "CPU %", "type": "slider", "min": 0, "max": 100, "step": 1, "default": 45 }, + { "name": "mem_pct", "label": "Memory %", "type": "slider", "min": 0, "max": 100, "step": 1, "default": 72 }, + { "name": "disk_pct", "label": "Disk %", "type": "slider", "min": 0, "max": 100, "step": 1, "default": 38 } + ], + "formatter": [ + { "name": "colorTheme", "label": "Colour Theme", "type": "select", "options": ["default", "dark", "neon"], "default": "default" }, + { "name": "animSpeed", "label": "Animation Speed", "type": "radio", "options": ["slow", "medium", "fast"], "default": "medium" }, + { "name": "showLabels", "label": "Show Labels", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "showGlow", "label": "Show Glow", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "warningThreshold", "label": "Warning Threshold", "type": "text", "default": "70" }, + { "name": "criticalThreshold", "label": "Critical Threshold", "type": "text", "default": "85" }, + { "name": "cpuField", "label": "CPU Field", "type": "text", "default": "cpu_pct" }, + { "name": "memField", "label": "Memory Field", "type": "text", "default": "mem_pct" }, + { "name": "diskField", "label": "Disk Field", "type": "text", "default": "disk_pct" } + ], + "data": { + "mode": "single_row", + "columns": ["cpu_pct", "mem_pct", "disk_pct"] + } +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/scheduler_health.json b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/scheduler_health.json new file mode 100644 index 0000000..f13ecfc --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/scheduler_health.json @@ -0,0 +1,23 @@ +{ + "label": "Scheduler Health", + "defaultSize": { "width": 600, "height": 300 }, + "noDataMessage": "Awaiting scheduler data", + "dependencies": [], + "fields": [ + { "name": "skip_pct", "label": "Skip %", "type": "slider", "min": 0, "max": 100, "step": 0.1, "default": 4.8 }, + { "name": "success_pct", "label": "Success %", "type": "slider", "min": 0, "max": 100, "step": 0.1, "default": 95.2 }, + { "name": "avg_runtime", "label": "Avg Runtime (s)", "type": "slider", "min": 0, "max": 120, "step": 0.5, "default": 12.5 }, + { "name": "total", "label": "Total Searches", "type": "slider", "min": 0, "max": 5000, "step": 1, "default": 1234 }, + { "name": "skipped", "label": "Skipped", "type": "slider", "min": 0, "max": 500, "step": 1, "default": 59 } + ], + "formatter": [ + { "name": "colorTheme", "label": "Colour Theme", "type": "select", "options": ["default", "dark", "neon"], "default": "default" }, + { "name": "showGlow", "label": "Show Glow", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "animSpeed", "label": "Animation Speed", "type": "radio", "options": ["slow", "medium", "fast"], "default": "medium" }, + { "name": "runtimeThreshold", "label": "Runtime Threshold", "type": "text", "default": "30" } + ], + "data": { + "mode": "single_row", + "columns": ["skip_pct", "success_pct", "avg_runtime", "total", "skipped"] + } +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/search_activity.json b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/search_activity.json new file mode 100644 index 0000000..fb1c88d --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/search_activity.json @@ -0,0 +1,29 @@ +{ + "label": "Search Activity", + "defaultSize": { "width": 600, "height": 250 }, + "noDataMessage": "Awaiting search data", + "dependencies": [], + "fields": [ + { "name": "_numRows", "label": "Number of Search Types", "type": "slider", "min": 1, "max": 5, "step": 1, "default": 3 } + ], + "formatter": [ + { "name": "colorTheme", "label": "Colour Theme", "type": "select", "options": ["default", "dark", "neon"], "default": "default" }, + { "name": "showGlow", "label": "Show Glow", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "animSpeed", "label": "Animation Speed", "type": "radio", "options": ["slow", "medium", "fast"], "default": "medium" }, + { "name": "maxConcurrent", "label": "Max Concurrent Slots", "type": "text", "default": "50" }, + { "name": "warningThreshold", "label": "Warning Threshold", "type": "text", "default": "60" }, + { "name": "criticalThreshold", "label": "Critical Threshold", "type": "text", "default": "80" } + ], + "data": { + "mode": "multi_row", + "rowCountField": "_numRows", + "columns": ["type", "count"], + "sampleRows": [ + ["scheduled", "18"], + ["ad-hoc", "7"], + ["other", "3"], + ["scheduled", "25"], + ["ad-hoc", "12"] + ] + } +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/splunk_status_board.json b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/splunk_status_board.json new file mode 100644 index 0000000..93886f5 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/harness/splunk_status_board.json @@ -0,0 +1,28 @@ +{ + "label": "Splunk Status Board", + "defaultSize": { "width": 800, "height": 400 }, + "noDataMessage": "Awaiting component data", + "dependencies": [], + "fields": [], + "formatter": [ + { "name": "colorTheme", "label": "Colour Theme", "type": "select", "options": ["default", "dark", "neon"], "default": "default" }, + { "name": "showGlow", "label": "Show Glow", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "warningThreshold", "label": "Warning Threshold", "type": "text", "default": "50" }, + { "name": "criticalThreshold", "label": "Critical Threshold", "type": "text", "default": "80" }, + { "name": "showCounts", "label": "Show Counts", "type": "radio", "options": ["true", "false"], "default": "true" }, + { "name": "animSpeed", "label": "Animation Speed", "type": "radio", "options": ["slow", "medium", "fast"], "default": "medium" }, + { "name": "columns", "label": "Columns", "type": "text", "default": "3" } + ], + "data": { + "mode": "multi_row", + "columns": ["component", "status", "errors", "warns", "health_score"], + "sampleRows": [ + ["Indexer", "ok", "0", "0", "10"], + ["Search Head", "warning", "0", "12", "60"], + ["KV Store", "critical", "23", "15", "90"], + ["License Master", "ok", "0", "0", "5"], + ["Deployment Server", "warning", "0", "8", "55"], + ["HEC", "ok", "0", "2", "15"] + ] + } +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/README/savedsearches.conf.spec b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/README/savedsearches.conf.spec new file mode 100644 index 0000000..8ddd8ba --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/README/savedsearches.conf.spec @@ -0,0 +1,63 @@ +display.visualizations.custom.splunk_health.indexing_pipeline_flow.animSpeed = +display.visualizations.custom.splunk_health.indexing_pipeline_flow.colorTheme = +display.visualizations.custom.splunk_health.indexing_pipeline_flow.showLabels = +display.visualizations.custom.splunk_health.indexing_pipeline_flow.showValues = +display.visualizations.custom.splunk_health.indexing_pipeline_flow.warningThreshold = +display.visualizations.custom.splunk_health.indexing_pipeline_flow.criticalThreshold = +display.visualizations.custom.splunk_health.indexing_pipeline_flow.showGlow = + +display.visualizations.custom.splunk_health.splunk_status_board.colorTheme = +display.visualizations.custom.splunk_health.splunk_status_board.showGlow = +display.visualizations.custom.splunk_health.splunk_status_board.warningThreshold = +display.visualizations.custom.splunk_health.splunk_status_board.criticalThreshold = +display.visualizations.custom.splunk_health.splunk_status_board.showCounts = +display.visualizations.custom.splunk_health.splunk_status_board.animSpeed = +display.visualizations.custom.splunk_health.splunk_status_board.columns = + +display.visualizations.custom.splunk_health.license_gauge.colorTheme = +display.visualizations.custom.splunk_health.license_gauge.showGlow = +display.visualizations.custom.splunk_health.license_gauge.warningThreshold = +display.visualizations.custom.splunk_health.license_gauge.criticalThreshold = +display.visualizations.custom.splunk_health.license_gauge.animSpeed = +display.visualizations.custom.splunk_health.license_gauge.showLabel = +display.visualizations.custom.splunk_health.license_gauge.usedField = +display.visualizations.custom.splunk_health.license_gauge.quotaField = +display.visualizations.custom.splunk_health.license_gauge.unit = + +display.visualizations.custom.splunk_health.forwarder_heatmap.colorTheme = +display.visualizations.custom.splunk_health.forwarder_heatmap.showGlow = +display.visualizations.custom.splunk_health.forwarder_heatmap.warningThreshold = +display.visualizations.custom.splunk_health.forwarder_heatmap.criticalThreshold = +display.visualizations.custom.splunk_health.forwarder_heatmap.showEps = +display.visualizations.custom.splunk_health.forwarder_heatmap.animSpeed = +display.visualizations.custom.splunk_health.forwarder_heatmap.cellSize = +display.visualizations.custom.splunk_health.forwarder_heatmap.sortBy = + +display.visualizations.custom.splunk_health.resource_gauge.colorTheme = +display.visualizations.custom.splunk_health.resource_gauge.showGlow = +display.visualizations.custom.splunk_health.resource_gauge.warningThreshold = +display.visualizations.custom.splunk_health.resource_gauge.criticalThreshold = +display.visualizations.custom.splunk_health.resource_gauge.animSpeed = +display.visualizations.custom.splunk_health.resource_gauge.showLabels = +display.visualizations.custom.splunk_health.resource_gauge.cpuField = +display.visualizations.custom.splunk_health.resource_gauge.memField = +display.visualizations.custom.splunk_health.resource_gauge.diskField = + +display.visualizations.custom.splunk_health.search_activity.colorTheme = +display.visualizations.custom.splunk_health.search_activity.showGlow = +display.visualizations.custom.splunk_health.search_activity.animSpeed = +display.visualizations.custom.splunk_health.search_activity.maxConcurrent = +display.visualizations.custom.splunk_health.search_activity.warningThreshold = +display.visualizations.custom.splunk_health.search_activity.criticalThreshold = + +display.visualizations.custom.splunk_health.index_storage.colorTheme = +display.visualizations.custom.splunk_health.index_storage.showGlow = +display.visualizations.custom.splunk_health.index_storage.animSpeed = +display.visualizations.custom.splunk_health.index_storage.cellSize = +display.visualizations.custom.splunk_health.index_storage.sortBy = + +display.visualizations.custom.splunk_health.scheduler_health.colorTheme = +display.visualizations.custom.splunk_health.scheduler_health.showGlow = +display.visualizations.custom.splunk_health.scheduler_health.animSpeed = +display.visualizations.custom.splunk_health.scheduler_health.runtimeThreshold = + diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/formatter.html b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/formatter.html new file mode 100644 index 0000000..cdfcf9a --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/formatter.html @@ -0,0 +1,53 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/preview.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/preview.png new file mode 100644 index 0000000..7d5789e Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/preview.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/visualization.css b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/visualization.css new file mode 100644 index 0000000..3197031 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/visualization.css @@ -0,0 +1,31 @@ +/* Press Start 2P — Latin subset (woff2, base64-embedded) + Source: Google Fonts, SIL Open Font License 1.1 */ +@font-face { + font-family: 'Press Start 2P'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) format('woff2'); +} + +/* Formula 1 Font — shared across all F1 visualizations */ +/* Prepended to each viz's visualization.css by build.sh / merge-viz.sh */ + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,d09GMgABAAAAAGIoABAAAAABHpAAAGHGAAEAQgAAAAAAAAAAAAAAAAAAAAAAAAAAG+4QHJB+BmAAix4IPAmXYhEICoLIYIKdWwE2AiQDkgwLiQoABCAFigEHp0QMgQ1bZANxJJp33woD1E5giapr+234JWybUvSgO1RUEl8aV8J003DP3Uo0EHiR7P///7ykImMmAdJ2GyBy9KiwMowwZVJUUSLhMKdbOrjSLTkowhzO7DXWQMmNmruKOVbhpoxdPxLNPIzg43lKW3oRiT9uCH7AInx56gsWSdabQ+xvu9iI/+TocOOGRBNZSWPqOs2XYX1zsNl6Q27WOfN7hs9C/MTxCWVLryeHOOngsPQ857fQ+gfGQHG8UCItkz21I3VXv6kFK8OLecpxvW/6DvQF51jqTTv/XLC4Yhf3tfazxNU5xgwllxi7PEwEXbK0J8+UPEH99fUnIqtuywO+ni9ZO2E1VP48v80/9z2qRUoFFAXEfgYqGIWK8Zkr94aNiw4DXbmIcpNlu2iX7aq+rAfIzWpjxVrQDiJIFRUQQSlKk64gRWUExtKwYMGCpSWaxJJTd2N2N9mSUs2Z/omptymf1jZrqpp0SXOzqatVl11g6xqBA24+Xj7+YCkIvD9YDJZz+8F72UzreU0hnaCgzhbMWd/b3+6eCvusAKCQ3Q88jsIIeGeiLulCMqmOwgY9Tq33pQattZndu1cTFlEPjVJoiRB5OGZIDzW6yMRgvnTiW3n8+fN4XC6Pj4/L5fDxcTgcDocfh59MAv/Pt2nnvm8QJ2ghVWo+ZqzGN2szcWoYZ8jeSqvzZbMCNtYD9AUQkAEAAn6p+dvV8YF92hi6gpahKXwkcYjiXA74c95SKxU9bQf0j2otUJQhqXniQ7bckU2SvbuQ77JElC/VlBS1u2pk4o9t9iFegRAIooGkIvq+rXVF5Lb304zD8//prO5LP0hCsowr0pNSArqzT82H8qFlJq16OK7NbnarEAms2bL3pg83FVh8FR5XzFqO2lSrmZxI1rjlPZaee2A8hIAOFzY3YczkC/lSEHIEWjgum+ZdinC/8njpmUqMuOsvp9dXW4s1aFgkslrZIfD//Nr/6t8sPP2NTsQlFGqcP+hw8MEuYmke7qWSIu09fBDzSKWRKz9SIvft979QsEYJpGidSGp//fpD3E6fmZ3dq7hlOqWIx0Ju9770iJ9Gqcy/Of2vnQtchRcdftiQ9LN/iq0k+20MRfOrPVtU3DADd+4MaBiQNATbgGQbSbYEyAEh2TMDyIBlPzm+ENKPAYRsC8l+tvyS1t4YY59CtWWIbbnnF3X5rbrp/gXPB4bdTrC/0HxgUZw0k2PSvtNP+i/607lZ36IdsO8ATpigGPS3pVuOuidqj3VtKLPADwtgCV6oiBWgEtiOByN8EO02KIskEO88zsLphEF4XJW+XK1Z/10sOZYwaHyKSlBJYDsLajbjPUDVwMF/EzPz/mxvp10TjBrcIYggjBFGFUYI7fEmVq3pvvdmWOb+oZSSCyGISBARkRJ6L5QTWa4IAij+p0k75xQ8ZK66CdhR3MWOEdKAAKFlxX7fmvP3v2y+P2j75tqzQuJI9IYo+XK/3/o/3Kg04K3sFRsDBWaIz/dJBNgqCgm74Y1zOwDvkfcb0g+8UQBTCi4XfexG8KLPWlBcp3lE5aB+oJ4KCDgSwdAUvG8eOAzMEAYMAftWWubrg7sqhZRzYO2Erf2+Sr3AEg1ttmax4vj9WX0KSUcBjjZJjWUJjzXqlKU6fXHlZlrzpRxMUXNTW9CBLuiyrummNnZ3D/Z4m3sN4oOOgUtGwZdWIEKUWHFMzBJZ2RUp098Aw4xUZ6EjKbBTa2Fkc2vArYlCOx3T7LPPprrL5P6os48muoTy0HDt034d0EEd0mEd1TEd1wmd1Cmd1hk165me64Ve6pVa9Vpv9Lbr3aBMlUu7tHvpnnQI7cyJ+trZlMOB2VllojpNjiNUJtUlCtmSFOgSJxE6I4G6NUKUfW0qkg1QDcbYFPfOWqOyyCRLomW3K7tG/3a5Vj1MZtrKIOtdJt2KnXIwMbRAPJJRELRFK5FXpOXYTRC9GaH4Yi+SkZRQaFdF16JDQXJ0oCxus4l2CjsGWCI706PTQoG0I/aPHArVSRSTs3AQ7ZsJ0i1M7fetkjTmzWhk5wVFipQhwq6aQ+2q2Cq4K2DBPtzuYbIJxL+xi2Mz/Ed4ltNekPsFv/Yu+f+jCKJ/AO7mwqBEqwVbypr/7jH2DuysfL5eutxcBXnKBa+CXRfSs9CJG+nMoJnVLdjsRNkEskGz3Bnsku//7WI4bmZQ1vf7UlPagRjxoMBIJ5W4acFvmjM+ovX+EMXNDm0Nf48sEyhHqkYj6hI3Ccay7kmgce9uE7gZcday+AgNSnE7ePWJfEKK152WuTRHC3NBQ3uMp+eIIXAEcv0f4CuU45nHhe9HGDqea5IfwIVGshMcbrQJDqxhwW1O5ADiMkpOBIF1NBlY/9yy7S1R7CJCIZziEAKX3T/hgDIBMHLWEZ/j+xMMaaCzF+2E8pwwPW1ALmJfu92aBciSeGg1GCWcK7RuhyCOdZk3EqRyj0NOyQQ+amXtdL0Tu6dz6Rh8kSOEljqbDRVs5687vclFQUOKU63U4dWGNU5VTwFQIeStxOdOEmeDbbXNcXuW/D1P1F6d2TVhYYhSNC88Df4b7qFH/lnvmGO1Xu4iYvL0hf6HkCgbESXfhuDJPOa8LEz7OuHPEZvagQNihhIiWXKUA30A4GBFchQx79zWcIH5GtjIowCBLeLjaSoDyW8r4kJmKt+ohRC/fNrt3lLqUAFd2RkdagTFLPRseqdDWqVgNFFSUKGeNkX3AhdENiH0wsBUgyfZCqW0vD53AOCMrbNWjI7qaFB0GzG3OyIPahk6l5odcHCbA0NdbbWEHUQmAJ3uqBnCJEAg194GOnxAVdIIzMx40I8HDxtghYbGMtBA2A0aMsz29TKo+7PBcXxbyxz37Ln3zwx/0z/IygUE7Jru0Buk78IDDQJdeO/+XqeY31foU5p/g5BqpCKI7n69BcVvrU2IaWmpPheHsU/Gwss7tYRNF90zeX+Py5p2CKE2QavXxzHCozPbGBgAprLb7SgIG5S0Ax0M01xSvbXSA1Gh8Tuqr9ixzVMFCWU07ch6ncBwTzkd0NhFu6A639dUwoO0/DBcQnqMHa+1Cr5pZKPc9ESVTNTNNs/XIwgmWzMEALGoiUA6ybTRXYH5aOo7FQWgL9e5qrjsIDdRc5xhj/ProeFsD5iseNVjUqTADjKfBlj1jbPrRHNb6hBqDNoX98GJEnXYHdscQCO1cz4TJW4LDdaIrhMbNYW1nZrgHuZDuS3U0NBXzF9nrFT9zKWnlmAOGadk3ikE3lxfUjIeWa5FEqOSkjtf5Mhfb9yX2jrQ70jOSVnhgknXu0kG4drYkr7QaN5fPe6P3jFDrjXpu5Vn7rFmAQGZcfzWG87PqBNRdGzyUvcegHaT0LU7CA3M/swj1DvMx2WpnTCBoDBBb7ffNxGMukIzP4v5eexXnIMVr7GqwJn0oEPfM6kxJgQiVPsXvTlUa58fwPjBnccwE/uIR4SUyDbKtevbiIro4ITT6FM1gm0wmdhFJ2b+c38PaRsVgcyodAvFibBeJQrRFCvgEomr3KrJcmLZ4Ey25aimEF56gYWKhv1tKBnre6oemBQ1LhM5auzvY6XXfodtwr8h4afzd5LlqfLIT2eCTvUmigqAPcOYK7+nMtFsJIzgM8sIRwW/a51wLImZivvqNHwidGISbDIaPFoWCladmXSpKVtXRaxKVcrTPbfX0x30nr2jfgboZPCjdTHSKKTJprCbZoZiNc1exqleuYVNlbZz6Wa3g/o4kgc76yEu/ryhbrltmIfeGuE9t2kduz3iw+w+FC0fQ9fGCUxtnSqjA3mMHd9b5sHlbTw8cLVHh/qlPDtyzPM/nPD6j3/27oa/+Pi323y+8y4/7v5fv+590J/Hn2+HbrT1xKgYD+n3WIfYXIPM007Gz84KePAcheJoVMegm4URHKbnlijFdhKIIiQSTYwTeDqRxMlkyIemUMjLqbyHpvOREhVq6/nZl8Z+tMborKF3gEDjDNYKsl6wA4VYL9QGYQ4S7hARDkWYKtJhokwT7QgxjmS0XqwF4iwVbxWTeczmSrBYoj0kWSW5SS9Fqnhp0hllXBzPYhPriwvl+E8Sm/bMOugoXiedmUWXcza7PRWZqdQmZSH7m4VkUknESZI44pSUs15/iwwIiTyly9nbqAgUKSZMys45SZ0Z6kMlWPiKOnOvKPscFCNb2EQTpdhXeyrKM29Fe++jBJ98leibNsnc6o7WPv7IkNIB0SC1M2JCelfEB59CHkt7MWnqMor0/fVwcABdfgl3SDOSsYCxTGnlL9StBaFbicPMJw+3QJsc0l5e+EXdIcJiBRGXMZaoFDKVVQ9IXC1jvSqTdnXFSztKq0coz5bRnXNLGUeP0V9wLd+LyqAsyfhfmgm4rKLVl3Ttfhd47c0MN8gE35ix3FYJ0p3C693o2aENousBmQ/2kWU9/pTEJ59hffZ5aW++R/nhJ3RffSHjyzbSRF9qNfiXhjk0oGyMB7pufTwvhnpXJbjqalgaU50g/Q4WPgjBwpYYFZ2SMdsTMyQgac4cIkt5BEe5KPBKFlKCr19CwYmEgnfQUzDVCjOiFYoZYTC1GUxVIoKGD36wCIeNB0zSMBGPjlSYBKMlBRkqZEkue45AgAcXWeIqxBnIyAAIApCTnOS64Uw9nKlXZAI8mBhSiIFEkDaTv6FYbbg5RkSCWiNMp8iTXLUiA+ChIUnCM/cS2+cwjkKPNDqqGQdO1TvnAolLFlKQdOg7HBR4TW3xIxjwwaHgvZEegQpDrdCDmfDtxExszIRJiGUtVIkoaHrEBxZsPDZyMm0Zz8zIKDKz4qVNlFgkrZ2yMqzCUCUCMeu5otKgZ12yQCVRm8FUJekbhVn+rcbAq8XUa1GzTgVpE2yjKJtVfBYiNsamSSVuuTon+3KAIgdzhJdCUcoydzNpLqQFA0EnZj6mDbMIw5cCynQ70xO1ksogANslqr5CvzwCtrJx/y3cAEO/LX9Kw8DCwSPY3ozgar47ExsXn5DofmV9hkC/a58H9B020xMGh0cYN5IwZWSkqpFR6odHaxj3pAGDYck0T3z00L6w6gygQD5vxuDfg5KgQoMOA+a3YRHw08e51ZjV6VXrmke1rCvWv673L8QyYtmyiUVPhyq+HMYPL9NTk9rUZV4WZUmWZmXWZEM2Z2saITxc8iBxJzUNHT2DYGEi/rpuOd5kM5Ie+97Emx+9cDHM8NRnVmbD0pD5MJM/E8+yLM8KmJFfHcu2bIdnR3amicjVffjyEyhUpGh6uXfV6uRk/GLPljTHXVnDm9+unhuyUTg6+j+5CKKGgG0QKlXE8YwkUp56DnOd5EcaWeTwwuUObrUtuJYaEIOORMKEo6hwalq8osE62SPWyEmyeBllVmVU2ZJRl/IE4Fs+JuJXoiZaCO65K+Wd5i0Mdo+BYHMYvDmU4Go7BIAYTyRIkZ3oDUGCGw8YlRDR1rQqW9JH8TFBhWWJvjaLbFSjG1NjYxvX+M1SFUyObYc5S+kMnBRCEZrM8CNgX01tFgHboXo429AP7DAwvjOHphyVsjDuL4wo4mGqPRKG90y1z34HHNxrzbo+wthqDZ9KIfbeBx/f+fshdGMYHN9im2eOfJhjds9xy/ZzUcN4sJPTcHCI6FI534cI+wKnV3EB2vfd0yefffFVns6d+RLffPe/Nt4tKDhrFLgtp2LJprnoJgGoikb+uSQwME++ugwsIhLetmu0w05NXHbZbY+9LnYyIXF2iOyCVaYYwIFvEeRTgUQcBn/ld8GJsDNt/5WPnH70sf/7x9PPQBCFOT1xBiQGBY+Mn2AIxVyYqq9gjrMGzHbywCynhfHC9QdU29PvdDnXzH7/gw8/Onvu/Mef7OYLUFN//S0xMB2h8hGo6xMiC5anwMqsN996+5/v/OvMu4pg8FjFwYkV5MF2jV933u+v/fvNXG1QINgEERmmiYbX/DGwNrj95CkI0zrzfegEMoiwNKkiH6HxhOB/pVwe3+j7R5bo/YAKFSlWolSZchUqtevYtXPP7lWq1ahlVqdeg0YWTZq1aGXVJtNGCAK8kW5ZvJrqZYhW3iYHn+vXUPW8VDVu5hyNY3XW5lVa8zpv8jbv6lFxPSGLlNWkJWPF9iYagA0PX5512VhJpZVVXd/6VQODCRUGUj+/GPZVCSXO1EzLjMzMpriyK7uzJ/uyPwck1qD+Dai2OihkM8ayyVOYGVB1i0rzWIipeXNv7FSlOs4czbEcz4mVXMjghz1JQNhWMdGbElfGKCz2A9U+cU7Q55KgR1Xu0dcZezz1qCitaiFwi88/w9wb5KGg8qdf+3q5wW3y8iCZ+vQfhAWTmofbYWAAetfagI2fVcfr1KMgwPgw5vpHoYwq4J6SUZ0RJu7+o5dUapRxNnM5FDryiiYRyUpu2jJUr3bpmY75XpSL2j8qJCoiChYVGxUflRK1I2o6OjAaFp0d/Z/otTBfxAbEFGI/4gjiOOLyh1NoJGwIFy9FV2VGW2mb3Y6EhZTRJibW6HYGstWne/tl920ctnHUxga4Gpz9ousTnKlNYI5vR6/IJ59ZcP5jz7vvwd/OgrvNfz/24a1c4oOfAfztBQ8kD4If5OGcPv6vX3fXd1/dfXr30d3zzLc6oDPYC3s+8HL11mh0OPmpTnOG/+tAU9D9gB4CekzVzefTp89+L5gWmTr7VHiJxqjTSaVuepsslUUKu3Rpqs2YEHw0abDuivRQpcwKPRXrZaYsw41Qa6QSA63TTw5Sf+s5TZXvPysN4rBFnlxd9Ua16WTtitiIg7iIh/hIQMyLNx9KgQyCBFOIlSBRkmSs+nJkU1DKoZPVsGN8JNnnqGOOO+GyK6665oiHnnnuhZdeme6tH3765XcHcHdEwnb3bU+/9g5o/8AODOrg4A6FdnhkJ0d1anSnwzoTXnNE58Z2PrILUV2M63p8LQndGN/NxC5NmIX8fzaxO5O6m9S95O6n9CC1R1N6nNaT9J5m92x6z2f0IrdXeS3kZyvo9czeFPa2uPclLZb1obx/qvpW3b81Ld19h+5hGbKzQ0XsUQknVErPGZWDoAouKLd3pf1tg8022mqtTfrmMJCRU8iSTalCJaMWzZziBuTaIFmUnEsSj0pxi58rE7MEiZIs+yQo/qE5H3Wp7JFTzjgP7tiBhm+45c6G+WOEZy++3fAVr0WYPXCCNOMFdXXPwMav/Gr+yEvzjTS0M8fRnoGdcDnxXcqNuBPfilUyJTkabbdDk51c9jnmqKDYlW8YVj/0fPULr8I//ZBSUh9O8b/mQBUGqdd/0QFWWgeyOxnAi+TP8DS/glvIBb7kLassd8N311WGt4e5KFkSZFh4THhgi04HWaNS4EkKdZEjj+KYUpxsbNyRT9hIGS/9yIHaSYJcSzVTs12yylrrpcC2fL3LrVbLeB7hLdnm2sB/khaCyfFxsm9byn6Uflbwxmep410zuqjVt9iLd7tbNC7t717YeMWoz6Znl3ZTV2l3bWzA/fZtBoaKB2xltEPnPbgDZcMMoUoMEKTiNCCgY/G/iadP82erFrU4WpCK5JGatz8nb95Nt+J0M9NJxio7MdqPjC5ZVTE+HvNZIlKGaLkBWkrCP5MhOb9vwnJOJSKn2LJl7xgIg56StRwHPWcDp+kk54CEdCxD0/FY6NxMhESSxDrkZiQCGsykTB3XKKOY2FjFFY7XuUgsjjDznH5qcvofvbaa+QouYyuVTTdu52TZZ7HaSWzZVUsser6ADoy8O0O0EjMcX4xEE8jGES1PkTcShAWMUDknWHn03yvvSp3gpyXz9TKQ05kwG/tQi3jHt/sRzLCDYtGwGN2AwrVoMX0i24S0VQDR9hzloytWLTQOUxuH7GdiTarxyRSziFbLMhVsuDLxue/Jjr5YZz7f8QE7qqht8YdxCDgAQ8LGN0nRbkhiZkWBc2DPDjghXM2R0n+t8lHkNxgji6ZX4ZBoARfe7qbqnyFfw/61nwE33m6ltzsxmvMTp/clPahwqj3v1IsjOTJ5BoVqrMMKrFLI1FSH8GaqDZfCNU62xXnuYt5gDhUnwvK6qsdyLdjKdLZi2HRTMZ23QAVnbUAIi5kidvo+4MVaJbZ2E5NELegl0gmMqILkP1eTdTiwEaf363Wrys9ddzUHfKjw3g34UbkVAg4hBB1SCDk0IezQhYjDIEQdRiHmMAlxh3ljGdbmBilaN8PUwkfvuH6gwml97Pp1rrZ+2vV/l05gjR1eN5AECZDCMgJLg2EZMCwLhuXAsDwYVgDDimBYCUyyBnXyfVSoZxSuQr183tsxIcEXYfobpgHqTt0CTUgrOTBh40NLhsUjZae4v2XXejKlaVWv+hfpKoZ3V9E2SoG5ZAe6t9W3o4s1Uki4acQl46kEAr/x4TfO8Mwe1k7VfyfQgzqttvqbCdT4MNBHe7ELDPDiCI9kFxmiikrgulqtIHsgtr2e/rZjNkalh8MyMyJx/naV/nN3AiOAAJqGfRJ+XSrvnkxfFqmb9JSNebra0ZDQJCosKF43k1htpV+6P5NyvUQ6E8kxmjBRU1bxbbRlwdkHR4qg3yvqCJZjQ3I85sWVowvlcuuyVc8dTUJLtrQfM+3xJaobUsBRi1zZgBmTlW0cXcfAVgJpw7XhWgK0VjZvjqZiEjkwqb9XiqEnyLLuYWAaF8ckke1dgnPClpJnLFJ6sTVzuUytOvMuIk1kmSEB61tLSlW8zuLUSgXBKzoFmRcLzBf30S5yKfK2+5PsOLSAqTXYuZbbSV1ua6PquxtYPuqyWWVFWBj90OuGkXNM22gY+5Qr9hRkaIHxNGhsaXhAgUsyLPaslKlT20Mor3ftzaaaGvnoh/8nVsDDa8epRevs+mF2dcjn7clbmpBUd2yHvN1EFTz7BTuKPzADM0fwA3K2pWeB3Sk733tNBX1n6YfnfsNwg4M3AgtTq+VkwPZ0HDa+ONl5t6NmBoYZ/G3HQZyYDzqF4CyBhc4J4sJElxBcJfBS1wRxY6JbCO4S6HVPEA8meoTgKYGlngnixUSvELwlEPVOEB8m+oRcXw2T//H4/meyuC+zVNwYLmmlVY2J0p2WOMogLr8XrqB+o7LTh+kPcZUVrqZATU8dtX+IzVa4juJRj93j4oB96PphY3ZDCnfbx8gs7ycf5RMCCJqyy+vRGy6pWbN66a/mseDQmwMcc3mw+7YAW98JrnoXIO08Q7J3rTbmAIcweKI3zkoHQd5K/GGGPZ1G4IIhna+75YpbqMuDpjrleGvQCqQcncgdoKJcZtSNCu/Cxd9PIQuQNLDH5sxLuiZYSuSG+UzV2sT+yuxjevWip4gLo9ohHtyqgHeM9xEAtXXrFdxAhi/VtxoRD8PEHnKJwGqEkuCk1RCrtKN1k1rOnpZhsiS5poc2dqVZiKFcOyN6ZkukmYqPLZ7qph+inU61p+XW7pvuzHSw6igR2O1xrVTXsB8u3jm2Bv/hWbL4aYRvFuvFkzY4iXM+LDKO73e0srMwX238XU8FKyVonqaVjjNRYvAnhdwVAVyAFHi5NZQTZBT6wEvDuaeWwaf/C8BU3RB8A6qbYaFiNEYGNaUnWaHkVtox2zVxlinJk/crCXr4qtauxJEqJ6sR1K0tMllVie93MIPrhmlf1wQfMT2acsG2iH/knGqV+91v/spaxVCm37albJj/be5iBTnbM519WCuUcO2hs0NpCw9CBaJkZCsG1TJnLK8yRAmglAIN0L73q9toHHgHK/y+GxwV9Z/g4ytQH1fOahZgMNJISodoEzBT4Vs4s2SbcMnkZAaET5ZmUSM2n0RMFMY3d7it1kKOiWPUPi8E8zu6XqHCuVT67pUIRTiBbxK+ZbHBwGsk8JFS+0s5B9WJKNVAxxHLnSKRCFBsC6C3qjsUKat/U041t07sMB846f+wjVig09PxkPYXiOB65p8573IZjKrrqZsgimxb86tpYdIRsDHbkURNh+Vi10ukqFidVS0TYlava8U8iVpnSkoiWN1I+eA8vRZd3OALVsiYg87hD1NhnS2ndMHbnxZrsI9KFPtvtRbNFyHvvsP4LM05VUIvcFGXk6U1CUpJaNP7tLKMWFRYVVqVpWxfFqhYraKrNzZZEvzkQ1bcmFnWfpa6cpv6gfJfF1SzIiVmCInzMdRR5F+A8WfP7z7zlZzgGMKahv9xmEckdvyAWjjrJuDAZFiPQSOgWLNfkbtq270j80NKiP+VCSbkmyQAtNwNaEWyN+eqvEYzgIm6l0MYPqPy9/V0dFHz7GHn5mNWlzlzd5Eh93NFPRXUS/erFkGlfN14OBh57VZcRVlRD6FVX+rEiE17pI5l9PM0cnWWor7fA4aOSXCcKEjLZ88TxKenGtOqjRQfuKHgJjuqQAVTZcIx/4UhTh0FYDdopKjVOjMfTsRQV2heUFQZgg+PTdfryrt7UjrpapnLsOkaK32ta2ppdBaiRcilSTtvoXtHn3PP12RH/PF2ORQf9ZgFhs85P84BcqC35Cu7q1Exc+Z84jnRHC3tPBCNxer2HuBzKkNzSZGyC50oG3bFeb6i+PcyT4AMSEj4qNicktIIBoOgWjklanTZAlSaEuOBCeLKxjrIjLdACRRZQkuQNzZJB6xceYPHqHET+RSLOLU039zjRBMpTr01Q9mctlQClca6QGZTHaUIUTpOfk9Q11BveMUMSpnawehcBu3+igvDBUynbAUAYEBWDkj7fQoJv5CIj+lWtqJZ2GlQ4W1fSPgc/RST/gVBjOzCOPMdKgvducrmJdqCERiA4dCYR4Z5MO7cRyLQTD6c7ydy9MZbj7wUg2zld8YEioawUoslbkdPM2W90uOcNmsHtbXkj8nlhoE1udO9iJp3UqjtXTk9Uw+iSve734VcGTGrPOjctQ2J0uDGtYtt+Sa+SbwnP0zcyegK48RiYCUKnuLADY2cNVAlURIiRRlUw4UH5MyAX6vFewqP2euIQLx+5wkSB5qE4WFgpLGr4RTSKe+9UvraJaL2oXTJ3X1jZlcp4/g7WgPjGvctxbqqG8Ior+b7qSDpStSuYgcGyz35fEKEEx4/QdBPV/ggFqCPILAnbzBJ7ywDtc12R4Xjt2hgiCw3n4SqYY93stgbkVWK2k1kF5uTisijX9kZdRujdCRtLAwSept9g6fD6fGmdmyb5ehJW7dOdUcy5ABW0pkK3TsjHtXondjdZn32xF3kWsLTEmUZ2IxSDYFD9vEGSSvD58sZl6PFU+hE1KiULhS18IXC/wpK18v+t12M5pLZlaevRmi/KZLcIxJHXO8rRMYUXaaBVKTsGbSQRXdBwlQstbsPrBwYEVpFEY4ID8R+W1rc8snjAVlIaYYC8tE1tO3x2YWlFqvcjE57ixS8xBpxH+wKB3+1UvSby2Gv5VSyiO6uHahIZHc/q9nu2Q2o9i4FrdrYT4nxClVPwSV/DQkJXzfog/eRDFGQcuZdlEroWAvDTM9x7uAvzLZLspY107cCMfnM74Uekso9e6LEWyPhkZXuwZrHeOI2Ti7MJMaBNYiAxu9u0mbS20dczB3TVKTG178xi+2YqThvdCNnuyLngtZjUSFDdU7tAkomXXlW7zR69X9hznk2/0nKZ3ZCaTr3ESjVDAff3q8P/270KXuWBIROTjZEY6DVil4ZQww9jG8EC5pd5Ov1XNrNP5sWQk58tjfA9yLH+VvD191jxFkRf+Z5gY++fnYVUplW7svNFdPcldJlZ4HlNlPJLJHCdhfxxf2tWhZC+ortq9GH8jZGz9h6lLLOhnI1StvanvQt8NBc65nbuoZbNmslLWpx3Q6Q2ZrPrHSKbSRCkAOPr1/7VzhWh/JSs7TE9Dvfcbta0mMx0Fq6KsOzPmo3RGnVdKT0QnPQGYhs/qBpDDOjvN2u7DLT0jLQ62QAwujYMtN/oiDhrKUiH+7GkTNHxN9U2IV5LfeGcoeFad5R4HmXoqDV2DheoczY2kqveis7lMVtITFiaNUkKMROlW/bqecp59vVvfjQuaG0tfy3cJcbLkeDijck9WvDlgH9dztdyIEHwAxQjEqVZK7OhwtyBzTpbs0Z1XwuJT3MjXlQR5s28OAKUySain2s5wQsUvUN/Y4dzcBA7VswJxNlPC2GFDt1NCiGNJciQcey3GInHsjWj1Yfy71nWuYm5EDojJXcQkGmBoOdRSmS1Q/L5WsCmu4nVY2OT3MJqxxGZCM8odtW+VOeyEYKTYz6j4I1F9iPLKfmMgoh76lN7r+dLsZ8fTK0jQB1rt4YrkYUt78GZbO+rFok2PbMJfE/6UT542AYmODlXZZihcEdFNHWESLlxoj46TyHdTFN+lsyXbUkraBYNU4S1S0pW2tqhYiUjAiE7ax5bRSq6oKIEUej2YA/uF8ftRlnhcCTaQBXUI6FEHygfAWw8LGl+3Ydaz3cH5iyd/cRAwcdmxhM2EUBopuVRermSwnCVyx9spgTDq2lKlYKCXDVpWI+VNDKXbQfZoL2hLKd3VMVXHv+UpEZUcCkNwKNY6I6pPFlTiFFUFL4JtLQikeCG/q0/IryFC4KqsbKQvJdrj/35mPPe2xIRrj9YSzcrASodg/8MsD5jPNTRLgFN4VWDaCVB9C31fmwXIVCpikesSJogCAEy/itA1oXRxbLAEcRfIBf2Mvt0fDz4RPVW/m5+4AScXMg/nanJwlO+ZHy2NzK+4YzDf+gEUmWhv4MNcO/b9ygXBCY1j5uv9ge+q1sxZ+w2WVZ1wJMQqc/ctS7IXc0V6wFcZzk9m/h69DpjFWus6HyhefCHUeo/9oSlYL78J9wIKo4jerRs6H80d5L3K0covISJO+4qe85yq9Egtzum4J6mXX++uzT/32jQqCZr5M/Xw5t6SuZANZXeGmhGOQZtR02Qc+ksr9gxGhEM18p0DQqoT97hwUeS0RfBiBYFIBnT19v6bEC2Gsa9vEjGwr77s7rbmlS/BrV53uDtq29NqeAIyByM21fj7YCjNrq+garC8/9/N6vIXIlRmYzjT+ytPVas6xV0+Ly8fai2xJGhqxKHq+ewPsozaDL2uU1pPYAxDxotRqssY8ZAqD6FmzSBHd4NH5rcPQ9baXjn0R6JlWMAyLSikME1DgNo7RnoLeH0t1Z3/BhlULETFc7FsLTtfHVn/SAXqOTqcdV62O+xgrmgAeflLVjvkCMiELwvW1pa29KahoXYOGEV7XpD2Mu6i5Kvgjlws9Ugy9mvraosrTTtJo2Q3q1iDyz1VRhcpoLVJvU8Kths8ppk0ShEqqpADesPxKu/FdikAnDl5y83BMQGx6/6uTNEjyM+S+xy4LJZvKTqfdXF9doVpvWJN8hHVs0LcK+IWzqrJpi7XWjN+YZrP0DvcJVXQNt4K7+VcLea+3aShldIC8RMQWyDhn9ohI5E2QszZhN2tjeNO7BGmFV/+3hCUvtqmRLRJ+qsT0c3eX9EDWam3+BSX/Orc1X7wL2ELrwW0zQWtuaiGwfnYibWak14QF2IikkTAYdDs/zLeILJTW6zmiAxtgfGXE/0tMNgPXl9Q+AB6rYrzGLgQmFLlshJzSrjP8Wc6rOz1FKnJ17UP5/rn7ezUmFw0T9/ZRN+wQS782orEEtEEhPaNOLyt5v0yU4KmoqfzV6pbNrDXR/3UwlkwnK473fqhueB7dAnEcHq1tnfuosf9gU0LTz4cAi7nPc9J13j74H3u15g/yfMB3F/578vaPj/Ng9x5q+AyUuSJEP5PXH3z8c7+gdgfrzXhs26/d0JgUN85vkL4JlENezHg1AfboUmxy5zSH5ZWGTs+stt+8jbyrP/Z7fU1tC2uvJGSnUZFZq+MDJmr7UzD66/q6LyznZjoXeIZEJHk8QMf15gTQlEWFaI1qda2syOs86snUEAqYUxwl+CM1AYwgoWMZ5IyhUW3ESZYxFqBPWAhKlFafmgsoSpaFwvDC+RkoQOxe27Ns4Zhmb2rhbajMY38S+LTHlFE4WVihxWpsGfDLzZApP/QQnQxj3dAFsSPxV/7Uw21hoKhfjWc1fwaoLPLgmk9joq5ApmnFSJcIiLM9tD6XWZqbN0Mw9JnMmEwnajqZQSvkTIVPCWzA/buwdWRPJXR6DTJw7tuC6mm9Sto2+d790g0hm4Vg/4geOgpG42no3Fo1NZdBlM012WBPEpQjbYj/DktHS6Gw3VnV9c3FzxDqIywFG07LXKRlpTErmHxaH+HUukAMRpc0WrYHJUGcmpdNQDIdaHxfOFe8KcymbLWVR2NQHXPf119y9TviUWBLe0qyxFqmiFZ8D5ljxUgXCkmkRFpOajyKstUZC7NdU8xpQZSzqKs4xgpOFOYbiriKVoTD/eTg2FSsT4g2+ZDc/s62NfPzBKMRjZY1l8eTfxOEOPuLf4D5jtf0ROn+eLH0dOwe86lfN79P9o9kyP4hgvt7MlDpBd7KQ5EgygpUyYLaNUnQ+HExsJjW0dkBqpSIOJE4n6kPKNApFW0mXDizn62FITLrvNMkQWpaXnd9a3VEM1rJPYfH4SNoAFjwPYgeia9zX9NZ3OJo9uNx04V4eP53rYXbsWF4/kbZ+4bZRfuGM+440PASbFzpJyWwq7bLHm1W0iYXtlak/uriMZNS+ek2SpDFJWfeqn8UPuEJqUrdXNu6uj6By6Gyq4HzVWzvVqHl3PlbASk3JiPx/IZaLfsGIgAASZJ/fcocaz5bBI770DwlE8GHfPodaz+ZBlNid/aj/oV4D1TzRd7EeeqBGzikzeRQ8Q7gjx1Ea6Ov3S8gUOJUn4zHwD+xNPgUUH79Ovz8in6VYrkALt0TwJGilO+kfGXHgnKP3Q69d4PF0GovtdBZEbjCCpS0MOpCBRG6uL44MpeB/Bn8t1uXxBULRJHHzG3EYFrFtKujWOlAno71X19XmSLNLVvC7hWAFVxBHisvgX4H6p7GuEdb/J/1HbKh+pR0KLYzHOZsYPHFFQ1HDqHlUVahu9p70cg9dBxdYyl3c7uXvPF5dl1OXYBpUdqSAORnTWA76WEbOiAC8dS7pj/1sB2kXzNbhFWtHeta3mB8IM2kMhW4HALH8IpaPvpwB0+izWQWhPU1KtQ7iesfjPviWuZEYzA+DCkkEKIeJrQzIgmfV+TKxUA4hlE6SsXwFvmxRMlLbpv9J+FOclzaGxhbzfVh+SVL6Y29iOpZdzI6/fIgI4nNuKfc50T8MyyNllWr/xgYEnkLdIwLaDBIm3j2mdHq0sVQqWMZ+Pdeq5UDRnWcf6UN8zdVm39CaZbdJmX8xDp/Icy8TnmRqX4u8tWIeARA2IxC/gK/ACM5CmzsCdDsTMRAnVWtunV4EkrHUMmpZUwWOZzNldAZHrHYAn64ZbRhrSCafkZpBsHDliYrcQzNEQUyMm6yAP5k5rhaLHm9bWQ1pykNz5DIRUlwyZ79KjBQtYKDBOmCo6GEYDT4cjbp/LcMh7FXcrO3OxU4coQaxBJ+Sc53CXvB9yNixn1+PDji707mzBGvpKxEY9KfKp/eevyFoxeUCynhmAL1SyngZFoVhYhiDmWvdD3q58s64Snx9Pbn/FmO74dkbApObZHDsuMgPirpJf8abC5X2w5sdc+Sm4HxcmPNugsgg0E+F/7a55Wj90bqW/T4PZXu7CLKduk+PmOHlzgW5umBy784z+TUubFAQhxoXTPQY436KiYJIzRRjI6GLgSsWexAyaxihMaRBMpY8SNpgaIVDwZAujtTc/GwpFkAiZvHJuDkEEsBK8xU0f8euTeJeMIdLxs+eKTuXptn6wx2g/K9yIN1/6+493aGthzs0kBK3KfxMNsMmIyNKIiInYZszfhfYlkiSXID7Y8aVuiZ1t+diYxSmblFXtomNOX4eC5Nt6np6scSb4NRe097T4OlbpltI4h5w6ujUhB0N0H4Tifzfe0r3G1o2fE2dGysGi0r/V2YsKt5XYiws+18pWFhChFFd4xJS3OI2aqazCrUanrp6sqbXHsOT5eautoY2YuVa035Pk3ulSCCUDEvoE/XCt2j5I3Vu++XzkXFhuX5OHnlhJct4aYfxb4js2H1Jy6a+c3bIcAjdzpwIgxujn7HvQVDOtCyn8I1GNTSoxLiR/23lmAW5x34WbYaFDzBDtzsqllNf5VO/UIteQSpCpDX6TgFQSbVEhwlcbqOyvIBsIR7F6endhXpRu78AMDIOxgu4BXt7t+3qYY4w0wmRkergW8hzTXw6YyMKGf7ofOH9HvPB8v5U8fLX13gPXA7qN/z00y8rfrxv7VSXy1T6qvrQdis/HzSWXITsRuymXiTlky6TL+Pzd5CvliZftfaOjj2wOyZ0U4lnSgdfRcYO6jZhd/y9an6Nr7IQF8FSbilY41cxYf0PF1TmqNiu6ZvA7dzt4BYXvoqn0YLC8Ylu3+r0dCNo701vBH731Z5AUN750Tf36pGaBQ4mbj8Nf9QOz+56f4N9hx1l6cfG476DyIkbB8cPAAcmgk3jywd/irFHzAQzAhx5NMJcmQiLJLsVp74Ozj5bbYNuADc84nSkVB3oxfUCLy3ruCO6T345musFmAGG5+MR2YlS9mrazOUxYl03WzgYbjVbR+zdv798aOTo15AUve69afjjXKQZ2mpTZ2lxZU3RuGm8qGFeKBkZR+Wos9K5jLwsDpVTf84Y3HR1lgur5mRmbeEaXNTtKCL8QBQOdghOjLoDf0N22Qr7z2zvkRO2tEDoemeO7UCGrBsjX5m+HfFAtPT3be/514qJzMr6zOh8ES016JoQH7tYIYC8G+qh2oRenshNJGqJqVDcP0CsDXntDgn2WISPotrH3w5Pr+dxXAf+jOKBU/uplAXWYwXtCsIJKIgSMxOPbQQEqkfHauDxV0rpjiuuc5ETdw2ibnbxImaAO3eCfjIkha78PcS1JIfAoZ1rbZB0mpZKdMrgDC1tyWano3ZWMlymwXEQcq83mMQtB23szGqU4MIctOyhIw/dh45W5/TIWolKhRIE3gT0PoAuN5iLQkH5uQWAT4HhJj/w4p57zgN6XyA/D8pnJcHcXF2+r65gXhCILAgNAAtCQvVgQGgIQlFT3zrVCoSUyEugi7m0FKqUS0+gSQXUFJpYoDMiQoaD0RHxIYgwYgQ6eAR9uND8/mxhrKim5PXwo1MMjdlgJJbv0kTSVGoFrhQXfjfIY8rESzfLeO+BJ5NnLhfGn7ZCrEMTmCyMBDsW3cpe+M1UlauOj4vjMn147ilyZlxNg6T2HPgEr4oVIldinoA3iLQ4Ampt/HVsKA1u8qzvKEvdtwX0zuOM2i/2JcNgufV270dzM+AL5hK5dBhiP7wOBhtvcLarl8tIf303Dl5q3xLwdwulctmws92wcRisrhFiXy+XlqQudXwlmZ2bL31G9kguKma7k5+WzjvROuZm50ufkq+/psVFHkzys9L52TknWv/83OzsxpyWXqbyKEglc7NO33utVMp2gta0tFgCrQ0tNdCahlZroKWltcLISWJyCGxKrZTIa2cTOFKevrdgQ4FHSU2yIZafgQaSk9EFfI4Bud2zR8D5IHpPQJBhiHVK7X6qsU7KQ3bH7Y8vrfn4wI3Gcz4y3EY5uzUWrTeID5dFxa3ntPtYMHbLem4Fr6K4Yt3kTSh037FbD/LXsW0fFHpz8qxZzKvgVhRHo5xVj4E8L2hEtt3aQy6QxR5ylYhEj4d9OeL7vRoC2fyxErIGn6O/tcdUZpouXX2jIRq2vpG8ieI8SxOjAouCuMGcIJQIj1lPNCYOYQRLn4N1BAQSQUBuX/2Iv0+Sl9wr3Qdk5EehSetNBlNUdQn/VUb25X368bKr6x9vHYdFcVH5IVdwPxxeWlxA86CR6wgRXwWlcR/WGmNzDNqidEEyV87COTZVASSOKEr+tiyKl9Zd29RguBKeyWSkpQF/fOxi5At8DGjq3v2jLQo+NX9X6Ok94SEhxaPmHsrGBFMCi8Lq/fkRr8+Pu4X4hxMm5B5QR9zXtqtRclQOlGJbkDL2yNqVK35ndAwqTZi6upzqWFdHjvQuIGHppciMy+g07EV5PlOOk2my3r9GAtxxI2UjDvYaSyLVJjVUVgf6iG3VwjGYsn+EmYmNJgzodYvFhI0CtQYkWp4SGeMrC5mESUlmngjNowFb88ZLfR/xtFTWifC8FNBrqUSZ70Nu6MvQiiqK8UkfFPDK7w6r0FPBf5ZDyZjt3ivitgJ51IIhMGpXvmcYRb9Rn3y/jb2U3pasB9SnacZ6YDErZjY7FnL3Fnh5gJClQGn2lRhob+59B/5+gdT46HTfOjHbEirpmSni5UBXWnGoIDlOy3AZ1dHSs657ZX2D66rfRWQ2p3SfOf1zPINhwVCUFJPZNPOI3mUMNjO6Z8YyQ9srBV/6PxVZNSZe61xCVuZLrDHn2Pcp4w+OgtjcRlVj5U8w2z/eKdl1agpz80SfI6QqLDTX+kppbsF2fMuLssArPyNmEVQdCwgVKbA6LhTyBBmFwar3oFBBhdXxmtfEbNu04Vrejtjr4HQDInKqmO0bf72Sf3FJTN5oX26LBa/NXJvCUx8GeRoizf0d+0mHYmMQFU/64ywTZ5ty2xvMg71534VDuLAw4qYxtWKHZ5ltQ4t4DSMjN0ciQ+4Wb0nJjLGIFU347AiFBS9WxGzl0a+JSgtOEZHdhBMDbROj1oBZRj3dIMcY1pEbDHR91hoZGLD2BfhV+FwRp4GudQWhL7sCXM1dDQ48KwL0qsLfIK79HtzkBdXzCESQv8QX7hfw2DvHBeGa++THf8tfDqB39/gXHpZdBC+2XGQR27SXkmWx6KkKd41JpbNkWS8RfgdxHaoIZBTv7RNEISM0jm/YkEaGyGc2fuRmLC04o+vCAIHFx7ko1CLFhuNVC8DzeWU2Ezd/sm/83UghBir+QieA9V+GIm39JuD/Xq5S1xsEECs0TF94DJB8wxPADKiMhKBE3iBKXE0Qq7DxKia4/NyI8x/HgAlGESIwsBjBmADGKmWftEreLqtMY/0SxQOYr/GfVKIzjqdMPyXBeCsFvsgSADR/RLKMXLSsRAlstJnP1RWfDYmyvmV0JVB/xqE7v/7mrjtntm0ESpRoWQw7l2F9+3wZFXMQFXcGKM/SMpQFXArP4TK4s6So7HyE7qYYQl1CoPwxQ0bQCx/+fOPgxq2aYPO+WeZ2hdlgxixUBZX++Y2g4s6PGEE61zV0UDjk5+JwieR8PgRNPygFJYin2EbsS/Du07vgy/edJe61bqIGQQzO1kEDU/qFX0u3wbNCojavAbtzb0hS6fvlK3KKGRmFVuvgf/nwBqG8GausBCvL54wG15nxYjqCjVFWQNDDz2PuxUSff8s6aRbMoilh3+MVLwp3RyscxztXt82aF4VpmeIIqGOpWzym8YMXKyOdyeNkc/XmkoB5T6/XWMvnKYogLW16p95fO9jXXp7PA0rMei4nm8fMSPdiNX7AhLe7lo+rPIlNuWFOnV8S6xbP5p6a/okBL3U/zqOKOWC2PecY4csMVCa7Dg5KQTEuDSC0tvuFysrSIDNcJd2EbCBaW5JDBC5w++BOjf2g6+L1+n/AzN84qnTuDk0c12QHmcyA+HwjVYw16oyhRW25g3EZkh8ozKX5IH0C3ccOIkeSA9hx8+aGUACqQp9vqAf5J+9DWobke64Ejzz8osdB65J1v6A1y3lKDShJzUS83tf5bYoYZKcKY+9HgtiXZeV+ChMU86scuNxwUSR9EpffWnf8XlrZuFhUVORvbF+UAtQ/6z0IOdK7hVYO/LquUQnWXbULAx90IhpsE00Y+YU2EEoZvBMcFS2ctXXtMbQvHI+Z0JZoA8V29wq0h8BTyNI0rzy4CeGVD2eWIE+Bh7QluYFC3PzLRjsNnom1wJjeEoQJ7i3GN8WeAWmxoNzQ3wdHeem7UqsRmXqiHJkAbvMwjNzsGe3HO3EZIvMsHWqgc4yxgugEcBWzORXlWlM5aH5m9kxtZkL7zK/MNYNrMFqK3eJmISjZREjWzW1Ng9yl8wyAcMg8tBWZyZkF4hgwdArrXHEUjFOxns2JHNZF1tsFIBCBy2WlMWnUnPOiVZlcsFP37Ica6Dja1V9uoxbIaw6iQztw3ruDo32OVidg09L4MOgC1cCFFT7WLwwWZBOkMHuvjrXg/LeCVfU+qbNyFgHLZTxPoBeGr2jFyehuDs63HkPxYaQ7ofP/Zk7qheTNyG9A7c21hHAh1M/c5RGQaRv900lA79luEI5Evgvp8c1EtVzsWDxabz7L3N0ykyfM42V9ahd2acuiTcKVYtKsx7+L9PqvNM5/1kxfEwHsn7z/dY57erQbXzPvVGOOrsEN2LMzC9h+XBvoWaOfL4HgYXx1QtiN9qKOaxAiO4CwgXw/ip8iPaWZqLZduU+ZIifJN6cB4hv4LbEcK4g6/jB7CuF4NP9rruM/QYLmXFiQIjsbYbE+Id0LxaebiepEe7h4n8fGgrosd979kL2uPZw9Id0ue4nWu1wW6huxPvYB2sSI24EdBTV1Ihq+ozK5fqT/HyTfOnyIea3dy0yqinmJ5O0Assptj8F0DGhgaLvoqXykXqLcpeXwjepbEiSyAptGYBOgMtZOWuJMx9PJ2Ku5RlTNFpvlgsHRjOdE+/QJArxNOkMxeeqdylDNn2mc/7HM+HbNBB4DB5N2Stbh9saqzwrMTs/o6i+SPLEaGHJUed9tw9APSdbmJE89EKRWCxaFfOrkNDhS2dtOWvh6paG7X6DrLaK9Q/RzitcgVljKhTi9RTTHfR1vSs8RO0H4w7mKxpsSwF8jirUqR8EQ2ByoHKLBtcy4Vp8y5TFzk1JbQjxEeg9No49h4y2wMQSwXGOSrJu0j8/8k5xLYnkzmrjDwSL+0mBhOgcszAfBIuEAWCReACySNgMski8IsBh2NMBi+CUBFqO/DBaTnwQ2mWKOy9LUPy+mPRtsMt1MYJMZwVfb+Hc15gGLlOsALFKvCbBIn1wasnj3/+KznxLO49z6qSHCmCNjcw5w3O3c3D4UPDfw8/UwWZj8b7v8tp3xjlmx9N4iNDdR9/XwF9D8uLmOvzD+9yIhcX3gHeH87b7jPGGzEtI9LvsZXB9pympO3B6wvVlgZ+OLoVJUyaDHHZqp2C7XUhtW7nr0rs0esSjmcOnQmKVU8y09s5nmvL5dc1XMXDdrGKtFsiigO+9wgca8RqWTHgFlxhuVyt69BW7r63PrNeV9iNVwpa37LkWjCcCrndRUKZZHYLMILBcqW9tJS6rpeDr8w3tQ5irS76/iBEEQBKGdgmA6nlSdEYSVOStzwYUjXCK56tSWrtAr1WO0qCo0uhgd7UiffnvPU07/wf3na7UR4DE7Ra0uVMfEQVRZcFF7pxQnRL5B4sL1zeNdaHIxqZ66YbOb/di1uOE723+Pk6jnXCza74XR9hFLzOk69BPvzs0sEKcjAHvYqRMz6l7wZM7DufA03pQH7Ie9G1wspt88aOON1PMb9NXamV2HTw0CdZzAboHG/FRmXKsuTHnM3KQ0RoBfDN7dxQRBEARBEMqMi4TymCjyDStHPMRGY27U0dSWG3WAl5M6S7IqAisk4G0Tdvm9nu/yvURgMwD3BQ6ec64OzdF/+/h7/GyJ75wx/ty2l9bPr+e29LzGd83v5GVOm0tn/E0LnAi42IwdU0N57VEuRuRmxtTGYnoGt+TS3uXLneS9fz59DtG++aApufUu78nP9YrcGXYE6D2ABqiDES59qB+vQlrbxISqpUyrkDZw5ciDdo6s5Lh4PwBfaQKWu5ShuoGJAoZyxFa1zKcXME7WLBqg3UJJFMDPhx0JcqD2uey4ziifn46LDOVsd9x26Mg7tmDu+Z5dys6mmtA8JCzTur4ftu78RfY0zV59uoHHv6IN9BlDJ+ShLbGWqoVKTcxLN5VmDbAcFruUWMRXJKbWWU1sJRvIz+hPnnZ07/b8UQ2psRpSc4+JtWb81E3TvSjPEa1AQ5WIUkL96NU0yvUlOuGVax93UtTJroMGqHRLGUBvH6OCdi+RhQVGd+/gR7gI9zr+GVx9tx+Ag8KNngk1+oVxWi/0Q23gyvEFLli3FQnGdgefnt2d9QvjC9ANXdAJW4QFbROerVNbGedl0PEWwALBFsQ+0AF/GV84QA7WPm0dtxgf0TuuMFzz8fA9x6KA1sp3AnL10dJ67BbcsRXnonth2CtA/qquxOEV5mUMGIvkmVuoXwwfLXwdYbWwGnTDb9AFnf6WVCz1pJzwbaOTRqsQ0A+NL63GNsoTSExuNa1/4bE2gMBH4pK9LAbd0AW/QSdsKW/bIuBj+oEmtNraMmpbyF8/1UUP+rbxJcAFzVq1A/1+P+gE+pVLSgl6mjp6g34xkTsvbbVIJjhrNSnVyAWxZr9YZ67HR4GKyW69pASg59JsvQWtbI5TySgvWz1wNF+t0craK3ZAv8rbEcCTN/WAj6bXuz3ONBWkMFb36fy2mMuwQsJSUtBTBwb6mUpxbaMWXHyhEfQH4FdUvGAUKb+OKC1fsv6kaSeODvhr+Bk4SSCxPQumA738sEMICSYIZLRcUQYRYp3x11FODO5GgRERA1YLVH5BOfmskFe/CbpgG3SSXietNEKCcfHWJOY0qm6vfgO6YBt08pbWUdA92t6v2Qi64Tfogm3QKbS0TSDhnpeD1AbEoyiHjh6kWOskKsmIEfRbKWagG7qgE7agvVAuZToH8sRC/ViPmgJ0Qxd0whY6wuBW18eu6HsEwQ0/cwsN11z8jqNjo1XhzYZNOaXmSHRU+N/HDqp1RL3ETEB3ux8ywVv00dbZGD3uRxHNTRkYu8JAUW4dYjD2d4hnNPyZOAcJ9xCMG4+sPWYZ9HXjC4QwYoLEylpLswq6q7lqoDqBLeVttXHh39IoHCHB6ttH0VZXsCExGLetBUHyU/ciQH8yvgDdP5Vc690z+S5EJ7JFRBuq801hRgPW7K/W6ydOQAlV05MhTIHVLjGThsh8E9z1EFQn3a9O2KwWj1q1MKf7GNLT4yFwL3ANs/m2O0prJnG9aeQlsVappptdsU/GQR5FiSOWEOSwAuu4tv8UrTUmgIIl4a3YEbNnwi/haZPGpAiLLa0dPT0d3u5C28+Q4ezVHOMugJqT9PtIl9KU9pspwTBRWxB/cg3sgC3bAtMKISM9H8ImyVFxXYjY44XTEij5/agSedp4mZ857Ty7quowODOin2tEbbpmstu06ROYIs07DZQITFissnmyvcubHblGjjts5tFiLnuJ2Vr+/bERDcKz5GQmd+443MTPcjFhROsqjKoUHl3sMCStOPMTRCbZzxtJ13NUXqo0gEY3m8Z3PRRCphKWvhz0RqXq1bs08vBKjdtdtwOYv5CgYwLZ2TdTiFATXTBwt9NzOF5vL+uo9VLRRu80eqa/8JQPwLQLqmsJIhlTvGtDls2gFSbimsJw3UKQ8CcWQbaWZT2Xpw9FCCFB8mM3tLOts40Q8pCHmtHU+vLiQMQUe2lyaRERNjzXDxEvebmdpsDY5xIMgB2l8Y0XDhh6mh4Rfzdo2iE64poO4Dox3mmpFCOTfulE7Bj+o2ycEMujPOZt41jAHoE2JTQa36jYiehi/O/2CwTis+d1VWQhQfaiL4kv6c6E9tJ8HRWTLQYyzk6rq+AgX38IIE0D+X2QC37xy4B9gKSG1Q+4M2s90hpXZGVpfCoTrsNfOB6WSnArXXWHQM5RJKaKjbsEQuxduxrhGmcM6XH9Bg5UW3vFwGAdWXd08o3ON59TxMN8yQMa1COrHREQugTZvza4SOQj+wlLmY9R7Mb2kittdOCr/LxyTKivB7Q0x319EIQe5uIBgsX7XRiHbt0ojUiVmoTtPcIwV1tgSCLmlmgJwMJz+id6iA/Qwa0V3CffA7kxll8z3KvlOFRMg8CPJICIN/BxapRm34Lg4nckDDJfO2Dk5BXC61SgsngTXtTNHGusK+Rk6FXRYrzDZjk9cvbe4w6wZlJjxpxuTZUgrTJIafYSrOmsJZ2lBzHPC8SMxMOiRQ2UIxfG4sFamWEXEzJQppxxO0TiGOBPajNFJpK44GeEkDgRyHZUtjnAnbfVvMZ8xsy0WfIIIVffyx2Ir0IlmTHEsfiigiiRwtOOKQEWTJrY+8RklGPRbe2AQ+NXcq0LKQmLQCOlwDMav+76nPeGEaZiyxOJ0OJEPxh0mhmgwVrjfuUvD6An13LeDH3sgiJejsY/twiT7Rp8SRJHoJup50nn4kp8EYgKzM6agumdwIzzE2/FutH5mCdCR/eOaiWsESKQOKMK6eS4M2rhdfVtnCQjBVahKH//3AQhTYG2OZFnmXLcJtdJqyH3Lm6H+kjnbmZx2TewMY19CWetbRskMpK0PtMx5W/gOCGEtDLNqCcp8Mfk8IojgSONYUc5QkB0TQxEgRzEAdxlFM6u8Pw7B16bsb51ZOUFSOP3e+QzqYlsD5dJe8ac/pHgU4us5DVFxXniua3H9R8rzo89A2IMgr2YvoHx5ljGln0LBnyLluE1U/HGwyyocOzi+ssMDMcDJIwGEdmWnL4FnxnB3dqxHf7WMa9QIaQqPW6aBVXLiisLKakn2gXED0wq6YxDZtIbRC0ReepdigXMwy5y7EXlkeoydPJ5FDjFFiL8XspN6ZPsJR7X6rQm3/pEre6H77mIguBEKCcz91WRrOpPkYg1iriciJravkEwRCIfP4p4wn3tWWbkqboauJy4OA/W7D927tRZA+MD2wov5yrZ0PrmLXzn1fp0WRltUpHkSbDcL70xBW/+ZsoQ4bJFiciEQkaCvu2j++uJ7wLUyhPtKfxNhLw2xa4IJNw+GIe83sCq7MoeU9wg8Koyk9ZC1Z7aTB4WXk/tDokDvZHrPfhZKRqzpRWtPIoeZa1IvbMUZ2jsTUGt9GwpNr5HSXfIen9MVz3rKQQ5zOrJpi2luLxKiXi1hU8jsxjnJmkzwlqDXLjfHOq4EQLfs5AwsKli0E3A63sYU0arsXVmgCTEznOJaESs1d9QbZENWywc6OyZ7hf96v7YXtRw8ceMrC9bp30xzBb1jZU3cc0WICYlK+WhQuN+MqobxZhxwWpj3ffQTo0iaPt/1JWMOffk/39KLHeukoRKI4NKvxV4DOtMPG95YQ+I+6pCXgF462vFK5uqaZbDK5HsLVEcaupPBN/GHcU7/h7dxwf+EnlN6OAjHC+0I274zW+92Fjqnvz9fQvQoGA+SAddV+3rSUgILsP1n+bQdLcXGkBr5XTv87HdSAR6Cd1uAnGaU3ToVB2IeDaRKWDuB9GsUVp0Lfnes3Br66757+bwIIWn518liGLjzkT4MTJTDdF44o9RGnj+Ew4LM5hZC7flbhIcej5DTqsqyhENt4TamQ8iIou+VgYJtVvg4SccP6Oj83SgXsy7WkJ+OzsT5zcmaIR5YG6QVzTzTaRQc3oNqVzZ1vpPcuGlIYLKktBVzYW8GGywlKmck33Fh2gjfcjzfu+fEJbFFnIRj+wLQdJIleicn7s87Jbz2aR37B+zOjAxMDEP43ZnNssisySvWv0vCFbEZRRSlHR9s9WjnmObaY5/QvRyq9Wg/dtRxJd4LX1hqZDpl/+ZhxLtMA/zKywpw5kbZAkwiQ8Nceib+uNh7d+IZmC1i6Zg8F7Ji50kFLFG5HdmCUlc8QUlmaaldD1HPpMnjUDfkSIohJqq4DU1QfeN0JnnmqdBU+R0P14tF66KBEunlHFnCjzr0DcvlwdcEWvxBjkcHmSpMDD0URi0FH70ATXAOACVJuefKmPotVTK0g7NP+6otWt03dTtexasCZROdv/RLYBa9BMuF7mnegnDTegkW74rzvu06QQ1yjE13HvA9SUthJ1Zm1LuelNyM4Sztuv2qe5yNCJziisjsnednNe61q482AXq4kOY0yZr2WL7plXvlUHWKh/WOjx0B0OkgZVeG8IpSjOFfl92vXPtqEsofOYd63sYDQ9XuWhkn0v9zeMEiqRMWnpd92xMzlPev6YhnrIio8noU4ScJtvSa8sUfEvc55sgkjfxekn5Tkk8bT23sb3sanJTNhrM+g+0L6iPV5Hkci4SfZf6P2AmCsdsui4fK8nKpv9YeIu5uMqFkvpU+ktwWA+OK/Cv2VE8u0g5woYeV4KH9DpEa51E+LjiU0T180Cb3BmcedlyODHTgXW3jtzl09tw3bcPNcD9+u7yYbtx19GzQi0vLUkt0jr+WXSpaZLVkFbPM0bDkI+han5rMuqrdGmVutVxF/SV/lDkYPPWnge2zqF9NwzS95MYk5uxhaq/4WM32PIrwOUETRd2lAqNfYOlUEZqPzxu/Oe/P3/78bsvbx9/9OH92+sri/mc/PWV+l+n9lUxL7odFCqlXlb63L9yfemrBZ2SUiYu88pqzvX2e72aD90lpZrf+Mq/GnXeiv/yaXoaj4aDXrfDWV1mXt/vK6XRd6eoD0ddva/FZEva6mdiolnvV7gjz0Nf/8LQ5+FPkuZdKeRa8j1mrTtRK9kdRhEJtTNoVOxZT1j/wS0wHdju5VyHy61p+wUK77+1Wi7GA15X5d0AXRtNuwWOAdbzX52Ow6rhX9W144fDZGtWsAK5aS/TDbm7Hw2lDLcbPsTtPYfy+tNO8U+Xzuh3OyyOspdJis826s9d8/nh+9166OhGfLXykf4Lq8BQQm2842CicFih4El8IeWcbkkptyqn/PpwwmJy37jiC6zwY0o/c4YzRBFFFjTLeWnYI/y2U3oHF+Hxeve3ZQSeVTdrZEhXGlZ7ncKMK51iLv+bQTswCDzO1kC9ot2yEvg8rO2Fm3ws15yjun3StJcuv/3oIbdzfkOXxMFevFy4cnQob37qVOQrd2zLtxgJo0bgm3RnsADBGD6jIviNIJqoFaG88g+Rjplg3lUh+pS1YFC9Z+ol5CQZv5hapUQrXZGhI4/I3oj7kR3tQg3IGRO4uWJzPhNGD7W0w1d9sAQcMpnLFsfUkZZBWmZTULt14iR7jc9d8mpTk4eR0+aLdosxREsv/Kz8HjIdD6wYn5oZc0FjrQY3TUjNwNjXwMhJHfA3CYqKtqeO6bdzicBJkSbADV22zF/qa+hN5QbNIscVTVOZohnoX+VPE7HH++bDsA485r/mAuv/08PzsMayP5Ylcnsu16f5F+nfnX0Euq1DUrw+n0nae4kWKGFg6Ql1DUySBysK/0fiDT7hKgXpJKchB9oDFwioZHJb4Ex7EMBiCIvepjpBgiF25oyYtcuxl07RtzZTD4WF2OVgLsX1QmAEW4uXOQo3MGH5mOdqcwspV07sJKDbFwol4GYQTUbPdSkNRfWEjwlMXAh/QszkBSJ2wMTe2NTuThEeEh+kvSw9lnspfdKV3nfB1OokNSy6KNR5dK0JEUp9uSpuLFnaNegjsk1aqD3Dh0UCER+fU2/O0n6LZt8QMzUhmbzXZGREKrH0UzWXHZ3ZfGtuOvGvkD28maY03deNaj06bAfzxTaoHycdJvLld7P9oM/GnXFVZmlEXMdelZjfQOs0cDZRk1rYz3opWjqfzZGgH+zp2KNKCCoYJ5SUZ9RG9j7nzM5gpFAhK7JN+K2ETo0w3NTv3X8ibE5sOh9JR0kjiMkJX1qqQfuTVmXay7r8gDVE1gcI7PHCeiIvjjxZvMVkWDiJC4HwuYmRcz0iZupFBtDSxjr4kH30kAQoPIGFXH0bVAzdK39vUElAoJWCbJ5lyrcsFEG2wQ2XPyr7egQVELBf3cm2LmsBwjU1FEL9pAA/ObxeqPPFm7JQgj8XTcO2m5ROAqy8Ofj0JgJPEiK0paqQtHQg4pmiALrGsYiZFE6og0+IfRYCDb2LkvG4Fhs93fNKGBje4K0De94PgiGYXCBf0cNdanHUGT8ipJQPZgpR7IEnigHIbaRHUvGgMS8ccWoPCX0H1WwNIhwGSqkHe4W6PgY7UqM7aneSpu7LIns8NSKCC+ua04Ltpt3arbA0kmVmHITurQOLe+2u3WRDJOb9SmAfRCpqGVsqB2Rvzu2NReKNG2WwPdiDWA6rKL7Hof4tlP00co2trUtiv+uT2wWn0ielExY6Su7Kgnyog5EVgG2rFUdztPZnuc3lfw8uiYv54ld3xZg0IFYHS/avAz0AfYm6o5vK+LP44lHbBh75pKiL4ZeOaqqb4PE0kCKZd4le1TftYhFmrdUxRXBUTDUDjkjIw4ioyfnWNlN0nX/sAfuNg06TVBaRJs4fbbuoQ7+1YjXqMBlC7WuS3J3ZpwApb3MLDZGgPn86z1BvKObmS90rnoFmk0/byYYMIjJRWT2rU3IMD3XA1p6hd0oyUdIoBO6ouFjJjaH9HY22k+0R7/HKJvLNfTv+vNka3JWh18IUfNKAl2SVCDBzizQtMtpgFCRJyMLoEIEyvTgm5VWnQ+LIbrAkIBqypEHVl83HYiiYvF0OMt0EJ0IBvHbtGUvBoSzL+vPv3x++vzHd/0gh1f96gkanJeL430Q8MFauWP7pwf16Tiqqjfr1yw7W9gsyyuzulyjTf0NBqEoVyztpvinADgVJMUUqxazOcYxCnonBdWupnj+yMHoc9k9I4qMHWRL4ntuad8WVT+ks7mQ/7ngSJimy9aqtdJgcMJG1M8ezBsRhi6uHFNxpwAYwyaajm1F9M7GHR3BZ9ixOcUUVobdXYm5svPFNqm0XHL+hY+mxnu+dg4kiF0+xZNVhC4OGbE8LS/koQEbcs2UlzgEG+gJf20RRHCEJH1U5ws20te9qPsQ6wQ1xuHMOEUeFl8A3IZ1CDCVLeIP/t8DKb8dzFjcdrgpB26ocNZLyOIfY1JawoyMFBBuJQhntl1dveICRW4oq6ZC3ZO9WYLigHbbZ0blw42SqkijI232iLOWQOmoxB7ILUO5oLTXrrSLP1ZJkwkJ87Y5JiUKpk4idEyP4ieYgNJCaDa7QBeZMtTU3W/Jwm6LeykQfUuqJzH25qH5nDtLfUVKO/qGHbMBKf2xiY9TOprh3Cf0HrtKBHcMLJUiU/vRSrfeMhmj0NeLkZ8BQEkf8LPnBMOAyiy7lS0fX06aD5gCpex3lSrEfRcV6Vr2ba4vI8uVhmsUE8UceU4deUTRrPoZq3MVtprRbKUAT4jAOChzSfq06ztjWg8Sul01qQKL6GiJ5VGmSyvOcEl+8pkWehsTHVpZD3npZQETpSLesXi+Y012jA+eZgZKwLULUHvig3JulHpuKKqFwSxO3Smelf/84xf7FG/5d71qSIXSWPQpCuChqcTNlR6RGSnOv1MCbgX1jFSPBctLu4cfeA6XfrxDC9NrNJdTybXjek6rkBzCR1Oez4riym/8FX1zgf2Ov1/5+Hv8ObMdpUg4l6aLwFYCASH337x+rAD79tM043gr4yyXfZwdtF73rP06sTww3sMAsowFvPKitvwqE2PZd6S7r9duzavZ80E8geoutXVK2q1J68UnmKn5PMPY8W2DIwOaqh8KeFR7MmtCXUvoIqa7lHp1tFpI3+OzAdX+W1JC3iSx/BWpnMAw71uAA2UXGEYbsh0CY1UYaCEPTQuNoQygIa3Q9clUvZJyLOqOIcYiQI2sraJbZa0L6Gn8MQA405eoKzQgkc3GA1WP0Q81oRlpvi+0paO5D03Osvc5YF/9+dha7Th8mWOIvKF5CQq1rSUqGCIug4ONai2iSIcSpJ4kUJ2Hf1o3lEYBrdVwscySqypW3dGUoQOQ4qy+ydJD9xPJ8MplYa2M4cp8gMgn008au+XSiSemPlN8soy89ry0uG8y1ItYZqxjb3PwqVjdSjjT6MZZtsOLeQqQuKRdjv8ngAOuxHn+sQA4t/VqkG83iuCUKQxwFB60ClJ+2z7D73BOaykjtFpPGGCNVT4bsfcrRnT449PFh5gCa13Ws3yN7/TV/Zu8enWqgbMvpKW8FYtgbkwjAxXLF81dPPmV6b7kUCKyI3OaOdTQWcYG3tWohHWk17BG3sln6SGpVt/C8gPYuHdz+EtFH+H0QpAjaXAp8hLZGDrjsUPUMS58gGdlpFmslQibvC1twD5VCcHWyvxC+5D6zgHvOwl33FjJPIUiP4v6UhPpUgvRrIY6wxj3uZ4twbyMcfNLjpZAc4YwjAAPU6+bhx0QnONrmXkMPYC4EtANZFZfGhI3p8/PIsAWPkBKIEqs340VC6wmz8NzX+MIxMpIOQTVkROF+FIXHlATyzAiwgXagE+5d1huQCzLlpPVj0weAgVkBFWpWGhACAVCB9eqpABrVA3J8RNvZVHzdDYlJuTh9SxgzEb9b2FLJ1lIhJafLLfxx33QkMg4VYzcSjyisWyY5/Oh69azbJ7PJ8R1cpe9G+nhjTyIHdaxrI0KpVsYVRx1nsVa1ivhMNvfCTH4kb+I9oaGZjaExcKCIaxPSw3NlCqs2nrTNSdbuETJI4uGLGLh9miOlLMYwfJQtjchJJEuVgSRKQsjyEOr97fAeYkypS8rcwGAl2TSuBKJWQWzRakZdV1Nb2U+vBHAVU/UPQZ2L5XAe/vlgDjRh1R5B9ZQ8Myt9dpa1Bm6GIlbnihBnjKDzsYjSd7ZljmiJlfhS8zch0BvqgSELBcZfFJfAs7fN0uONkY8cFu3rU34NTy1OkTGFF1V07Q0apBWZsdbizLOQuWSTKC9txokitowi7cYIcd+Dn3g4tGICeHIEAAnPERhePsJZ8g1FeNNQDaq5aax8ga7HCMAgG2ObCTmvBN5jK3wXUo5DN3izhX5gVzei79i72iyLc/0O2OrPIUEi0Y/0j/tvcr0i0jIV1xNG5C1W+fPAXSIo9FMXe4Lh4Wes6clwFPlyWVy/zeu6VqrG7h4WlXrSd+TogtcD7eOXnXtlNkFs8NuYP3zyi4vrDloMssnJrU1+mp+dnF8sl7ls1x88ai+lXdRQkW21i4JrkUoLQ4UdcKvDpsKWJrCEkn4791tt70noB3Z1I/qOvavNsjjX74Ct/hwSBJzU2COo/+P+m1yv6KNca+KRMjA6Bm/X6VX+PBDeaTCgGGY/dbGn04eHn9GjompMsYLwpVmp6ycfRjf+7lrfNXk4rcXz78azSB4YvDYg9vFLBFPZTRCr4t+OeI7RPP+6gxbF9TY5ubX5Bk5TZyfnBGvdj7XJ1h882suiwHV6roWcmZjmUjMDK8JkyGDP0UzGI6D9GysXdSYUxbKtQwnDY1cUs3yCvSEwgkG6DBaZsmSzYkjleQhrs23aKdAeB2qkk87YUCOkrj9I7jTgabVB6VoQMSu6IuI/WHBWmwlQrOZnlaWWYQnGuJ0xEtvUSaewyPIOO2KjTUSSlGi1U6omr9EJbByJkhW/dUf+JMdVq1KDcX1Ygxb8n4pecKqGUBAVGE77HhqKxt/CAJ6P5vhkrx1/rVKo+DpkMqaZYWLKHRVGFA9k3V+3aWrd9iQydzjddc8Dj9z30OPI9dJTb3310c+Knm8IGt3vpvr7dzhAx0DwxkDVaplHUvPlR8O/HxG0dN0yVJ0GjVH4db+7QoQKEy6iZ0ZMEClKdKM0aWHVmswotpV2pIpnYu731F4g3r0Qm/HadJiYLV0GDi525Yxe2V+AGvkSe2qrs87YppzRcBExSaBvpS1h2T7dc+dVOuvcLPS8l6bqYzUNbZddcNGlufLk0/U5gB93VwNjs7oheta7jqg3tB2258FGNOJ73tXUl1XNez8HLbipxQ09MD5n9HJLh3E+J3uyDRU06xyBbvRsrF+OpRkjXsbYztngiGAxJ9ie5TE85niYPHEd4nOCyTzxl78i7UdD7yYQZG697fY7MFUHTv5oCxiluQedc5WDIw+uZhEb85+DZ5/7/8+/8OJLL7/y6muvv4HAugC2awv26K/DC21ff/Ptd99f/PcP//nxp59/+fW3//7h/IOYz1BdQ5NmLVq1014HXemIhJzgmBZxSZ86ipM0ywuU0hLO6N+Xvf5gOBpPprM5jvIfDafz5QpdP4zifIgpl6rT5WponJd1248z6D/H0jgfe7B461nicJvTmvB2Bx5kFDwKsrgayS7snvBMGkb8m4AFeQzMYUe4kWwQSf1kS15TKMdbpeIh9P7H1vWs5csF/lA+dchhah1bwjWBbacxexo2OhB24GvC1NMtxyQP4rcc4bxsptgwAisZW+DgcyCZ2tB1ANailww6sDw5r2DNuMUMQh08thNbBRHqqkoUylDKiX0T5AYzVNcVktOOXQ9X0TY7mNTi2bO6uLPcatbAyomjCjOXpdMFM6dn9qxV/ZnfbBkUgU2CM2LpinLTblEeQeVFXbzT73QTfZ0FcIYzzkOTfA2cOoIkitN1YScHVYzvHH82I7FYOSKYibRTArekXq4EkzO9l9uJna/nKd9gluoamO46/j2kbkP4bzqEuvpf9KzJ/5ZWVxk6V6Fs1Vmdnjifos1OHECy2EXVKbNYokUVmzlFp8JenXwX7wiuCKMrwtg5B2ml0SpLlDaPXGzl0i7qUiBwck1dJ5d1MZe50AUtrUtzNUdzEdJFJ7sSsvPSeXPtrXs95h9s5JCLT91oTndB2UX4pNArCZlvH29C4n3QbSE5iu6fu2oSUfEHGXs8gdjYu8z45MZFY/D1i8BO0yoQgb6Pt+glfx4FmZyv/d7R4JMrHj2Qmx6BrbMeOdX2cU8pCkPOE3kRYzqeOu8SietpKHzQbV2lEd8uOcHAmDDKTprVjCDILsop6kIFpJOkQ5SCd24XsXPH7CAYt0aOrp5lTSJBbA6Tlc0p+FptNnltDiSFuvt6FkEtBmuNegbVTsL3JSTGNZR34DLRUg1811MCUaOEcjMu9OjVc3A554t5xyG3wXu0ot7wlEI6V5eJlkrVW9X1kUDUKINyo9w4EcpQRwiF2bTS9b182USNWqnyDVwmVs5vvYhkpk/t1/yX1KFzcK9QttxpKgiP2nmtMZjeU0VHLKjnwMEsKn0Vi0feP4vjmOqjmD0GXjEgJscY5svMn7LJI3GDqbjnsayB9+7hFVwqOflV4Z/Fr3LIGF2cJA8HtYuuZtgisdKkD1dS9ZWqhnjRZbibdHxRV4fF7B6h8vXVTGPl5nU1RzTUoCEGjGHQGAYNlrTEkpRQGiWWRvldzofzFp+wJ/BkPX1KzBNTX4QZB5AV1NFifZqk66UDUZjEo3RaNIilQJzpXq1SI8u5YpgWmv21r+xXhWOoTmyovBYkkUAFIxApBQGBOnR9WYlPzv6yH4ZXiObmkxTueEFfGuzOXKZWZYf6AqEMuerXoaM9o8DWwxV0MabQMi14vh77Yr8Vi68Qsq0YbmC2EieQQIJHYuQ0sscpYoUveUWlZ5gBiAZcWwlyYMAAQQ4QYc8+gqQ0GfS0bDSwvwDXHa+A/vVrmyaxe89iNKGxp0+bex6G6NQR+m2C8Xmz5Jep5YmvMOf66t3w9Nvk6iukBC9a5OrJJ9Fv7Uc3sllqlCAETo3gDejnaba0Q5Az7xak1Gk/dkDH7G9qk203Mh8YiDG4/HEaYmBnyf/zCjQXmJCcAaf6Sfnfer/nnhW/fwoOx6eN/WXCbwS4f8NnRSGf5WWTppGBOIbJ/OvFa+svDRq/wvGXSeUBAAAA) format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +.forwarder-heatmap-viz { + background: transparent; +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/visualization.js b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/visualization.js new file mode 100644 index 0000000..bebd7fe --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/forwarder_heatmap/visualization.js @@ -0,0 +1 @@ +define(["api/SplunkVisualizationBase","api/SplunkVisualizationUtils"],(t,e)=>{return a={194(t,e,a){var i,r;i=[a(879),a(423)],r=function(t,e){var a={slow:.3,medium:.7,fast:1.4},i={default:{tubeStroke:"rgba(100,180,255,0.25)",tubeGlass:"rgba(60,130,220,0.06)",liquidLow:"#00d4aa",liquidMid:"#ffcc00",liquidHigh:"#ff3355",particle:"rgba(100,200,255,0.8)",connector:"rgba(100,180,255,0.15)",text:"rgba(255,255,255,0.6)",valueBg:"rgba(0,0,0,0.3)"},dark:{tubeStroke:"rgba(80,80,120,0.3)",tubeGlass:"rgba(30,30,60,0.1)",liquidLow:"#00b894",liquidMid:"#fdcb6e",liquidHigh:"#e17055",particle:"rgba(150,150,200,0.7)",connector:"rgba(80,80,120,0.15)",text:"rgba(255,255,255,0.5)",valueBg:"rgba(0,0,0,0.4)"},neon:{tubeStroke:"rgba(0,255,200,0.3)",tubeGlass:"rgba(0,255,200,0.04)",liquidLow:"#00ff88",liquidMid:"#ffff00",liquidHigh:"#ff0066",particle:"rgba(0,255,200,0.9)",connector:"rgba(0,255,200,0.2)",text:"rgba(0,255,200,0.7)",valueBg:"rgba(0,0,0,0.5)"}};function r(t,e,a){return Math.max(e,Math.min(a,t))}function l(t){if("#"===t.charAt(0))return[parseInt(t.slice(1,3),16),parseInt(t.slice(3,5),16),parseInt(t.slice(5,7),16)];var e=t.match(/(\d+)/g);return e&&e.length>=3?[parseInt(e[0],10),parseInt(e[1],10),parseInt(e[2],10)]:[0,0,0]}function o(t,e,a){var i=l(t),r=l(e);return"rgb("+Math.round(i[0]+(r[0]-i[0])*a)+","+Math.round(i[1]+(r[1]-i[1])*a)+","+Math.round(i[2]+(r[2]-i[2])*a)+")"}function s(t,e,a,i){if(t>=a)return i.liquidHigh;if(t>=e){var l=(t-e)/(a-e);return o(i.liquidMid,i.liquidHigh,r(l,0,1))}if(t>=.5*e){var s=(t-.5*e)/(.5*e);return o(i.liquidLow,i.liquidMid,r(s,0,1))}return i.liquidLow}function n(t,e,a){return t<=0?15:t>=a?95:15+t/a*80}function h(t,e,a,i,r,l){t.beginPath(),t.moveTo(e+l,a),t.lineTo(e+i-l,a),t.arcTo(e+i,a,e+i,a+l,l),t.lineTo(e+i,a+r-l),t.arcTo(e+i,a+r,e+i-l,a+r,l),t.lineTo(e+l,a+r),t.arcTo(e,a+r,e,a+r-l,l),t.lineTo(e,a+l),t.arcTo(e,a,e+l,a,l),t.closePath()}function d(t,e,a,i,r,l,o){h(t,e,a,i,r,l),t.fillStyle=o.tubeGlass,t.fill(),t.strokeStyle=o.tubeStroke,t.lineWidth=1.5,t.stroke();var s=Math.max(2,.08*i);t.save(),t.beginPath(),h(t,e,a,i,r,l),t.clip();var n=t.createLinearGradient(e,a,e+3*s,a);n.addColorStop(0,"rgba(255,255,255,0.0)"),n.addColorStop(.3,"rgba(255,255,255,0.08)"),n.addColorStop(.6,"rgba(255,255,255,0.03)"),n.addColorStop(1,"rgba(255,255,255,0.0)"),t.fillStyle=n,t.fillRect(e+2,a,3*s,r),t.restore()}function f(t,e,a,i,l,s,n,d,f,u,c){if(!(n<=0)){var g=e+2,v=i-4,p=Math.max(1,s-2),m=l-4,w=m*(n/100),x=a+l-2-w;t.save(),h(t,e+2,a+2,v,m,p),t.clip();var b=t.createLinearGradient(g,x,g,x+w);b.addColorStop(0,d),b.addColorStop(.4,d),b.addColorStop(1,o(d,"#000000",.35)),t.fillStyle=b,t.globalAlpha=.85,t.fillRect(g,x,v,w);var M=Math.min(4,.12*w),_=.35*v,T=.55*v;t.beginPath(),t.moveTo(g,x+I(0,u));for(var y=1;y<=v;y+=2)t.lineTo(g+y,x+I(y,u));t.lineTo(g+v,x+w+5),t.lineTo(g,x+w+5),t.closePath(),t.fillStyle=d,t.globalAlpha=.6,t.fill(),t.globalAlpha=1,t.beginPath(),t.moveTo(g,x+I(0,u));for(var S=1;S<=v;S+=2)t.lineTo(g+S,x+I(S,u));if(t.strokeStyle="rgba(255,255,255,0.35)",t.lineWidth=1.5,t.stroke(),n>40)for(var A=Math.max(1,Math.floor(n/20)),C=0;C0&&t.measureText(e.slice(0,r)).width+i>a;)r--;return e.slice(0,r)+"..."}return t.extend({initialize:function(){t.prototype.initialize.apply(this,arguments),this.el.classList.add("forwarder-heatmap-viz"),this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.display="block",this.el.appendChild(this.canvas),this._lastGoodData=null,this._animTime=0,this._timer=null,this._drillGrid=null,this._drillForwarders=null},getInitialDataParams:function(){return{outputMode:t.ROW_MAJOR_OUTPUT_MODE,count:1e4}},formatData:function(e,a){if(!e||!e.rows||0===e.rows.length){if(this._lastGoodData)return this._lastGoodData;throw new t.VisualizationError("Awaiting data — Forwarder Heatmap")}for(var i=e.fields,r={},l=0;l=50;h-=5){var d=Math.floor((o+5)/(h+5));if(d<1&&(d=1),Math.ceil(t/d)*(.85*h+5)-5<=s&&d>0){n=h;break}}r=Math.max(50,n)}(l=Math.max(1,Math.floor((o+5)/(r+5))))>t&&(l=Math.max(1,t)),t<=l&&(r=Math.min(300,Math.floor((o-5*(l-1))/l)));var f=l*r+5*(l-1);return{cellW:r,cellH:Math.min(Math.round(.85*r),120),cols:l,rows:Math.ceil(t/l),gap:5,offsetX:Math.max(8,(e-f)/2),startY:4}}(C,y,S,m),q=B.cellW,k=B.cellH,G=B.cols,L=B.gap,P=B.offsetX,I=B.startY,R=Math.min(6,.08*q),D=Math.max(7,Math.min(11,.13*q)),F=Math.max(8,Math.min(16,.18*q)),H=Math.max(6,Math.min(9,.1*q)),E=this._animTime*b,W=0;WS)){var U=z.mins_ago,N=n(U,0,g),X=s(U,c,g,x),Y=U>=g;d(T,V,O,q,k,R,x),f(T,V,O,q,k,R,N,X,o,E,Y),T.save(),T.font=D+"px sans-serif",T.fillStyle=x.text,T.textAlign="center",T.textBaseline="top";var J=u(T,z.host,q-8);T.fillText(J,V+q/2,O+4),T.restore(),T.save(),T.font="bold "+F+"px monospace";var K=U<100?U.toFixed(1)+"m":Math.round(U)+"m",j=T.measureText(K).width+10,Q=F+4;if(h(T,V+q/2-j/2,O+k/2-Q/2,j,Q,3),T.fillStyle=x.valueBg,T.fill(),T.fillStyle="#ffffff",T.textAlign="center",T.textBaseline="middle",o&&Y&&(T.shadowColor=X,T.shadowBlur=8),T.fillText(K,V+q/2,O+k/2),T.shadowBlur=0,T.restore(),v&&z.eps>0){T.save(),T.font=H+"px sans-serif",T.fillStyle="rgba(255,255,255,0.4)",T.textAlign="center",T.textBaseline="bottom";var Z=z.eps>=1e3?(z.eps/1e3).toFixed(1)+"k":z.eps.toFixed(0);T.fillText(Z+" eps",V+q/2,O+k-3),T.restore()}}}var $=Math.max(7,Math.min(10,.016*y)),tt=S-10,et=[{color:x.liquidLow,label:"OK (<"+c+"m)"},{color:x.liquidMid,label:"Warning ("+c+"-"+g+"m)"},{color:x.liquidHigh,label:"Critical (>"+g+"m)"}];T.font=$+"px sans-serif",T.textBaseline="middle";for(var at=$,it=.5*$,rt=0,lt=0;lt=h&&a<=h+r.cellW&&i>=d&&i<=d+r.cellH){var f={action:t.FIELD_VALUE_DRILLDOWN,data:{host:l[o].host}};return void this.drilldownRedirect(f)}}},_startAnimation:function(){if(!this._timer){var t=this;this._timer=setInterval(function(){t._animTime+=.016,t.invalidateUpdateView()},50)}},_stopAnimation:function(){this._timer&&(clearInterval(this._timer),this._timer=null)},_ensureCanvas:function(){this.canvas||(this.el.innerHTML="",this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.display="block",this.el.appendChild(this.canvas));var t=this.el.getBoundingClientRect(),e=window.devicePixelRatio||1;this.canvas.width=t.width*e,this.canvas.height=t.height*e},_drawStatusMessage:function(t){var e=this.el.getBoundingClientRect(),a=window.devicePixelRatio||1,i=this.canvas.getContext("2d");i.scale(a,a);var r=e.width,l=e.height;i.clearRect(0,0,r,l);var o=.85*r,s=Math.max(10,Math.min(32,.09*Math.min(r,l))),n=Math.round(1.6*s),h=.5*s;for(i.font="500 "+s+"px sans-serif";i.measureText(t).width>o&&s>8;)s-=1,n=Math.round(1.6*s),i.font="500 "+s+"px sans-serif";i.font=n+"px sans-serif",i.textAlign="center",i.textBaseline="middle",i.fillStyle="rgba(255,255,255,1)",i.fillText("⏳",r/2,l/2-.5*s-h),i.font="500 "+s+"px sans-serif",i.fillStyle="rgba(255,255,255,0.30)",i.fillText(t,r/2,l/2+.3*n),i.textAlign="start",i.textBaseline="alphabetic"},reflow:function(){this.invalidateUpdateView()},destroy:function(){this._stopAnimation(),t.prototype.destroy.apply(this,arguments)}})}.apply(e,i),void 0===r||(t.exports=r)},879(e){"use strict";e.exports=t},423(t){"use strict";t.exports=e}},i={},function t(e){var r=i[e];if(void 0!==r)return r.exports;var l=i[e]={exports:{}};return a[e](l,l.exports,t),l.exports}(194);var a,i}); \ No newline at end of file diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/formatter.html b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/formatter.html new file mode 100644 index 0000000..d627669 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/formatter.html @@ -0,0 +1,36 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/preview.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/preview.png new file mode 100644 index 0000000..370dfe8 Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/preview.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/visualization.css b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/visualization.css new file mode 100644 index 0000000..457ad86 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/visualization.css @@ -0,0 +1,31 @@ +/* Press Start 2P — Latin subset (woff2, base64-embedded) + Source: Google Fonts, SIL Open Font License 1.1 */ +@font-face { + font-family: 'Press Start 2P'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) format('woff2'); +} + +/* Formula 1 Font — shared across all F1 visualizations */ +/* Prepended to each viz's visualization.css by build.sh / merge-viz.sh */ + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,d09GMgABAAAAAGMsABAAAAABGtQAAGLNAAEAQgAAAAAAAAAAAAAAAAAAAAAAAAAAG+5UHJB4BmAAix4IPAmXYhEICoLBGIKWcwE2AiQDkgwLiQoABCAFiVEHp0QMgQ1bCgBxBGu3XfeioPO2MVOuSkcgFdNtFtzdUieH0uDV3mHsdpAX+YqT/f//n5hUxtA0aAoFnCK63X0Qc/dsBTdewmTUiIZis21uO3x7lSBl7wfyyDXqCSFjXuY21QRRejE7UWfuG++jVVsLnEx/Z88f4+WoaHsJBcKVHR1/ubZAkCI8kAvzEhP0uPUdoqLFv//4mpkU/LF5CkqTlRVvOHXz33JXaqRvx3qutY/VNgylnjqV9oUkK0FazJMGHmd5c1YgVqaTt1WVeRnVzn5c7IEzQbQv/6P3GG/bECv2hMkurWWNsWtAqKZRQ5YEhychVMsqpKzqHrS9e4RATyJw+hBu1r+ZSUgIeINVkUKDWPAQdHusOkfXrdu7r3pi6va9qrm77/0EkMBAPJF3DikUXSahu4o+A3D6olOl4UhObanSA7BNcVMEqykpCRsMbMSgVRQxwAajNxtzaeSGtc1ENxbYC9csirkoFxGy/HTxiaAqi5esTadq2sHzwg36sVJnX5VbBs8QoOqZa8WSgc7CGfv//TR9jwGXd5mVN249rdaBkcRaCDUc4xy5y+nwlwPppWxJ+8pnoH+0/c+KEjzNCRd8sx2+WJ6BfydBk29FTVFvV00WX1yrpnsEqBkskTqhyd89o2uS4rQbIV++e2UQQiAAKKLb8vNzFAYAAVECAdcN/OeO/e/hLeD4BCKKqSVRkt12clsmraU7Y4v69evXrwu4evXp06tPr14dHZ0CRadA0VOglOCJd+vfM3MV8WVhl2c8+yJGVFpSmXTxok+6Og3wrxLwWK6KxNsDJGmLESAtYrV755yIPB6fHj+2ZihpMSz/TBVeHY6jnrhnty/JywsAA08kCij0hJvgK3Wa4KPuno81wayAX9Ns6X3GAFu+B09Rh0bXBvFQffJetbfbPW0a/PaU8a8pdcYSJxMj5I/gir981bTFCyOMRnTPypJX8tdt5lRU+Rwp2Yj4RWAJyhhDRaf3bYJhG2pFsK8eH6GTePqL6a2VJXpTAPTslSYfooBumjyl/CAI8DAhbPjU+XV9z4bUaWRKb1dCsr1ddy8XvyLZT0+ykIQhsmzANmRi4CfYIsU4RZJtIkoaZP6U0pjWMaY61ZBfM6XV25ZWbrv3ettbqdfj3z3t4Xreq6WKNUYsCFUKfGX33WpBnuzunU5v6aWUVpERCsTB6E9IgjIMRLVseqoVKJq4Hon6wpv7gzyKWtIKdziQ1HtDCipEh0Ry336mzWXmJ+9tGYREoWa3NPKczC0c7f+HgRLAz6lN1SYtqxOyspUA5GTrfz/tZ5N9HFoLXRERWhOq+0tTBvVqtuXtp+1fWikJ9Qa6Qxg8g3C9SoxBSJREKYjPn6yd/QkSUtE2pBgEnhObJ9QFiLavvioyZ+7uuZrGWYqkN6l1CxERERHf8fE1B5TZWBf04e8uSShC1XFP+vprhxnYpXP/ccaq1VdVUVERkRfV+7zPIZvhDnltx7a+86wQAQKEiAOd6M9+mjWOm17MWsZE1LhxTHjA6/Wvx2wata2dXsyTE6CTEKmXFPpSGPlAJ4XLfiLgkLwuetnLz1kC611vtX8XBnHARLC9fD0QLHmu6L+f3KW/bxf8RyDwSFAGi67fB7MYHSGiVPR9O98/ww2tQayzgXSwW+CZ2GgbyOWENLcZZpXxj6QRQczAgVM4xFHOiUcikpjiSNORk9HUpJg6lVFBk7u2Dd3Rq33UF31XTX/0lwG2YWbmRowQiCy8+gVERKWp8soqqnQ1dbP0TFhrtz0O8ntHOtmd4ach7Yg9dsO2HjH0gulhR97mo7mMgcARU+YqHHbEUcccp3LSKaedcdY5512g9tIrr73x1jvvffBx+rQn9fY7YPZ8kAW1J6LKv1uvgh6yljhS5ozKVR05eN776AczsJpsm1JEVFipxEwwQe3hJi9L8zy0EoZ8gVAklkixiW9i0s9FpK4RVarB9VRrEcB3FxGSPYqtdUmKvAWzxg0fsEn4VASEHTiqliJbxyZEoYaj5hZQoYaPeLN0ZsIjDzirCfQIumXEJt03SlWsqpaT94oJojahYoIIE20bl+PsFHOkopgCEjO1US1Vycurma4ZNUTxlvl9CTQKil0REXTflGO9CwZ7uO0YehxED6Njx0n/KP039A8H15n+aHYfxXyr/0vhW7vrp1JQp11j5wJAETa7bUYSvXT6HnMn6wA262U4fhrrFbQ03TVK6k2/TEv61NAKW+AZwOjXs4mPAH4tRroI+LQ2hHF0TflHhB4Q6RtPj6zJ0jBAZH1tUr/6LQ1+PNQZHXmI9M0DLOFfFC4Yv3LKRSB1n31YZStSAHMuDkXVj0SeLC1GtdNxj6vwJNM8IsZjpZam4oguMg55uHHp+KmUrFFc8KCyTeR6F71AEpp+AqUy8FCx64SA6VujCrRjKTJudcJru+h/L//0sfXR9A+VZS0mOb+QsLKxzi8MqoElDtSlLZrCBRLrg8WvdHK3J7CM0Ow6BSAyENEbfXBduo3Kp8NWrRcvQCeIdcWS9LXHXxZD41OXDUxmnCtwJ7bOcoRpzpCEJlqajpqfOrl8Z15fTiYJvIdUUrGJnrgM4/y+iY0IAEYUXNu4bRDNWpELN3mXA7dee+t+K1gDIJVgf5WOhbhxL1I7WZ8A4QImNBRCK88uKKsQHtRGfqyQNqM7F1BJqAsNlAWQJV1wJrNKQon4YdgbJlSfwEdZDZUH7TGI0BItsAI5ZWWClzUNEloNGkbmnblgbXn2PFANAVrA9QMtNST/hFeaQ0kGqTckf2LHp6M+Ps3ADmPPjZjJpka5rpzo8ALzkz4bGsFRI3feaUmpkNT8WAQjQmUgCBgHJDaDCqhNmGh04Abl4EDU6+ysZEaD6UBZOm0XlCiToQJP/d11p5aVjuFmE/jwTfEHmbeaeAkXex+FVwT8DGkP1foG3hsSDjTIDZePtigF+4FBf2BFMlQLty5ATl3p96vtXtWCwzlq5s6vTPNt/se0dBiZlDRNKwXxLJvcZ+cvGIZWv/XQ1A9bVeaLKWRTrfphgsK3Vqa7/aRNSoGgPCy9I5hUadFqrjU3VieZNA0TmqaN22Z9yFo2qkZuAoCtpWb0l2OvNsZ9x26B/nb6U6e+FJxrIFZDAWPxUbWkpFCjxJXRfNbne6qszjvsUjVtNFu6q1HNUI3hk2EK3b5ou/ujJs1YSg5NEnMaNKztpLjAODMAmxoiN0W1QvYCEjU9RIpFI+XdSihUxp3hh/buXo6bua70ARUIln14MQV0UyTODQzBVCjrqKl1IdAQCgLtsvuk+0JqzgYqGEOIwFgzUQtY/5uYRUpk1lZE/2AMk0bh61p9SryoSQy9CnJ3hOmY1bvHFuO6wzMLLIBz1seok4aMxrkMJSBFvqS11y6ZwIArctBknfA3J1+Turvjb/s8kiURv29ABhufqeb93O5DzEeZUIyZAFjjHwAJj01vZr4BqiTM+4XBSWzdaXlGFalHYc/s9T1NEyhAJqBR3Jc4t2Wcmcixqt1p+cC+uXHMtpmfScCC2lUv/pYtDNOOSQ3OH+BU9e3XxwIXS+AeUA2ml2n2Di41zZKSQsuon1zX0NKDu2SI7w7jgxJZ4b9OMoXLgOmfa6Qt0wblgDgZRewfvsbO5mCk1b9at6Zn4+XuGxv58zOFCBxsw+iNwVerh/3QXupXBp5NlpRQijyVSyyeL/+kCZ1HO9fTXcj1l0XFCV0TBiTmyISnLnzBHnUw7haFJ4NXJQwPVPivdmOkTZ7l5wY2TgKZm4lXiFVER79ZlqtaWY/NdKAJs6yx0Vyby8W2usT20aV22WOZyZet9Ht/0PVP/9LzH/+zymE1utYRjrLOyY9tdKXrbHKD2+xwZznpYffrjlf+rszd7lXuSR+TWmiphqzMrmcxBe3M2CF0cdz4dXkC0DsYJkkn1VfpscYLeqJFe09tqn/VSzI9vbJVX+8NGOoTuZE+207ZVxMm+2XaTH/sd6j/nXTJinydhlHX7uSMMx+B2/zrEcxRR8NqBWllyRHkcRbwFglKxDT/teSjfJldnoNTgcwal3Vum7z45lr6Y8C2wblxQzHMCH4VQQNCBkWkxgxRDIvKxIyIq0gYlVSRMiZtXMakrCmqvJxpeQ0KZhXNKakoa1fRQ3NEVStdi5qyun0ajmg+pmhp00wzruSAUtOxatbXHWabr2GBxXRLLKVZZjl9dB1n6ukyodEaq9am97eHVrVRViZJhUo0Oip267Qn3fOMsY6D/pDRkVKlGjM7Nhyp6KgcGSy2yE/eJO9mtynOFhMF8lH+2Tvy3vWpgs99qearb+u++7Hpp54pZOWL0Yo2MaAdXWLEePSIDUMxjfl+sUWs+WMTKCV2xk7jQhCMm2eE4h4v4XjHT2T+oTzMFgsn4eKJSJRk+C7AZXESpZJUz0gnOamySYtELhQwwwzW0BI1rUqctJVC0l6DpRMhgyzbdCoR0vVg9HTriZittoVOX5W08tKSXQZLuAzV8HkF4aId2UdhVw7ZreSUPSVGlDXH7II0TKebd7kgt+x3MGYO1S/HyklnouasC3GidqmQ3PY42zzxJkLe+hA9H2kiVqcGvQXW2b7qd8dArK+DFSt8yBJFDVundiMUz3e6zFRuvD2pxXNlspM3L0lyK4aOOS4c6DIPlx379h6DrPLlFsoDDFP6ziRWkrwTKC9oMkkzkyhpcRwwk3KXjI6Et/tbh2dc8hYJN7hgIXJEbCMfbXkVJQWxFfie7/JVvov7nDPypo38yPf52ff5Nd9HScK1dpPf5PU02xl/8Zh/zPFfvow1b2fK2Eb+63wXJadghBqmk4dYuJmKQaCd5btSZ3Ce4JEuZ+WJldbCeu5TBkCArqT7ZYUKMuTQcpyfPTUhVgxpbPyXGXNB/jkSgHH1UWKWOjkCRw99zI8N8vitZJmmEiTNNWiaIKCH9dARK5vVdKPEJMBDdx7pNb62X6gWkGaCoyTk2DTDvZcut+c5KNLO69WYaaJ1bJYxNfiCfOyVfWre63qDfMjRIDnmRNBAQQR9tTrrXDafLiaXgfNHi4Gbjr23s7xeh2LLuB5/Nk0XJGlniRv62yeBAocs8NPvdBtjzeXnayCSmFnZ31sEi/n8RiYWNg7OWyU79mPXHrhN00GPdp/JDNlf7uzmX3d2d8idPRx1R08nPKBszyROe4T7Fk7txDlFoCCnRbGLcx3kg4agEBSDxo+PxC5oj/uW8uXk8mIF8c01cx1Y92+cNsWb0a22wMyLR3A546OZ0cuWJ2jTbpMefQYMGrHDLruNmTCdlgplmqzEuf1CxihiEkgmJS3793kKK1SP0Bk49fOLSEXPkaMiSyeaE7IFlfn1sZyR4cjRXJEpLFdnb/a1UmtIQFBUTqGx939PxDL3BZPE7I46S/WW1Iiu79ywGfFjbdX1OxF+BBxG8EZiEctYxbrg4hnFRISXyERhicoGVOFhbhFTDgNkJ9IyOP49vCEDwZIO7QsnUdzp910MZ/QuRjJ+F/5qz4dAjalTsG6VSItgaqtCKrVewU01NoGVxooHOW5hNbe7oBx0Bd1BT9B78CCCSBTe+AeTcOaaoxlPv4+N2muK1tXc61HPUupV7/rUN1vMam6+lo6gBAQWRXBSYYYVNvpKu5gFR9zEGbSbg/CoSQV2jqKcpLK0e3luwhLeTWWLx+5t8252i1vddm/jjKcnxNjGzJEc2ee+8OVF3QUwBKOOsxg7sHOiwJwKPWdirVpAN2twhxtgcJhzMZ3fDAgrAheyuB3sO+7iAHzV1771nZ7BneJ63/VfP1vE3QWCF/cCl+U8FDvQh+5k4hRoIfVFE9ixOvfBFipWzW3QlabN2Guf/Q6YddAhVyo5gAR3rF2ZzGyhxPE2i/ieIDbePPr+7xJK8njNWh1znMoJZ51z3oW0CM2ytP5CwhhOuUZBCUSuF1a4d8DnwQfwWbAcPg2usfK3p2/RKky/36f08mxPPPXMcy+89Mprb+4WV+LzTMN2G8BrtORp+7thfy6hsWZSnuW2O+66574HHnrkrRVyDBWHBnOhvhMJhQeeZ4ttYkgc75QnLHwObzUyyme804BVrWHMlL1pKZLM4iFjomKykiZmFAv56hA5f93s1wp9dWxAp1C6DJmyZMuRK0++Amustd46G22wympFipUoVaZcBalKVarVqFVH01qCkLiAcVrG6vfT2JkaJv6pCcSh2iBrXm0nS56j23YKb73z3gcf4etTzWtRS0QiJX/TorBieRMEwAOH9V2QPbWqdW2KKrqYYlFUKxhSf3g4+oGkyKlPQ5rSHGX250BmczCHcyRHKVajdsUVXwJir5n40uOSFgPKboFpYQlxFLcPMuWQtP41evZUTufMB9lJ5wdd3GCzFUp6h+fDBgqTfbL2jZstfo9bP8vD/Dpvn8sPPK6HNB5c5e3nmZtD7ggVvvvqo3KZa8ydCz//P+41/nQPjSV3gAH0htWAU/6qMp6ovUkar4dc/aS4cQi4qSb+ZKZVjm/frjX+4C8udZ3bo0sGgg05rCSkLpsKq7AXCiE9vgvUFQVF2aIwKDyKhPJFjWcfsUVoDDqaPYfdl++Ck8vX5dvyQ/kp7vt5xgQ4pQxNS4I01UZMmnUiejk5PAqO5MLQpuX87j38BWWDgqNQ0Kf5wx/7mezu7FYyHz3NPCosPnsA9h//owA//AEeen90+8O5Sn8R4IfP782bTl7ryfGDfa/8efB+55ff+cl3fvidrxz8yAM6fbUeDfA/C7I7TFNtja9WZbP97gTocQM9fujJhyJflLh8/3vanFgXxw5epRqbxMqQKc8GwRiCJAoVolXTbOD/k0pkSZKtRRq5HMlyNWOpINWuUooiOxXiEllllw71IvCMKJZuXLgwCeqsw4leDudIjmYnu9ljAQYOwZY9B46cQHkLQBWIJqiG0EUTiBErGb/NivG/yWEnO9XpznSt693oZic86WWvet2b3tboY7/63Z/+0vafTo7phph1Y8y7KZbdEqtujXW3xabbA+mOILsPqvuhewCmB2F7CK5H4HsUoccQe5xzz3LpOa49j9QLyD3BbQpyS8a9l3n0Cs9eRek1Xr3Opzf59ha/3ubfO4J7J6T3QvuA0SfMFrDSYPcZpy+4fRXedxH9ENlPUS2K63/x/SNsWasJIG5CKze1IjezMrcAzC2l0c2tgXIb4Fy1b3j9125j9pigoDQ+GWKRogjwRYuRr4BEtSrA/CuAg/6lRYuKQ0XkUbzUQvyPGM+soUkojpjwUZWyh4wKixh2rECDcQlJGeYZ485y2zMWFEloXylXnvzpLixqKVHKyldeOXnkfeJruXmmjfv6DRgkLgeQ72qOC85bkNimTZmxz177HXaqk4Ri1zfsWp70quV1b+O/+0WlTPk6yP/YRSSKbbaq7mojdgJkDz2Axwnf40F+HVcRBuB9PsbB8jB4Ywno2h4/mktSgnQL9wl3rG4jQNbcMoD7iScUrLtJn08sVhuDnIx+Tg7GH8meO5mQi7HmyOiuNkphFxXY+PoiJ2wX2Gd2sKm3mgA51+IDzNzT0hG8wX6a3ZQWC2b/IhnDtylA4DktsvTmH4P7N/jHT4mH+yjv5VTj0oRa/R+lJfmRHTrvwTvQ5hNBWGKAAH9yGqDQsbhrxEafpquhw8XRAh8nD7O88zl5825cIRZsPeY1sxPlz6Hye1ajTNVjrmZCwxSZQidDBe5i4qTgkERId6lcSf5uSfoMFEGxvWQ14iCes4G7dJJzgEEsGuCsHgueWwmnEa9RhMKMJAEOxlO+jpvLojoxt7KbHb8WIsniCLP1iF3U6Nyr2FumbitsYDuVLVd3crLss2jupm7JrUuYe6EADwTemVBREjN8vzkaTUBjRbNTJEcS3DYgQMscZeLRPyuZBqdZSkYbZZ4tJ2ISusJFvO3VPo0RZpAlBvWIGyDWihbjWWoSoiod++rcx8k+TQWNwJjV+fhTMfXVOB9wGvvrcj0BM15Naso6VU3fXGc+3/YBCxqtxHxf5wErIImEma/7oo8BjZmiAR+gxR6wQdjlkdU/TvI5P2aULBrXCKtGC9jxZi81W8zzVSyl/Qg48GY7vdlt0Zx/DPY9pBMNQ+5Hqq6PpJHKMxC12PIXWGSRhUmE+FZqkstiLY6mxVMesPUGSWvZ4TC5oXZiWQi24p2tOjz0VI72VmjIGZsjhPOJiJjpK6APa41KvJeoNGpBppFUIUlUQdLf9WhdBnIdx69b23Cm7rgrOSCjYXon4EIj78AdoMATYMAb4IAvwIP+gAEMBAQwGBDBUMDYHYWp3MQnys0z9ZBv75j1YCCGKG/xj8bLl/h/6FsPY43CRTPiiD8LnA2IBkVDoqOiYdGI6JioIu4JaKCIjTo9IJlXqBPNpuczPaYl4aab/rZJgaST3AbSkFYyYNrqA0uG5WMlJ7ia0Ws1WZDeNj7MFymK4dWNyyqlBCqjQnd5fSNyWEPiCZ414hPjrjQWv/DTb5/5U3vQ1DC/HchDg1a8/k4C1geBAvoLQ6BIlkJ4RFqnhEZlcU29VqABsefV+O9ZZrMq7Q4NZkTj9DiE+dnbgTLAAs5+IeiqJLxzMt5WaRjZ+CooQ/39gOA0Uqwo1mwl0dxOP/Vk88T1OaLNvRyjCZEaQ5RvoC0Llj44VATxraIKZTk2GOsxKqWsrpZK6vKkL6wmwUW2NB8z5qklam9khhmLCsmAWScr7yl4qxdPAsQMC8NtAehV3kqOjnnSOaCJH5GS8BHYbHgQqLalEDV2R5bgibChuC4vvHhBmYU8pV6DeXclPkriQ5S35q0x7tUmTrVU0nkFoyD+koHa7FHqRSq7vOf6RD0O1GHqFXap5U7SkPuWCrM7gUbbdlsTNClL4191q6PsI+a0Oyo+TootBXFaIlsGjj0pD0xzLlGx2LKypkG9h9Cx3rLHuybWLNrhf4uV4+Gl49SiDRY/nKaO+cyfdIAkRNEDnZi3UhAhvF44XZ57pj4Rgu+SMz35bWBGV+HMriHMzlCoU7M6Sm9gdiEWC1Ov5ciBcKcrFna2qKFOOVE3ofwDxgEg4bxiKbYIkLUgZbkAUHBiJQJULUhYLQA0nFiLAF0LCqwXAAZObESAqQUVbBYAFk5sRYCtBWVsFwAOTuxEPOXqkN9Yul807DP4QMffKaGGAbBN6qcPpf8Ivj8xzvAd5I2fJXkQvCyMHzDwuvGLpA+C14Vxgx3g0XDad1CbDum3riVOjU8fyHgns7vmTj2pcgCAIHNZL+i97Mum5YmN5R5wgpPByc8Ke9cnHHopnO9MPOuukkU8qB9PTw6XpFhiyXhZ6Y43/KSwG5UWcuxux2boxBd3CbLPNJcrcVbaUcrhOfkqzuJxu8pHDDZD+fAn55p1APHR1T+DWNZ5I7TkGXHUL3VnyjzKrCPUmpRsY7iUkR0GPGVlVXAp4zoGzlU2fNsER7/Lzz5RknhqlOyV7GOA6hikVOwpG8YqdQLl/Yta9uwed4NwChzDwTGxkQ6VSEHNhLdVdU0afkOpbojMULdW5eld288dobzcuvY5fEJWmNUlT5hduJu1RrIKOyyszenDPA3wYhM58cnHzYC+fz6DJFgyK5/9twllvlJ9DH1mFHAxMp3u75Lpg0zQvIlYhZ7IpUiCizi3i9nmviaH7YHNRB8acizBTKGKR5MgflblJ0vihwODouQrYo3pqhy0cKKW9FpFMpvy2jAPTZg7xUHXNYXnU8fOvX5AUQ4FT+OmyNz/GPQ1z38QHkmxS2ddU0/xV6afpnXNFL1o3Tl+KbjAi6zPuoIerHmyRnkdHggVEOVcmuKg0pgLNS3jKhsAJANQiT67R65/Pz9PQEkpE+XK0KfRNHUr0/ftFagadaT8EYELQpZhzMywMVdEb7qTzN9NmUe2azfnTTB5Z64sZ3VHVHEQcTJh7PTgxu+aARmTD7Pa8o/A+X1dLraoNyS8fyFCMVyBV+s5uyhx4OkrfSsNVsuF9ptClZVIWDsPKAlBF8XK6Bm5slS1IXhfVOAfQrFfVtwNpwUX119mVFG4ony9RzAFdMaihqhWLCIGg0DSLUrW6io8NKLg5HvEjfvqqJrLI9QnOW6esDmq4KPXljbuamu1+IC7G1LWFjSiyM77wPWTme7diwVGoiaCuyTFKN1TAhOTiluArl4uZbiqiZpN2K29p8lFY5GYW8uYOx3j/LoW+kbiGUQFwboNdczJM/NiGvpWRXwvEUL1ZW1L9c8A9Q1tQp6RyEGcKAf0lScHAQciE3ojfyCML+G6y7l6yNtEFTELa+OFJMEFCrSCK8p3apsLRsVkGePiHmC/Tb1+5uWPCDqpCeKIKhOEm0ZaKqUNawKelsO0jIc/fc5/xVvkXr0Wv6yWBgHfuGgiGsIkOI3sShIbGzRcEJHVM03C6V5YttMFg4Fzj0v4/IULBlRHHns34rtirYgXQ1L3875TJ2GRj/Z8Hoe4ibt1JZAVOnXE66TBYztBa4u2rsZH0grjPKyQtdzOlHL2uDkdaPWFZETtplYD92Rz+9N7jrvpP79+31Y30AbzCtUI06KYwFBFx5mLgBzQkMZI4xfZZ9YZHnW1XyfPNu+uiCLrc43alE/302vklViFdikJF9QGgnWa/WI2PF5WSDicgQpIAkJJUwPuiZ0dzSEpSxW7HHaJDdAfEzVC4RcgQnmgJbunK3Bi/7iYyRlKQv+snRbcZT1KyhdR/kZwqY2m/gdLXxrHfGTkwxlzCC5Ciai3+4MPDR44PvIIM4hZT45BMtHMpsJwL6z2xOYBBLTZGHWp54tkJLxOIozy6EHWgj5isB7TOVEkQbwolDPRgSVqRcdZohduwFnaxVJnK4DrgS1HDKVg0nhCxHKEz4V23nE2gtsiAQv/jjYUXySsyXylKKoeg6XccLHNXuVEor9k9Aauy3E9mcao/ucqkURI22xDTp760xzjtlbbtRuPsVPiK+WqGLMkUnBcUbCsiS4vb7lGkTawqF1WbRJgJab9xO/TXY8lW5mk1IA+1wq/TVEwW5O4oMRneMI6oreEVPebMSWTt6cUSbl7yJOjt1Xm/U3maekU0ZV8SLSYWzsqDU1ohRHawPsMSIId6ShHlGWwNMnlWhFOas+8W/o3DBNs1bY3/RoSCe8fAtWSuViIkCjzDlDuH57FjcOfYKiSlYGEoXeYedSXMtw1jLdZI/YRRsrWRpniNguDhIbKFNKctdmzkwil/eIlln44IQaTgb2fey1c6ImIKL6o+95WHIZpPUsUv4PbZ2NW7KGqc+w50oEqUqmD/dG2lcSIvWxlbIVBXf0+rKhS3PrkFRub5T8ETUuEyd+tCxFblLlyxJPNUOsILeEWBfzBRxJX24QVKZhrL0iodasWUzCdEP9jL9pKj7CMU4XRjMBDdZCcbFhuiX3qwINht7CkO7ghW49Q5HhTrAq0DJqCejoSu/jeKyTCRk+W2bMnauB/thB16VbMoq3Nk3VYtnX1RO0m2woTbUovUiM92Y4H2Rci2B1ViDTgcEYwsWTay0k9mHZK7Yh1IkEvz0mm1B8FdvDzVDaONOXL1+O4/WRSn6GpGaiTlBAyjhEszsw268tvFJRS52nCXNC9umRSZFG3FPuaS+3zflY7vCx4AVHBPvYS85yHjQouDp/lYcU2bFRMmyeGnsga6Olq4Ye73wQfH6cXbC8MLEzQqb77hf6X3ONqNp1nf5cnhbEriykPfX4myx+54hW4lfy+3/lY5UI7qat7NVFt7n4SoQpOSKgTpD7rgU4+UiiXj2+PnC61P0w4RSd2OFFDM/AAY78XuJEsIRITPaA2W8/qge33K4ga3PvZSfF5X2Pf53ms5zwNehyk9+yoEuaN++JAjzV1mYbC8ci/8Tafm6GvtE37cb8X13ojd5BJiMzCZKERew9F9V4aZPe+pCSLQgQWUYT61TlYgEF5LOXn2GOtLAkXjPhSx2TCMMLIfNZXo3nQN/Pta0KOueha1DVoKa8jNtxR9bIWlXWTTgAnCxI6KEx/cdwv4DlG9vYfL6dPfLG0WAAhFdl1wifgVxAs1aYgyTc1JBVbo1mrdQqlG+u/wZhtqANL5jnltceIpkN3H/bdty57Uh7KFmkuQknYAb1CsjhBAPzu92ZEpyBJZI1n5oFk0ELLFynQRXS+IUievpzFk1C4VQs1vO+Y/WA+StM8dm/bwS1790Iiteuis8jcNZdKcW1O1pYeJ47YtePxacFs2d4ly8rReO8QwZIqlZKRmXm6qEaPCSbfWvuKrgMsfKWVZn+Bagw/uLAybBUcS4Y0JYwNXdwnw4AMAFXgRfLY44Uu8sxb8CT7xry/MH3ahAtyI3+2waLeU0YURB0XGZV5iw4lPyz6JrKOAG38WUXIIrAG6FS2wpsptaWNJu1g7T8SJIT6/pAVY9eYa9TLqfmy2ZcduYy+OSv/s2DEJZCf6TQhOFgmPxwenAg9TdVfEgHZ8Zg3RtJq3rqGfJyaOXLwtnFsAahIGBUc8ka6zvx2HPpqT5OiOnMEECSx0pocT9n8xxzGB8gKk+8K+yYz3WjUa1xCn8TrrKPbDsL7P7LVyYdZXL+QbSieltaq/WRZn/WQROVhi+CgYu2IjRXS2fOcDz3622S++oSZXcHUFGKu0aa0k5/8gBYXL92P/zlHaAhcTuSBSdRtwLeWs/UT/O4zcoTNrPP01s7IqKhCEUslWAppI2SZE8NJsb4ZYzWpdqCoQ2WA8dvUQC6BmDh7ePy3qZU2pSiPdr3irfdDr3mqCzguu6Op7E6U9GZ6350vucqS51JqVaTYo2nrJposwL2UZ6uW3EdTmlEnQr9OCkzAo5FQwOjAT8BePMZHtFC63Ec3HhaNCVM5WCUTtsryk8d6Q+Iz9BSEQY+PpBBxsnIiOPrV690oGGrC2PLsRqnft2c6zJGrT+q8WPaHVyvFqZ9mlkpkSE/CKV/kmmJuowmsN6ARITZy6enfk8WLkAukZxRo8d2AKfiYsCthIBNNP3KwMpxn3X2lgvKV+ky/YktdrxSC2f0hM9Kt2IzQKfYh3XL6GQ9kmhecRA/N/+ttx8tmv1i9NTliir96s/L/Ffh14/dZfDWqtk+raruqGFVJVx+5VbQrY75jAXf9hH4344Tn/dIpWf5Zfs9lb0faW6vZ1e1tI29lxKMLGiVxwD/vU69SOEZ6A7xvF7fO7xPaPpYBJBkuXopnMVAS/7CK5o5BomAVgcaCZFBBHREkIdnw19FsDqnqQqIsCZiUllLaUtNpFQMxV8mUF5zze5Ad6PBbdoaPc2vXlVhX1Dbm9gNrZblXcke/jlL6PFzcN/tk92b1zm4o21AkUWW7vHHaeZywcljVrdJ/6RGvisf+uqx2/KHKXpKblhS5zsUyE4EN/AEXWMIvXus69mARv0z6r//s90aI6XMyfUGlUZn7xqubK2P6BdQdVx1XH8f5xpfGXhc9w2PV9na3Mdq2dNeyarecQmvV0/m+u72CvQ75ZvkdOrx6u/2QPj3Voh2Ny7L66clptDPWP1w+UkcIrzYeR52W1btjnSpUkA03RpFC02QhFzu1KR4W4CDzsSXrG5hGd8ELLJNjWVFV6bV4GQOFNjKeQJqfl6VVTVVdkV35jv9r1ywbrsnNzvt+0Lu+46oC3KKjz8S17eD3gXXbxO2jh0fOwSPjOCGsBBaUs/0K2jqdFAJ71MpztAUPgsG1YO7sHs6cPkPMY4gyE/S5DmagHDBYCMaagTlpCbwwCdcoLF59gHcA3goCt+kRUNRtx2mwpMbhwbSpouGrj2xfec+XKYfMhkqVV28RHrrOE5K/HDurA2zwLc2cu0OHstYm5+8YPmBHOych2Ye8mlDecCoqzctMYjCTYpiWN4POXALrPTAWy5IrxHEsroD/Cx58Cz3U0/9otBqp8B1I8RuYW0qEMwQx3Ih4AYz+szXnLQa8SwD4DNKtdJ5YiKgwibAnMr3RLu4RoZZcy8BIEja3SzRTqalq39c3SavFWGNSic7nd5wKjsLYYOihe3coMMJGJyHfuZxdyC5NyL9aG0JhnhTCEuQK6KxU3LkFYYNTHN/RL7TtiuM30HC9pmJweu+YhMYW5YkCWc5BmmLF1Pop+aZd4brs4SkaWxrJh9qTizWKmliud5EwmB1V5Q3YfTY3VLewujenveDg/qnBvMQOiQnSqOESuLqHYSVYAkNzfrggRMW1UJLfY/WVht6+PUh/jRqFQy5zr/v+/KQFdmveTi2swyFxeOcoX/nsWgWS6GINrijMiUnILTRK8S2FterpDep7lxgm5xaKUhJzweUu1qcIHuBwPdAAKHizAS8zTRCXlW4QTu+A9oP0CvQI7slBeHc0L50DI6bmZ6KjR9vx+SC9XD1/NcHTC0DulSvBxq7kV+mBDuE6VQljm10TghPqDRbGOlVxs+905qpCt0dEbQPCKmEw6/Q3CUuIfAPhVHUl9E/9Vv+hor8r7cIBP+xOyoGrByg7sb97ilrjAPXZ2FhHKSeuX6Lsqso9lbC6rTevx3lL6m66cPhVO8WKvNddgv4BR9t+ttMWqDWHZM0peY6uONZzAdTVDDdjtc8jy1aSx03eUCBdp1iP6jUyazg461GCLhULXTBRDL98LFusWIt/bGHDQlLYCMUKBYKNLjHYvamn4an6G2WFf7E3hvJN/cMQ2xwGqwIXT723sAfvWwPWa/VX4s4fZkEiE5IECaI4WOwJFvrOQowveFAP3AYKrDJOFK9OSY0tMhbdqMobNWzXi/ZRZ4UYxyUmxKbmZBjG0ppBlaD1hyq41Sg2WZKQmppvFC2hxF54mqMPBkFztz19YFBuUf6h51H8/VTd9zlTen670mOCkw763bPNK+tObupfeeP6ytEh7jziw4eG9aODIiSRztiR7mqQ3keTQcXAurywKI+gjHAn1/HZowaGUJPdSPIInUus5sfVugrCBLUkfhyxhpvNIVbyY2pd7BVc+THEKo5lfQSVxiVxKxUxGvH5+H+7zxFBxG3HO02eGfeMnozJyOQNb99GaBoYzKsimXPJNL7/syH+QLw5PBoVNShuqE4VuMJCMngkv80Rps7mFrj5s7NNKfKy9VpHwMwU6EArmi2RpXQw5Wmo8xgY5hX8ML4CCdV2vVCcFMvxIdhxFPtfKDID/aH05Jgkn5JtJSVnSp5ufWavtxUEbPC8DPRk64CU3oP3N5XmlcFySkt7Uwe57t5EmIOTa+Rk+q7pAo/xG1s25WRgVreXDRKm5N3yDSxiaWxko1MybCsmblewXg0Twlja08rpOXWYyojw4TygWdUEg/R/71VtO5wUw6bhbLlZELeAtK3xcms5l5NGJLnFhFvEWlBjyQ5p/Ym7HXePD0+aA5kaG2sRbuEWQ7pojPkYbB/8EYPF/GEgGX92tTDBLARHBy+43h3fGGzGt11JEbDs6EPd2VBYedrl439TDUCA6/6Bpwwwbadafax5ZZ64OI8zbHWNlhDDeha/1JC7t4y6gemrufrdmvg5Yeu3cE/3qlrb9k7HmYTk859rJgSCK7uLOpsG+slpDg5yry8Dbzu7V03WhpKekUz6yO9D5B4dLH9P+oRy5FkGOfak1RSIhFc6UtigNbFIeqyAhwsTCuhIev3TE27HixVs8INArGxswBASFGJtYwWBgvRHU2JrdDOBbHG+0xFCS0wK0BLQIp4ecbgfG7J1dBsNK5NbQp862rd2RuK0gcmFxe2JEG6S/940CIIY7BrYHT+BjbfiGxrrAA0XNpgkekYpGYHYVBIEe+fG/difbf247JbvXA4Y/PC2HGEtN4+1NtkxoYhTxE7MdzixDQ1GtwGV7mlzDIz5QDcWlAYbEpXm+xb2aJOC0BeUt8Pos15KL1xoSru6AG3ZiQnVBP4MGg5dZ+ztGcyi0CjFPE8B9oeDbQMSYv93w4bdjIGSaY1k5CTxL3ESSW6kkWOgt7BhfunYJzu6BW6u6uYn3LMVKctbm9cYItqDbDzeaBnS7wJWu9fTfb3LCxyhMZuXFJ3QhZlC2m62RU5huhLWXx142Y0E3AuX9e6eEZexRMN6Y6Iqubk+NCqAzi9OLQrl71i/X2RAKL/oUDpid/9+pUq5v4ftUe3hIPbMzvT9d8LpssWUGT8OXsoT1LjEymNrXXgCnJQj5eJoial1/hDXOPNi8FLuxZ6s9Mycs7mSzKwD2ZKM3LM56RnZZIyPno+br76PQnicnyESMuOrnX/8OGTzVF7J+rryOpJ5osLTCoVauSwGk9PEpTNZa1j0cps4DD612U+SEtacvIK0g4tMgWYiePK/86lHXb6Q9T2Zz2RLKG1PbaOMipN4VzsE+GIa8DDIW1uHBTTKEu/CYd+K5zcGkKWt4w0CHk4FX0R4uDh2VBpm6ISO8S+yE/9MsC+CHlLsoZzGeFTAeO8uWw9DQ/483CXaICqL7Yig38VzcTho8Pp4hM/7Edxt5pZoEieKcICFHlyJGWuO7N1pYn1I4ko5XoY9BlLcldZvvlG9mdvflVA1mrF/qDdiKdhdPdsHRppGHteuSyzy56/OrXpCybGh1tBudDKUDHtDDBFjTLkWXN9NOi4LLt3Ntbq+C72xvGGbyz4ZXKoNz2voQG8ES/OLIR0zfyZN9U+V5kGypqVdiH7zQAZqnirl+nOl1FdMVLB5P6ZrWgrJCuFK0oEK4OZwK4ZabJtemP7fU/+t5VjnckLxgvwz7EK10mWxPqlIVnuJ/7E2No9WG+AfB+VI0q3kC2YVKtUj66Fskum1DgLIISaUANvB3k29fHB5guqMBvigJSoaKkoYTNgkHvSM2i697LhHKt6DYH2hay0SqdLxivThDvWOVcCHQ15DXUMsiNFAMbmqO6FvystUapquTh/K+PkW2NAwGNjRoH/qdmOaimbsedeTqUb09MpHtXtVvduV5T0INdPzrjcB70NP5IcwAgejn3oFgYwQ/ujxqMN9HHm2HAJJgiBg4RAIjAdDQFKWZoJtubL8vX06cNLUL/2+pm+f3cHglJ6Zb+Qhc7qDcNcv0nK0Pzo8yZEf5IzDNyOx2mk/0pIV5cYBrUeDMf7kIrdEN0I+IQFL+uqo1oeXXI6k98V5nd2jSxO1vBDq7C58muafmoAD4adimO7Z8b3j2xL+TN6lnR2j7rVnQfYrdDADqm3GZLx8+/Z1akI+EX5zH6XclrzJLJIX3a9cLa/eyO5V9gZ4fl69ura2srJDGZqOS3XgSQOlXOnyWq6Su3w+HUQzBYMbkGxDSpxJnkUsMJXp3Li4OCLb6nZKmmlKcoINg0iEsBJSU0xTxbdZVkRi3tRXKWlmKUmJEBaRaMNISE4yS059xbYiyHAkOxwZZ7euRuKRPSnBcRHBNOoWncxIKk37n7I2G2bjaGUHcbSBwZwgdlZODmE0dq0QxgpcXSjKCgwXiuKBPAumLeZYOA/q7jwMhtebG8z2yXbzS67u/3Lgxude4gxbUozDIYjmuC92Agv3FfXNNeJUtKMju/O5R3SAiy82jOGYa0pvl2/xQ9pCrQrdG5QNDs+QZghj3BasxNVcpbuhvSLz66/vPU1DrDD88Tx7DCZso8H3NuFYG/V7wuKrAzdO3//i5Y3oXn+FX7TdDaBFp4N9ZE9jvfAev/hqe30kD4OxPw268Yqw+P60H2c3dRQUFO5d9DYMqpCGGnj93FsIJMx+tv/0WodJKwyDvBfJFhQACeqdJ+EzA36qDoJ9TyJQTvqQhJ0GQoqqq6VWteXVRZCi8ppaK2l1zRaJo6+jK1HkSHYSEV3vy3aibK+T1xlmF3GzbD7A07k8eMaHLCsuNyO/33PxuPD036kNMHjDWw0HxhxecXLlyUOrOmmG0Ji6V6Z+la4xx8RwL/1oP8pwmNahc0V8z7B7lEdUc/rmE9No9NCpx6GEw0dPDaHR0ydeczZ7RLlHNaOxL+z11kfjENtoi0OHwKAqQ6okzPMRCXMeBNlyH6Tbd3vXCMovlwLZrn0Naxsur9l+3HBrD2mLtVEG0VSxuwnK2N8YZeKeKrDrwNUTC+3Yy1+D4Ioj4FwJhzmC/S1MNIYQw397A/779GocQnpa17aiWsAh5/pZ5wgVqw+3DIHBD4yw4TFeYKQ5oYlx7+hydwGyFYLsd7XV4WcTtOQios+oKCU8cHq7VLDDbClbpissQJlZZdlxFUxKHP7U9fu+oqmamNWNnIZ13ezWf4x3/fx/eGD9GkY1UUUkMUhrVTV3Jio//i0S7YZWZJ7tQI22gD5OjsxA/FktWGO/oV1WpiQPr5Pk0QrXJ/WNBY6cv6s/7n/eN3GYuoD3wBT7ehEk6FfWd607wz0L7SpGurEszZOhxGqH+NZkdxVWczmDwODPhbM5qs+z3S9TWaPUVD4PrIuzYzjMERvKWoFO9VNVLegmMDcbTw1hrkCn+amx6rnHWphfzVoSovv088435u+jdfVW6D77vOutpT1sQ1STfY80ZjxwCls68GyXlSL/nDjvl8vpFHWSnr0CierTs1HV5cbBTvcGOW8EOLAwglavWDmWVmE8PXqw8OCociXqT54inDO1p/CduuVdc+1moooZkauceL2CKqDxIEWh8K4hKrd4sj2rgUBBeN9CX5FaJNmgk4RXrhxwUyKQ+IEcqj6Z62bj2ta1pHyLNGxhPES+2u5vQmHqYK3CyfcSVT29J43IlDZdsEiPrB72F8nOxkWdG0tQpzf0btuT8iqXUuTnxSpBjF1LihFVEcuYiowRzGK48njqgyrMVdaMwIBIAxhG62MJu+B4xhLWnoGBkXBYPWGiQnbpKtaLyTedCt3KKigbGds7nRLIos/taey8wTrDwoNX0Ap2hXqjjNRGrqCF9CnYQ9EW0GvU/ERZGMaezgPk1P8UysVXh8WVu/LCeOWksDi8GiAPXxkWU+5yF3E958VXcRbqIzxpNBLNc8FStEgK28K2vX7MC6PQMEYY9/jtcQ7Acdt//R8f1kHq5e8ldbjDx/7f/hC+btuPwYX7uA+6b/IF8Q9xBjYiTdweaACy0JWfJB2FnZXe0J4c/rDFq6WrhUW4b4rXKempTS1RGzJWc15Qbe3UbxrchDjDdG/6wuMN/3KDO/MMYtP3i+zUd0ZDL0AGm9ukfV/X7+pTy8EmPsvVqaYK9DufkV0EU97I9+0wMqO/SumaqTc/eHfCjrv3Ofqku2DiQkNyiayrsgeklYjwj/VNprUtCFU0SQJ6/DNIhobI+2hkYFTxhvFtdBn9DmmyCq0uDgWfQKUYnwt3+rxM1i4q9nzxIvtF7TJZ0ajHrZ8/R9YslHTqofONwe6IlSG2a2xu/FDfjwPm5ikHPTDMVrYZoa/fiX6MoJfAJUfXhaed0hwd9I0fcDCpuvfSAG2l49z8/GMF38GjmlNpdeHkaGtdg5d///r+q+N2fNPdA87ITgon2kddG1r+jIqy2cEDVzpNyNZ3XVYYW446lu9QvMF4b3dBcfz2DEH+bzbnqdrvSNIVbhvvhJCi8JmSnr6FSPP9sRoVLWUhyZ/ASKY/MHRCPrmSwfAVudJYimRF0rF9iA0bMxBqeW9Dr0KNyNi4wf33zbeHAMufMW4dQyaXYaksRZSCx1pwQYfv5Nm6lCnqoOSQjXERpq/r0fyJK8K0jmzvqMrSBkA7UQBYk/L45TmqFB3cqtAX6G44EioNQ5Zt1UyhkElAl798gcIF9YPQ+6+7WfWKF2j6kdnBXb3T6stedygvIFmDejVO/HWmgrzcOJ8ojJcNHUtR2+kl6YHabHhlZvFZ4nRJboZZbGQJtB9kUKuPVVOwEAYjCkOhhKFVPR/2YtFap5okHX8xniMJDB2BXG0ncNOooQOaMy7WznCStSvBOBAYqNaUbcytLFqp/tCyZjkaiAvS/Lx9NvQC0eCK92e/DIC1DyhhKcwmuceu/f37tyMLJcJ2YP8mpNgnsxQ8HzD8dTQsa06UOsaVpRdijcmaE7euvcSQmR6UFPQ3KBRFtrd/riqHkyFl9u9ddZw+2FcpyrwkpixHR46Pqz8uItRZYuavb0H6YO7kuEwEn/+cC/Z7+yYu65f2oOP0iIOwkRnToxAHcPFPttA+gGzbGkVsGrnXar+K+mNSzhGtzaqvUDTDM4zNzr6f8ijFlORESdprOsWKctJDKxtr5O5AS2ZHJFcXrF2nqMKdN/qzJU2YclBQSYrsEFrSZJU7q9hCh4dRM4xiT5CPbz8f0LtT0wtZ6NB70/49swlasEJTszPdWTCHPczp8IpjZl5Om0KWSv+rygEhrCSZotELNOJfSPaUCujUVP6RQcUrzJxZz67PnJ55ZOXtmroxWkrAKyR1rPeOT3QMdM+fGeDa1UbHtZAyCf6KFMp1d+OxqFX2IRx4Lm32itqllbwTozobjCoMC69zSHKEMV6TnEtD3qImPAsxVZCTAlsXBnEUL/7ZwrMlY4Zu408GvV78q4VXS6aOGWyASYjcy+stsgknuRM+UPop3OfCRF6lF3FfUBhSUO99z9p/ZM+wDLweCHIKSnPZ2gT4//sQ2C7AWwZgu6v9JoCN+wBOb8V9YwcRBMjWIn/3RPAvAI9Wtxbp5ll3Xw2w/4Jo/xCcPTnnl7sQjiXq2c5kGRxlGKbfx8xtmf9naL2yO2Mrm7beL+Ql2RbPIqIzNQ4CYOGWC+n/AIA3nJyjeiwVygz2hcGhED1mbhVamPvbcECXFg119ZQEjHV34v3KraABoBvZ29P3xOODcoaY7jB5IfqTNszrtbveX6R2jps+YBLZHW/ZBZ/fW/usc6S9pmAFnpkBzFcxKuRwsH5/9gr2nfrTcmFwEsbnFrQLDiYPMTh+iB7TH2PmbkOWQiOHQpoCOLpVkC9fQa7Dj9H1hPEi6DXeJQx+zWIoC/o+uFk8ATB4mNy1bbCE6DFzb9s2C7XMraHX4fRYjxac9D4zB82EAzNoL8zcSeAGBhnsLw/XA4zRr7h6CLIlJY6DMtZQkEVRAtWMqaEa7PGPQRCoozySZ/6Tl21UxVmOtZVtR2Qj7fY33U0Rgm6vNBiIiC/8IWs9MCdK4gMVCXsrEvdA4kSo0TqnpQ6SBd/0hV/OBfKhMzzeSK2zHGeL1SPCkZwsC4UpKKNPzRyjev/vnHaEm9TTbGSPQ+98iGmO0Zdv4ZWsIjJTwEnMSljrFGjGWK+VxFgzAlzSJ9itJCInRfxRSSAUpFAUTTVdaszOaanD8em1nOq1ktNs8FXdtEc+HdOi6Wk24oXpXU828cIzy0R0biID+KYG4eOz1XK+oSBJ4lFQYz/VdMrWpw6r7GFplBnLyc2C08tFGIAvlMF9VeIuSELmi1EcLj503fKHEVMnAJo8HwAbU6cDYGP6nwDAxswpAdiYPQRINubOA8DG/PEB2Fg4Hmxc7MHG5WUBG9d3BGzd0GALb67fuHU//vZDtbbuuDmPbt03GT70QA+AjcVTwcZSVr+yi+ULiLPfrXEyAJnTq4/FkzDYYeF2nmKhUfAdsWlo8pgtnsJcQX/1zTD4Gou/Zfw7QV8KW5S20JZSSwEArVE8hjE+lqzteaCommpTcDJh5r4Cj0k3D6MIwi64K4UQKQaa6bl1UBMZ9RFTmzUjXNzMUq/wV5HJUDnlTijMkxTnLNWzLDOz4KB+iqidj0e42WMyj+oPoEfnbiZOgAIYRcYSP4PEi6EesGz92ZyWsVkGNOvqn7/VbvKaJehMPXzPERE2uoUFeoSe762FhyJxHhIPoW6+55jTZm4JOFjwc89sDk+5/JbMXN9I3AqPJVqoUTCnpY4WC77JLA5ZPOXyfWd4ppFaNznOFruPH0BMNgc5AJPdFk6ywVd/V312czFxcP/YNEcYqgGdGQGS9fnO/TSjVf+Q0WdIZxyaFOc62hTFtdrNclu7Z3YAP6K5zu9M1tJWTeek5EY0l7JddEOpjulckDQiltluupOhgSTO0gDqROfZspoye9ke6YYwSjfH89JlM5+PLhExKyvHlCvjZ1eWlaNWGnsedSZtv6WMPjUOpH2zzGnd86ij7A1Lo7RuLTVQHi+jNP6c7ozD4XA4HGXrO3GUvTrRpCj8JJW4timEqZ8piici8Ugksc/vjeJUkbgbUtDT5dvXHn3lGZDwowBO9d+/y4dn9ffz/9aoD5z455pv8dfy8Pz+v1P+dd26O/9OJvtvLi/+0HO/AHDa6S3VFvqYf59/7ng2TV4m07iarU8f/tulTuPozs35eTR2r7mt0s92JGzIGTmo3N/U5+hRoPfZIEYyPJAGWEDtPTVL44Vnq19vGDASYVUJHzOeWk27zznKATE8AANVpVA5NnY1VVWqbdO7GxNg9SwUF2RhPZ0tuFCfeeNbD/Gs+OrDY+74niNZKD7DgM1/9CUHVXnqzMV52qQXqzl78jeNSbSt/4GGn59ag75hJDcTdeOuxosubV3qmtqKAWIkwwOwEjV2sE90rwb5qj2QneRWaoUUK9Ab71UmFXnVYBgcTt6dr32GaolFIL6VRy0eBqg8rUahuq20+ojulWZuz2MDPI4Wi0MfgAVWyxaOh3G/8Q1L+IG5ymJjabm1fkaC+d4zeFV/1xztq2bje8Y3MD7xSy0YZz5WgnGpatTEXEGwhDnMYD4YXzWVw0rtpZNmWnjMazge8IJq9EN22DcjUru4PvNTfIexBPF1xtx81DX+mgI565jBIJcb82pTMRqti3fYZfTJgOVqPL5EJa0Gq8NUM+yQ8cMcSe3+Vltao92KomIJPzCHma75WCXtcdyUmUVOZY9+SYV+UZ6kTqquJhhv40u+kqvSG5Q8nT7D3OMbWMIcfmAG83zxTKBV1Yze4OvH0ipQq6k9eo4D+l6xgvEhLy2Ov1CNRbrkZ5tg7NKfLId+etumz9KoaRt+Zub8TH3YJbVn/7DftefUvcG3Vb9lpsec4g9d21w3hVBxLhB23jviDP9sTdNcodT8/jKddedXvIJPM1nP1ujHJiDn8Ax9jhA8pKMbr675uWHofweFZXZyTTXCk7FyxfYfQwG3tH7DpPRQq58G3RuPXUnZaVZG/7H0H9o2GO/MudOg5x6JJEnKYTArpX9zjChWLusKGAN9ihF4GK89LtSbnGAJPzCHRcwE871n8F+qRhfGk8a3DUv4gTksYiaYVynC5tgO/eUVwBJ+YA6LmAnmJUmhW9aIl95gV44C4+tfzlq6XT3hOa6wmlLFEuYww+ZXmFs5+VXW7itWVi5gCXOYwbxdXRgOXxFXZljAEo4HKOpdmmGvJcailxvfl0+kNs/ULRinHz/siujCe3f1cjWtmmkUa99OM5peY49+ObehP/LChPCZxdbs91cg/tX3NZZhXCOQ+wxGNTwmjAetKvMqfc3Hx7dWXqDKYWAvaysKlm411wI/A+b5YmuE/qsVeKAL6yVLaS+vmyl/4xnrurGtzK3uTz0VsPR/xJfl3LyKBv1GM+QeoSZUgzKZYQIqjHVV7bwmC5kVdiN1//3yF4iA8uCZcUI4KGRdsyP1Gqelg/gZp9UYlyt4/oSsQIscqMv8stajDM3L2AnbEUgrgJkwNqglINKUxEX9P33mi9hIZ4UHI5ixIOMJs+IFdGDm0s309u3r7A9iggMkoHrutmDsEfOV9mMSt1iH7Rj3nPBw1B+iMMqqA8hkzfAhcMTYxxFoaRvKcozd8MwItkEcoqsOX1j62jF5QMen/Ubj4daPg9irJ8klQsCVhVLC0rOs0lLIKvL6VynD9unYDAGUqAbp7W20iiTHL7CnDS90HWTdZoxtjE/nM/wDeJSZpuK6HQE3+mlaTGnZp5hRkeJnhBoCEcseepSw59jUugznya1ImIA+hlk3brTTCPFKhnQl4LvNVBEpjE5koSyCtXJB+EghY1iAgU8fPdyszLV2zrzLqY1+3wX9wZE2umHzZljXhPUNrgh6ovjSTrY7RDg+kXdfNwuDL0drpzHXyMw3WD+70BgBb8OQGSa1vKIw40IfxsmkTt6CU8gJejaTGWfkwFbqJcAT5Sw6KAS6oNrpskyc+TTIYJyng3VM/sjGqKqDtMUx2xmnZOLF3G8IlgjYIde9QlN456oULO20KK4XTcbHcq/keuesvCDuUYLC2di4bnrSxvYn7juNOYDSgp/BshtHYkPGNKOR/O6McZrbwvqi2OFDxdCNeZSZIZVnAXEECVltz1bZ7jFs0zZKrIxUJzmSuaJ3JW7cYzI9mNdA8qih8oALBr4KjkeHPtV4+TgukqIZ0MiPcIMLadeXyVERje9i2eMBA9t5YMHQMT3D8kUE9aubuKjrQ2OoplhzHZkdPUZhLqtOQqLQ7jB55o9naO9oAE1SkM7vuPc+AgkKEQ5wmk4XTDAQTRUYjwSf5RPkPdPSRc4icPqPNOfDuEI9wDFHDzDdhKEifD1eVen0c/cCeQidyjlHGthghEtdWt2B30VGpaW8DM2GmT40wTCdeE/gTiUbIheb+zmEAadeb456md5/cj87u+alzFsUsCW32RRnsDFJ7kDo7pwJ57lhwYWdle/xgFte5KKgVEpeCs+G0DQtRuQ/LBMHEJ3xtIiC6JJSyNwll4wdJ8TkFPKq/OwZZxdyVkFgw1ikA9vbqm7/5LBWM28QEo2YbAfnC4a57y0x32oY91hnIUZMMSLWhovTuIMGhmfYTtG1EAQwnFC5TaI7mIA+6MqM5dbzU9F6nXEO/eNPAiRtOf2GGnMwIA04M9X9JS+LGHGOfhXmqFFrWhohJ4SfEOfmuEID+q7NwXEpm/2bJr0ddbeiPHg2XaDZdTO6PAXY5azvzJzkNA1QpbiRDhe4jeR9IPpSvEOlKRCwvA2rvH87Ep/cRaaiDu6d+eUQ2iS+maFNi8I2JsS6NrrghIZzNEgmVEYC/sLT0kJgop1QQJ9271Ncra+24ROsZzEAO6WNeIV+m8GATS2SeCW4yLGteYwBjJcHuUcRXKFiWBvWbUKw9KO5l6ei6/PMCDbRSZYEFyo+Wh6Ze53DVuO5fSiawqcEe4284FL6ZLv4wgtgBKu4kIkROLfnKLHt6elh7m47GRxpC8/vHMEHYoG1ox7Vpp3GKydt2ZVBv/ySx0MZ3Tt/qHqyXmu+9Pbwvsm+ohsHRyGGnbp1lN6d9ukj7T6fl/btW18kbFsiSLdPvDP7ncZLh23Zmf1FgExx01T3Yna1igGbo6cFgxDHlhHg1QplZ/Jte3gcTKjTaRujr0nRukf2IxKHlV4tfcT63TEwGmnVffMSaSR7UNuqAJnimSwGjg+J7Q7E1ndpiicjBgFgaXrocuvaGvx5/BC59L4tPU1wfBa5IRELTcK9DFgjxghgj6/EFj32VBRskcDoiGawPN84N0EIhN982MOECxvrRsLADQvDzKHDXpq7qI/mXfdtxaSeIvi6peLm3JyajHXYm6UHoEN4TYUcz1aZJciMS7cew9ILSDc2GiU+aFMMPSzOWDIreED+/38I/WhSErmodyo4eutPbpnpl7Z0a0DIRxfwDrBDCII73j328NM8ngS6t88wkOlHK5SHOco3/Ev04H99F/sdgQEBJvBUWyjiTx494Cz7gNyfVgD1hkCgLjYWW3gChKFQf0YhYK+bpiwjL+0nECMQKIwOOEgAwc8oWdBKTBZadhk+GCy9dsbwzBuntib1RxQG0T8pWDFGMP8pgQrWQOKI2sFpcFJ/JBkI4wolCeisl9QGXi7E6EhFR0R3zx9kp8gvDDE2Zi7iZnXw4D/an5gFivNDY7dNyYHfNEbp+Hrs7loydPQBSWmkCgE5NtdP2gBntufzW+yXkbdyQLgwpzRFYG46VIHnbofVWQpplMNyQVcaS83cC5qilJEqvYHroyYrGqVj7jN8Q9dvaCAhVlL6PLECEeGijZOohOe7+Z/bGYElWiVkekhecYgKsaKAHpn3vNeuHverxXzaPw1ObByWcE/ArzDVfczozdriYomhnEk8lt8DV3TdILAc+ytExJBfGphf8PG07EJdK35jVlmh/tszLFeU4RnLcnny8cX/P7dDeySxFU8ngSGzpROCip01PR8nUb8wtiMOmDSjDeXBlTpiJFekd+YBwzkQia8gR/PCK4poiqdYtyLzvyHDFrEfw7SZop5NIzkrdYSPRb+saya4BAbUVM7dodqKMU3ZUkqDMpisPMEq1n/+jCnfRigjaMdSkGEv7PuCIcXrMALRGtZfIYHjozhCE9O+3WpCFRU7iGojACyKLWipAKtWuSBXHmrR7kBSmom06Rv+K3XY7bSiSURdpONa+FHXG5lvWQZqj2qYLP0YicPcQlGYJLB4KG3C7f9q2o6OzHYRpV5rvJJnR3BEGyalH7OWOxe5/SklIYTCVL710YHeN05csmpI3zLzjhwXBUCcEn3gMGBgaDCSYZbDc7UDYcgQxvguljm/NCjVibjLl9TRzCVGFZ3wIrK2r7uxThu+zrfGDhojq5sQXDlDh0Tk2kUcZMaEWDNN82dYSH0aRw2xVtZtFyyNsVeNtnujUVLA4KCQkCfAxSPQJCWx7a35G+W6KdFNeCQ72Er75RoGWJHReYoi2ia2028Ci5EZ50mbtCRS2jkGro7MBYugk2F0qc6xmCN5vGDm5RBVwRCLeljMZSIp/TfHqLb+CuT9D64vdlsyoNvXuKVV2WkZNk5+AWkr9lyv4vrNVrdapaWPOOwN72eKyF02zgENWSIWeNsZ8CxTmd8OqlYWfr92Imt7S1hEVl0cOj/+/9fvP33/lfrk448+fH97VEGKN52b6r5mc9nypOwjLcnaT1dgJa/PrmCXS0ZBLudCm9o7S2h7zOqoj0IuqKWSUjnuH7KkOX30ID3OfJWIFfLqTF7WJ/Em6o1Zgfe+aT+cTsajYb9XSMGz2B8EA7Mz6pWo/SawswdYJMfgeZBowx+6Jyvduv2TSpbu91RgWjCVUNpUrjHGk4NuRLHOc449mp/cJep2h2ttfWPqyzHaS7m03dksWH+F1Np3B0VlYsZBoy82HIWFXk0ov0UaU0vhHzXg3peOMrXRuDlt4RoWkFVHbkqupSal5rjXmpSenpo6eqwTWcmlzc8yre6iToohYaC8sk0NsY/Mn4c/9keS51kYLKKN2nmM6ne7Xs6kl4vw0UjdLx9u7kb8SwZF+F6JwHmEPpt8ehb0K6MS/nrfUQX5FfPDI73iU4pHWOQ8iRTTVb6BGbyrW78WluNPgTJRzgU8qQ9VNFHkGrQh+FHaepNGwcOVBDnwgNyvF2wGhP8vjyPgNv+2wnH9Kf2k0s0HDF+0+kbuxpcT2zik/bCtF85vTo4t6/gaMzEcE+2zwmLZ9Z9cnGu8e03M5IxidCZnaC2BbR0pConBE0oqWnK5IOKTySC2MnmzP4fl2yTXaG8w3UUSwfZ4CxbDGUFmGKkllN6MQ2S09GoFjOdniGtX+ExM0anTA5usIM3el0hz6H27FGvI1SL9mAK5gsquBKB0xQEFEcmcfgUrBMq713ttX486SogMuq23rZzMigEb/zV+OBIo0T2URgqhWxYrN0VN3qtxSJblS1Fw/wwBDKM6FF3oq3l4eFbkrYmyDtp+GAggvdHShDrsykyeNp6S+pyn/H/3+njWa1rWLcGT684vF+cdqbH9AwSQIxeaEFyJrSKIrlDwJAFYZJHiHg7emkPAL0PnGV4l5ouSYSKFQkEYVqrtcqPIpFV4yv4u+ddUd63X82QgRvyJkex38YJ9v+eEc33Uk0lZKudBNDubL5KmG/O0pUcAPO43GPMccXAFr5BJ6Kn1Vyjhmv3cJ/YUQ4rR0TEyV9AEVZQswwSVUNZUd8vpFTdVQOJ3xIxPEdqMoT0WzJ4pcev5StbXv26VSOX9rvKmHh/JksS3VG1T1hcLyfRWCahFqY4Aw+NRbH1BDcvEK0S8h7LGuvWXpva55rIR0faTq3WQV5I5BREh5lCzKZ3fFstsUNWlGDHJNWkIYEmdBuuWkjFFFOGMZUx8kC9Yf8QTeX9/ZNZfgd+f9wuNj14sT+NRMevPRJ4m7ZB4jTIHvC4XtbEyR3ivd+8+4h+jghJlQfQ2YobQ8UGV05JnUTzZb9Av22nU0cHvkKQKg76O6yM3xCAiC9yjcJNf05HwS2BEztVzPDmWPB1lQ3mmNmkbZfALCxHDjP0MO4Onz10aoRMHuQ57sZBS2F1qsfX7DQxnlE1p8nMo36QN21VKmLVTzTUPwvve7eZ/s90QZ9kN0CE639p3XX2E2gTFD6PifJOCeE+Pr1AuEKIurnI53jvRnT+jqUIbI/oNNCw8VQi2oICd3QUtPiVSwUIrARsla7gj4jJB/IqsyabWvdsyRxPTE7oTvS74ETIgjGdIZn4zbbkX8ZQ+H9MMwIbZAuxuhelWQgqJMz+sLAgnjOzWQ9tgLV6ojF5mSJMuI8TcP4YcvyiMI0XYFUh6SCj6DKo+C/ttjE+rGxztJlSg1ie5fVjRiinvqy21wZ0Rwe4icHCCmGUJVpOUkaZH13aNXYvYUwdVSEpT1NBcY5sp7sJ9KkTxNot3/2jqBAHOkQf7LO3wiB/W3n6vbO+M2EahISopcmpyxR2sfKk6dUi0GwUL1I7n3Zn8t2EineaVE25yw/wAfFl15MQNQ0eHQYt6QTexW7l4ZFTv+mWwLiu+vS+9KD8R+iKEgyr5jCzuD4CbPcEB7i2EbMX2k7OjS/CHn9hvJOVj1NrKMKM9uDo9aOtWn68FN51XBEeHJyatbALeM1oMNYqEELq/MbARsBZBzoKhg2DP2aEMzPcZj3fT3Yke6HpFwW40Y1bUsOTpP8Shu9GHeWdpSUr8E2sx+p+Ouwlp1y1GqZihFfAQ0n1kANZFaakyJs2k1tgKclKICASdSE2KA3tfhX54EX63aAGBHoDNAiZYPeZEGonHQPGyGyRzO+PJlJsd818GS3y8Sct/09CG9YaDrgL3lmDQ+7dqUjs5ZM+xyxYP1Cf+TYAWen+cj40c5thJSb5c34g4cNOFrW+GmQ+IyAM5LtJ5/4xU9+RcwhHf0VaeAxLWeClJiJdLnLyAjzTn2psW+0WWK2HuOlfipaO421wG1KhlTXbhdbmQlTiOPi0h0k5jqVJyyxjefT1IctoQ6VShHTtk7mrVZbFCg2bAfDW6jwXhrBELDUlWYUIkc9JDpfb7Ccn2mf1OXnj77vHaBrdJm7XGQAovKmVy3CJTEWT0XZslU2MdEzf+seyHEDGZ+hzr7I6xIUcPdYJpPLU+hR0GSQgBUYs6AZ5enxGO0Gm4KERZJiA6Xbdysh+Z3xBbgO38lnmJdCITRn8oihOX9mRC8HcMd0N1kA3L7rRP1zexry7CiCmSYkBSUp17QZuIYjDoE01DFELUcMZpmp/vrMsMBSwK1RYPyK1yATp5OWW0cVloNhNiTT5FiQLWUFN477rqKSSPkCM+lQfP19S9JWq3K7PeNbKlbbHgik3cRkeuXgrHjh4YXu9EyZ4ygEWc98GAernquAv2aYRDI8MDDL3G2NEOT/ea2D8e6h9r+GclhKPZyq4+WfOQV3J5Y+VskoithdUzuWD5WNhWecKFlZFopZSnumw9JWpaohqfo+3Qcifyi8oO81reBNH6jXWHNuy5oA17At1Y+xhbzbgR6vPMQA7rPu0SJmm9NC3x2infgoXR50tzCqPlmU5Ul6655wEZmgtcNsk9a6pLpS8dC3JTWDagbAT99DU84NPKv3xB+vgKxP+io1YkJlzggAQE4qxQ8u8dKRfiZJPJU6RwHjAzMwkRDxKjx5+OOuz5uMq4YysAVlDKES/j1oJuADRPTS+I3zRjVr//Oyv/VTn8CxCmxkg2U1SUivJ+ISDab7zklYKUXf+/i4R9BHzzrJuPhrofm+PUenssIQyob4nAb2Knre8PgHn+Dmdbe2n4p9UeCH0bpT9pLRAOtwv36EPkk+G+GNbntHCw/G1oHRf39EKjeUbvxkpavJYXwV5LqS3ZL7zFtKTY+q5t7Dqpp4uPKvwY0uoNyuAL+3QDl7URJ6AsJwKdSvc9OHp30JYmspe0Rm5o1gPEy+wX6vDgG3z6cCAt97GN2dU+/Eb1SY4RRk3RQPcb7iXJQSb3nFL/evedNNrP1f9SwqEHTkj0hrR9zNqcwqbIu7WYWiW5zDmSLa2QO4qLSgJqu0ZrBKGM7sNHQ6EX7q65onTfzkAr3b+TBhIrgmi42tCjgu7TS/GPnPa7nNDdTD0HQkhIvIfM41QfesWGH2qMKlW91h8wTkgZ14QGQ2YEUQeC3JZRHRbuouFWzDF2EcYHuiOijBXY8gl1fahyqDWCTkMcxWJs1ZHo/Z5xXu4qkbug04qZ97IuQv0dHhpKHlmUoGJa0KVZaURf32v1lm6H9LrPsoo3CpudMvJM6zFKjcGtw7lS+WeptP+5IvfTAtjZCgpvbq3LwhAL/OVRLSUvuKQafsSj7JTY6B3t+DW+8a5UuDL+Ivz5iLAOsito8wILbE0I+KXyjIhzgtRs5InyBzuX5sJT8QxVQCK01M8XQs3OmQs8cy4m+5mjHMiM4vkU5faniyvN81qKaVZm8Ty75HEGX2vkkMiMV0JmOFFWgMhDpxGyRD/obJpPgwAPUDZjUs0X14RbrSekleHJTySXkggtl9eLCJklJ2TluHiWemjNU0kyyxG2efT515Qodx1QSTgHLoaLoAkuV/QA8/etpR1YHNiGW+E0fBYOQScMwlOUmwSeoVxhpfcVnWcTKHpgdWHDfHQsnS+cs4b7zobU0RpDacy0AnDcJZA2YqlrdfA1aRx7y+/2D3sv9CpnTovT8k2l9wJ6vIm9rDGiaKNMa6TqVqK0qLRWJ/zywaZk9YQBzlUH4Ba1n70/Z8KwkFoickXUvpl9DG4fypVZObrnCqvJI500are4h1p2/CKufAVT6yigaiqwkAVZ16prTMXJdbFg3aWyZTdty2Pa6lqrRJdydwq6/deD6UvKpjJCf4qsF87V+gJXminTs1RU71JMD1MWEpFNXwuoHhe4cr5r4kbMXXVk9LikGtTM998h0MvaQjQDhwpSHQwefvjF77C7+YTBv35qXuQiUHcZ+y4pzoKNg//3VD2ZRb/9JKuKI5INlweTrazXkgPMsYQH4Uv2iAnXj/FencSQxQi4f3xIiFim6jTWv0zCNPM84eSLTnj7GpMYxHohEazr10TkHdGhEXmJnX1sqAFz6Ef15lglD6OpitJhkk2RxskOr8Jk+GIvfOsQ4X/+TLhsW/yXiD1unrLKBCXpjk3nW5HgprJDK8blFbfylpdQHCen3y80ejrebln6f0l4e9ifMrbiHqe1j++foSO/ZJdxH/7lj2/a70+daBS7nNrqnNKGtuvdPo5zZPDeq8RZVBai9D1FZZ066kg4I6TqhGnAeY2uql27mNj15tN2cc3DaKqidJhkU6RxssOrMBm+2Isbb+NYRPX/+TPhsv3uRyJujamsmibccyXdsfAugSmSd/abyg52uXF5xa0MgwnFpWRP1+/v2es/nil2bjlG2VQI/yv37duKe+RPfnw/YGMv2WUxanjP6c/CLj51olHH1XJqq3O6wY21Xf95mjjpcalldrz3qmyOMxw+M+94Ybmrhqsj05l3TL7jXWdh08OtGJm9LKvfZXmeZZf1rD77Fc46e9kARmoFHQMTCxtH1eThyKk9UhS+aDfTihUnaFoiCX+ujoHt6cGAlsQ8maOuS7shlzLBIRjnGDQky2IPGMOn2bOdS68ae+eEPZTMNKz2rr2C7Zv1n0lfqTlNyVIZunK6Vi3aiO5BLEPGeu3V1uuNdlaF3vcfYLZ+Ayn3rS5fOnTB36wgSAG32wDsbsC66j5TZsyB54/sNO3u9ZxNL9fhQQ973NMe9aRnIG2TI0+BfIXkgdKrX6R2+wcBIE5Oy8eKrFasJEgoaBhYdv0MB4/Qi5UpVa4iRJP1i+XMhSsScu8mjRt3Hjz7g0rVatWEwot3Z5uJD19+/PtNQO9jrWvRtEadtdYlWIhQdAyRN69PHQmb073K3jbhYheaJCaxOWHCRZTuf7yWZebl3nepDOrm8EnXq4trSTwhUde63JWuSpAoSXK/pZiqB4pJelEmDmx0C3eNTRGC+5OZNoIPLOyPVb2aX4QWutN8t8tWgvP6qLqjTnCmN+r4YLYucAOGfXljMNaLeWzWEaJeEyFY6nGvcWf06ZeyiXydNmJUeUfNd4LZ+XsojRnXjXVTPD9WsMME8ASHEvZ9BcH3rwC1i+ZcctkVV11z3Q033TKPHpcQkl3i8EfQAo3Pvvjqm+9++M9Pi5b88tsff/3vn+UH5QHwBsoVFJWUVdSo1UprdXA1cYkFf3jpdqcbxUnKEIvO8B/J/mA4Gk+ms/nCta5/vlxvIFnYcPoyK8qqbtqut2F8OCKneVm3/Th3nL1tJPWAgE8vruVZfWV8ziBgXRG0DYxNY2eX8rHuyTZFfHVQQ+1BtVwYT9aWlh/D+3Qwtx0W0R8jFah9/feOL6Vf3/mvEc+oZQykgXFlCPtYx7f1i96aEkhi9KNZ+mCmMFXpvZ5qgifNmYG/6QNokQXYxlByBggBxVrIEPg5aWBVPGMLJRXBfQixGHa8ib1qLRIBNgZEVlukH28we2NPB3ysYbvAkPDxlOb7xNO2gjZkxBFbGhOo2hKbeNpp//1xV2gYghtO3DXe8GSjTzxFtRGcJCDnPaKktgCUj85lc0mgnhncGh0mKWi1qe20/k9nASMxw2TEYGNPJhZ64uBPeXYlSbNPW21d1LHxovkneD4xfomPf/U4/eeOvL+iMxkRpGZEWyRA3vN23rHml1Fa0MhTJpmaDHT8B3ORUiqLFdZJjXVS07ZKndRau2srn8HOVGiSoXVpMuAgD+iSoyMklKIUMRYjMiESKDMhnemKW3l7lv2Dh1oWE8/d2X5U7XLlh0hizsf7U3H9rNIZ9naVrsXMoWIqX4Po8Qa290Kj+SFx2RYdvwycN8bCDOyWBBS7eq6GyiSpqne3ykQ8+2WSnoGD04E66Hh/sFdsjSQbfNOS+379nJ2NDr7Nvp/OFBnqdOkZ9vWMlfSaKSmCoRY9E22jEsFoqfdrGxfJJ1XM9H3g7eWcFbVSej5rqAx1+7q2CQsXSc3p7ap9ATYCcHRV4yZB5so5oLtKH4Khb2Za8BcKILYpBTTmBraBtFHhnHWrFyoACyhfaqulXJelLi9qUWmX0R6xTcnoy4ajgW0gh9AbFQA1AxETpBynTJzC+W0baGmEKyC2q//0IjPaOD/t3NRBuFW4brvRaIjj8WwYRnwNaosPjDmTK5JE9ZAL0tSPdEka9ICTVLa4UoG1QMJD8G/SjvFVRHwXR+295sdnGEVwu0r86foFwS/29VGf/fnYMfrRnSfpyJ86yw3pHAmRiVQG2gMZcYsnGtT6K5MtwpGbaOZabfKacEIKJSgUIJBAIYGCqlKpKpSopFQlfVj94LY0qAIJDc4PTAOuXn6s+TWci5jrehCsGqSq0vZAtdYmaiiiQbhVO6Imw4XKmZt1+brVi66bQf8qD/rUB7aXBQ1NYIkcWLBg6rBcqqLsGJdhPyi3EL3Jp2P8R0XcSew2cfeUW+2gvYFwHTbqmzowz6iQZ6M2YlkwwC0pCyr3vTWr+vC2chCzz6N24nkqNSgo1Ep1gTJ2OB9WbvhQg6BNEFsVWAskSFBgLaCImT5CqaTMiGnYNqG/EDY8RsDW5LbN9cl7Txbw0GvOVpq8JTp9nLinwFH19Wh2myHbkvpQtnKQWip3uoWr6uvvKged7HEKmfAQzYOqvrD8lDdSCHPulKpCDdRUwC8tX+Cha6eridYRN5omf8g4955XQ7j0u30cAP4eeo8ZRMT9VvcYEC/9YUb7hwfoDozNKBiA8XeNarrW7whub1phg/RAxLxFXEvsh9zx9YIV1uxGr1WutYKIOfbBLNffc+3vogbN9/DpP1qULgs=) format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +.index-storage-viz { + background: transparent; +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/visualization.js b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/visualization.js new file mode 100644 index 0000000..beabd1c --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/index_storage/visualization.js @@ -0,0 +1 @@ +define(["api/SplunkVisualizationBase","api/SplunkVisualizationUtils"],(t,e)=>{return a={194(t,e,a){var i,l;i=[a(879),a(423)],l=function(t,e){var a={slow:.3,medium:.7,fast:1.4},i={default:{tubeStroke:"rgba(100,180,255,0.25)",tubeGlass:"rgba(60,130,220,0.06)",liquidLow:"#00d4aa",liquidMid:"#ffcc00",liquidHigh:"#ff3355",particle:"rgba(100,200,255,0.8)",connector:"rgba(100,180,255,0.15)",text:"rgba(255,255,255,0.6)",valueBg:"rgba(0,0,0,0.3)"},dark:{tubeStroke:"rgba(80,80,120,0.3)",tubeGlass:"rgba(30,30,60,0.1)",liquidLow:"#00b894",liquidMid:"#fdcb6e",liquidHigh:"#e17055",particle:"rgba(150,150,200,0.7)",connector:"rgba(80,80,120,0.15)",text:"rgba(255,255,255,0.5)",valueBg:"rgba(0,0,0,0.4)"},neon:{tubeStroke:"rgba(0,255,200,0.3)",tubeGlass:"rgba(0,255,200,0.04)",liquidLow:"#00ff88",liquidMid:"#ffff00",liquidHigh:"#ff0066",particle:"rgba(0,255,200,0.9)",connector:"rgba(0,255,200,0.2)",text:"rgba(0,255,200,0.7)",valueBg:"rgba(0,0,0,0.5)"}},l={default:{hot:"#ff3355",warm:"#ffcc00",cold:"#4dabf7"},dark:{hot:"#e17055",warm:"#fdcb6e",cold:"#339af0"},neon:{hot:"#ff0066",warm:"#ffff00",cold:"#00ff88"}};function r(t,e,a){return Math.max(e,Math.min(a,t))}function o(t){if("#"===t.charAt(0))return[parseInt(t.slice(1,3),16),parseInt(t.slice(3,5),16),parseInt(t.slice(5,7),16)];var e=t.match(/(\d+)/g);return e&&e.length>=3?[parseInt(e[0],10),parseInt(e[1],10),parseInt(e[2],10)]:[0,0,0]}function n(t,e,a){var i=o(t),l=o(e);return"rgb("+Math.round(i[0]+(l[0]-i[0])*a)+","+Math.round(i[1]+(l[1]-i[1])*a)+","+Math.round(i[2]+(l[2]-i[2])*a)+")"}function s(t,e,a,i){if(t>=a)return i.liquidHigh;if(t>=e){var l=(t-e)/(a-e);return n(i.liquidMid,i.liquidHigh,l)}if(t>=.5*e){var r=(t-.5*e)/(.5*e);return n(i.liquidLow,i.liquidMid,r)}return i.liquidLow}function d(t,e,a,i,l,r){t.beginPath(),t.moveTo(e+r,a),t.lineTo(e+i-r,a),t.arcTo(e+i,a,e+i,a+r,r),t.lineTo(e+i,a+l-r),t.arcTo(e+i,a+l,e+i-r,a+l,r),t.lineTo(e+r,a+l),t.arcTo(e,a+l,e,a+l-r,r),t.lineTo(e,a+r),t.arcTo(e,a,e+r,a,r),t.closePath()}function h(t,e,a,i,l,r,o){d(t,e,a,i,l,r),t.fillStyle=o.tubeGlass,t.fill(),t.strokeStyle=o.tubeStroke,t.lineWidth=1.5,t.stroke();var n=Math.max(2,.08*i);t.save(),t.beginPath(),d(t,e,a,i,l,r),t.clip();var s=t.createLinearGradient(e,a,e+3*n,a);s.addColorStop(0,"rgba(255,255,255,0.0)"),s.addColorStop(.3,"rgba(255,255,255,0.08)"),s.addColorStop(.6,"rgba(255,255,255,0.03)"),s.addColorStop(1,"rgba(255,255,255,0.0)"),t.fillStyle=s,t.fillRect(e+2,a,3*n,l),t.restore()}function f(t,e,a,i,l,o,s,h,f,c,u,v){if(!(s.sizeGB<=0)){var g=e+2,m=i-4,p=Math.max(1,o-2),x=l-4,b=s.maxGB>0?s.maxGB:h,w=r(s.sizeGB/b,0,1),M=x*w;M<2&&(M=2);var G=0,B=0,_=0;if(s.hotGB>0||s.warmGB>0||s.coldGB>0){var S=s.hotGB+s.warmGB+s.coldGB;S>0?(G=M*(s.coldGB/S),B=M*(s.warmGB/S),_=M*(s.hotGB/S)):G=M}else G=M;t.save(),d(t,e+2,a+2,m,x,p),t.clip();var y,T,C,A=a+l-2;if(G>.5){var I=A-G,z=t.createLinearGradient(g,I,g,A);z.addColorStop(0,f.cold),z.addColorStop(.4,f.cold),z.addColorStop(1,n(f.cold,"#000000",.35)),t.fillStyle=z,t.globalAlpha=.85,t.fillRect(g,I,m,G),t.globalAlpha=1}if(B>.5){var k=A-G-B,L=t.createLinearGradient(g,k,g,k+B);L.addColorStop(0,f.warm),L.addColorStop(.4,f.warm),L.addColorStop(1,n(f.warm,"#000000",.35)),t.fillStyle=L,t.globalAlpha=.85,t.fillRect(g,k,m,B),t.globalAlpha=1}if(_>.5){var R=A-G-B-_,P=t.createLinearGradient(g,R,g,R+_);P.addColorStop(0,f.hot),P.addColorStop(.4,f.hot),P.addColorStop(1,n(f.hot,"#000000",.35)),t.fillStyle=P,t.globalAlpha=.85,t.fillRect(g,R,m,_),t.globalAlpha=1}if(_>.5?(y=_,T=A-G-B-_,C=f.hot):B>.5?(y=B,T=A-G-B,C=f.warm):(y=G,T=A-G,C=f.cold),M>2){var q=Math.min(4,.12*y),H=.35*m,D=.55*m;function W(t,e){return Math.sin(t/H*Math.PI*2+3.5*e)*q+Math.sin(t/D*Math.PI*2-2.2*e)*q*.4}t.beginPath(),t.moveTo(g,T+W(0,u));for(var E=1;E<=m;E+=2)t.lineTo(g+E,T+W(E,u));t.lineTo(g+m,T+y+5),t.lineTo(g,T+y+5),t.closePath(),t.fillStyle=C,t.globalAlpha=.6,t.fill(),t.globalAlpha=1,t.beginPath(),t.moveTo(g,T+W(0,u));for(var V=1;V<=m;V+=2)t.lineTo(g+V,T+W(V,u));t.strokeStyle="rgba(255,255,255,0.35)",t.lineWidth=1.5,t.stroke()}for(var X=Math.max(1,Math.floor(5*w)),Y=0;Y.7){var j=(w-.7)/.3,K=w>.9?f.hot:w>.8?f.warm:C,Q=r(.2*j+.15*Math.sin(4*u),.1,.5),Z=Math.max(6,14*j);t.save(),t.shadowColor=K,t.shadowBlur=Z,d(t,e,a,i,l,o),t.strokeStyle=K,t.globalAlpha=Q,t.lineWidth=2,t.stroke(),t.shadowBlur=0,t.globalAlpha=1,t.restore()}}}function c(t,e,a){if(t.measureText(e).width<=a)return e;for(var i=t.measureText("...").width,l=e.length;l>0&&t.measureText(e.slice(0,l)).width+i>a;)l--;return e.slice(0,l)+"..."}function u(t){return t>=1e3?(t/1e3).toFixed(1)+" TB":t>=1?t.toFixed(1)+" GB":(1024*t).toFixed(0)+" MB"}return t.extend({initialize:function(){t.prototype.initialize.apply(this,arguments),this.el.classList.add("index-storage-viz"),this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.display="block",this.el.appendChild(this.canvas),this._lastGoodData=null,this._animTime=0,this._timer=null,this._drillGrid=null,this._drillIndexes=null;var e=this;this.canvas.addEventListener("mousemove",function(t){if(e._drillGrid&&e._drillIndexes){for(var a=t.offsetX,i=t.offsetY,l=e._drillGrid,r=e._drillIndexes,o=!1,n=0;n=h&&a<=h+l.cellW&&i>=f&&i<=f+l.cellH){o=!0;break}}e.canvas.style.cursor=o?"pointer":"default"}})},getInitialDataParams:function(){return{outputMode:t.ROW_MAJOR_OUTPUT_MODE,count:1e4}},formatData:function(e,a){if(!e||!e.rows||0===e.rows.length){if(this._lastGoodData)return this._lastGoodData;throw new t.VisualizationError("Awaiting data — Index Storage")}for(var i=e.fields,l={},r=0;rh&&(h=v)}}var b={indexes:d,maxSize:h};return this._lastGoodData=b,b},updateView:function(t,e){if(t&&t._status)return this._ensureCanvas(),this._drawStatusMessage(t._status),void this._stopAnimation();if(!t){if(!this._lastGoodData)return;t=this._lastGoodData}if(t.indexes&&0!==t.indexes.length){var r=this.getPropertyNamespaceInfo().propertyNamespace,o=e[r+"colorTheme"]||"default",n="true"===(e[r+"showGlow"]||"true"),d=e[r+"animSpeed"]||"medium",v=e[r+"cellSize"]||"auto",g=e[r+"sortBy"]||"size",m=i[o]||i.default,p=l[o]||l.default,x=a[d]||a.medium,b=this.el.getBoundingClientRect();if(!(b.width<=0||b.height<=0)){var w=window.devicePixelRatio||1;this.canvas.width=b.width*w,this.canvas.height=b.height*w;var M=this.canvas.getContext("2d");if(M){M.scale(w,w);var G=b.width,B=b.height;M.clearRect(0,0,G,B);for(var _=function(t,e){var a=t.slice();return"name"===e?a.sort(function(t,e){return t.title.toLowerCase().localeCompare(e.title.toLowerCase())}):a.sort(function(t,e){return e.sizeGB-t.sizeGB}),a}(t.indexes,g),S=_.length,y=t.maxSize,T=0;T<_.length;T++)_[T].sizeGB;for(var C=function(t,e,a,i){var l,r=e-16,o=a-4-28-8;if("small"===i)l=60;else if("medium"===i)l=90;else if("large"===i)l=120;else{for(var n=90,s=140;s>=50;s-=5){var d=Math.floor((r+5)/(s+5));if(d<1&&(d=1),Math.ceil(t/d)*(.85*s+5)-5<=o&&d>0){n=s;break}}l=Math.max(50,n)}var h=Math.max(1,Math.floor((r+5)/(l+5)));h>t&&(h=Math.max(1,t)),t<=h&&(l=Math.min(300,Math.floor((r-5*(h-1))/h)));var f=h*l+5*(h-1);return{cellW:l,cellH:Math.min(Math.round(.85*l),120),cols:h,rows:Math.ceil(t/h),gap:5,offsetX:Math.max(8,(e-f)/2),startY:4}}(S,G,B,v),A=C.cellW,I=C.cellH,z=C.cols,k=C.gap,L=C.offsetX,R=C.startY,P=Math.min(6,.08*A),q=Math.max(7,Math.min(11,.13*A)),H=Math.max(8,Math.min(16,.18*A)),D=this._animTime*x,W=0;WB)){h(M,V,X,A,I,P,m),f(M,V,X,A,I,P,E,y,p,n,D),M.save(),M.font="600 "+q+"px sans-serif",M.fillStyle="#ffffff",M.textAlign="center",M.textBaseline="top";var Y=c(M,E.title,A-8);M.fillText(Y,V+A/2,X+4),M.restore(),M.save();var U=E.maxGB>0?E.maxGB:y,F=U>0?Math.round(E.sizeGB/U*100):0,N=s(F,70,90,m);M.font="bold "+H+"px monospace";var O=F+"%";M.fillStyle=N,M.textAlign="center",M.textBaseline="middle",M.fillText(O,V+A/2,X+I/2-.4*H);var J=Math.max(6,.7*H);M.font=J+"px sans-serif",M.fillStyle="#ffffff",M.fillText(u(E.sizeGB)+" / "+u(U),V+A/2,X+I/2+.5*H),M.restore()}}var j=Math.max(7,Math.min(10,.016*G)),K=B-10,Q=[{color:p.hot,label:"Hot"},{color:p.warm,label:"Warm"},{color:p.cold,label:"Cold"}];M.font=j+"px sans-serif",M.textBaseline="middle";for(var Z=j,$=.5*j,tt=0,et=0;et=d&&a<=d+l.cellW&&i>=h&&i<=h+l.cellH){var f={action:t.FIELD_VALUE_DRILLDOWN,data:{title:r[o].title}};return void this.drilldownRedirect(f)}}},_startAnimation:function(){if(!this._timer){var t=this;this._timer=setInterval(function(){t._animTime+=.016,t.invalidateUpdateView()},50)}},_stopAnimation:function(){this._timer&&(clearInterval(this._timer),this._timer=null)},_ensureCanvas:function(){this.canvas||(this.el.innerHTML="",this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.display="block",this.el.appendChild(this.canvas));var t=this.el.getBoundingClientRect(),e=window.devicePixelRatio||1;this.canvas.width=t.width*e,this.canvas.height=t.height*e},_drawStatusMessage:function(t){var e=this.el.getBoundingClientRect(),a=window.devicePixelRatio||1,i=this.canvas.getContext("2d");i.scale(a,a);var l=e.width,r=e.height;i.clearRect(0,0,l,r);var o=.85*l,n=Math.max(10,Math.min(32,.09*Math.min(l,r))),s=Math.round(1.6*n),d=.5*n;for(i.font="500 "+n+"px sans-serif";i.measureText(t).width>o&&n>8;)n-=1,s=Math.round(1.6*n),i.font="500 "+n+"px sans-serif";i.font=s+"px sans-serif",i.textAlign="center",i.textBaseline="middle",i.fillStyle="rgba(255,255,255,1)",i.fillText("⏳",l/2,r/2-.5*n-d),i.font="500 "+n+"px sans-serif",i.fillStyle="rgba(255,255,255,0.30)",i.fillText(t,l/2,r/2+.3*s),i.textAlign="start",i.textBaseline="alphabetic"},reflow:function(){this.invalidateUpdateView()},destroy:function(){this._stopAnimation(),t.prototype.destroy.apply(this,arguments)}})}.apply(e,i),void 0===l||(t.exports=l)},879(e){"use strict";e.exports=t},423(t){"use strict";t.exports=e}},i={},function t(e){var l=i[e];if(void 0!==l)return l.exports;var r=i[e]={exports:{}};return a[e](r,r.exports,t),r.exports}(194);var a,i}); \ No newline at end of file diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/indexing_pipeline_flow/formatter.html b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/indexing_pipeline_flow/formatter.html new file mode 100644 index 0000000..7bf50b7 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/indexing_pipeline_flow/formatter.html @@ -0,0 +1,44 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/indexing_pipeline_flow/visualization.css b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/indexing_pipeline_flow/visualization.css new file mode 100644 index 0000000..f10b5d7 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/indexing_pipeline_flow/visualization.css @@ -0,0 +1,31 @@ +/* Press Start 2P — Latin subset (woff2, base64-embedded) + Source: Google Fonts, SIL Open Font License 1.1 */ +@font-face { + font-family: 'Press Start 2P'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) format('woff2'); +} + +/* Formula 1 Font — shared across all F1 visualizations */ +/* Prepended to each viz's visualization.css by build.sh / merge-viz.sh */ + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +.indexing-pipeline-flow-viz { + background: transparent; +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/indexing_pipeline_flow/visualization.js b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/indexing_pipeline_flow/visualization.js new file mode 100644 index 0000000..b632906 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/indexing_pipeline_flow/visualization.js @@ -0,0 +1 @@ +define(["api/SplunkVisualizationBase","api/SplunkVisualizationUtils"],(t,a)=>{return e={194(t,a,e){var i,l;i=[e(879),e(423)],l=function(t,a){var e=["parsingqueue","mergingqueue","typingqueue","indexqueue"],i={parsingqueue:"PARSING",mergingqueue:"MERGING",typingqueue:"TYPING",indexqueue:"INDEXING"},l={slow:.3,medium:.7,fast:1.4},r={default:{tubeStroke:"rgba(100,180,255,0.25)",tubeGlass:"rgba(60,130,220,0.06)",liquidLow:"#00d4aa",liquidMid:"#ffcc00",liquidHigh:"#ff3355",particle:"rgba(100,200,255,0.8)",connector:"rgba(100,180,255,0.15)",text:"rgba(255,255,255,0.6)",valueBg:"rgba(0,0,0,0.3)"},dark:{tubeStroke:"rgba(80,80,120,0.3)",tubeGlass:"rgba(30,30,60,0.1)",liquidLow:"#00b894",liquidMid:"#fdcb6e",liquidHigh:"#e17055",particle:"rgba(150,150,200,0.7)",connector:"rgba(80,80,120,0.15)",text:"rgba(255,255,255,0.5)",valueBg:"rgba(0,0,0,0.4)"},neon:{tubeStroke:"rgba(0,255,200,0.3)",tubeGlass:"rgba(0,255,200,0.04)",liquidLow:"#00ff88",liquidMid:"#ffff00",liquidHigh:"#ff0066",particle:"rgba(0,255,200,0.9)",connector:"rgba(0,255,200,0.2)",text:"rgba(0,255,200,0.7)",valueBg:"rgba(0,0,0,0.5)"}};function n(t,a,e){return Math.max(a,Math.min(e,t))}function o(t){if("#"===t.charAt(0))return[parseInt(t.slice(1,3),16),parseInt(t.slice(3,5),16),parseInt(t.slice(5,7),16)];var a=t.match(/(\d+)/g);return a&&a.length>=3?[parseInt(a[0],10),parseInt(a[1],10),parseInt(a[2],10)]:[0,0,0]}function s(t,a,e){var i=o(t),l=o(a);return"rgb("+Math.round(i[0]+(l[0]-i[0])*e)+","+Math.round(i[1]+(l[1]-i[1])*e)+","+Math.round(i[2]+(l[2]-i[2])*e)+")"}function h(t,a,e,i){if(t>=e)return i.liquidHigh;if(t>=a){var l=(t-a)/(e-a);return s(i.liquidMid,i.liquidHigh,l)}if(t>=.5*a){var r=(t-.5*a)/(.5*a);return s(i.liquidLow,i.liquidMid,r)}return i.liquidLow}function u(t,a,e,i,l,r){t.beginPath(),t.moveTo(a+r,e),t.lineTo(a+i-r,e),t.arcTo(a+i,e,a+i,e+r,r),t.lineTo(a+i,e+l-r),t.arcTo(a+i,e+l,a+i-r,e+l,r),t.lineTo(a+r,e+l),t.arcTo(a,e+l,a,e+l-r,r),t.lineTo(a,e+r),t.arcTo(a,e,a+r,e,r),t.closePath()}function f(t,a,e,i,l,r,n){u(t,a,e,i,l,r),t.fillStyle=n.tubeGlass,t.fill(),t.strokeStyle=n.tubeStroke,t.lineWidth=1.5,t.stroke();var o=Math.max(2,.08*i);t.save(),t.beginPath(),u(t,a,e,i,l,r),t.clip();var s=t.createLinearGradient(a,e,a+3*o,e);s.addColorStop(0,"rgba(255,255,255,0.0)"),s.addColorStop(.3,"rgba(255,255,255,0.08)"),s.addColorStop(.6,"rgba(255,255,255,0.03)"),s.addColorStop(1,"rgba(255,255,255,0.0)"),t.fillStyle=s,t.fillRect(a+2,e,3*o,l),t.restore()}function c(t,a,e,i,l,r,n,o,h,f){if(!(n<=0)){var c=a+3,d=i-6,g=Math.max(1,r-3),p=l-6,v=p*(n/100),m=e+l-3-v;t.save(),u(t,a+3,e+3,d,p,g),t.clip();var x=t.createLinearGradient(c,m,c,m+v);x.addColorStop(0,o),x.addColorStop(.4,o),x.addColorStop(1,s(o,"#000000",.35)),t.fillStyle=x,t.globalAlpha=.85,t.fillRect(c,m,d,v);var b=Math.min(6,.15*v),M=.35*d,w=.55*d;t.beginPath(),t.moveTo(c,m+G(0,f));for(var _=1;_<=d;_+=2)t.lineTo(c+_,m+G(_,f));t.lineTo(c+d,m+v+5),t.lineTo(c,m+v+5),t.closePath(),t.fillStyle=o,t.globalAlpha=.6,t.fill(),t.globalAlpha=1,t.beginPath(),t.moveTo(c,m+G(0,f));for(var y=1;y<=d;y+=2)t.lineTo(c+y,m+G(y,f));t.strokeStyle="rgba(255,255,255,0.35)",t.lineWidth=1.5,t.stroke();for(var T=Math.max(2,Math.floor(n/15)),S=0;S50){var C=(n-50)/50;t.shadowColor=o,t.shadowBlur=12*C,u(t,a,e,i,l,r),t.strokeStyle=o,t.globalAlpha=.2*C,t.lineWidth=2,t.stroke(),t.shadowBlur=0,t.globalAlpha=1}}function G(t,a){return Math.sin(t/M*Math.PI*2+3.5*a)*b+Math.sin(t/w*Math.PI*2-2.2*a)*b*.4}}function d(t,a,e,i,l,r,n,o,s,h){var u=(e+l)/2;t.fillStyle=n.connector,t.fillRect(a,u-r/2,i-a,r),t.strokeStyle=n.tubeStroke,t.lineWidth=1,t.beginPath(),t.moveTo(a,u-r/2),t.lineTo(i,u-r/2),t.moveTo(a,u+r/2),t.lineTo(i,u+r/2),t.stroke();for(var f=i-a,c=0;ci&&(g-=f);var p=d.size;t.beginPath(),t.arc(g,u,p,0,2*Math.PI),t.fillStyle=n.particle,t.globalAlpha=.4+.6*d.alpha,t.shadowColor=n.particle,t.shadowBlur=4,t.fill(),t.shadowBlur=0,t.globalAlpha=1}}function g(t,a,e,i,l){t.beginPath(),t.moveTo(a,e-i),t.lineTo(a+i,e),t.lineTo(a,e+i),t.closePath(),t.fillStyle=l.particle,t.globalAlpha=.5,t.fill(),t.globalAlpha=1}function p(t,a){for(var e=[],i=0;i=b&&(S.shadowColor=$,S.shadowBlur=8),S.fillText(et,Q+N/2,Z+z/2),S.shadowBlur=0}if(v){var rt=Math.max(9,Math.min(14,.16*N));if(S.font="600 "+rt+"px sans-serif",S.fillStyle=w.text,S.textAlign="center",S.textBaseline="top",S.fillText(i[K]||K,Q+N/2,Z+z+6),Y.capacity>0){var nt=Math.max(7,.75*rt);S.font=nt+"px sans-serif",S.fillStyle="rgba(255,255,255,0.3)";var ot=Math.round(Y.avg_size)+" / "+Math.round(Y.capacity)+" KB";S.fillText(ot,Q+N/2,Z+z+6+rt+2)}}if(J"+b+"%)"}];S.font=ft+"px sans-serif",S.textBaseline="middle";for(var gt=ft,pt=.6*ft,vt=0,mt=0;mtn&&o>8;)o-=1,s=Math.round(1.6*o),i.font="500 "+o+"px sans-serif";i.font=s+"px sans-serif",i.textAlign="center",i.textBaseline="middle",i.fillStyle="rgba(255,255,255,1)",i.fillText("⏳",l/2,r/2-.5*o-h),i.font="500 "+o+"px sans-serif",i.fillStyle="rgba(255,255,255,0.30)",i.fillText(t,l/2,r/2+.3*s),i.textAlign="start",i.textBaseline="alphabetic"},reflow:function(){this.invalidateUpdateView()},destroy:function(){this._stopAnimation(),t.prototype.destroy.apply(this,arguments)}})}.apply(a,i),void 0===l||(t.exports=l)},879(a){"use strict";a.exports=t},423(t){"use strict";t.exports=a}},i={},function t(a){var l=i[a];if(void 0!==l)return l.exports;var r=i[a]={exports:{}};return e[a](r,r.exports,t),r.exports}(194);var e,i}); \ No newline at end of file diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/formatter.html b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/formatter.html new file mode 100644 index 0000000..d66766f --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/formatter.html @@ -0,0 +1,52 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + + + + + + +
diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/preview.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/preview.png new file mode 100644 index 0000000..8440133 Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/preview.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/visualization.css b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/visualization.css new file mode 100644 index 0000000..e374fb1 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/visualization.css @@ -0,0 +1,31 @@ +/* Press Start 2P — Latin subset (woff2, base64-embedded) + Source: Google Fonts, SIL Open Font License 1.1 */ +@font-face { + font-family: 'Press Start 2P'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) format('woff2'); +} + +/* Formula 1 Font — shared across all F1 visualizations */ +/* Prepended to each viz's visualization.css by build.sh / merge-viz.sh */ + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +.license-gauge-viz { + background: transparent; +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/visualization.js b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/visualization.js new file mode 100644 index 0000000..cf5e65e --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/license_gauge/visualization.js @@ -0,0 +1 @@ +define(["api/SplunkVisualizationBase","api/SplunkVisualizationUtils"],(t,a)=>{return i={194(t,a,i){var e,r;e=[i(879),i(423)],r=function(t,a){var i=Math.PI/180,e=135*i,r=405*i,n=r-e,l={slow:.3,medium:.7,fast:1.4},s={default:{tubeStroke:"rgba(100,180,255,0.25)",tubeGlass:"rgba(60,130,220,0.06)",liquidLow:"#00d4aa",liquidMid:"#ffcc00",liquidHigh:"#ff3355",particle:"rgba(100,200,255,0.8)",connector:"rgba(100,180,255,0.15)",text:"rgba(255,255,255,0.6)",valueBg:"rgba(0,0,0,0.3)"},dark:{tubeStroke:"rgba(80,80,120,0.3)",tubeGlass:"rgba(30,30,60,0.1)",liquidLow:"#00b894",liquidMid:"#fdcb6e",liquidHigh:"#e17055",particle:"rgba(150,150,200,0.7)",connector:"rgba(80,80,120,0.15)",text:"rgba(255,255,255,0.5)",valueBg:"rgba(0,0,0,0.4)"},neon:{tubeStroke:"rgba(0,255,200,0.3)",tubeGlass:"rgba(0,255,200,0.04)",liquidLow:"#00ff88",liquidMid:"#ffff00",liquidHigh:"#ff0066",particle:"rgba(0,255,200,0.9)",connector:"rgba(0,255,200,0.2)",text:"rgba(0,255,200,0.7)",valueBg:"rgba(0,0,0,0.5)"}};function o(t,a,i){return Math.max(a,Math.min(i,t))}function h(t){if("#"===t.charAt(0))return[parseInt(t.slice(1,3),16),parseInt(t.slice(3,5),16),parseInt(t.slice(5,7),16)];var a=t.match(/(\d+)/g);return a&&a.length>=3?[parseInt(a[0],10),parseInt(a[1],10),parseInt(a[2],10)]:[0,0,0]}function u(t,a,i){var e=h(t),r=h(a);return"rgb("+Math.round(e[0]+(r[0]-e[0])*i)+","+Math.round(e[1]+(r[1]-e[1])*i)+","+Math.round(e[2]+(r[2]-e[2])*i)+")"}function d(t,a,i,e){if(t>=i)return e.liquidHigh;if(t>=a){var r=(t-a)/(i-a);return u(e.liquidMid,e.liquidHigh,r)}if(t>=.5*a){var n=(t-.5*a)/(.5*a);return u(e.liquidLow,e.liquidMid,n)}return e.liquidLow}function c(t){return e+n*(o(t,0,100)/100)}function f(t,a,i,e){return{x:t+Math.cos(e)*i,y:a+Math.sin(e)*i}}function p(t,a,i,e,r,n,l){var s=c(n),o=e+.6*r,h=f(a,i,e-.6*r,s),u=f(a,i,o,s);t.beginPath(),t.moveTo(h.x,h.y),t.lineTo(u.x,u.y),t.strokeStyle=l,t.lineWidth=2,t.globalAlpha=.6,t.stroke(),t.globalAlpha=1}return t.extend({initialize:function(){t.prototype.initialize.apply(this,arguments),this.el.classList.add("license-gauge-viz"),this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.el.appendChild(this.canvas),this._lastGoodData=null,this._animTime=0,this._particles=null,this._timer=null},getInitialDataParams:function(){return{outputMode:t.ROW_MAJOR_OUTPUT_MODE,count:1e4}},formatData:function(a,i){if(!a||!a.rows||0===a.rows.length){if(this._lastGoodData)return this._lastGoodData;throw new t.VisualizationError("Awaiting data — License Gauge")}for(var e=a.fields,r={},n=0;n0?o(k/q*100,0,100):0,C=this.el.getBoundingClientRect();if(!(C.width<=0||C.height<=0)){var B=window.devicePixelRatio||1;this.canvas.width=C.width*B,this.canvas.height=C.height*B;var I=this.canvas.getContext("2d");if(I){I.scale(B,B);var P=C.width,G=C.height;I.clearRect(0,0,P,G);var L=Math.min(P,G),R=Math.max(40,.42*L),D=P/2,W=G/2,z=Math.max(12,Math.min(40,.18*R)),H=Math.max(5,Math.min(8,Math.round(T/15)));this._particles&&this._particles.length===H||(this._particles=function(t){for(var a=[],i=0;i50){var M=(l-50)/50;t.beginPath(),t.arc(a,i,r,e,d,!1),t.strokeStyle=s,t.lineWidth=n-2,t.lineCap="round",t.shadowColor=s,t.shadowBlur=12*M,t.globalAlpha=.2*M,t.stroke(),t.shadowBlur=0,t.globalAlpha=1}t.restore()}}(I,D,W,R,z,T,d(T,g,v,_),h,this._animTime),function(t,a,i,r,n,l,s,o,h,u){if(!(l<=0)){var d=c(l)-e;t.save();for(var p=0;p1&&(g.pos-=1);var v=e+d*g.pos,m=f(a,i,r+g.offset*(.4*n),v);t.beginPath(),t.arc(m.x,m.y,g.size,0,2*Math.PI),t.fillStyle=u.particle,t.globalAlpha=g.alpha*(.6+.4*Math.sin(4*o+p)),t.shadowColor=u.particle,t.shadowBlur=4,t.fill(),t.shadowBlur=0}t.globalAlpha=1,t.restore()}}(I,D,W,R,z,T,this._particles,this._animTime,y,_),function(t,a,i,e,r,n,l,s,o,h,u,c,f){var p=2*(e-r/2-4)*.85,g=h?Math.max(8,Math.min(14,.1*p)):0,v=Math.max(10,Math.min(22,.17*p)),m=Math.max(7,Math.min(12,.08*p)),b=h?g+4:0,x=v+4,M=i-(b+x+(m+2))/2;h&&(t.font="600 "+g+"px sans-serif",t.fillStyle=f.text,t.textAlign="center",t.textBaseline="top",t.fillText("LICENSE USAGE",a,M));var w=Math.round(n)+"%",_=d(n,u,c,f);t.font="bold "+v+"px monospace",t.fillStyle=_,t.textAlign="center",t.textBaseline="top",t.fillText(w,a,M+b),t.font=m+"px sans-serif",t.fillStyle="rgba(255,255,255,0.3)",t.textAlign="center",t.textBaseline="top";var y=l.toFixed(2)+" / "+s.toFixed(2)+" "+o;t.fillText(y,a,M+b+x)}(I,D,W,R,z,T,k,q,w,b,g,v,_),function(t,a,i,e,r,n){var l=Math.max(8,Math.min(11,.022*a)),s=i-Math.max(10,.04*i),o=[{color:n.liquidLow,label:"Normal (<"+e+"%)"},{color:n.liquidMid,label:"Warning ("+e+"-"+r+"%)"},{color:n.liquidHigh,label:"Critical (>"+r+"%)"}];t.font=l+"px sans-serif",t.textBaseline="middle";for(var h=l,u=.6*l,d=0,c=0;cl&&s>8;)s-=1,o=Math.round(1.6*s),e.font="500 "+s+"px sans-serif";e.font=o+"px sans-serif",e.textAlign="center",e.textBaseline="middle",e.fillStyle="rgba(255,255,255,1)",e.fillText("⏳",r/2,n/2-.5*s-h),e.font="500 "+s+"px sans-serif",e.fillStyle="rgba(255,255,255,0.30)",e.fillText(t,r/2,n/2+.3*o),e.textAlign="start",e.textBaseline="alphabetic"},reflow:function(){this.invalidateUpdateView()},destroy:function(){this._stopAnimation(),t.prototype.destroy.apply(this,arguments)}})}.apply(a,e),void 0===r||(t.exports=r)},879(a){"use strict";a.exports=t},423(t){"use strict";t.exports=a}},e={},function t(a){var r=e[a];if(void 0!==r)return r.exports;var n=e[a]={exports:{}};return i[a](n,n.exports,t),n.exports}(194);var i,e}); \ No newline at end of file diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/formatter.html b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/formatter.html new file mode 100644 index 0000000..613bd04 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/formatter.html @@ -0,0 +1,52 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + + + + + + +
diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/preview.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/preview.png new file mode 100644 index 0000000..ef2d2d8 Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/preview.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/visualization.css b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/visualization.css new file mode 100644 index 0000000..17a5169 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/visualization.css @@ -0,0 +1,31 @@ +/* Press Start 2P — Latin subset (woff2, base64-embedded) + Source: Google Fonts, SIL Open Font License 1.1 */ +@font-face { + font-family: 'Press Start 2P'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) format('woff2'); +} + +/* Formula 1 Font — shared across all F1 visualizations */ +/* Prepended to each viz's visualization.css by build.sh / merge-viz.sh */ + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +.resource-gauge-viz { + background: transparent; +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/visualization.js b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/visualization.js new file mode 100644 index 0000000..fc67865 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/resource_gauge/visualization.js @@ -0,0 +1 @@ +define(["api/SplunkVisualizationBase","api/SplunkVisualizationUtils"],(t,a)=>{return e={194(t,a,e){var i,l;i=[e(879),e(423)],l=function(t,a){var e=Math.PI/180,i=135*e,l=405*e,r=l-i,n={slow:.3,medium:.7,fast:1.4},s={cpu:"CPU",mem:"MEM",disk:"DISK"},o={default:{tubeStroke:"rgba(100,180,255,0.25)",tubeGlass:"rgba(60,130,220,0.06)",liquidLow:"#00d4aa",liquidMid:"#ffcc00",liquidHigh:"#ff3355",particle:"rgba(100,200,255,0.8)",connector:"rgba(100,180,255,0.15)",text:"rgba(255,255,255,0.6)",valueBg:"rgba(0,0,0,0.3)"},dark:{tubeStroke:"rgba(80,80,120,0.3)",tubeGlass:"rgba(30,30,60,0.1)",liquidLow:"#00b894",liquidMid:"#fdcb6e",liquidHigh:"#e17055",particle:"rgba(150,150,200,0.7)",connector:"rgba(80,80,120,0.15)",text:"rgba(255,255,255,0.5)",valueBg:"rgba(0,0,0,0.4)"},neon:{tubeStroke:"rgba(0,255,200,0.3)",tubeGlass:"rgba(0,255,200,0.04)",liquidLow:"#00ff88",liquidMid:"#ffff00",liquidHigh:"#ff0066",particle:"rgba(0,255,200,0.9)",connector:"rgba(0,255,200,0.2)",text:"rgba(0,255,200,0.7)",valueBg:"rgba(0,0,0,0.5)"}};function h(t,a,e){return Math.max(a,Math.min(e,t))}function d(t){if("#"===t.charAt(0))return[parseInt(t.slice(1,3),16),parseInt(t.slice(3,5),16),parseInt(t.slice(5,7),16)];var a=t.match(/(\d+)/g);return a&&a.length>=3?[parseInt(a[0],10),parseInt(a[1],10),parseInt(a[2],10)]:[0,0,0]}function c(t,a,e){var i=d(t),l=d(a);return"rgb("+Math.round(i[0]+(l[0]-i[0])*e)+","+Math.round(i[1]+(l[1]-i[1])*e)+","+Math.round(i[2]+(l[2]-i[2])*e)+")"}function u(t,a,e,i){if(t>=e)return i.liquidHigh;if(t>=a){var l=(t-a)/(e-a);return c(i.liquidMid,i.liquidHigh,l)}if(t>=.5*a){var r=(t-.5*a)/(.5*a);return c(i.liquidLow,i.liquidMid,r)}return i.liquidLow}function f(t,a,e,i,l,r){t.beginPath(),t.moveTo(a+r,e),t.lineTo(a+i-r,e),t.arcTo(a+i,e,a+i,e+r,r),t.lineTo(a+i,e+l-r),t.arcTo(a+i,e+l,a+i-r,e+l,r),t.lineTo(a+r,e+l),t.arcTo(a,e+l,a,e+l-r,r),t.lineTo(a,e+r),t.arcTo(a,e,a+r,e,r),t.closePath()}function p(t,a,e,r,n,s){t.beginPath(),t.arc(a,e,r,i,l,!1),t.strokeStyle=s.tubeStroke,t.lineWidth=n,t.lineCap="round",t.stroke(),t.beginPath(),t.arc(a,e,r,i,l,!1),t.strokeStyle=s.tubeGlass,t.lineWidth=n-2,t.lineCap="round",t.stroke(),t.beginPath(),t.arc(a,e,r-n/2+1,i,l,!1),t.strokeStyle="rgba(255,255,255,0.06)",t.lineWidth=1,t.lineCap="round",t.stroke(),t.beginPath(),t.arc(a,e,r+n/2-1,i,l,!1),t.strokeStyle="rgba(255,255,255,0.04)",t.lineWidth=1,t.lineCap="round",t.stroke()}function g(t,a,e,l,n,s,o,h,d){if(!(s<=0)){var c=i+r*(s/100);if(t.save(),t.beginPath(),t.arc(a,e,l,i,c,!1),t.strokeStyle=o,t.lineWidth=n-4,t.lineCap="round",t.globalAlpha=.85,t.stroke(),t.beginPath(),t.arc(a,e,l+.15*n,i,c,!1),t.strokeStyle="rgba(255,255,255,0.08)",t.lineWidth=.2*n,t.lineCap="round",t.globalAlpha=1,t.stroke(),t.restore(),h&&s>50){var u=(s-50)/50,f=.15+.05*Math.sin(3*d);t.save(),t.shadowColor=o,t.shadowBlur=12*u,t.beginPath(),t.arc(a,e,l,i,c,!1),t.strokeStyle=o,t.lineWidth=n-4,t.lineCap="round",t.globalAlpha=f*u,t.stroke(),t.shadowBlur=0,t.globalAlpha=1,t.restore()}}}function m(t,a,e,l,n,s,o,d,c){if(!(s<=2))for(var u=i+r*(s/100),f=r*(s/100),p=Math.max(3,Math.min(6,Math.floor(s/15))),g=0;gu)){var x=a+Math.cos(v)*l,b=e+Math.sin(v)*l,M=1.5+m%2,w=.4+.3*Math.sin(4*o+1.5*g);t.save(),t.beginPath(),t.arc(x,b,M,0,2*Math.PI),t.fillStyle=c.particle,t.globalAlpha=h(w,.2,.9),t.shadowColor=c.particle,t.shadowBlur=4,t.fill(),t.shadowBlur=0,t.globalAlpha=1,t.restore()}}}return t.extend({initialize:function(){t.prototype.initialize.apply(this,arguments),this.el.classList.add("resource-gauge-viz"),this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.el.appendChild(this.canvas),this._lastGoodData=null,this._animTime=0,this._timer=null},getInitialDataParams:function(){return{outputMode:t.ROW_MAJOR_OUTPUT_MODE,count:1e4}},formatData:function(a,e){if(!a||!a.rows||0===a.rows.length){if(this._lastGoodData)return this._lastGoodData;throw new t.VisualizationError("Awaiting data — Resource Gauge")}for(var i=a.fields,l={},r=0;r=ot?{label:"CRITICAL",color:"#ff3355"}:ht>=st?{label:"WARNING",color:"#ffcc00"}:{label:"HEALTHY",color:"#00d4aa"});if(q.font="700 "+Q+"px sans-serif",q.fillStyle=dt.color,q.textAlign="center",q.textBaseline="top",q.globalAlpha=.8+.1*Math.sin(2*this._animTime),q.fillText(dt.label,E,it+$),q.globalAlpha=1,x)for(var ct=it+$+tt+at,ut=Math.max(5,.65*X),ft=Math.max(3,.5*ut),pt=1.4*K,gt=E-pt/2,mt=E+pt/2,vt=0;vt<3;vt++){var xt=z[vt],bt=s[xt.key],Mt=Math.round(xt.pct),wt=u(xt.pct,d,c,y),yt=ct+vt*et+et/2;q.save(),f(q,gt,yt-ut/2,ut,ut,2),q.fillStyle=wt,q.globalAlpha=.9,q.fill(),q.globalAlpha=1,q.restore(),q.font="600 "+X+"px sans-serif",q.fillStyle=y.text,q.textAlign="left",q.textBaseline="middle",q.fillText(bt,gt+ut+ft,yt),q.font="bold "+Z+"px monospace",q.fillStyle=wt,q.textAlign="right",q.textBaseline="middle",q.fillText(Mt+"%",mt,yt)}for(var _t=0;_t<3;_t++){var At=z[_t],Tt=U[_t],kt=(u(At.pct,d,c,y),Math.max(7,Math.min(11,.032*L))),St=i-.12,Ct=E+Math.cos(St)*(Tt+.8*W),It=N+Math.sin(St)*(Tt+.8*W);q.font="600 "+kt+"px sans-serif",q.fillStyle=y.text,q.textAlign="right",q.textBaseline="middle",q.globalAlpha=.7,q.fillText(s[At.key],Ct,It),q.globalAlpha=1}var Bt=Math.max(8,Math.min(11,.018*R)),Pt=G-Math.max(8,.03*G),qt=[{color:y.liquidLow,label:"Normal (<"+d+"%)"},{color:y.liquidMid,label:"Warning ("+d+"-"+c+"%)"},{color:y.liquidHigh,label:"Critical (>"+c+"%)"}];q.font=Bt+"px sans-serif",q.textBaseline="middle";for(var Rt=Bt,Gt=.6*Bt,Lt=0,Dt=0;Dtn&&s>8;)s-=1,o=Math.round(1.6*s),i.font="500 "+s+"px sans-serif";i.font=o+"px sans-serif",i.textAlign="center",i.textBaseline="middle",i.fillStyle="rgba(255,255,255,1)",i.fillText("⏳",l/2,r/2-.5*s-h),i.font="500 "+s+"px sans-serif",i.fillStyle="rgba(255,255,255,0.30)",i.fillText(t,l/2,r/2+.3*o),i.textAlign="start",i.textBaseline="alphabetic"},reflow:function(){this.invalidateUpdateView()},destroy:function(){this._stopAnimation(),t.prototype.destroy.apply(this,arguments)}})}.apply(a,i),void 0===l||(t.exports=l)},879(a){"use strict";a.exports=t},423(t){"use strict";t.exports=a}},i={},function t(a){var l=i[a];if(void 0!==l)return l.exports;var r=i[a]={exports:{}};return e[a](r,r.exports,t),r.exports}(194);var e,i}); \ No newline at end of file diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/formatter.html b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/formatter.html new file mode 100644 index 0000000..e252938 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/formatter.html @@ -0,0 +1,28 @@ +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/preview.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/preview.png new file mode 100644 index 0000000..6ad16dd Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/preview.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/visualization.css b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/visualization.css new file mode 100644 index 0000000..2b20947 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/visualization.css @@ -0,0 +1,31 @@ +/* Press Start 2P — Latin subset (woff2, base64-embedded) + Source: Google Fonts, SIL Open Font License 1.1 */ +@font-face { + font-family: 'Press Start 2P'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) format('woff2'); +} + +/* Formula 1 Font — shared across all F1 visualizations */ +/* Prepended to each viz's visualization.css by build.sh / merge-viz.sh */ + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +.scheduler-health-viz { + background: transparent; +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/visualization.js b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/visualization.js new file mode 100644 index 0000000..e1845e2 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/scheduler_health/visualization.js @@ -0,0 +1 @@ +define(["api/SplunkVisualizationBase","api/SplunkVisualizationUtils"],(t,a)=>{return i={194(t,a,i){var e,r;e=[i(879),i(423)],r=function(t,a){var i={slow:.3,medium:.7,fast:1.4},e={default:{tubeStroke:"rgba(100,180,255,0.25)",tubeGlass:"rgba(60,130,220,0.06)",liquidLow:"#00d4aa",liquidMid:"#ffcc00",liquidHigh:"#ff3355",particle:"rgba(100,200,255,0.8)",connector:"rgba(100,180,255,0.15)",text:"rgba(255,255,255,0.6)",valueBg:"rgba(0,0,0,0.3)"},dark:{tubeStroke:"rgba(80,80,120,0.3)",tubeGlass:"rgba(30,30,60,0.1)",liquidLow:"#00b894",liquidMid:"#fdcb6e",liquidHigh:"#e17055",particle:"rgba(150,150,200,0.7)",connector:"rgba(80,80,120,0.15)",text:"rgba(255,255,255,0.5)",valueBg:"rgba(0,0,0,0.4)"},neon:{tubeStroke:"rgba(0,255,200,0.3)",tubeGlass:"rgba(0,255,200,0.04)",liquidLow:"#00ff88",liquidMid:"#ffff00",liquidHigh:"#ff0066",particle:"rgba(0,255,200,0.9)",connector:"rgba(0,255,200,0.2)",text:"rgba(0,255,200,0.7)",valueBg:"rgba(0,0,0,0.5)"}},r=["SUCCESS","SKIPPED","RUNTIME"];function n(t,a,i){return Math.max(a,Math.min(i,t))}function l(t){if("#"===t.charAt(0))return[parseInt(t.slice(1,3),16),parseInt(t.slice(3,5),16),parseInt(t.slice(5,7),16)];var a=t.match(/(\d+)/g);return a&&a.length>=3?[parseInt(a[0],10),parseInt(a[1],10),parseInt(a[2],10)]:[0,0,0]}function s(t,a,i){var e=l(t),r=l(a);return"rgb("+Math.round(e[0]+(r[0]-e[0])*i)+","+Math.round(e[1]+(r[1]-e[1])*i)+","+Math.round(e[2]+(r[2]-e[2])*i)+")"}function o(t,a,i,e,r,n){t.beginPath(),t.moveTo(a+n,i),t.lineTo(a+e-n,i),t.arcTo(a+e,i,a+e,i+n,n),t.lineTo(a+e,i+r-n),t.arcTo(a+e,i+r,a+e-n,i+r,n),t.lineTo(a+n,i+r),t.arcTo(a,i+r,a,i+r-n,n),t.lineTo(a,i+n),t.arcTo(a,i,a+n,i,n),t.closePath()}function h(t){if(t>=1e3){for(var a=t.toString(),i="",e=0,r=a.length-1;r>=0;r--)i=a.charAt(r)+i,++e%3==0&&r>0&&(i=","+i);return i}return t.toString()}function u(t,a,i){if("success"===a){if(t>=95)return i.liquidLow;if(t>=80){var e=(t-80)/15;return s(i.liquidMid,i.liquidLow,e)}var r=t/80;return s(i.liquidHigh,i.liquidMid,r)}if("skip"===a){if(t<=5)return i.liquidLow;if(t<=15){var l=(t-5)/10;return s(i.liquidLow,i.liquidMid,l)}var o=n((t-15)/15,0,1);return s(i.liquidMid,i.liquidHigh,o)}if("runtime"===a){if(t<50)return i.liquidLow;if(t<=80){var h=(t-50)/30;return s(i.liquidLow,i.liquidMid,h)}var u=n((t-80)/20,0,1);return s(i.liquidMid,i.liquidHigh,u)}return i.liquidLow}function d(t,a){return"success"===t?a<70:"skip"===t?a>10:"runtime"===t&&a>70}function c(t){for(var a=[],i=0;i0)for(var A=Math.max(2,Math.round(d.length*(b/100))),B=0;B1&&(L.x-=1),L.y>1&&(L.y=0),L.y<0&&(L.y=1);var R=v+L.x*w,G=g+L.y*x;t.beginPath(),t.arc(R,G,L.size,0,2*Math.PI),t.fillStyle="rgba(255,255,255,0.15)",t.globalAlpha=L.alpha*(.6+.4*Math.sin(4*u+B)),t.fill()}if(t.globalAlpha=1,t.restore(),c&&f){t.save();var D=.4+.3*Math.sin(3*u);o(t,v,g,w,x,M),t.fillStyle=h,t.shadowColor=h,t.shadowBlur=12,t.globalAlpha=.15*D,t.fill(),t.shadowBlur=0,t.globalAlpha=1,t.restore()}}}function v(t,a,i,e,r,n){t.save(),t.font="600 "+r+"px sans-serif",t.fillStyle=n.text,t.textAlign="right",t.textBaseline="middle",t.fillText(a,i,e),t.restore()}function g(t,a,i,e,r,n,l){t.save();var s=Math.max(9,Math.min(14,.5*r));t.font="bold "+s+"px monospace";var h=t.measureText(a).width+12,u=s+8,d=i-h-4;o(t,d,e-u/2,h,u,Math.min(u/2,6)),t.fillStyle=l.valueBg,t.fill(),t.fillStyle=n,t.textAlign="center",t.textBaseline="middle",t.fillText(a,d+h/2,e),t.restore()}return t.extend({initialize:function(){t.prototype.initialize.apply(this,arguments),this.el.classList.add("scheduler-health-viz"),this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.el.appendChild(this.canvas),this._lastGoodData=null,this._animTime=0,this._animTimer=null,this._bubbles=[c(12),c(12),c(12)]},getInitialDataParams:function(){return{outputMode:t.ROW_MAJOR_OUTPUT_MODE,count:50}},formatData:function(a,i){if(!a||!a.rows||0===a.rows.length){if(this._lastGoodData)return this._lastGoodData;throw new t.VisualizationError("Awaiting data — Scheduler Health")}for(var e=a.fields,r={},n=0;nl&&s>8;)s-=1,o=Math.round(1.6*s),e.font="500 "+s+"px sans-serif";e.font=o+"px sans-serif",e.textAlign="center",e.textBaseline="middle",e.fillStyle="rgba(255,255,255,1)",e.fillText("⏳",r/2,n/2-.5*s-h),e.font="500 "+s+"px sans-serif",e.fillStyle="rgba(255,255,255,0.30)",e.fillText(t,r/2,n/2+.3*o),e.textAlign="start",e.textBaseline="alphabetic"},reflow:function(){this.invalidateUpdateView()},destroy:function(){this._animTimer&&(clearInterval(this._animTimer),this._animTimer=null),t.prototype.destroy.apply(this,arguments)}})}.apply(a,e),void 0===r||(t.exports=r)},879(a){"use strict";a.exports=t},423(t){"use strict";t.exports=a}},e={},function t(a){var r=e[a];if(void 0!==r)return r.exports;var n=e[a]={exports:{}};return i[a](n,n.exports,t),n.exports}(194);var i,e}); \ No newline at end of file diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/formatter.html b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/formatter.html new file mode 100644 index 0000000..86451db --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/formatter.html @@ -0,0 +1,36 @@ +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + +
diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/preview.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/preview.png new file mode 100644 index 0000000..dab9d4b Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/preview.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/visualization.css b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/visualization.css new file mode 100644 index 0000000..e57a1f1 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/visualization.css @@ -0,0 +1,31 @@ +/* Press Start 2P — Latin subset (woff2, base64-embedded) + Source: Google Fonts, SIL Open Font License 1.1 */ +@font-face { + font-family: 'Press Start 2P'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) format('woff2'); +} + +/* Formula 1 Font — shared across all F1 visualizations */ +/* Prepended to each viz's visualization.css by build.sh / merge-viz.sh */ + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,d09GMgABAAAAAGIoABAAAAABHpAAAGHGAAEAQgAAAAAAAAAAAAAAAAAAAAAAAAAAG+4QHJB+BmAAix4IPAmXYhEICoLIYIKdWwE2AiQDkgwLiQoABCAFigEHp0QMgQ1bZANxJJp33woD1E5giapr+234JWybUvSgO1RUEl8aV8J003DP3Uo0EHiR7P///7ykImMmAdJ2GyBy9KiwMowwZVJUUSLhMKdbOrjSLTkowhzO7DXWQMmNmruKOVbhpoxdPxLNPIzg43lKW3oRiT9uCH7AInx56gsWSdabQ+xvu9iI/+TocOOGRBNZSWPqOs2XYX1zsNl6Q27WOfN7hs9C/MTxCWVLryeHOOngsPQ857fQ+gfGQHG8UCItkz21I3VXv6kFK8OLecpxvW/6DvQF51jqTTv/XLC4Yhf3tfazxNU5xgwllxi7PEwEXbK0J8+UPEH99fUnIqtuywO+ni9ZO2E1VP48v80/9z2qRUoFFAXEfgYqGIWK8Zkr94aNiw4DXbmIcpNlu2iX7aq+rAfIzWpjxVrQDiJIFRUQQSlKk64gRWUExtKwYMGCpSWaxJJTd2N2N9mSUs2Z/omptymf1jZrqpp0SXOzqatVl11g6xqBA24+Xj7+YCkIvD9YDJZz+8F72UzreU0hnaCgzhbMWd/b3+6eCvusAKCQ3Q88jsIIeGeiLulCMqmOwgY9Tq33pQattZndu1cTFlEPjVJoiRB5OGZIDzW6yMRgvnTiW3n8+fN4XC6Pj4/L5fDxcTgcDocfh59MAv/Pt2nnvm8QJ2ghVWo+ZqzGN2szcWoYZ8jeSqvzZbMCNtYD9AUQkAEAAn6p+dvV8YF92hi6gpahKXwkcYjiXA74c95SKxU9bQf0j2otUJQhqXniQ7bckU2SvbuQ77JElC/VlBS1u2pk4o9t9iFegRAIooGkIvq+rXVF5Lb304zD8//prO5LP0hCsowr0pNSArqzT82H8qFlJq16OK7NbnarEAms2bL3pg83FVh8FR5XzFqO2lSrmZxI1rjlPZaee2A8hIAOFzY3YczkC/lSEHIEWjgum+ZdinC/8njpmUqMuOsvp9dXW4s1aFgkslrZIfD//Nr/6t8sPP2NTsQlFGqcP+hw8MEuYmke7qWSIu09fBDzSKWRKz9SIvft979QsEYJpGidSGp//fpD3E6fmZ3dq7hlOqWIx0Ju9770iJ9Gqcy/Of2vnQtchRcdftiQ9LN/iq0k+20MRfOrPVtU3DADd+4MaBiQNATbgGQbSbYEyAEh2TMDyIBlPzm+ENKPAYRsC8l+tvyS1t4YY59CtWWIbbnnF3X5rbrp/gXPB4bdTrC/0HxgUZw0k2PSvtNP+i/607lZ36IdsO8ATpigGPS3pVuOuidqj3VtKLPADwtgCV6oiBWgEtiOByN8EO02KIskEO88zsLphEF4XJW+XK1Z/10sOZYwaHyKSlBJYDsLajbjPUDVwMF/EzPz/mxvp10TjBrcIYggjBFGFUYI7fEmVq3pvvdmWOb+oZSSCyGISBARkRJ6L5QTWa4IAij+p0k75xQ8ZK66CdhR3MWOEdKAAKFlxX7fmvP3v2y+P2j75tqzQuJI9IYo+XK/3/o/3Kg04K3sFRsDBWaIz/dJBNgqCgm74Y1zOwDvkfcb0g+8UQBTCi4XfexG8KLPWlBcp3lE5aB+oJ4KCDgSwdAUvG8eOAzMEAYMAftWWubrg7sqhZRzYO2Erf2+Sr3AEg1ttmax4vj9WX0KSUcBjjZJjWUJjzXqlKU6fXHlZlrzpRxMUXNTW9CBLuiyrummNnZ3D/Z4m3sN4oOOgUtGwZdWIEKUWHFMzBJZ2RUp098Aw4xUZ6EjKbBTa2Fkc2vArYlCOx3T7LPPprrL5P6os48muoTy0HDt034d0EEd0mEd1TEd1wmd1Cmd1hk165me64Ve6pVa9Vpv9Lbr3aBMlUu7tHvpnnQI7cyJ+trZlMOB2VllojpNjiNUJtUlCtmSFOgSJxE6I4G6NUKUfW0qkg1QDcbYFPfOWqOyyCRLomW3K7tG/3a5Vj1MZtrKIOtdJt2KnXIwMbRAPJJRELRFK5FXpOXYTRC9GaH4Yi+SkZRQaFdF16JDQXJ0oCxus4l2CjsGWCI706PTQoG0I/aPHArVSRSTs3AQ7ZsJ0i1M7fetkjTmzWhk5wVFipQhwq6aQ+2q2Cq4K2DBPtzuYbIJxL+xi2Mz/Ed4ltNekPsFv/Yu+f+jCKJ/AO7mwqBEqwVbypr/7jH2DuysfL5eutxcBXnKBa+CXRfSs9CJG+nMoJnVLdjsRNkEskGz3Bnsku//7WI4bmZQ1vf7UlPagRjxoMBIJ5W4acFvmjM+ovX+EMXNDm0Nf48sEyhHqkYj6hI3Ccay7kmgce9uE7gZcday+AgNSnE7ePWJfEKK152WuTRHC3NBQ3uMp+eIIXAEcv0f4CuU45nHhe9HGDqea5IfwIVGshMcbrQJDqxhwW1O5ADiMkpOBIF1NBlY/9yy7S1R7CJCIZziEAKX3T/hgDIBMHLWEZ/j+xMMaaCzF+2E8pwwPW1ALmJfu92aBciSeGg1GCWcK7RuhyCOdZk3EqRyj0NOyQQ+amXtdL0Tu6dz6Rh8kSOEljqbDRVs5687vclFQUOKU63U4dWGNU5VTwFQIeStxOdOEmeDbbXNcXuW/D1P1F6d2TVhYYhSNC88Df4b7qFH/lnvmGO1Xu4iYvL0hf6HkCgbESXfhuDJPOa8LEz7OuHPEZvagQNihhIiWXKUA30A4GBFchQx79zWcIH5GtjIowCBLeLjaSoDyW8r4kJmKt+ohRC/fNrt3lLqUAFd2RkdagTFLPRseqdDWqVgNFFSUKGeNkX3AhdENiH0wsBUgyfZCqW0vD53AOCMrbNWjI7qaFB0GzG3OyIPahk6l5odcHCbA0NdbbWEHUQmAJ3uqBnCJEAg194GOnxAVdIIzMx40I8HDxtghYbGMtBA2A0aMsz29TKo+7PBcXxbyxz37Ln3zwx/0z/IygUE7Jru0Buk78IDDQJdeO/+XqeY31foU5p/g5BqpCKI7n69BcVvrU2IaWmpPheHsU/Gwss7tYRNF90zeX+Py5p2CKE2QavXxzHCozPbGBgAprLb7SgIG5S0Ax0M01xSvbXSA1Gh8Tuqr9ixzVMFCWU07ch6ncBwTzkd0NhFu6A639dUwoO0/DBcQnqMHa+1Cr5pZKPc9ESVTNTNNs/XIwgmWzMEALGoiUA6ybTRXYH5aOo7FQWgL9e5qrjsIDdRc5xhj/ProeFsD5iseNVjUqTADjKfBlj1jbPrRHNb6hBqDNoX98GJEnXYHdscQCO1cz4TJW4LDdaIrhMbNYW1nZrgHuZDuS3U0NBXzF9nrFT9zKWnlmAOGadk3ikE3lxfUjIeWa5FEqOSkjtf5Mhfb9yX2jrQ70jOSVnhgknXu0kG4drYkr7QaN5fPe6P3jFDrjXpu5Vn7rFmAQGZcfzWG87PqBNRdGzyUvcegHaT0LU7CA3M/swj1DvMx2WpnTCBoDBBb7ffNxGMukIzP4v5eexXnIMVr7GqwJn0oEPfM6kxJgQiVPsXvTlUa58fwPjBnccwE/uIR4SUyDbKtevbiIro4ITT6FM1gm0wmdhFJ2b+c38PaRsVgcyodAvFibBeJQrRFCvgEomr3KrJcmLZ4Ey25aimEF56gYWKhv1tKBnre6oemBQ1LhM5auzvY6XXfodtwr8h4afzd5LlqfLIT2eCTvUmigqAPcOYK7+nMtFsJIzgM8sIRwW/a51wLImZivvqNHwidGISbDIaPFoWCladmXSpKVtXRaxKVcrTPbfX0x30nr2jfgboZPCjdTHSKKTJprCbZoZiNc1exqleuYVNlbZz6Wa3g/o4kgc76yEu/ryhbrltmIfeGuE9t2kduz3iw+w+FC0fQ9fGCUxtnSqjA3mMHd9b5sHlbTw8cLVHh/qlPDtyzPM/nPD6j3/27oa/+Pi323y+8y4/7v5fv+590J/Hn2+HbrT1xKgYD+n3WIfYXIPM007Gz84KePAcheJoVMegm4URHKbnlijFdhKIIiQSTYwTeDqRxMlkyIemUMjLqbyHpvOREhVq6/nZl8Z+tMborKF3gEDjDNYKsl6wA4VYL9QGYQ4S7hARDkWYKtJhokwT7QgxjmS0XqwF4iwVbxWTeczmSrBYoj0kWSW5SS9Fqnhp0hllXBzPYhPriwvl+E8Sm/bMOugoXiedmUWXcza7PRWZqdQmZSH7m4VkUknESZI44pSUs15/iwwIiTyly9nbqAgUKSZMys45SZ0Z6kMlWPiKOnOvKPscFCNb2EQTpdhXeyrKM29Fe++jBJ98leibNsnc6o7WPv7IkNIB0SC1M2JCelfEB59CHkt7MWnqMor0/fVwcABdfgl3SDOSsYCxTGnlL9StBaFbicPMJw+3QJsc0l5e+EXdIcJiBRGXMZaoFDKVVQ9IXC1jvSqTdnXFSztKq0coz5bRnXNLGUeP0V9wLd+LyqAsyfhfmgm4rKLVl3Ttfhd47c0MN8gE35ix3FYJ0p3C693o2aENousBmQ/2kWU9/pTEJ59hffZ5aW++R/nhJ3RffSHjyzbSRF9qNfiXhjk0oGyMB7pufTwvhnpXJbjqalgaU50g/Q4WPgjBwpYYFZ2SMdsTMyQgac4cIkt5BEe5KPBKFlKCr19CwYmEgnfQUzDVCjOiFYoZYTC1GUxVIoKGD36wCIeNB0zSMBGPjlSYBKMlBRkqZEkue45AgAcXWeIqxBnIyAAIApCTnOS64Uw9nKlXZAI8mBhSiIFEkDaTv6FYbbg5RkSCWiNMp8iTXLUiA+ChIUnCM/cS2+cwjkKPNDqqGQdO1TvnAolLFlKQdOg7HBR4TW3xIxjwwaHgvZEegQpDrdCDmfDtxExszIRJiGUtVIkoaHrEBxZsPDZyMm0Zz8zIKDKz4qVNlFgkrZ2yMqzCUCUCMeu5otKgZ12yQCVRm8FUJekbhVn+rcbAq8XUa1GzTgVpE2yjKJtVfBYiNsamSSVuuTon+3KAIgdzhJdCUcoydzNpLqQFA0EnZj6mDbMIw5cCynQ70xO1ksogANslqr5CvzwCtrJx/y3cAEO/LX9Kw8DCwSPY3ozgar47ExsXn5DofmV9hkC/a58H9B020xMGh0cYN5IwZWSkqpFR6odHaxj3pAGDYck0T3z00L6w6gygQD5vxuDfg5KgQoMOA+a3YRHw08e51ZjV6VXrmke1rCvWv673L8QyYtmyiUVPhyq+HMYPL9NTk9rUZV4WZUmWZmXWZEM2Z2saITxc8iBxJzUNHT2DYGEi/rpuOd5kM5Ie+97Emx+9cDHM8NRnVmbD0pD5MJM/E8+yLM8KmJFfHcu2bIdnR3amicjVffjyEyhUpGh6uXfV6uRk/GLPljTHXVnDm9+unhuyUTg6+j+5CKKGgG0QKlXE8YwkUp56DnOd5EcaWeTwwuUObrUtuJYaEIOORMKEo6hwalq8osE62SPWyEmyeBllVmVU2ZJRl/IE4Fs+JuJXoiZaCO65K+Wd5i0Mdo+BYHMYvDmU4Go7BIAYTyRIkZ3oDUGCGw8YlRDR1rQqW9JH8TFBhWWJvjaLbFSjG1NjYxvX+M1SFUyObYc5S+kMnBRCEZrM8CNgX01tFgHboXo429AP7DAwvjOHphyVsjDuL4wo4mGqPRKG90y1z34HHNxrzbo+wthqDZ9KIfbeBx/f+fshdGMYHN9im2eOfJhjds9xy/ZzUcN4sJPTcHCI6FI534cI+wKnV3EB2vfd0yefffFVns6d+RLffPe/Nt4tKDhrFLgtp2LJprnoJgGoikb+uSQwME++ugwsIhLetmu0w05NXHbZbY+9LnYyIXF2iOyCVaYYwIFvEeRTgUQcBn/ld8GJsDNt/5WPnH70sf/7x9PPQBCFOT1xBiQGBY+Mn2AIxVyYqq9gjrMGzHbywCynhfHC9QdU29PvdDnXzH7/gw8/Onvu/Mef7OYLUFN//S0xMB2h8hGo6xMiC5anwMqsN996+5/v/OvMu4pg8FjFwYkV5MF2jV933u+v/fvNXG1QINgEERmmiYbX/DGwNrj95CkI0zrzfegEMoiwNKkiH6HxhOB/pVwe3+j7R5bo/YAKFSlWolSZchUqtevYtXPP7lWq1ahlVqdeg0YWTZq1aGXVJtNGCAK8kW5ZvJrqZYhW3iYHn+vXUPW8VDVu5hyNY3XW5lVa8zpv8jbv6lFxPSGLlNWkJWPF9iYagA0PX5512VhJpZVVXd/6VQODCRUGUj+/GPZVCSXO1EzLjMzMpriyK7uzJ/uyPwck1qD+Dai2OihkM8ayyVOYGVB1i0rzWIipeXNv7FSlOs4czbEcz4mVXMjghz1JQNhWMdGbElfGKCz2A9U+cU7Q55KgR1Xu0dcZezz1qCitaiFwi88/w9wb5KGg8qdf+3q5wW3y8iCZ+vQfhAWTmofbYWAAetfagI2fVcfr1KMgwPgw5vpHoYwq4J6SUZ0RJu7+o5dUapRxNnM5FDryiiYRyUpu2jJUr3bpmY75XpSL2j8qJCoiChYVGxUflRK1I2o6OjAaFp0d/Z/otTBfxAbEFGI/4gjiOOLyh1NoJGwIFy9FV2VGW2mb3Y6EhZTRJibW6HYGstWne/tl920ctnHUxga4Gpz9ousTnKlNYI5vR6/IJ59ZcP5jz7vvwd/OgrvNfz/24a1c4oOfAfztBQ8kD4If5OGcPv6vX3fXd1/dfXr30d3zzLc6oDPYC3s+8HL11mh0OPmpTnOG/+tAU9D9gB4CekzVzefTp89+L5gWmTr7VHiJxqjTSaVuepsslUUKu3Rpqs2YEHw0abDuivRQpcwKPRXrZaYsw41Qa6QSA63TTw5Sf+s5TZXvPysN4rBFnlxd9Ua16WTtitiIg7iIh/hIQMyLNx9KgQyCBFOIlSBRkmSs+nJkU1DKoZPVsGN8JNnnqGOOO+GyK6665oiHnnnuhZdeme6tH3765XcHcHdEwnb3bU+/9g5o/8AODOrg4A6FdnhkJ0d1anSnwzoTXnNE58Z2PrILUV2M63p8LQndGN/NxC5NmIX8fzaxO5O6m9S95O6n9CC1R1N6nNaT9J5m92x6z2f0IrdXeS3kZyvo9czeFPa2uPclLZb1obx/qvpW3b81Ld19h+5hGbKzQ0XsUQknVErPGZWDoAouKLd3pf1tg8022mqtTfrmMJCRU8iSTalCJaMWzZziBuTaIFmUnEsSj0pxi58rE7MEiZIs+yQo/qE5H3Wp7JFTzjgP7tiBhm+45c6G+WOEZy++3fAVr0WYPXCCNOMFdXXPwMav/Gr+yEvzjTS0M8fRnoGdcDnxXcqNuBPfilUyJTkabbdDk51c9jnmqKDYlW8YVj/0fPULr8I//ZBSUh9O8b/mQBUGqdd/0QFWWgeyOxnAi+TP8DS/glvIBb7kLassd8N311WGt4e5KFkSZFh4THhgi04HWaNS4EkKdZEjj+KYUpxsbNyRT9hIGS/9yIHaSYJcSzVTs12yylrrpcC2fL3LrVbLeB7hLdnm2sB/khaCyfFxsm9byn6Uflbwxmep410zuqjVt9iLd7tbNC7t717YeMWoz6Znl3ZTV2l3bWzA/fZtBoaKB2xltEPnPbgDZcMMoUoMEKTiNCCgY/G/iadP82erFrU4WpCK5JGatz8nb95Nt+J0M9NJxio7MdqPjC5ZVTE+HvNZIlKGaLkBWkrCP5MhOb9vwnJOJSKn2LJl7xgIg56StRwHPWcDp+kk54CEdCxD0/FY6NxMhESSxDrkZiQCGsykTB3XKKOY2FjFFY7XuUgsjjDznH5qcvofvbaa+QouYyuVTTdu52TZZ7HaSWzZVUsser6ADoy8O0O0EjMcX4xEE8jGES1PkTcShAWMUDknWHn03yvvSp3gpyXz9TKQ05kwG/tQi3jHt/sRzLCDYtGwGN2AwrVoMX0i24S0VQDR9hzloytWLTQOUxuH7GdiTarxyRSziFbLMhVsuDLxue/Jjr5YZz7f8QE7qqht8YdxCDgAQ8LGN0nRbkhiZkWBc2DPDjghXM2R0n+t8lHkNxgji6ZX4ZBoARfe7qbqnyFfw/61nwE33m6ltzsxmvMTp/clPahwqj3v1IsjOTJ5BoVqrMMKrFLI1FSH8GaqDZfCNU62xXnuYt5gDhUnwvK6qsdyLdjKdLZi2HRTMZ23QAVnbUAIi5kidvo+4MVaJbZ2E5NELegl0gmMqILkP1eTdTiwEaf363Wrys9ddzUHfKjw3g34UbkVAg4hBB1SCDk0IezQhYjDIEQdRiHmMAlxh3ljGdbmBilaN8PUwkfvuH6gwml97Pp1rrZ+2vV/l05gjR1eN5AECZDCMgJLg2EZMCwLhuXAsDwYVgDDimBYCUyyBnXyfVSoZxSuQr183tsxIcEXYfobpgHqTt0CTUgrOTBh40NLhsUjZae4v2XXejKlaVWv+hfpKoZ3V9E2SoG5ZAe6t9W3o4s1Uki4acQl46kEAr/x4TfO8Mwe1k7VfyfQgzqttvqbCdT4MNBHe7ELDPDiCI9kFxmiikrgulqtIHsgtr2e/rZjNkalh8MyMyJx/naV/nN3AiOAAJqGfRJ+XSrvnkxfFqmb9JSNebra0ZDQJCosKF43k1htpV+6P5NyvUQ6E8kxmjBRU1bxbbRlwdkHR4qg3yvqCJZjQ3I85sWVowvlcuuyVc8dTUJLtrQfM+3xJaobUsBRi1zZgBmTlW0cXcfAVgJpw7XhWgK0VjZvjqZiEjkwqb9XiqEnyLLuYWAaF8ckke1dgnPClpJnLFJ6sTVzuUytOvMuIk1kmSEB61tLSlW8zuLUSgXBKzoFmRcLzBf30S5yKfK2+5PsOLSAqTXYuZbbSV1ua6PquxtYPuqyWWVFWBj90OuGkXNM22gY+5Qr9hRkaIHxNGhsaXhAgUsyLPaslKlT20Mor3ftzaaaGvnoh/8nVsDDa8epRevs+mF2dcjn7clbmpBUd2yHvN1EFTz7BTuKPzADM0fwA3K2pWeB3Sk733tNBX1n6YfnfsNwg4M3AgtTq+VkwPZ0HDa+ONl5t6NmBoYZ/G3HQZyYDzqF4CyBhc4J4sJElxBcJfBS1wRxY6JbCO4S6HVPEA8meoTgKYGlngnixUSvELwlEPVOEB8m+oRcXw2T//H4/meyuC+zVNwYLmmlVY2J0p2WOMogLr8XrqB+o7LTh+kPcZUVrqZATU8dtX+IzVa4juJRj93j4oB96PphY3ZDCnfbx8gs7ycf5RMCCJqyy+vRGy6pWbN66a/mseDQmwMcc3mw+7YAW98JrnoXIO08Q7J3rTbmAIcweKI3zkoHQd5K/GGGPZ1G4IIhna+75YpbqMuDpjrleGvQCqQcncgdoKJcZtSNCu/Cxd9PIQuQNLDH5sxLuiZYSuSG+UzV2sT+yuxjevWip4gLo9ohHtyqgHeM9xEAtXXrFdxAhi/VtxoRD8PEHnKJwGqEkuCk1RCrtKN1k1rOnpZhsiS5poc2dqVZiKFcOyN6ZkukmYqPLZ7qph+inU61p+XW7pvuzHSw6igR2O1xrVTXsB8u3jm2Bv/hWbL4aYRvFuvFkzY4iXM+LDKO73e0srMwX238XU8FKyVonqaVjjNRYvAnhdwVAVyAFHi5NZQTZBT6wEvDuaeWwaf/C8BU3RB8A6qbYaFiNEYGNaUnWaHkVtox2zVxlinJk/crCXr4qtauxJEqJ6sR1K0tMllVie93MIPrhmlf1wQfMT2acsG2iH/knGqV+91v/spaxVCm37albJj/be5iBTnbM519WCuUcO2hs0NpCw9CBaJkZCsG1TJnLK8yRAmglAIN0L73q9toHHgHK/y+GxwV9Z/g4ytQH1fOahZgMNJISodoEzBT4Vs4s2SbcMnkZAaET5ZmUSM2n0RMFMY3d7it1kKOiWPUPi8E8zu6XqHCuVT67pUIRTiBbxK+ZbHBwGsk8JFS+0s5B9WJKNVAxxHLnSKRCFBsC6C3qjsUKat/U041t07sMB846f+wjVig09PxkPYXiOB65p8573IZjKrrqZsgimxb86tpYdIRsDHbkURNh+Vi10ukqFidVS0TYlava8U8iVpnSkoiWN1I+eA8vRZd3OALVsiYg87hD1NhnS2ndMHbnxZrsI9KFPtvtRbNFyHvvsP4LM05VUIvcFGXk6U1CUpJaNP7tLKMWFRYVVqVpWxfFqhYraKrNzZZEvzkQ1bcmFnWfpa6cpv6gfJfF1SzIiVmCInzMdRR5F+A8WfP7z7zlZzgGMKahv9xmEckdvyAWjjrJuDAZFiPQSOgWLNfkbtq270j80NKiP+VCSbkmyQAtNwNaEWyN+eqvEYzgIm6l0MYPqPy9/V0dFHz7GHn5mNWlzlzd5Eh93NFPRXUS/erFkGlfN14OBh57VZcRVlRD6FVX+rEiE17pI5l9PM0cnWWor7fA4aOSXCcKEjLZ88TxKenGtOqjRQfuKHgJjuqQAVTZcIx/4UhTh0FYDdopKjVOjMfTsRQV2heUFQZgg+PTdfryrt7UjrpapnLsOkaK32ta2ppdBaiRcilSTtvoXtHn3PP12RH/PF2ORQf9ZgFhs85P84BcqC35Cu7q1Exc+Z84jnRHC3tPBCNxer2HuBzKkNzSZGyC50oG3bFeb6i+PcyT4AMSEj4qNicktIIBoOgWjklanTZAlSaEuOBCeLKxjrIjLdACRRZQkuQNzZJB6xceYPHqHET+RSLOLU039zjRBMpTr01Q9mctlQClca6QGZTHaUIUTpOfk9Q11BveMUMSpnawehcBu3+igvDBUynbAUAYEBWDkj7fQoJv5CIj+lWtqJZ2GlQ4W1fSPgc/RST/gVBjOzCOPMdKgvducrmJdqCERiA4dCYR4Z5MO7cRyLQTD6c7ydy9MZbj7wUg2zld8YEioawUoslbkdPM2W90uOcNmsHtbXkj8nlhoE1udO9iJp3UqjtXTk9Uw+iSve734VcGTGrPOjctQ2J0uDGtYtt+Sa+SbwnP0zcyegK48RiYCUKnuLADY2cNVAlURIiRRlUw4UH5MyAX6vFewqP2euIQLx+5wkSB5qE4WFgpLGr4RTSKe+9UvraJaL2oXTJ3X1jZlcp4/g7WgPjGvctxbqqG8Ior+b7qSDpStSuYgcGyz35fEKEEx4/QdBPV/ggFqCPILAnbzBJ7ywDtc12R4Xjt2hgiCw3n4SqYY93stgbkVWK2k1kF5uTisijX9kZdRujdCRtLAwSept9g6fD6fGmdmyb5ehJW7dOdUcy5ABW0pkK3TsjHtXondjdZn32xF3kWsLTEmUZ2IxSDYFD9vEGSSvD58sZl6PFU+hE1KiULhS18IXC/wpK18v+t12M5pLZlaevRmi/KZLcIxJHXO8rRMYUXaaBVKTsGbSQRXdBwlQstbsPrBwYEVpFEY4ID8R+W1rc8snjAVlIaYYC8tE1tO3x2YWlFqvcjE57ixS8xBpxH+wKB3+1UvSby2Gv5VSyiO6uHahIZHc/q9nu2Q2o9i4FrdrYT4nxClVPwSV/DQkJXzfog/eRDFGQcuZdlEroWAvDTM9x7uAvzLZLspY107cCMfnM74Uekso9e6LEWyPhkZXuwZrHeOI2Ti7MJMaBNYiAxu9u0mbS20dczB3TVKTG178xi+2YqThvdCNnuyLngtZjUSFDdU7tAkomXXlW7zR69X9hznk2/0nKZ3ZCaTr3ESjVDAff3q8P/270KXuWBIROTjZEY6DVil4ZQww9jG8EC5pd5Ov1XNrNP5sWQk58tjfA9yLH+VvD191jxFkRf+Z5gY++fnYVUplW7svNFdPcldJlZ4HlNlPJLJHCdhfxxf2tWhZC+ortq9GH8jZGz9h6lLLOhnI1StvanvQt8NBc65nbuoZbNmslLWpx3Q6Q2ZrPrHSKbSRCkAOPr1/7VzhWh/JSs7TE9Dvfcbta0mMx0Fq6KsOzPmo3RGnVdKT0QnPQGYhs/qBpDDOjvN2u7DLT0jLQ62QAwujYMtN/oiDhrKUiH+7GkTNHxN9U2IV5LfeGcoeFad5R4HmXoqDV2DheoczY2kqveis7lMVtITFiaNUkKMROlW/bqecp59vVvfjQuaG0tfy3cJcbLkeDijck9WvDlgH9dztdyIEHwAxQjEqVZK7OhwtyBzTpbs0Z1XwuJT3MjXlQR5s28OAKUySain2s5wQsUvUN/Y4dzcBA7VswJxNlPC2GFDt1NCiGNJciQcey3GInHsjWj1Yfy71nWuYm5EDojJXcQkGmBoOdRSmS1Q/L5WsCmu4nVY2OT3MJqxxGZCM8odtW+VOeyEYKTYz6j4I1F9iPLKfmMgoh76lN7r+dLsZ8fTK0jQB1rt4YrkYUt78GZbO+rFok2PbMJfE/6UT542AYmODlXZZihcEdFNHWESLlxoj46TyHdTFN+lsyXbUkraBYNU4S1S0pW2tqhYiUjAiE7ax5bRSq6oKIEUej2YA/uF8ftRlnhcCTaQBXUI6FEHygfAWw8LGl+3Ydaz3cH5iyd/cRAwcdmxhM2EUBopuVRermSwnCVyx9spgTDq2lKlYKCXDVpWI+VNDKXbQfZoL2hLKd3VMVXHv+UpEZUcCkNwKNY6I6pPFlTiFFUFL4JtLQikeCG/q0/IryFC4KqsbKQvJdrj/35mPPe2xIRrj9YSzcrASodg/8MsD5jPNTRLgFN4VWDaCVB9C31fmwXIVCpikesSJogCAEy/itA1oXRxbLAEcRfIBf2Mvt0fDz4RPVW/m5+4AScXMg/nanJwlO+ZHy2NzK+4YzDf+gEUmWhv4MNcO/b9ygXBCY1j5uv9ge+q1sxZ+w2WVZ1wJMQqc/ctS7IXc0V6wFcZzk9m/h69DpjFWus6HyhefCHUeo/9oSlYL78J9wIKo4jerRs6H80d5L3K0covISJO+4qe85yq9Egtzum4J6mXX++uzT/32jQqCZr5M/Xw5t6SuZANZXeGmhGOQZtR02Qc+ksr9gxGhEM18p0DQqoT97hwUeS0RfBiBYFIBnT19v6bEC2Gsa9vEjGwr77s7rbmlS/BrV53uDtq29NqeAIyByM21fj7YCjNrq+garC8/9/N6vIXIlRmYzjT+ytPVas6xV0+Ly8fai2xJGhqxKHq+ewPsozaDL2uU1pPYAxDxotRqssY8ZAqD6FmzSBHd4NH5rcPQ9baXjn0R6JlWMAyLSikME1DgNo7RnoLeH0t1Z3/BhlULETFc7FsLTtfHVn/SAXqOTqcdV62O+xgrmgAeflLVjvkCMiELwvW1pa29KahoXYOGEV7XpD2Mu6i5Kvgjlws9Ugy9mvraosrTTtJo2Q3q1iDyz1VRhcpoLVJvU8Kths8ppk0ShEqqpADesPxKu/FdikAnDl5y83BMQGx6/6uTNEjyM+S+xy4LJZvKTqfdXF9doVpvWJN8hHVs0LcK+IWzqrJpi7XWjN+YZrP0DvcJVXQNt4K7+VcLea+3aShldIC8RMQWyDhn9ohI5E2QszZhN2tjeNO7BGmFV/+3hCUvtqmRLRJ+qsT0c3eX9EDWam3+BSX/Orc1X7wL2ELrwW0zQWtuaiGwfnYibWak14QF2IikkTAYdDs/zLeILJTW6zmiAxtgfGXE/0tMNgPXl9Q+AB6rYrzGLgQmFLlshJzSrjP8Wc6rOz1FKnJ17UP5/rn7ezUmFw0T9/ZRN+wQS782orEEtEEhPaNOLyt5v0yU4KmoqfzV6pbNrDXR/3UwlkwnK473fqhueB7dAnEcHq1tnfuosf9gU0LTz4cAi7nPc9J13j74H3u15g/yfMB3F/578vaPj/Ng9x5q+AyUuSJEP5PXH3z8c7+gdgfrzXhs26/d0JgUN85vkL4JlENezHg1AfboUmxy5zSH5ZWGTs+stt+8jbyrP/Z7fU1tC2uvJGSnUZFZq+MDJmr7UzD66/q6LyznZjoXeIZEJHk8QMf15gTQlEWFaI1qda2syOs86snUEAqYUxwl+CM1AYwgoWMZ5IyhUW3ESZYxFqBPWAhKlFafmgsoSpaFwvDC+RkoQOxe27Ns4Zhmb2rhbajMY38S+LTHlFE4WVihxWpsGfDLzZApP/QQnQxj3dAFsSPxV/7Uw21hoKhfjWc1fwaoLPLgmk9joq5ApmnFSJcIiLM9tD6XWZqbN0Mw9JnMmEwnajqZQSvkTIVPCWzA/buwdWRPJXR6DTJw7tuC6mm9Sto2+d790g0hm4Vg/4geOgpG42no3Fo1NZdBlM012WBPEpQjbYj/DktHS6Gw3VnV9c3FzxDqIywFG07LXKRlpTErmHxaH+HUukAMRpc0WrYHJUGcmpdNQDIdaHxfOFe8KcymbLWVR2NQHXPf119y9TviUWBLe0qyxFqmiFZ8D5ljxUgXCkmkRFpOajyKstUZC7NdU8xpQZSzqKs4xgpOFOYbiriKVoTD/eTg2FSsT4g2+ZDc/s62NfPzBKMRjZY1l8eTfxOEOPuLf4D5jtf0ROn+eLH0dOwe86lfN79P9o9kyP4hgvt7MlDpBd7KQ5EgygpUyYLaNUnQ+HExsJjW0dkBqpSIOJE4n6kPKNApFW0mXDizn62FITLrvNMkQWpaXnd9a3VEM1rJPYfH4SNoAFjwPYgeia9zX9NZ3OJo9uNx04V4eP53rYXbsWF4/kbZ+4bZRfuGM+440PASbFzpJyWwq7bLHm1W0iYXtlak/uriMZNS+ek2SpDFJWfeqn8UPuEJqUrdXNu6uj6By6Gyq4HzVWzvVqHl3PlbASk3JiPx/IZaLfsGIgAASZJ/fcocaz5bBI770DwlE8GHfPodaz+ZBlNid/aj/oV4D1TzRd7EeeqBGzikzeRQ8Q7gjx1Ea6Ov3S8gUOJUn4zHwD+xNPgUUH79Ovz8in6VYrkALt0TwJGilO+kfGXHgnKP3Q69d4PF0GovtdBZEbjCCpS0MOpCBRG6uL44MpeB/Bn8t1uXxBULRJHHzG3EYFrFtKujWOlAno71X19XmSLNLVvC7hWAFVxBHisvgX4H6p7GuEdb/J/1HbKh+pR0KLYzHOZsYPHFFQ1HDqHlUVahu9p70cg9dBxdYyl3c7uXvPF5dl1OXYBpUdqSAORnTWA76WEbOiAC8dS7pj/1sB2kXzNbhFWtHeta3mB8IM2kMhW4HALH8IpaPvpwB0+izWQWhPU1KtQ7iesfjPviWuZEYzA+DCkkEKIeJrQzIgmfV+TKxUA4hlE6SsXwFvmxRMlLbpv9J+FOclzaGxhbzfVh+SVL6Y29iOpZdzI6/fIgI4nNuKfc50T8MyyNllWr/xgYEnkLdIwLaDBIm3j2mdHq0sVQqWMZ+Pdeq5UDRnWcf6UN8zdVm39CaZbdJmX8xDp/Icy8TnmRqX4u8tWIeARA2IxC/gK/ACM5CmzsCdDsTMRAnVWtunV4EkrHUMmpZUwWOZzNldAZHrHYAn64ZbRhrSCafkZpBsHDliYrcQzNEQUyMm6yAP5k5rhaLHm9bWQ1pykNz5DIRUlwyZ79KjBQtYKDBOmCo6GEYDT4cjbp/LcMh7FXcrO3OxU4coQaxBJ+Sc53CXvB9yNixn1+PDji707mzBGvpKxEY9KfKp/eevyFoxeUCynhmAL1SyngZFoVhYhiDmWvdD3q58s64Snx9Pbn/FmO74dkbApObZHDsuMgPirpJf8abC5X2w5sdc+Sm4HxcmPNugsgg0E+F/7a55Wj90bqW/T4PZXu7CLKduk+PmOHlzgW5umBy784z+TUubFAQhxoXTPQY436KiYJIzRRjI6GLgSsWexAyaxihMaRBMpY8SNpgaIVDwZAujtTc/GwpFkAiZvHJuDkEEsBK8xU0f8euTeJeMIdLxs+eKTuXptn6wx2g/K9yIN1/6+493aGthzs0kBK3KfxMNsMmIyNKIiInYZszfhfYlkiSXID7Y8aVuiZ1t+diYxSmblFXtomNOX4eC5Nt6np6scSb4NRe097T4OlbpltI4h5w6ujUhB0N0H4Tifzfe0r3G1o2fE2dGysGi0r/V2YsKt5XYiws+18pWFhChFFd4xJS3OI2aqazCrUanrp6sqbXHsOT5eautoY2YuVa035Pk3ulSCCUDEvoE/XCt2j5I3Vu++XzkXFhuX5OHnlhJct4aYfxb4js2H1Jy6a+c3bIcAjdzpwIgxujn7HvQVDOtCyn8I1GNTSoxLiR/23lmAW5x34WbYaFDzBDtzsqllNf5VO/UIteQSpCpDX6TgFQSbVEhwlcbqOyvIBsIR7F6endhXpRu78AMDIOxgu4BXt7t+3qYY4w0wmRkergW8hzTXw6YyMKGf7ofOH9HvPB8v5U8fLX13gPXA7qN/z00y8rfrxv7VSXy1T6qvrQdis/HzSWXITsRuymXiTlky6TL+Pzd5CvliZftfaOjj2wOyZ0U4lnSgdfRcYO6jZhd/y9an6Nr7IQF8FSbilY41cxYf0PF1TmqNiu6ZvA7dzt4BYXvoqn0YLC8Ylu3+r0dCNo701vBH731Z5AUN750Tf36pGaBQ4mbj8Nf9QOz+56f4N9hx1l6cfG476DyIkbB8cPAAcmgk3jywd/irFHzAQzAhx5NMJcmQiLJLsVp74Ozj5bbYNuADc84nSkVB3oxfUCLy3ruCO6T345musFmAGG5+MR2YlS9mrazOUxYl03WzgYbjVbR+zdv798aOTo15AUve69afjjXKQZ2mpTZ2lxZU3RuGm8qGFeKBkZR+Wos9K5jLwsDpVTf84Y3HR1lgur5mRmbeEaXNTtKCL8QBQOdghOjLoDf0N22Qr7z2zvkRO2tEDoemeO7UCGrBsjX5m+HfFAtPT3be/514qJzMr6zOh8ES016JoQH7tYIYC8G+qh2oRenshNJGqJqVDcP0CsDXntDgn2WISPotrH3w5Pr+dxXAf+jOKBU/uplAXWYwXtCsIJKIgSMxOPbQQEqkfHauDxV0rpjiuuc5ETdw2ibnbxImaAO3eCfjIkha78PcS1JIfAoZ1rbZB0mpZKdMrgDC1tyWano3ZWMlymwXEQcq83mMQtB23szGqU4MIctOyhIw/dh45W5/TIWolKhRIE3gT0PoAuN5iLQkH5uQWAT4HhJj/w4p57zgN6XyA/D8pnJcHcXF2+r65gXhCILAgNAAtCQvVgQGgIQlFT3zrVCoSUyEugi7m0FKqUS0+gSQXUFJpYoDMiQoaD0RHxIYgwYgQ6eAR9uND8/mxhrKim5PXwo1MMjdlgJJbv0kTSVGoFrhQXfjfIY8rESzfLeO+BJ5NnLhfGn7ZCrEMTmCyMBDsW3cpe+M1UlauOj4vjMn147ilyZlxNg6T2HPgEr4oVIldinoA3iLQ4Ampt/HVsKA1u8qzvKEvdtwX0zuOM2i/2JcNgufV270dzM+AL5hK5dBhiP7wOBhtvcLarl8tIf303Dl5q3xLwdwulctmws92wcRisrhFiXy+XlqQudXwlmZ2bL31G9kguKma7k5+WzjvROuZm50ufkq+/psVFHkzys9L52TknWv/83OzsxpyWXqbyKEglc7NO33utVMp2gta0tFgCrQ0tNdCahlZroKWltcLISWJyCGxKrZTIa2cTOFKevrdgQ4FHSU2yIZafgQaSk9EFfI4Bud2zR8D5IHpPQJBhiHVK7X6qsU7KQ3bH7Y8vrfn4wI3Gcz4y3EY5uzUWrTeID5dFxa3ntPtYMHbLem4Fr6K4Yt3kTSh037FbD/LXsW0fFHpz8qxZzKvgVhRHo5xVj4E8L2hEtt3aQy6QxR5ylYhEj4d9OeL7vRoC2fyxErIGn6O/tcdUZpouXX2jIRq2vpG8ieI8SxOjAouCuMGcIJQIj1lPNCYOYQRLn4N1BAQSQUBuX/2Iv0+Sl9wr3Qdk5EehSetNBlNUdQn/VUb25X368bKr6x9vHYdFcVH5IVdwPxxeWlxA86CR6wgRXwWlcR/WGmNzDNqidEEyV87COTZVASSOKEr+tiyKl9Zd29RguBKeyWSkpQF/fOxi5At8DGjq3v2jLQo+NX9X6Ok94SEhxaPmHsrGBFMCi8Lq/fkRr8+Pu4X4hxMm5B5QR9zXtqtRclQOlGJbkDL2yNqVK35ndAwqTZi6upzqWFdHjvQuIGHppciMy+g07EV5PlOOk2my3r9GAtxxI2UjDvYaSyLVJjVUVgf6iG3VwjGYsn+EmYmNJgzodYvFhI0CtQYkWp4SGeMrC5mESUlmngjNowFb88ZLfR/xtFTWifC8FNBrqUSZ70Nu6MvQiiqK8UkfFPDK7w6r0FPBf5ZDyZjt3ivitgJ51IIhMGpXvmcYRb9Rn3y/jb2U3pasB9SnacZ6YDErZjY7FnL3Fnh5gJClQGn2lRhob+59B/5+gdT46HTfOjHbEirpmSni5UBXWnGoIDlOy3AZ1dHSs657ZX2D66rfRWQ2p3SfOf1zPINhwVCUFJPZNPOI3mUMNjO6Z8YyQ9srBV/6PxVZNSZe61xCVuZLrDHn2Pcp4w+OgtjcRlVj5U8w2z/eKdl1agpz80SfI6QqLDTX+kppbsF2fMuLssArPyNmEVQdCwgVKbA6LhTyBBmFwar3oFBBhdXxmtfEbNu04Vrejtjr4HQDInKqmO0bf72Sf3FJTN5oX26LBa/NXJvCUx8GeRoizf0d+0mHYmMQFU/64ywTZ5ty2xvMg71534VDuLAw4qYxtWKHZ5ltQ4t4DSMjN0ciQ+4Wb0nJjLGIFU347AiFBS9WxGzl0a+JSgtOEZHdhBMDbROj1oBZRj3dIMcY1pEbDHR91hoZGLD2BfhV+FwRp4GudQWhL7sCXM1dDQ48KwL0qsLfIK79HtzkBdXzCESQv8QX7hfw2DvHBeGa++THf8tfDqB39/gXHpZdBC+2XGQR27SXkmWx6KkKd41JpbNkWS8RfgdxHaoIZBTv7RNEISM0jm/YkEaGyGc2fuRmLC04o+vCAIHFx7ko1CLFhuNVC8DzeWU2Ezd/sm/83UghBir+QieA9V+GIm39JuD/Xq5S1xsEECs0TF94DJB8wxPADKiMhKBE3iBKXE0Qq7DxKia4/NyI8x/HgAlGESIwsBjBmADGKmWftEreLqtMY/0SxQOYr/GfVKIzjqdMPyXBeCsFvsgSADR/RLKMXLSsRAlstJnP1RWfDYmyvmV0JVB/xqE7v/7mrjtntm0ESpRoWQw7l2F9+3wZFXMQFXcGKM/SMpQFXArP4TK4s6So7HyE7qYYQl1CoPwxQ0bQCx/+fOPgxq2aYPO+WeZ2hdlgxixUBZX++Y2g4s6PGEE61zV0UDjk5+JwieR8PgRNPygFJYin2EbsS/Du07vgy/edJe61bqIGQQzO1kEDU/qFX0u3wbNCojavAbtzb0hS6fvlK3KKGRmFVuvgf/nwBqG8GausBCvL54wG15nxYjqCjVFWQNDDz2PuxUSff8s6aRbMoilh3+MVLwp3RyscxztXt82aF4VpmeIIqGOpWzym8YMXKyOdyeNkc/XmkoB5T6/XWMvnKYogLW16p95fO9jXXp7PA0rMei4nm8fMSPdiNX7AhLe7lo+rPIlNuWFOnV8S6xbP5p6a/okBL3U/zqOKOWC2PecY4csMVCa7Dg5KQTEuDSC0tvuFysrSIDNcJd2EbCBaW5JDBC5w++BOjf2g6+L1+n/AzN84qnTuDk0c12QHmcyA+HwjVYw16oyhRW25g3EZkh8ozKX5IH0C3ccOIkeSA9hx8+aGUACqQp9vqAf5J+9DWobke64Ejzz8osdB65J1v6A1y3lKDShJzUS83tf5bYoYZKcKY+9HgtiXZeV+ChMU86scuNxwUSR9EpffWnf8XlrZuFhUVORvbF+UAtQ/6z0IOdK7hVYO/LquUQnWXbULAx90IhpsE00Y+YU2EEoZvBMcFS2ctXXtMbQvHI+Z0JZoA8V29wq0h8BTyNI0rzy4CeGVD2eWIE+Bh7QluYFC3PzLRjsNnom1wJjeEoQJ7i3GN8WeAWmxoNzQ3wdHeem7UqsRmXqiHJkAbvMwjNzsGe3HO3EZIvMsHWqgc4yxgugEcBWzORXlWlM5aH5m9kxtZkL7zK/MNYNrMFqK3eJmISjZREjWzW1Ng9yl8wyAcMg8tBWZyZkF4hgwdArrXHEUjFOxns2JHNZF1tsFIBCBy2WlMWnUnPOiVZlcsFP37Ica6Dja1V9uoxbIaw6iQztw3ruDo32OVidg09L4MOgC1cCFFT7WLwwWZBOkMHuvjrXg/LeCVfU+qbNyFgHLZTxPoBeGr2jFyehuDs63HkPxYaQ7ofP/Zk7qheTNyG9A7c21hHAh1M/c5RGQaRv900lA79luEI5Evgvp8c1EtVzsWDxabz7L3N0ykyfM42V9ahd2acuiTcKVYtKsx7+L9PqvNM5/1kxfEwHsn7z/dY57erQbXzPvVGOOrsEN2LMzC9h+XBvoWaOfL4HgYXx1QtiN9qKOaxAiO4CwgXw/ip8iPaWZqLZduU+ZIifJN6cB4hv4LbEcK4g6/jB7CuF4NP9rruM/QYLmXFiQIjsbYbE+Id0LxaebiepEe7h4n8fGgrosd979kL2uPZw9Id0ue4nWu1wW6huxPvYB2sSI24EdBTV1Ihq+ozK5fqT/HyTfOnyIea3dy0yqinmJ5O0Assptj8F0DGhgaLvoqXykXqLcpeXwjepbEiSyAptGYBOgMtZOWuJMx9PJ2Ku5RlTNFpvlgsHRjOdE+/QJArxNOkMxeeqdylDNn2mc/7HM+HbNBB4DB5N2Stbh9saqzwrMTs/o6i+SPLEaGHJUed9tw9APSdbmJE89EKRWCxaFfOrkNDhS2dtOWvh6paG7X6DrLaK9Q/RzitcgVljKhTi9RTTHfR1vSs8RO0H4w7mKxpsSwF8jirUqR8EQ2ByoHKLBtcy4Vp8y5TFzk1JbQjxEeg9No49h4y2wMQSwXGOSrJu0j8/8k5xLYnkzmrjDwSL+0mBhOgcszAfBIuEAWCReACySNgMski8IsBh2NMBi+CUBFqO/DBaTnwQ2mWKOy9LUPy+mPRtsMt1MYJMZwVfb+Hc15gGLlOsALFKvCbBIn1wasnj3/+KznxLO49z6qSHCmCNjcw5w3O3c3D4UPDfw8/UwWZj8b7v8tp3xjlmx9N4iNDdR9/XwF9D8uLmOvzD+9yIhcX3gHeH87b7jPGGzEtI9LvsZXB9pympO3B6wvVlgZ+OLoVJUyaDHHZqp2C7XUhtW7nr0rs0esSjmcOnQmKVU8y09s5nmvL5dc1XMXDdrGKtFsiigO+9wgca8RqWTHgFlxhuVyt69BW7r63PrNeV9iNVwpa37LkWjCcCrndRUKZZHYLMILBcqW9tJS6rpeDr8w3tQ5irS76/iBEEQBKGdgmA6nlSdEYSVOStzwYUjXCK56tSWrtAr1WO0qCo0uhgd7UiffnvPU07/wf3na7UR4DE7Ra0uVMfEQVRZcFF7pxQnRL5B4sL1zeNdaHIxqZ66YbOb/di1uOE723+Pk6jnXCza74XR9hFLzOk69BPvzs0sEKcjAHvYqRMz6l7wZM7DufA03pQH7Ie9G1wspt88aOON1PMb9NXamV2HTw0CdZzAboHG/FRmXKsuTHnM3KQ0RoBfDN7dxQRBEARBEMqMi4TymCjyDStHPMRGY27U0dSWG3WAl5M6S7IqAisk4G0Tdvm9nu/yvURgMwD3BQ6ec64OzdF/+/h7/GyJ75wx/ty2l9bPr+e29LzGd83v5GVOm0tn/E0LnAi42IwdU0N57VEuRuRmxtTGYnoGt+TS3uXLneS9fz59DtG++aApufUu78nP9YrcGXYE6D2ABqiDES59qB+vQlrbxISqpUyrkDZw5ciDdo6s5Lh4PwBfaQKWu5ShuoGJAoZyxFa1zKcXME7WLBqg3UJJFMDPhx0JcqD2uey4ziifn46LDOVsd9x26Mg7tmDu+Z5dys6mmtA8JCzTur4ftu78RfY0zV59uoHHv6IN9BlDJ+ShLbGWqoVKTcxLN5VmDbAcFruUWMRXJKbWWU1sJRvIz+hPnnZ07/b8UQ2psRpSc4+JtWb81E3TvSjPEa1AQ5WIUkL96NU0yvUlOuGVax93UtTJroMGqHRLGUBvH6OCdi+RhQVGd+/gR7gI9zr+GVx9tx+Ag8KNngk1+oVxWi/0Q23gyvEFLli3FQnGdgefnt2d9QvjC9ANXdAJW4QFbROerVNbGedl0PEWwALBFsQ+0AF/GV84QA7WPm0dtxgf0TuuMFzz8fA9x6KA1sp3AnL10dJ67BbcsRXnonth2CtA/qquxOEV5mUMGIvkmVuoXwwfLXwdYbWwGnTDb9AFnf6WVCz1pJzwbaOTRqsQ0A+NL63GNsoTSExuNa1/4bE2gMBH4pK9LAbd0AW/QSdsKW/bIuBj+oEmtNraMmpbyF8/1UUP+rbxJcAFzVq1A/1+P+gE+pVLSgl6mjp6g34xkTsvbbVIJjhrNSnVyAWxZr9YZ67HR4GKyW69pASg59JsvQWtbI5TySgvWz1wNF+t0craK3ZAv8rbEcCTN/WAj6bXuz3ONBWkMFb36fy2mMuwQsJSUtBTBwb6mUpxbaMWXHyhEfQH4FdUvGAUKb+OKC1fsv6kaSeODvhr+Bk4SSCxPQumA738sEMICSYIZLRcUQYRYp3x11FODO5GgRERA1YLVH5BOfmskFe/CbpgG3SSXietNEKCcfHWJOY0qm6vfgO6YBt08pbWUdA92t6v2Qi64Tfogm3QKbS0TSDhnpeD1AbEoyiHjh6kWOskKsmIEfRbKWagG7qgE7agvVAuZToH8sRC/ViPmgJ0Qxd0whY6wuBW18eu6HsEwQ0/cwsN11z8jqNjo1XhzYZNOaXmSHRU+N/HDqp1RL3ETEB3ux8ywVv00dbZGD3uRxHNTRkYu8JAUW4dYjD2d4hnNPyZOAcJ9xCMG4+sPWYZ9HXjC4QwYoLEylpLswq6q7lqoDqBLeVttXHh39IoHCHB6ttH0VZXsCExGLetBUHyU/ciQH8yvgDdP5Vc690z+S5EJ7JFRBuq801hRgPW7K/W6ydOQAlV05MhTIHVLjGThsh8E9z1EFQn3a9O2KwWj1q1MKf7GNLT4yFwL3ANs/m2O0prJnG9aeQlsVappptdsU/GQR5FiSOWEOSwAuu4tv8UrTUmgIIl4a3YEbNnwi/haZPGpAiLLa0dPT0d3u5C28+Q4ezVHOMugJqT9PtIl9KU9pspwTBRWxB/cg3sgC3bAtMKISM9H8ImyVFxXYjY44XTEij5/agSedp4mZ857Ty7quowODOin2tEbbpmstu06ROYIs07DZQITFissnmyvcubHblGjjts5tFiLnuJ2Vr+/bERDcKz5GQmd+443MTPcjFhROsqjKoUHl3sMCStOPMTRCbZzxtJ13NUXqo0gEY3m8Z3PRRCphKWvhz0RqXq1bs08vBKjdtdtwOYv5CgYwLZ2TdTiFATXTBwt9NzOF5vL+uo9VLRRu80eqa/8JQPwLQLqmsJIhlTvGtDls2gFSbimsJw3UKQ8CcWQbaWZT2Xpw9FCCFB8mM3tLOts40Q8pCHmtHU+vLiQMQUe2lyaRERNjzXDxEvebmdpsDY5xIMgB2l8Y0XDhh6mh4Rfzdo2iE64poO4Dox3mmpFCOTfulE7Bj+o2ycEMujPOZt41jAHoE2JTQa36jYiehi/O/2CwTis+d1VWQhQfaiL4kv6c6E9tJ8HRWTLQYyzk6rq+AgX38IIE0D+X2QC37xy4B9gKSG1Q+4M2s90hpXZGVpfCoTrsNfOB6WSnArXXWHQM5RJKaKjbsEQuxduxrhGmcM6XH9Bg5UW3vFwGAdWXd08o3ON59TxMN8yQMa1COrHREQugTZvza4SOQj+wlLmY9R7Mb2kittdOCr/LxyTKivB7Q0x319EIQe5uIBgsX7XRiHbt0ojUiVmoTtPcIwV1tgSCLmlmgJwMJz+id6iA/Qwa0V3CffA7kxll8z3KvlOFRMg8CPJICIN/BxapRm34Lg4nckDDJfO2Dk5BXC61SgsngTXtTNHGusK+Rk6FXRYrzDZjk9cvbe4w6wZlJjxpxuTZUgrTJIafYSrOmsJZ2lBzHPC8SMxMOiRQ2UIxfG4sFamWEXEzJQppxxO0TiGOBPajNFJpK44GeEkDgRyHZUtjnAnbfVvMZ8xsy0WfIIIVffyx2Ir0IlmTHEsfiigiiRwtOOKQEWTJrY+8RklGPRbe2AQ+NXcq0LKQmLQCOlwDMav+76nPeGEaZiyxOJ0OJEPxh0mhmgwVrjfuUvD6An13LeDH3sgiJejsY/twiT7Rp8SRJHoJup50nn4kp8EYgKzM6agumdwIzzE2/FutH5mCdCR/eOaiWsESKQOKMK6eS4M2rhdfVtnCQjBVahKH//3AQhTYG2OZFnmXLcJtdJqyH3Lm6H+kjnbmZx2TewMY19CWetbRskMpK0PtMx5W/gOCGEtDLNqCcp8Mfk8IojgSONYUc5QkB0TQxEgRzEAdxlFM6u8Pw7B16bsb51ZOUFSOP3e+QzqYlsD5dJe8ac/pHgU4us5DVFxXniua3H9R8rzo89A2IMgr2YvoHx5ljGln0LBnyLluE1U/HGwyyocOzi+ssMDMcDJIwGEdmWnL4FnxnB3dqxHf7WMa9QIaQqPW6aBVXLiisLKakn2gXED0wq6YxDZtIbRC0ReepdigXMwy5y7EXlkeoydPJ5FDjFFiL8XspN6ZPsJR7X6rQm3/pEre6H77mIguBEKCcz91WRrOpPkYg1iriciJravkEwRCIfP4p4wn3tWWbkqboauJy4OA/W7D927tRZA+MD2wov5yrZ0PrmLXzn1fp0WRltUpHkSbDcL70xBW/+ZsoQ4bJFiciEQkaCvu2j++uJ7wLUyhPtKfxNhLw2xa4IJNw+GIe83sCq7MoeU9wg8Koyk9ZC1Z7aTB4WXk/tDokDvZHrPfhZKRqzpRWtPIoeZa1IvbMUZ2jsTUGt9GwpNr5HSXfIen9MVz3rKQQ5zOrJpi2luLxKiXi1hU8jsxjnJmkzwlqDXLjfHOq4EQLfs5AwsKli0E3A63sYU0arsXVmgCTEznOJaESs1d9QbZENWywc6OyZ7hf96v7YXtRw8ceMrC9bp30xzBb1jZU3cc0WICYlK+WhQuN+MqobxZhxwWpj3ffQTo0iaPt/1JWMOffk/39KLHeukoRKI4NKvxV4DOtMPG95YQ+I+6pCXgF462vFK5uqaZbDK5HsLVEcaupPBN/GHcU7/h7dxwf+EnlN6OAjHC+0I274zW+92Fjqnvz9fQvQoGA+SAddV+3rSUgILsP1n+bQdLcXGkBr5XTv87HdSAR6Cd1uAnGaU3ToVB2IeDaRKWDuB9GsUVp0Lfnes3Br66757+bwIIWn518liGLjzkT4MTJTDdF44o9RGnj+Ew4LM5hZC7flbhIcej5DTqsqyhENt4TamQ8iIou+VgYJtVvg4SccP6Oj83SgXsy7WkJ+OzsT5zcmaIR5YG6QVzTzTaRQc3oNqVzZ1vpPcuGlIYLKktBVzYW8GGywlKmck33Fh2gjfcjzfu+fEJbFFnIRj+wLQdJIleicn7s87Jbz2aR37B+zOjAxMDEP43ZnNssisySvWv0vCFbEZRRSlHR9s9WjnmObaY5/QvRyq9Wg/dtRxJd4LX1hqZDpl/+ZhxLtMA/zKywpw5kbZAkwiQ8Nceib+uNh7d+IZmC1i6Zg8F7Ji50kFLFG5HdmCUlc8QUlmaaldD1HPpMnjUDfkSIohJqq4DU1QfeN0JnnmqdBU+R0P14tF66KBEunlHFnCjzr0DcvlwdcEWvxBjkcHmSpMDD0URi0FH70ATXAOACVJuefKmPotVTK0g7NP+6otWt03dTtexasCZROdv/RLYBa9BMuF7mnegnDTegkW74rzvu06QQ1yjE13HvA9SUthJ1Zm1LuelNyM4Sztuv2qe5yNCJziisjsnednNe61q482AXq4kOY0yZr2WL7plXvlUHWKh/WOjx0B0OkgZVeG8IpSjOFfl92vXPtqEsofOYd63sYDQ9XuWhkn0v9zeMEiqRMWnpd92xMzlPev6YhnrIio8noU4ScJtvSa8sUfEvc55sgkjfxekn5Tkk8bT23sb3sanJTNhrM+g+0L6iPV5Hkci4SfZf6P2AmCsdsui4fK8nKpv9YeIu5uMqFkvpU+ktwWA+OK/Cv2VE8u0g5woYeV4KH9DpEa51E+LjiU0T180Cb3BmcedlyODHTgXW3jtzl09tw3bcPNcD9+u7yYbtx19GzQi0vLUkt0jr+WXSpaZLVkFbPM0bDkI+han5rMuqrdGmVutVxF/SV/lDkYPPWnge2zqF9NwzS95MYk5uxhaq/4WM32PIrwOUETRd2lAqNfYOlUEZqPzxu/Oe/P3/78bsvbx9/9OH92+sri/mc/PWV+l+n9lUxL7odFCqlXlb63L9yfemrBZ2SUiYu88pqzvX2e72aD90lpZrf+Mq/GnXeiv/yaXoaj4aDXrfDWV1mXt/vK6XRd6eoD0ddva/FZEva6mdiolnvV7gjz0Nf/8LQ5+FPkuZdKeRa8j1mrTtRK9kdRhEJtTNoVOxZT1j/wS0wHdju5VyHy61p+wUK77+1Wi7GA15X5d0AXRtNuwWOAdbzX52Ow6rhX9W144fDZGtWsAK5aS/TDbm7Hw2lDLcbPsTtPYfy+tNO8U+Xzuh3OyyOspdJis826s9d8/nh+9166OhGfLXykf4Lq8BQQm2842CicFih4El8IeWcbkkptyqn/PpwwmJy37jiC6zwY0o/c4YzRBFFFjTLeWnYI/y2U3oHF+Hxeve3ZQSeVTdrZEhXGlZ7ncKMK51iLv+bQTswCDzO1kC9ot2yEvg8rO2Fm3ws15yjun3StJcuv/3oIbdzfkOXxMFevFy4cnQob37qVOQrd2zLtxgJo0bgm3RnsADBGD6jIviNIJqoFaG88g+Rjplg3lUh+pS1YFC9Z+ol5CQZv5hapUQrXZGhI4/I3oj7kR3tQg3IGRO4uWJzPhNGD7W0w1d9sAQcMpnLFsfUkZZBWmZTULt14iR7jc9d8mpTk4eR0+aLdosxREsv/Kz8HjIdD6wYn5oZc0FjrQY3TUjNwNjXwMhJHfA3CYqKtqeO6bdzicBJkSbADV22zF/qa+hN5QbNIscVTVOZohnoX+VPE7HH++bDsA485r/mAuv/08PzsMayP5Ylcnsu16f5F+nfnX0Euq1DUrw+n0nae4kWKGFg6Ql1DUySBysK/0fiDT7hKgXpJKchB9oDFwioZHJb4Ex7EMBiCIvepjpBgiF25oyYtcuxl07RtzZTD4WF2OVgLsX1QmAEW4uXOQo3MGH5mOdqcwspV07sJKDbFwol4GYQTUbPdSkNRfWEjwlMXAh/QszkBSJ2wMTe2NTuThEeEh+kvSw9lnspfdKV3nfB1OokNSy6KNR5dK0JEUp9uSpuLFnaNegjsk1aqD3Dh0UCER+fU2/O0n6LZt8QMzUhmbzXZGREKrH0UzWXHZ3ZfGtuOvGvkD28maY03deNaj06bAfzxTaoHycdJvLld7P9oM/GnXFVZmlEXMdelZjfQOs0cDZRk1rYz3opWjqfzZGgH+zp2KNKCCoYJ5SUZ9RG9j7nzM5gpFAhK7JN+K2ETo0w3NTv3X8ibE5sOh9JR0kjiMkJX1qqQfuTVmXay7r8gDVE1gcI7PHCeiIvjjxZvMVkWDiJC4HwuYmRcz0iZupFBtDSxjr4kH30kAQoPIGFXH0bVAzdK39vUElAoJWCbJ5lyrcsFEG2wQ2XPyr7egQVELBf3cm2LmsBwjU1FEL9pAA/ObxeqPPFm7JQgj8XTcO2m5ROAqy8Ofj0JgJPEiK0paqQtHQg4pmiALrGsYiZFE6og0+IfRYCDb2LkvG4Fhs93fNKGBje4K0De94PgiGYXCBf0cNdanHUGT8ipJQPZgpR7IEnigHIbaRHUvGgMS8ccWoPCX0H1WwNIhwGSqkHe4W6PgY7UqM7aneSpu7LIns8NSKCC+ua04Ltpt3arbA0kmVmHITurQOLe+2u3WRDJOb9SmAfRCpqGVsqB2Rvzu2NReKNG2WwPdiDWA6rKL7Hof4tlP00co2trUtiv+uT2wWn0ielExY6Su7Kgnyog5EVgG2rFUdztPZnuc3lfw8uiYv54ld3xZg0IFYHS/avAz0AfYm6o5vK+LP44lHbBh75pKiL4ZeOaqqb4PE0kCKZd4le1TftYhFmrdUxRXBUTDUDjkjIw4ioyfnWNlN0nX/sAfuNg06TVBaRJs4fbbuoQ7+1YjXqMBlC7WuS3J3ZpwApb3MLDZGgPn86z1BvKObmS90rnoFmk0/byYYMIjJRWT2rU3IMD3XA1p6hd0oyUdIoBO6ouFjJjaH9HY22k+0R7/HKJvLNfTv+vNka3JWh18IUfNKAl2SVCDBzizQtMtpgFCRJyMLoEIEyvTgm5VWnQ+LIbrAkIBqypEHVl83HYiiYvF0OMt0EJ0IBvHbtGUvBoSzL+vPv3x++vzHd/0gh1f96gkanJeL430Q8MFauWP7pwf16Tiqqjfr1yw7W9gsyyuzulyjTf0NBqEoVyztpvinADgVJMUUqxazOcYxCnonBdWupnj+yMHoc9k9I4qMHWRL4ntuad8WVT+ks7mQ/7ngSJimy9aqtdJgcMJG1M8ezBsRhi6uHFNxpwAYwyaajm1F9M7GHR3BZ9ixOcUUVobdXYm5svPFNqm0XHL+hY+mxnu+dg4kiF0+xZNVhC4OGbE8LS/koQEbcs2UlzgEG+gJf20RRHCEJH1U5ws20te9qPsQ6wQ1xuHMOEUeFl8A3IZ1CDCVLeIP/t8DKb8dzFjcdrgpB26ocNZLyOIfY1JawoyMFBBuJQhntl1dveICRW4oq6ZC3ZO9WYLigHbbZ0blw42SqkijI232iLOWQOmoxB7ILUO5oLTXrrSLP1ZJkwkJ87Y5JiUKpk4idEyP4ieYgNJCaDa7QBeZMtTU3W/Jwm6LeykQfUuqJzH25qH5nDtLfUVKO/qGHbMBKf2xiY9TOprh3Cf0HrtKBHcMLJUiU/vRSrfeMhmj0NeLkZ8BQEkf8LPnBMOAyiy7lS0fX06aD5gCpex3lSrEfRcV6Vr2ba4vI8uVhmsUE8UceU4deUTRrPoZq3MVtprRbKUAT4jAOChzSfq06ztjWg8Sul01qQKL6GiJ5VGmSyvOcEl+8pkWehsTHVpZD3npZQETpSLesXi+Y012jA+eZgZKwLULUHvig3JulHpuKKqFwSxO3Smelf/84xf7FG/5d71qSIXSWPQpCuChqcTNlR6RGSnOv1MCbgX1jFSPBctLu4cfeA6XfrxDC9NrNJdTybXjek6rkBzCR1Oez4riym/8FX1zgf2Ov1/5+Hv8ObMdpUg4l6aLwFYCASH337x+rAD79tM043gr4yyXfZwdtF73rP06sTww3sMAsowFvPKitvwqE2PZd6S7r9duzavZ80E8geoutXVK2q1J68UnmKn5PMPY8W2DIwOaqh8KeFR7MmtCXUvoIqa7lHp1tFpI3+OzAdX+W1JC3iSx/BWpnMAw71uAA2UXGEYbsh0CY1UYaCEPTQuNoQygIa3Q9clUvZJyLOqOIcYiQI2sraJbZa0L6Gn8MQA405eoKzQgkc3GA1WP0Q81oRlpvi+0paO5D03Osvc5YF/9+dha7Th8mWOIvKF5CQq1rSUqGCIug4ONai2iSIcSpJ4kUJ2Hf1o3lEYBrdVwscySqypW3dGUoQOQ4qy+ydJD9xPJ8MplYa2M4cp8gMgn008au+XSiSemPlN8soy89ry0uG8y1ItYZqxjb3PwqVjdSjjT6MZZtsOLeQqQuKRdjv8ngAOuxHn+sQA4t/VqkG83iuCUKQxwFB60ClJ+2z7D73BOaykjtFpPGGCNVT4bsfcrRnT449PFh5gCa13Ws3yN7/TV/Zu8enWqgbMvpKW8FYtgbkwjAxXLF81dPPmV6b7kUCKyI3OaOdTQWcYG3tWohHWk17BG3sln6SGpVt/C8gPYuHdz+EtFH+H0QpAjaXAp8hLZGDrjsUPUMS58gGdlpFmslQibvC1twD5VCcHWyvxC+5D6zgHvOwl33FjJPIUiP4v6UhPpUgvRrIY6wxj3uZ4twbyMcfNLjpZAc4YwjAAPU6+bhx0QnONrmXkMPYC4EtANZFZfGhI3p8/PIsAWPkBKIEqs340VC6wmz8NzX+MIxMpIOQTVkROF+FIXHlATyzAiwgXagE+5d1huQCzLlpPVj0weAgVkBFWpWGhACAVCB9eqpABrVA3J8RNvZVHzdDYlJuTh9SxgzEb9b2FLJ1lIhJafLLfxx33QkMg4VYzcSjyisWyY5/Oh69azbJ7PJ8R1cpe9G+nhjTyIHdaxrI0KpVsYVRx1nsVa1ivhMNvfCTH4kb+I9oaGZjaExcKCIaxPSw3NlCqs2nrTNSdbuETJI4uGLGLh9miOlLMYwfJQtjchJJEuVgSRKQsjyEOr97fAeYkypS8rcwGAl2TSuBKJWQWzRakZdV1Nb2U+vBHAVU/UPQZ2L5XAe/vlgDjRh1R5B9ZQ8Myt9dpa1Bm6GIlbnihBnjKDzsYjSd7ZljmiJlfhS8zch0BvqgSELBcZfFJfAs7fN0uONkY8cFu3rU34NTy1OkTGFF1V07Q0apBWZsdbizLOQuWSTKC9txokitowi7cYIcd+Dn3g4tGICeHIEAAnPERhePsJZ8g1FeNNQDaq5aax8ga7HCMAgG2ObCTmvBN5jK3wXUo5DN3izhX5gVzei79i72iyLc/0O2OrPIUEi0Y/0j/tvcr0i0jIV1xNG5C1W+fPAXSIo9FMXe4Lh4Wes6clwFPlyWVy/zeu6VqrG7h4WlXrSd+TogtcD7eOXnXtlNkFs8NuYP3zyi4vrDloMssnJrU1+mp+dnF8sl7ls1x88ai+lXdRQkW21i4JrkUoLQ4UdcKvDpsKWJrCEkn4791tt70noB3Z1I/qOvavNsjjX74Ct/hwSBJzU2COo/+P+m1yv6KNca+KRMjA6Bm/X6VX+PBDeaTCgGGY/dbGn04eHn9GjompMsYLwpVmp6ycfRjf+7lrfNXk4rcXz78azSB4YvDYg9vFLBFPZTRCr4t+OeI7RPP+6gxbF9TY5ubX5Bk5TZyfnBGvdj7XJ1h882suiwHV6roWcmZjmUjMDK8JkyGDP0UzGI6D9GysXdSYUxbKtQwnDY1cUs3yCvSEwgkG6DBaZsmSzYkjleQhrs23aKdAeB2qkk87YUCOkrj9I7jTgabVB6VoQMSu6IuI/WHBWmwlQrOZnlaWWYQnGuJ0xEtvUSaewyPIOO2KjTUSSlGi1U6omr9EJbByJkhW/dUf+JMdVq1KDcX1Ygxb8n4pecKqGUBAVGE77HhqKxt/CAJ6P5vhkrx1/rVKo+DpkMqaZYWLKHRVGFA9k3V+3aWrd9iQydzjddc8Dj9z30OPI9dJTb3310c+Knm8IGt3vpvr7dzhAx0DwxkDVaplHUvPlR8O/HxG0dN0yVJ0GjVH4db+7QoQKEy6iZ0ZMEClKdKM0aWHVmswotpV2pIpnYu731F4g3r0Qm/HadJiYLV0GDi525Yxe2V+AGvkSe2qrs87YppzRcBExSaBvpS1h2T7dc+dVOuvcLPS8l6bqYzUNbZddcNGlufLk0/U5gB93VwNjs7oheta7jqg3tB2258FGNOJ73tXUl1XNez8HLbipxQ09MD5n9HJLh3E+J3uyDRU06xyBbvRsrF+OpRkjXsbYztngiGAxJ9ie5TE85niYPHEd4nOCyTzxl78i7UdD7yYQZG697fY7MFUHTv5oCxiluQedc5WDIw+uZhEb85+DZ5/7/8+/8OJLL7/y6muvv4HAugC2awv26K/DC21ff/Ptd99f/PcP//nxp59/+fW3//7h/IOYz1BdQ5NmLVq1014HXemIhJzgmBZxSZ86ipM0ywuU0hLO6N+Xvf5gOBpPprM5jvIfDafz5QpdP4zifIgpl6rT5WponJd1248z6D/H0jgfe7B461nicJvTmvB2Bx5kFDwKsrgayS7snvBMGkb8m4AFeQzMYUe4kWwQSf1kS15TKMdbpeIh9P7H1vWs5csF/lA+dchhah1bwjWBbacxexo2OhB24GvC1NMtxyQP4rcc4bxsptgwAisZW+DgcyCZ2tB1ANailww6sDw5r2DNuMUMQh08thNbBRHqqkoUylDKiX0T5AYzVNcVktOOXQ9X0TY7mNTi2bO6uLPcatbAyomjCjOXpdMFM6dn9qxV/ZnfbBkUgU2CM2LpinLTblEeQeVFXbzT73QTfZ0FcIYzzkOTfA2cOoIkitN1YScHVYzvHH82I7FYOSKYibRTArekXq4EkzO9l9uJna/nKd9gluoamO46/j2kbkP4bzqEuvpf9KzJ/5ZWVxk6V6Fs1Vmdnjifos1OHECy2EXVKbNYokUVmzlFp8JenXwX7wiuCKMrwtg5B2ml0SpLlDaPXGzl0i7qUiBwck1dJ5d1MZe50AUtrUtzNUdzEdJFJ7sSsvPSeXPtrXs95h9s5JCLT91oTndB2UX4pNArCZlvH29C4n3QbSE5iu6fu2oSUfEHGXs8gdjYu8z45MZFY/D1i8BO0yoQgb6Pt+glfx4FmZyv/d7R4JMrHj2Qmx6BrbMeOdX2cU8pCkPOE3kRYzqeOu8SietpKHzQbV2lEd8uOcHAmDDKTprVjCDILsop6kIFpJOkQ5SCd24XsXPH7CAYt0aOrp5lTSJBbA6Tlc0p+FptNnltDiSFuvt6FkEtBmuNegbVTsL3JSTGNZR34DLRUg1811MCUaOEcjMu9OjVc3A554t5xyG3wXu0ot7wlEI6V5eJlkrVW9X1kUDUKINyo9w4EcpQRwiF2bTS9b182USNWqnyDVwmVs5vvYhkpk/t1/yX1KFzcK9QttxpKgiP2nmtMZjeU0VHLKjnwMEsKn0Vi0feP4vjmOqjmD0GXjEgJscY5svMn7LJI3GDqbjnsayB9+7hFVwqOflV4Z/Fr3LIGF2cJA8HtYuuZtgisdKkD1dS9ZWqhnjRZbibdHxRV4fF7B6h8vXVTGPl5nU1RzTUoCEGjGHQGAYNlrTEkpRQGiWWRvldzofzFp+wJ/BkPX1KzBNTX4QZB5AV1NFifZqk66UDUZjEo3RaNIilQJzpXq1SI8u5YpgWmv21r+xXhWOoTmyovBYkkUAFIxApBQGBOnR9WYlPzv6yH4ZXiObmkxTueEFfGuzOXKZWZYf6AqEMuerXoaM9o8DWwxV0MabQMi14vh77Yr8Vi68Qsq0YbmC2EieQQIJHYuQ0sscpYoUveUWlZ5gBiAZcWwlyYMAAQQ4QYc8+gqQ0GfS0bDSwvwDXHa+A/vVrmyaxe89iNKGxp0+bex6G6NQR+m2C8Xmz5Jep5YmvMOf66t3w9Nvk6iukBC9a5OrJJ9Fv7Uc3sllqlCAETo3gDejnaba0Q5Az7xak1Gk/dkDH7G9qk203Mh8YiDG4/HEaYmBnyf/zCjQXmJCcAaf6Sfnfer/nnhW/fwoOx6eN/WXCbwS4f8NnRSGf5WWTppGBOIbJ/OvFa+svDRq/wvGXSeUBAAAA) format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +.search-activity-viz { + background: transparent; +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/visualization.js b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/visualization.js new file mode 100644 index 0000000..902aa58 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/search_activity/visualization.js @@ -0,0 +1 @@ +define(["api/SplunkVisualizationBase","api/SplunkVisualizationUtils"],(t,a)=>{return e={194(t,a,e){var i,r;i=[e(879),e(423)],r=function(t,a){var e={slow:.3,medium:.7,fast:1.4},i={default:{tubeStroke:"rgba(100,180,255,0.25)",tubeGlass:"rgba(60,130,220,0.06)",liquidLow:"#00d4aa",liquidMid:"#ffcc00",liquidHigh:"#ff3355",particle:"rgba(100,200,255,0.8)",connector:"rgba(100,180,255,0.15)",text:"rgba(255,255,255,0.6)",valueBg:"rgba(0,0,0,0.3)"},dark:{tubeStroke:"rgba(80,80,120,0.3)",tubeGlass:"rgba(30,30,60,0.1)",liquidLow:"#00b894",liquidMid:"#fdcb6e",liquidHigh:"#e17055",particle:"rgba(150,150,200,0.7)",connector:"rgba(80,80,120,0.15)",text:"rgba(255,255,255,0.5)",valueBg:"rgba(0,0,0,0.4)"},neon:{tubeStroke:"rgba(0,255,200,0.3)",tubeGlass:"rgba(0,255,200,0.04)",liquidLow:"#00ff88",liquidMid:"#ffff00",liquidHigh:"#ff0066",particle:"rgba(0,255,200,0.9)",connector:"rgba(0,255,200,0.2)",text:"rgba(0,255,200,0.7)",valueBg:"rgba(0,0,0,0.5)"}},r={default:{scheduled:"#00d4aa",adhoc:"#4dabf7",other:"#b197fc"},dark:{scheduled:"#00b894",adhoc:"#339af0",other:"#9775fa"},neon:{scheduled:"#00ff88",adhoc:"#ffff00",other:"#ff0066"}};function n(t,a,e){return Math.max(a,Math.min(e,t))}function l(t){if("#"===t.charAt(0))return[parseInt(t.slice(1,3),16),parseInt(t.slice(3,5),16),parseInt(t.slice(5,7),16)];var a=t.match(/(\d+)/g);return a&&a.length>=3?[parseInt(a[0],10),parseInt(a[1],10),parseInt(a[2],10)]:[0,0,0]}function o(t,a,e){var i=l(t),r=l(a);return"rgb("+Math.round(i[0]+(r[0]-i[0])*e)+","+Math.round(i[1]+(r[1]-i[1])*e)+","+Math.round(i[2]+(r[2]-i[2])*e)+")"}function s(t,a,e,i){if(t>=e)return i.liquidHigh;if(t>=a){var r=(t-a)/(e-a);return o(i.liquidMid,i.liquidHigh,r)}if(t>=.5*a){var n=(t-.5*a)/(.5*a);return o(i.liquidLow,i.liquidMid,n)}return i.liquidLow}function h(t,a,e,i,r,n){t.beginPath(),t.moveTo(a+n,e),t.lineTo(a+i-n,e),t.arcTo(a+i,e,a+i,e+n,n),t.lineTo(a+i,e+r-n),t.arcTo(a+i,e+r,a+i-n,e+r,n),t.lineTo(a+n,e+r),t.arcTo(a,e+r,a,e+r-n,n),t.lineTo(a,e+n),t.arcTo(a,e,a+n,e,n),t.closePath()}function d(t){var a=(t||"").toLowerCase().replace(/[^a-z]/g,"");return"scheduled"===a?"scheduled":"adhoc"===a||"ad-hoc"===a||"adoc"===a?"adhoc":"other"}function u(t){return"scheduled"===t?"Scheduled":"adhoc"===t?"Ad-hoc":"Other"}return t.extend({initialize:function(){t.prototype.initialize.apply(this,arguments),this.el.classList.add("search-activity-viz"),this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.el.appendChild(this.canvas),this._lastGoodData=null,this._animTime=0,this._timer=null},getInitialDataParams:function(){return{outputMode:t.ROW_MAJOR_OUTPUT_MODE,count:1e4}},formatData:function(a,e){if(!a||!a.rows||0===a.rows.length){if(this._lastGoodData)return this._lastGoodData;throw new t.VisualizationError("Awaiting data — Search Activity")}for(var i=a.fields,r={},n=0;n0?n(w/g*100,0,100):0,_=this.el.getBoundingClientRect();if(!(_.width<=0||_.height<=0)){var S=window.devicePixelRatio||1;this.canvas.width=_.width*S,this.canvas.height=_.height*S;var T=this.canvas.getContext("2d");if(T){T.scale(S,S);var A=_.width,k=_.height;T.clearRect(0,0,A,k);var C=Math.max(12,Math.min(30,.04*A)),q=Math.max(16,.12*k),G=C,I=A-2*C,B=Math.max(30,Math.min(.5*k,.7*(k-q-2*C))),P=(k-q-B)/2,R=Math.min(12,.15*B);!function(t,a,e,i,r,n,l){h(t,a,e,i,r,n),t.fillStyle=l.tubeGlass,t.fill(),h(t,a,e,i,r,n),t.strokeStyle=l.tubeStroke,t.lineWidth=1.5,t.stroke();var o=Math.max(4,.06*i),s=t.createLinearGradient(a,e,a+o,e);s.addColorStop(0,"rgba(255,255,255,0)"),s.addColorStop(.08,"rgba(255,255,255,0.08)"),s.addColorStop(.5,"rgba(255,255,255,0.03)"),s.addColorStop(1,"rgba(255,255,255,0)"),t.save(),h(t,a,e,i,r,n),t.clip(),t.fillStyle=s,t.fillRect(a,e,o,r),t.restore()}(T,G,P,I,B,R,m);var D=s(y,v,p,m);!function(t,a,e,i,r,l,s,d,u,c,f){if(d<=0||u<=0)return 0;var g=a+3,v=e+3,p=i-6,m=r-6,b=Math.max(1,l-3),x=n(d/u,0,1),M=p*x;t.save(),h(t,g,v,p,m,b),t.clip();for(var w=g,y=0;y2&&x<.99){var R=Math.min(3,.02*M),D=.3*m,L=g+M;t.beginPath(),t.moveTo(L,v);for(var z=v;z<=v+m;z+=1){var H=Math.sin((z-v)/D*Math.PI*2+2*f)*R;t.lineTo(L+H,z)}t.lineTo(L-R-2,v+m),t.lineTo(L-R-2,v),t.closePath();var V=s.length>0&&c[s[s.length-1].key]||c.other;t.fillStyle=V,t.globalAlpha=.5,t.fill(),t.globalAlpha=1}t.restore()}(T,G,P,I,B,R,M,w,g,b,this._animTime),function(t,a,e,i,r,n,l,o,s,d,u,c,f){if(f&&!(l<=50)){var g=(l-50)/50,v=.85+.05*Math.sin(3*c),p=l>=s?u.liquidHigh:d;t.save(),h(t,a,e,i,r,n),t.shadowColor=p,t.shadowBlur=12*g,t.globalAlpha=.2*g*v,t.strokeStyle=p,t.lineWidth=2,t.stroke(),t.shadowBlur=0,t.globalAlpha=1,t.restore()}}(T,G,P,I,B,R,y,0,p,D,m,this._animTime,c),function(t,a,e,i,r,n,l,o,d,u,c){var f=.8*i,g=.8*r,v=Math.max(10,Math.min(36,Math.min(.12*f,.45*g))),p=Math.max(7,Math.min(14,Math.min(.05*f,.2*g))),m=a+i/2,b=e+r/2,x=Math.min(.6*f,5*v),M=v+p+12;h(t,m-x/2,b-M/2,x,M,Math.min(6,.2*M)),t.fillStyle=c.valueBg,t.fill();var w=Math.round(o)+"%",y=s(o,d,u,c);t.font="bold "+v+"px monospace",t.fillStyle=y,t.textAlign="center",t.textBaseline="middle",t.fillText(w,m,b-.4*p),t.font=p+"px sans-serif",t.fillStyle="rgba(255,255,255,0.3)",t.textAlign="center",t.textBaseline="middle";var _=n+" / "+l+" slots";t.fillText(_,m,b+.4*v)}(T,G,P,I,B,w,g,y,v,p,m),function(t,a,e,i,r,n){for(var l=Math.max(8,Math.min(11,.018*a)),o=l,s=.6*l,d=[],c=0;c0&&d.push({color:r[i[c].key]||r.other,label:u(i[c].key)+" ("+i[c].count+")"});d.push({color:n.tubeGlass,label:"Available"}),t.font=l+"px sans-serif",t.textBaseline="middle";for(var f=0,g=0;gl&&o>8;)o-=1,s=Math.round(1.6*o),i.font="500 "+o+"px sans-serif";i.font=s+"px sans-serif",i.textAlign="center",i.textBaseline="middle",i.fillStyle="rgba(255,255,255,1)",i.fillText("⏳",r/2,n/2-.5*o-h),i.font="500 "+o+"px sans-serif",i.fillStyle="rgba(255,255,255,0.30)",i.fillText(t,r/2,n/2+.3*s),i.textAlign="start",i.textBaseline="alphabetic"},reflow:function(){this.invalidateUpdateView()},destroy:function(){this._stopAnimation(),t.prototype.destroy.apply(this,arguments)}})}.apply(a,i),void 0===r||(t.exports=r)},879(a){"use strict";a.exports=t},423(t){"use strict";t.exports=a}},i={},function t(a){var r=i[a];if(void 0!==r)return r.exports;var n=i[a]={exports:{}};return e[a](n,n.exports,t),n.exports}(194);var e,i}); \ No newline at end of file diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/formatter.html b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/formatter.html new file mode 100644 index 0000000..da060fb --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/formatter.html @@ -0,0 +1,42 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/preview.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/preview.png new file mode 100644 index 0000000..fc6da0b Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/preview.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/visualization.css b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/visualization.css new file mode 100644 index 0000000..123b841 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/visualization.css @@ -0,0 +1,31 @@ +/* Press Start 2P — Latin subset (woff2, base64-embedded) + Source: Google Fonts, SIL Open Font License 1.1 */ +@font-face { + font-family: 'Press Start 2P'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(data:font/woff2;base64,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) format('woff2'); +} + +/* Formula 1 Font — shared across all F1 visualizations */ +/* Prepended to each viz's visualization.css by build.sh / merge-viz.sh */ + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Formula1'; + src: url(data:font/woff2;base64,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) format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} +.splunk-status-board-viz { + background: transparent; +} diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/visualization.js b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/visualization.js new file mode 100644 index 0000000..a1dbc26 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/appserver/static/visualizations/splunk_status_board/visualization.js @@ -0,0 +1 @@ +define(["api/SplunkVisualizationBase","api/SplunkVisualizationUtils"],(t,e)=>{return a={194(t,e,a){var i,n;i=[a(879),a(423)],n=function(t,e){var a={slow:.3,medium:.7,fast:1.4},i={default:{tubeStroke:"rgba(100,180,255,0.25)",tubeGlass:"rgba(60,130,220,0.06)",liquidLow:"#00d4aa",liquidMid:"#ffcc00",liquidHigh:"#ff3355",particle:"rgba(100,200,255,0.8)",connector:"rgba(100,180,255,0.15)",text:"rgba(255,255,255,0.6)",valueBg:"rgba(0,0,0,0.3)"},dark:{tubeStroke:"rgba(80,80,120,0.3)",tubeGlass:"rgba(30,30,60,0.1)",liquidLow:"#00b894",liquidMid:"#fdcb6e",liquidHigh:"#e17055",particle:"rgba(150,150,200,0.7)",connector:"rgba(80,80,120,0.15)",text:"rgba(255,255,255,0.5)",valueBg:"rgba(0,0,0,0.4)"},neon:{tubeStroke:"rgba(0,255,200,0.3)",tubeGlass:"rgba(0,255,200,0.04)",liquidLow:"#00ff88",liquidMid:"#ffff00",liquidHigh:"#ff0066",particle:"rgba(0,255,200,0.9)",connector:"rgba(0,255,200,0.2)",text:"rgba(0,255,200,0.7)",valueBg:"rgba(0,0,0,0.5)"}};function n(t,e,a){return Math.max(e,Math.min(a,t))}function r(t){if("#"===t.charAt(0))return[parseInt(t.slice(1,3),16),parseInt(t.slice(3,5),16),parseInt(t.slice(5,7),16)];var e=t.match(/(\d+)/g);return e&&e.length>=3?[parseInt(e[0],10),parseInt(e[1],10),parseInt(e[2],10)]:[0,0,0]}function o(t,e,a){var i=r(t),n=r(e);return"rgb("+Math.round(i[0]+(n[0]-i[0])*a)+","+Math.round(i[1]+(n[1]-i[1])*a)+","+Math.round(i[2]+(n[2]-i[2])*a)+")"}function s(t,e,a,i){if(t>=a)return i.liquidHigh;if(t>=e){var n=(t-e)/(a-e);return o(i.liquidMid,i.liquidHigh,n)}if(t>=.5*e){var r=(t-.5*e)/(.5*e);return o(i.liquidLow,i.liquidMid,r)}return i.liquidLow}function l(t,e,a,i,n,r){t.beginPath(),t.moveTo(e+r,a),t.lineTo(e+i-r,a),t.arcTo(e+i,a,e+i,a+r,r),t.lineTo(e+i,a+n-r),t.arcTo(e+i,a+n,e+i-r,a+n,r),t.lineTo(e+r,a+n),t.arcTo(e,a+n,e,a+n-r,r),t.lineTo(e,a+r),t.arcTo(e,a,e+r,a,r),t.closePath()}function h(t,e,a,i,n,r,o){l(t,e,a,i,n,r),t.fillStyle=o.tubeGlass,t.fill(),t.strokeStyle=o.tubeStroke,t.lineWidth=1.5,t.stroke();var s=Math.max(2,.08*i);t.save(),t.beginPath(),l(t,e,a,i,n,r),t.clip();var h=t.createLinearGradient(e,a,e+3*s,a);h.addColorStop(0,"rgba(255,255,255,0.0)"),h.addColorStop(.3,"rgba(255,255,255,0.08)"),h.addColorStop(.6,"rgba(255,255,255,0.03)"),h.addColorStop(1,"rgba(255,255,255,0.0)"),t.fillStyle=h,t.fillRect(e+2,a,3*s,n),t.restore()}function u(t,e,a,i,n,r,s,h,u,c){if(!(s<=0)){var d=e+3,f=i-6,v=Math.max(1,r-3),g=n-6,p=g*(s/100),m=a+n-3-p;t.save(),l(t,e+3,a+3,f,g,v),t.clip();var b=t.createLinearGradient(d,m,d,m+p);b.addColorStop(0,h),b.addColorStop(.4,h),b.addColorStop(1,o(h,"#000000",.35)),t.fillStyle=b,t.globalAlpha=.85,t.fillRect(d,m,f,p);var M=Math.min(4,.12*p),x=.35*f,w=.55*f;t.beginPath(),t.moveTo(d,m+B(0,c));for(var _=1;_<=f;_+=2)t.lineTo(d+_,m+B(_,c));t.lineTo(d+f,m+p+5),t.lineTo(d,m+p+5),t.closePath(),t.fillStyle=h,t.globalAlpha=.6,t.fill(),t.globalAlpha=1,t.beginPath(),t.moveTo(d,m+B(0,c));for(var T=1;T<=f;T+=2)t.lineTo(d+T,m+B(T,c));t.strokeStyle="rgba(255,255,255,0.35)",t.lineWidth=1.5,t.stroke();for(var y=Math.max(2,Math.floor(s/12)),S=0;S50){var A=(s-50)/50;t.save(),t.shadowColor=h,t.shadowBlur=12*A,l(t,e,a,i,n,r),t.strokeStyle=h,t.globalAlpha=.2*A,t.lineWidth=2,t.stroke(),t.shadowBlur=0,t.globalAlpha=1,t.restore()}}function B(t,e){return Math.sin(t/x*Math.PI*2+3.5*e)*M+Math.sin(t/w*Math.PI*2-2.2*e)*M*.4}}function c(t,e,a,i,n,r){t.save(),t.lineWidth=Math.max(1.5,.15*i),t.lineCap="round",t.lineJoin="round","ok"===n?(t.strokeStyle=r.liquidLow,t.beginPath(),t.moveTo(e-.4*i,a),t.lineTo(e-.1*i,a+.35*i),t.lineTo(e+.4*i,a-.3*i),t.stroke()):"warning"===n?(t.strokeStyle=r.liquidMid,t.beginPath(),t.moveTo(e,a-.4*i),t.lineTo(e+.4*i,a+.35*i),t.lineTo(e-.4*i,a+.35*i),t.closePath(),t.stroke(),t.fillStyle=r.liquidMid,t.beginPath(),t.arc(e,a+.2*i,.06*i,0,2*Math.PI),t.fill(),t.beginPath(),t.moveTo(e,a-.15*i),t.lineTo(e,a+.08*i),t.stroke()):(t.strokeStyle=r.liquidHigh,t.beginPath(),t.moveTo(e-.3*i,a-.3*i),t.lineTo(e+.3*i,a+.3*i),t.moveTo(e+.3*i,a-.3*i),t.lineTo(e-.3*i,a+.3*i),t.stroke()),t.restore()}return t.extend({initialize:function(){t.prototype.initialize.apply(this,arguments),this.el.classList.add("splunk-status-board-viz"),this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.display="block",this.el.appendChild(this.canvas),this._lastGoodData=null,this._animTime=0,this._timer=null,this._hitRects=[],this._boundClick=this._onClick.bind(this),this._boundMouseMove=this._onMouseMove.bind(this),this.canvas.addEventListener("click",this._boundClick),this.canvas.addEventListener("mousemove",this._boundMouseMove)},getInitialDataParams:function(){return{outputMode:t.ROW_MAJOR_OUTPUT_MODE,count:1e4}},formatData:function(e){if(!e||!e.rows||0===e.rows.length){if(this._lastGoodData)return this._lastGoodData;throw new t.VisualizationError("Awaiting data — Splunk Status Board")}for(var a=e.fields,i={},r=0;r0||V.warns>0),Z=z+(I-(j+Y+K+(Q?Y+(Q?X+2:0):0)))/2;if(w.font="600 "+F+"px sans-serif",w.fillStyle="#ffffff",w.textAlign="center",w.textBaseline="top",w.fillText(V.component,N,Z),Z+=j+Y,l&&"critical"===V.status&&(w.shadowColor=U,w.shadowBlur=10),c(w,N,Z+J/2,J,V.status,m),w.shadowBlur=0,Z+=K,Q){Z+=Y;var $=[];V.errors>0&&$.push(V.errors+" err"),V.warns>0&&$.push(V.warns+" warn"),w.font=X+"px sans-serif",w.fillStyle="#ffffff",w.textAlign="center",w.textBaseline="top",w.fillText($.join(" · "),N,Z)}}var tt=Math.max(8,Math.min(11,.018*_)),et=T-Math.max(6,.4*k),at=[{color:m.liquidLow,label:"OK (<"+d+")"},{color:m.liquidMid,label:"Warn ("+d+"-"+f+")"},{color:m.liquidHigh,label:"Crit (>"+f+")"}];w.font=tt+"px sans-serif",w.textBaseline="middle";for(var it=tt,nt=.6*tt,rt=0,ot=0;ot=o.x&&i<=o.x+o.w&&n>=o.y&&n<=o.y+o.h){var s={action:t.FIELD_VALUE_DRILLDOWN,data:{component:o.component}};this.drilldown(s,e);break}}},_onMouseMove:function(t){for(var e=this.canvas.getBoundingClientRect(),a=t.clientX-e.left,i=t.clientY-e.top,n=!1,r=0;r=o.x&&a<=o.x+o.w&&i>=o.y&&i<=o.y+o.h){n=!0;break}}this.canvas.style.cursor=n?"pointer":"default"},_startAnimation:function(){if(!this._timer){var t=this;this._timer=setInterval(function(){t._animTime+=.016,t.invalidateUpdateView()},50)}},_stopAnimation:function(){this._timer&&(clearInterval(this._timer),this._timer=null)},_ensureCanvas:function(){this.canvas||(this.el.innerHTML="",this.canvas=document.createElement("canvas"),this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.display="block",this.el.appendChild(this.canvas));var t=this.el.getBoundingClientRect(),e=window.devicePixelRatio||1;this.canvas.width=t.width*e,this.canvas.height=t.height*e},_drawStatusMessage:function(t){var e=this.el.getBoundingClientRect(),a=window.devicePixelRatio||1,i=this.canvas.getContext("2d");i.scale(a,a);var n=e.width,r=e.height;i.clearRect(0,0,n,r);var o=.85*n,s=Math.max(10,Math.min(32,.09*Math.min(n,r))),l=Math.round(1.6*s),h=.5*s;for(i.font="500 "+s+"px sans-serif";i.measureText(t).width>o&&s>8;)s-=1,l=Math.round(1.6*s),i.font="500 "+s+"px sans-serif";i.font=l+"px sans-serif",i.textAlign="center",i.textBaseline="middle",i.fillStyle="rgba(255,255,255,1)",i.fillText("⏳",n/2,r/2-.5*s-h),i.font="500 "+s+"px sans-serif",i.fillStyle="rgba(255,255,255,0.30)",i.fillText(t,n/2,r/2+.3*l),i.textAlign="start",i.textBaseline="alphabetic"},reflow:function(){this.invalidateUpdateView()},destroy:function(){this._stopAnimation(),this.canvas&&(this.canvas.removeEventListener("click",this._boundClick),this.canvas.removeEventListener("mousemove",this._boundMouseMove)),t.prototype.destroy.apply(this,arguments)}})}.apply(e,i),void 0===n||(t.exports=n)},879(e){"use strict";e.exports=t},423(t){"use strict";t.exports=e}},i={},function t(e){var n=i[e];if(void 0!==n)return n.exports;var r=i[e]={exports:{}};return a[e](r,r.exports,t),r.exports}(194);var a,i}); \ No newline at end of file diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/app.conf b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/app.conf new file mode 100644 index 0000000..b697e29 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/app.conf @@ -0,0 +1,21 @@ +[id] +name = splunk_health +version = 1.0.42 + +[install] +is_configured = true +build = 1 + +[ui] +is_visible = true +label = Splunk Health +show_in_nav = true + +[launcher] +author = Splunk Viz +description = Glass-themed health monitoring visualizations for Splunk instances +version = 1.0.42 + +[package] +id = splunk_health +check_for_updates = false diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/data/ui/nav/default.xml b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/data/ui/nav/default.xml new file mode 100644 index 0000000..708b9ea --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/data/ui/nav/default.xml @@ -0,0 +1,3 @@ + diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/data/ui/views/splunk_health.xml b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/data/ui/views/splunk_health.xml new file mode 100644 index 0000000..7c20097 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/data/ui/views/splunk_health.xml @@ -0,0 +1,316 @@ + + + Glass-themed health monitoring dashboard for Splunk instances + 0 | join type=outer title [| rest /services/data/indexes | eval maxGB=round(maxTotalDataSizeMB/1024,2) | table title maxGB] | table title sizeGB maxGB hotGB warmGB coldGB | sort -sizeGB | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting index data\", title=\"\", sizeGB=0, maxGB=0, hotGB=0, warmGB=0, coldGB=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_indexing_pipeline": { + "name": "Indexing Pipeline", + "options": { + "query": "index=_internal group=queue name IN (parsingqueue, mergingqueue, typingqueue, indexqueue) | stats avg(current_size_kb) as avg_size, avg(max_size_kb) as capacity by name | eval fill_pct=if(capacity>0, round((avg_size/capacity)*100, 1), 0) | table name fill_pct avg_size capacity | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting pipeline data\", name=\"parsingqueue\", fill_pct=0, avg_size=0, capacity=0]", + "queryParameters": { + "earliest": "-5m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_license_gauge": { + "name": "License Usage", + "options": { + "query": "| rest /services/licenser/pools | eval used_gb=round(used_bytes/1024/1024/1024,2) | eval quota_gb=round(effective_quota/1024/1024/1024,2) | stats sum(used_gb) as used_gb, max(quota_gb) as quota_gb | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting license data\", used_gb=0, quota_gb=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_resource_gauge": { + "name": "System Resources", + "options": { + "query": "index=_introspection sourcetype=splunk_resource_usage component=hostwide | stats latest(data.cpu_user_pct) as cpu_user, latest(data.cpu_system_pct) as cpu_sys, latest(data.mem_used) as mem_used, latest(data.mem) as mem_total, latest(data.swap_used) as swap_used, latest(data.swap) as swap_total by host | eval cpu_pct=round(cpu_user+cpu_sys, 1) | eval mem_pct=if(mem_total>0, round((mem_used/mem_total)*100, 1), 0) | eval disk_pct=if(swap_total>0, round((swap_used/swap_total)*100, 1), 0) | head 1 | table cpu_pct mem_pct disk_pct | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting resource data\", cpu_pct=0, mem_pct=0, disk_pct=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_scheduler_health": { + "name": "Scheduler Health", + "options": { + "query": "index=_internal sourcetype=scheduler status=* | stats count as total, count(eval(status=\"skipped\")) as skipped, count(eval(status=\"success\")) as success, avg(run_time) as avg_runtime | eval skip_pct=if(total>0, round((skipped/total)*100,1), 0) | eval success_pct=if(total>0, round((success/total)*100,1), 0) | eval avg_runtime=round(avg_runtime,2) | table skip_pct success_pct avg_runtime total skipped | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting scheduler data\", skip_pct=0, success_pct=0, avg_runtime=0, total=0, skipped=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_search_activity": { + "name": "Search Activity", + "options": { + "query": "| rest /services/server/status/resource-usage/splunk-processes | search search_props.sid=* | eval type=case(search_props.mode==\"historical\",\"scheduled\", search_props.mode==\"historical_fast\",\"scheduled\", search_props.provenance==\"UI:Search\",\"ad-hoc\", 1=1,\"other\") | stats count by type | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting search data\", type=\"\", count=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_status_board": { + "name": "Component Status", + "options": { + "query": "index=_internal sourcetype=splunkd component=* log_level=* | stats count(eval(log_level=\"ERROR\")) as errors, count(eval(log_level=\"WARN\")) as warns by component | eval status=if(errors>0, \"critical\", if(warns>0, \"warning\", \"ok\")) | eval health_score=case(status=\"critical\", 90, status=\"warning\", 60, 1=1, 10) | sort - errors - warns | head 20 | table component status errors warns health_score | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting component data\", component=\"\", status=\"ok\", errors=0, warns=0, health_score=0]", + "queryParameters": { + "earliest": "-15m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + } + }, + "layout": { + "layoutDefinitions": { + "layout_1": { + "options": { + "display": "auto-scale", + "height": 1080, + "width": 1920 + }, + "structure": [ + { + "item": "viz_status_board", + "position": { + "h": 400, + "w": 1030, + "x": 10, + "y": 10 + }, + "type": "block" + }, + { + "item": "viz_license_gauge", + "position": { + "h": 350, + "w": 560, + "x": 10, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_resource_gauge", + "position": { + "h": 350, + "w": 460, + "x": 580, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_indexing_pipeline", + "position": { + "h": 400, + "w": 860, + "x": 1050, + "y": 10 + }, + "type": "block" + }, + { + "item": "viz_forwarder_heatmap", + "position": { + "h": 290, + "w": 810, + "x": 10, + "y": 780 + }, + "type": "block" + }, + { + "item": "viz_search_activity", + "position": { + "h": 350, + "w": 400, + "x": 1050, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_scheduler_health", + "position": { + "h": 350, + "w": 450, + "x": 1460, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_index_storage", + "position": { + "h": 290, + "w": 1080, + "x": 830, + "y": 780 + }, + "type": "block" + } + ], + "type": "absolute" + } + }, + "options": { + "showTitleAndDescription": false + }, + "tabs": { + "items": [ + { + "label": "New tab", + "layoutId": "layout_1" + } + ] + } + } +} + ]]> + diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/savedsearches.conf b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/savedsearches.conf new file mode 100644 index 0000000..2f3b38c --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/savedsearches.conf @@ -0,0 +1,119 @@ +[Indexing Pipeline Flow - Live] +search = index=_internal group=queue name IN (parsingqueue, mergingqueue, typingqueue, indexqueue) | stats avg(current_size_kb) as avg_size, avg(max_size_kb) as capacity by name | eval fill_pct=if(capacity>0, round((avg_size/capacity)*100, 1), 0) | table name fill_pct avg_size capacity | appendpipe [| stats count | where count=0 | eval _status="Awaiting pipeline data", name="parsingqueue", fill_pct=0, avg_size=0, capacity=0] +dispatch.earliest_time = -5m +dispatch.latest_time = now +display.general.type = visualizations +display.visualizations.type = custom +display.visualizations.custom.type = splunk_health.indexing_pipeline_flow +display.visualizations.custom.splunk_health.indexing_pipeline_flow.animSpeed = medium +display.visualizations.custom.splunk_health.indexing_pipeline_flow.colorTheme = default +display.visualizations.custom.splunk_health.indexing_pipeline_flow.showLabels = true +display.visualizations.custom.splunk_health.indexing_pipeline_flow.showValues = true +display.visualizations.custom.splunk_health.indexing_pipeline_flow.warningThreshold = 70 +display.visualizations.custom.splunk_health.indexing_pipeline_flow.criticalThreshold = 85 +display.visualizations.custom.splunk_health.indexing_pipeline_flow.showGlow = true + +[Splunk Status Board - Live] +search = index=_internal sourcetype=splunkd component=* log_level=* | stats count(eval(log_level="ERROR")) as errors, count(eval(log_level="WARN")) as warns by component | eval status=if(errors>0, "critical", if(warns>0, "warning", "ok")) | eval health_score=case(status="critical", 90, status="warning", 60, 1=1, 10) | sort - errors - warns | head 20 | table component status errors warns health_score | appendpipe [| stats count | where count=0 | eval _status="Awaiting component data", component="", status="ok", errors=0, warns=0, health_score=0] +dispatch.earliest_time = -15m +dispatch.latest_time = now +display.general.type = visualizations +display.visualizations.type = custom +display.visualizations.custom.type = splunk_health.splunk_status_board +display.visualizations.custom.splunk_health.splunk_status_board.colorTheme = default +display.visualizations.custom.splunk_health.splunk_status_board.showGlow = true +display.visualizations.custom.splunk_health.splunk_status_board.warningThreshold = 50 +display.visualizations.custom.splunk_health.splunk_status_board.criticalThreshold = 80 +display.visualizations.custom.splunk_health.splunk_status_board.showCounts = true +display.visualizations.custom.splunk_health.splunk_status_board.animSpeed = medium +display.visualizations.custom.splunk_health.splunk_status_board.columns = 3 + +[License Gauge - Daily Usage] +search = | rest /services/licenser/pools | eval used_gb=round(used_bytes/1024/1024/1024,2) | eval quota_gb=round(effective_quota/1024/1024/1024,2) | stats sum(used_gb) as used_gb, max(quota_gb) as quota_gb | appendpipe [| stats count | where count=0 | eval _status="Awaiting license data", used_gb=0, quota_gb=0] +dispatch.earliest_time = -1m +dispatch.latest_time = now +display.general.type = visualizations +display.visualizations.type = custom +display.visualizations.custom.type = splunk_health.license_gauge +display.visualizations.custom.splunk_health.license_gauge.colorTheme = default +display.visualizations.custom.splunk_health.license_gauge.showGlow = true +display.visualizations.custom.splunk_health.license_gauge.warningThreshold = 80 +display.visualizations.custom.splunk_health.license_gauge.criticalThreshold = 90 +display.visualizations.custom.splunk_health.license_gauge.animSpeed = medium +display.visualizations.custom.splunk_health.license_gauge.showLabel = true +display.visualizations.custom.splunk_health.license_gauge.usedField = used_gb +display.visualizations.custom.splunk_health.license_gauge.quotaField = quota_gb +display.visualizations.custom.splunk_health.license_gauge.unit = GB + +[Forwarder Heatmap - Live] +search = index=_internal sourcetype=splunkd group=tcpin_connections | stats max(_time) as last_seen, avg(tcp_KBps) as avg_kbps, avg(tcp_eps) as eps by hostname | eval mins_ago=round((now()-last_seen)/60,1) | eval eps=round(eps,1) | rename hostname as host | table host mins_ago eps | appendpipe [| stats count | where count=0 | eval _status="Awaiting forwarder data", host="", mins_ago=0, eps=0] +dispatch.earliest_time = -5m +dispatch.latest_time = now +display.general.type = visualizations +display.visualizations.type = custom +display.visualizations.custom.type = splunk_health.forwarder_heatmap +display.visualizations.custom.splunk_health.forwarder_heatmap.colorTheme = default +display.visualizations.custom.splunk_health.forwarder_heatmap.showGlow = true +display.visualizations.custom.splunk_health.forwarder_heatmap.warningThreshold = 5 +display.visualizations.custom.splunk_health.forwarder_heatmap.criticalThreshold = 15 +display.visualizations.custom.splunk_health.forwarder_heatmap.showEps = true +display.visualizations.custom.splunk_health.forwarder_heatmap.animSpeed = medium +display.visualizations.custom.splunk_health.forwarder_heatmap.cellSize = auto +display.visualizations.custom.splunk_health.forwarder_heatmap.sortBy = status + +[Resource Gauge - Live] +search = index=_introspection sourcetype=splunk_resource_usage component=hostwide | stats latest(data.cpu_user_pct) as cpu_user, latest(data.cpu_system_pct) as cpu_sys, latest(data.mem_used) as mem_used, latest(data.mem) as mem_total, latest(data.swap_used) as swap_used, latest(data.swap) as swap_total by host | eval cpu_pct=round(cpu_user+cpu_sys, 1) | eval mem_pct=if(mem_total>0, round((mem_used/mem_total)*100, 1), 0) | eval disk_pct=if(swap_total>0, round((swap_used/swap_total)*100, 1), 0) | head 1 | table cpu_pct mem_pct disk_pct | appendpipe [| stats count | where count=0 | eval _status="Awaiting resource data", cpu_pct=0, mem_pct=0, disk_pct=0] +dispatch.earliest_time = -1m +dispatch.latest_time = now +display.general.type = visualizations +display.visualizations.type = custom +display.visualizations.custom.type = splunk_health.resource_gauge +display.visualizations.custom.splunk_health.resource_gauge.colorTheme = default +display.visualizations.custom.splunk_health.resource_gauge.showGlow = true +display.visualizations.custom.splunk_health.resource_gauge.warningThreshold = 70 +display.visualizations.custom.splunk_health.resource_gauge.criticalThreshold = 85 +display.visualizations.custom.splunk_health.resource_gauge.animSpeed = medium +display.visualizations.custom.splunk_health.resource_gauge.showLabels = true +display.visualizations.custom.splunk_health.resource_gauge.cpuField = cpu_pct +display.visualizations.custom.splunk_health.resource_gauge.memField = mem_pct +display.visualizations.custom.splunk_health.resource_gauge.diskField = disk_pct + +[Search Activity - Live] +search = | rest /services/server/status/resource-usage/splunk-processes | search search_props.sid=* | eval type=case(search_props.mode=="historical","scheduled", search_props.mode=="historical_fast","scheduled", search_props.provenance=="UI:Search","ad-hoc", 1=1,"other") | stats count by type | appendpipe [| stats count | where count=0 | eval _status="Awaiting search data", type="", count=0] +dispatch.earliest_time = -1m +dispatch.latest_time = now +display.general.type = visualizations +display.visualizations.type = custom +display.visualizations.custom.type = splunk_health.search_activity +display.visualizations.custom.splunk_health.search_activity.colorTheme = default +display.visualizations.custom.splunk_health.search_activity.showGlow = true +display.visualizations.custom.splunk_health.search_activity.animSpeed = medium +display.visualizations.custom.splunk_health.search_activity.maxConcurrent = 50 +display.visualizations.custom.splunk_health.search_activity.warningThreshold = 60 +display.visualizations.custom.splunk_health.search_activity.criticalThreshold = 80 + +[Index Storage - Live] +search = | dbinspect index=* | eval temp=case(state=="hot","hot", state=="warm","warm", state=="cold","cold", 1=1,"other") | stats sum(sizeOnDiskMB) as sizeMB by index, temp | eval sizeGB=round(sizeMB/1024,2) | chart sum(sizeGB) as sizeGB by index, temp | rename index as title | eval hotGB=coalesce(hot,0), warmGB=coalesce(warm,0), coldGB=coalesce(cold,0) | eval sizeGB=hotGB+warmGB+coldGB | where sizeGB>0 | join type=outer title [| rest /services/data/indexes | eval maxGB=round(maxTotalDataSizeMB/1024,2) | table title maxGB] | table title sizeGB maxGB hotGB warmGB coldGB | sort -sizeGB | appendpipe [| stats count | where count=0 | eval _status="Awaiting index data", title="", sizeGB=0, maxGB=0, hotGB=0, warmGB=0, coldGB=0] +dispatch.earliest_time = -1m +dispatch.latest_time = now +display.general.type = visualizations +display.visualizations.type = custom +display.visualizations.custom.type = splunk_health.index_storage +display.visualizations.custom.splunk_health.index_storage.colorTheme = default +display.visualizations.custom.splunk_health.index_storage.showGlow = true +display.visualizations.custom.splunk_health.index_storage.animSpeed = medium +display.visualizations.custom.splunk_health.index_storage.cellSize = auto +display.visualizations.custom.splunk_health.index_storage.sortBy = size + +[Scheduler Health - Live] +search = index=_internal sourcetype=scheduler status=* | stats count as total, count(eval(status="skipped")) as skipped, count(eval(status="success")) as success, avg(run_time) as avg_runtime | eval skip_pct=if(total>0, round((skipped/total)*100,1), 0) | eval success_pct=if(total>0, round((success/total)*100,1), 0) | eval avg_runtime=round(avg_runtime,2) | table skip_pct success_pct avg_runtime total skipped | appendpipe [| stats count | where count=0 | eval _status="Awaiting scheduler data", skip_pct=0, success_pct=0, avg_runtime=0, total=0, skipped=0] +dispatch.earliest_time = -15m +dispatch.latest_time = now +display.general.type = visualizations +display.visualizations.type = custom +display.visualizations.custom.type = splunk_health.scheduler_health +display.visualizations.custom.splunk_health.scheduler_health.colorTheme = default +display.visualizations.custom.splunk_health.scheduler_health.showGlow = true +display.visualizations.custom.splunk_health.scheduler_health.animSpeed = medium +display.visualizations.custom.splunk_health.scheduler_health.runtimeThreshold = 30 + diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/visualizations.conf b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/visualizations.conf new file mode 100644 index 0000000..ff855b2 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/default/visualizations.conf @@ -0,0 +1,63 @@ +[indexing_pipeline_flow] +label = Indexing Pipeline Flow +description = Animated visualization of Splunk indexing pipeline queues with glass tube fill levels and flow particles +default_height = 350 +allow_user_selection = true +disabled = 0 +search_fragment = index=_internal group=queue | stats latest(current_size) as avg_size by name + +[splunk_status_board] +label = Splunk Status Board +description = Monitor component health with animated glass tiles and threshold colors +default_height = 400 +allow_user_selection = true +disabled = 0 +search_fragment = | rest /services/server/health/splunkd/details | table component status errors warns health_score + +[license_gauge] +label = License Gauge +description = Track daily license consumption against quota with an animated arc gauge +default_height = 400 +allow_user_selection = true +disabled = 0 +search_fragment = | rest /services/licenser/pools | stats sum(used_bytes) as used_bytes + +[forwarder_heatmap] +label = Forwarder Heatmap +description = Glass-themed heatmap grid showing forwarder health and staleness +default_height = 400 +allow_user_selection = true +disabled = 0 +search_fragment = | stats max(_time) as last_seen by hostname | eval mins_ago=round((now()-last_seen)/60,1) | table host mins_ago eps + +[resource_gauge] +label = Resource Gauge +description = Concentric arc gauges showing CPU, memory, and disk utilization +default_height = 350 +allow_user_selection = true +disabled = 0 +search_fragment = | stats latest(data.cpu_user_pct) as cpu_user latest(data.mem_used) as mem_used + +[search_activity] +label = Search Activity +description = Monitor search slot utilization with a stacked glass tank gauge +default_height = 250 +allow_user_selection = true +disabled = 0 +search_fragment = | rest /services/server/status/resource-usage/splunk-processes + +[index_storage] +label = Index Storage +description = Glass tank grid showing index sizes with hot/warm/cold data layers +default_height = 400 +allow_user_selection = true +disabled = 0 +search_fragment = | rest /services/data/indexes | eval sizeGB=round(currentDBSizeMB/1024,2) | table title sizeGB hotGB warmGB coldGB + +[scheduler_health] +label = Scheduler Health +description = Display scheduler success, skip rate, and runtime as animated glass tubes +default_height = 300 +allow_user_selection = true +disabled = 0 +search_fragment = | stats count as total, count(eval(status="skipped")) as skipped diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/metadata/default.meta b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/metadata/default.meta new file mode 100644 index 0000000..95d1c17 --- /dev/null +++ b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/metadata/default.meta @@ -0,0 +1,76 @@ +[] +access = read : [ * ], write : [ admin, sc_admin, power ] + +[app/local] +access = read : [ * ], write : [ admin, sc_admin ] + +[views] +access = read : [ * ], write : [ admin, sc_admin, power ] + +[nav] +access = read : [ * ], write : [ admin, sc_admin ] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[visualizations/indexing_pipeline_flow] +export = system + +[visualizations/splunk_status_board] +export = system + +[visualizations/license_gauge] +export = system + +[visualizations/forwarder_heatmap] +export = system + +[visualizations/resource_gauge] +export = system + +[visualizations/search_activity] +export = system + +[visualizations/index_storage] +export = system + +[visualizations/scheduler_health] +export = system diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIcon.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIcon.png new file mode 100644 index 0000000..3839512 Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIcon.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIconAlt.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIconAlt.png new file mode 100644 index 0000000..3839512 Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIconAlt.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIconAlt_2x.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIconAlt_2x.png new file mode 100644 index 0000000..1cffb21 Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIconAlt_2x.png differ diff --git a/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIcon_2x.png b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIcon_2x.png new file mode 100644 index 0000000..1cffb21 Binary files /dev/null and b/integration/splunk-visual/vendor/rcastley-splunk-custom-visualizations/splunk_health/static/appIcon_2x.png differ diff --git a/pyproject.toml b/pyproject.toml index 1026e82..5f7f0f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,11 +4,12 @@ build-backend = "hatchling.build" [project] name = "splunk-dashboard-studio-python" -version = "0.2.0" +version = "0.2.1" description = "Deterministic, version-aware Splunk Enterprise Dashboard Studio tooling for Python" readme = "README.md" requires-python = ">=3.12" license = "Apache-2.0" +license-files = ["LICENSE", "THIRD_PARTY_NOTICES.md"] authors = [{ name = "Kmosoti" }] keywords = ["splunk", "dashboard-studio", "pydantic", "spl", "validation"] classifiers = [ @@ -50,6 +51,7 @@ include = [ "/CHANGELOG.md", "/LICENSE", "/README.md", + "/THIRD_PARTY_NOTICES.md", "/docs", "/examples", "/pyproject.toml", @@ -60,11 +62,15 @@ include = [ exclude = [ "/.github", "/benchmarks", + "/integration", "/node_modules", "**/*.js", "**/*.cjs", + "**/*.mjs", "**/package.json", "**/package-lock.json", + "**/*.ts", + "**/*.tsx", ] [tool.pytest.ini_options] diff --git a/scripts/check_distribution.py b/scripts/check_distribution.py index 2a37cf8..b177e08 100644 --- a/scripts/check_distribution.py +++ b/scripts/check_distribution.py @@ -9,8 +9,15 @@ from pathlib import Path, PurePosixPath PROHIBITED_NAMES = {"package-lock.json", "package.json"} -PROHIBITED_PARTS = {"node_modules"} -PROHIBITED_SUFFIXES = {".cjs", ".js", ".mjs"} +PROHIBITED_PARTS = { + ".local-browsers", + "artifacts", + "integration", + "node_modules", + "playwright-report", + "test-results", +} +PROHIBITED_SUFFIXES = {".cjs", ".js", ".mjs", ".ts", ".tsx"} def artifact_members(path: Path) -> list[str]: diff --git a/scripts/release_evidence.py b/scripts/release_evidence.py index 6a3aa3f..06e77d0 100644 --- a/scripts/release_evidence.py +++ b/scripts/release_evidence.py @@ -9,7 +9,12 @@ from pathlib import Path from typing import Any -from splunk_dashboard_studio import __version__ +from splunk_dashboard_studio import ( + __version__, + build_source_template, + canonical_json, + source_template_entries, +) from splunk_dashboard_studio.catalog import build_catalog_bundle, catalog_entries from splunk_dashboard_studio.profiles import profile_manifest @@ -82,6 +87,22 @@ def build_release_evidence(tag: str, distribution_directory: Path) -> dict[str, "definition_sha256": bundle.manifest.definition_sha256, } ) + source_templates = [] + for entry in source_template_entries(): + definition = build_source_template(entry.template_id, str(entry.minimum_target)) + normalized = canonical_json(definition).encode("utf-8") + source_templates.append( + { + "template_id": entry.template_id, + "minimum_target": str(entry.minimum_target), + "repository": entry.origin.repository, + "revision": entry.origin.revision, + "license": entry.origin.license, + "source_definition_sha256": entry.origin.definition_sha256, + "normalized_definition_sha256": hashlib.sha256(normalized).hexdigest(), + "required_apps": [app.app_id for app in entry.required_apps], + } + ) return { "schema_version": "release-evidence/v1", "package": { @@ -92,6 +113,7 @@ def build_release_evidence(tag: str, distribution_directory: Path) -> dict[str, }, "artifacts": [_artifact(path) for path in artifacts], "catalog": catalog, + "source_templates": source_templates, "compatibility": profile_manifest(), "verification": { "native": [ @@ -104,7 +126,11 @@ def build_release_evidence(tag: str, distribution_directory: Path) -> dict[str, "distribution inspection", ], "official_engines": "validated by the release workflow matrix", - "live_splunk_roundtrip": "deferred", + "live_splunk_roundtrip": ( + "validated by the release visual matrix, including pinned source templates" + ), + "browser_rendering": "validated by target-specific Playwright baselines", + "vision_qa": "advisory artifact; deterministic corroboration is required to gate", }, } diff --git a/scripts/sync_dashboard_samples.py b/scripts/sync_dashboard_samples.py new file mode 100644 index 0000000..d097598 --- /dev/null +++ b/scripts/sync_dashboard_samples.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +"""Synchronize the public dashboard gallery from reviewed live Splunk baselines.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import shutil +from pathlib import Path +from typing import Final + +ROOT: Final = Path(__file__).resolve().parents[1] +BASELINES: Final = ROOT / "integration" / "splunk-visual" / "baselines" +OUTPUT: Final = ROOT / "docs" / "images" / "dashboard-samples" +MANIFEST_PATH: Final = OUTPUT / "manifest.json" +SAMPLES: Final = ( + { + "sample_id": "splunk_health_portable_94", + "title": "Splunk Health portable port", + "target": "9.4.3", + "baseline": "rcastley-splunk-health-portable-full.png", + "output": "splunk-health-portable-9.4.png", + }, + { + "sample_id": "kubernetes_workload_health_94", + "title": "Kubernetes workload health", + "target": "9.4.3", + "baseline": "kubernetes-workload-health-full.png", + "output": "kubernetes-workload-health-9.4.png", + }, + { + "sample_id": "business_journey_slo_102", + "title": "Business journey SLO", + "target": "10.2.0", + "baseline": "business-journey-slo-full.png", + "output": "business-journey-slo-10.2.png", + }, + { + "sample_id": "microservice_service_map_104", + "title": "Microservice service map", + "target": "10.4.0", + "baseline": "microservice-service-map-full.png", + "output": "microservice-service-map-10.4.png", + }, + { + "sample_id": "splunk_health_custom_104", + "title": "Splunk Health custom visualization source", + "target": "10.4.0", + "baseline": "rcastley-splunk-health-full.png", + "output": "splunk-health-custom-10.4.png", + }, +) + + +def _sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def _manifest() -> dict[str, object]: + records = [] + for sample in SAMPLES: + source = BASELINES / sample["target"] / sample["baseline"] + if not source.is_file(): + raise FileNotFoundError(f"Missing reviewed baseline {source.relative_to(ROOT)}") + records.append( + { + "baseline_path": source.relative_to(ROOT).as_posix(), + "bytes": source.stat().st_size, + "image_sha256": _sha256(source), + "output_path": (OUTPUT / sample["output"]).relative_to(ROOT).as_posix(), + "sample_id": sample["sample_id"], + "target": sample["target"], + "title": sample["title"], + } + ) + return { + "schema_version": "dashboard-sample-gallery/v1", + "source": "reviewed live Splunk Enterprise Playwright baselines", + "samples": records, + } + + +def sync(*, write: bool) -> list[dict[str, str]]: + manifest = _manifest() + expected_manifest = json.dumps(manifest, indent=2, sort_keys=True) + "\n" + failures: list[dict[str, str]] = [] + if write: + OUTPUT.mkdir(parents=True, exist_ok=True) + for sample in SAMPLES: + source = BASELINES / sample["target"] / sample["baseline"] + destination = OUTPUT / sample["output"] + if write: + shutil.copyfile(source, destination) + elif not destination.is_file(): + failures.append({"path": destination.relative_to(ROOT).as_posix(), "reason": "missing"}) + elif destination.read_bytes() != source.read_bytes(): + failures.append({"path": destination.relative_to(ROOT).as_posix(), "reason": "drifted"}) + if write: + MANIFEST_PATH.write_text(expected_manifest, encoding="utf-8") + elif not MANIFEST_PATH.is_file(): + failures.append({"path": MANIFEST_PATH.relative_to(ROOT).as_posix(), "reason": "missing"}) + elif MANIFEST_PATH.read_text(encoding="utf-8") != expected_manifest: + failures.append({"path": MANIFEST_PATH.relative_to(ROOT).as_posix(), "reason": "drifted"}) + return failures + + +def main() -> int: + parser = argparse.ArgumentParser() + mode = parser.add_mutually_exclusive_group(required=True) + mode.add_argument("--check", action="store_true") + mode.add_argument("--write", action="store_true") + arguments = parser.parse_args() + try: + failures = sync(write=arguments.write) + except OSError as error: + print( + json.dumps( + {"status": "error", "error_type": type(error).__name__, "message": str(error)}, + sort_keys=True, + ) + ) + return 2 + print( + json.dumps( + { + "failures": failures, + "mode": "write" if arguments.write else "check", + "samples": len(SAMPLES), + "status": "drifted" if failures else "valid", + }, + indent=2, + sort_keys=True, + ) + ) + return 1 if failures else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/sync_source_templates.py b/scripts/sync_source_templates.py new file mode 100644 index 0000000..1926f85 --- /dev/null +++ b/scripts/sync_source_templates.py @@ -0,0 +1,271 @@ +#!/usr/bin/env python3 +"""Import the pinned rcastley source template and integration-only Splunk app snapshot.""" + +from __future__ import annotations + +import argparse +import copy +import hashlib +import json +import re +import subprocess +from pathlib import Path +from typing import Any, Final + +ROOT: Final = Path(__file__).resolve().parents[1] +INTEGRATION_ROOT: Final = ROOT / "integration" / "splunk-visual" +VENDOR_ROOT: Final = INTEGRATION_ROOT / "vendor" / "rcastley-splunk-custom-visualizations" +LOCK_PATH: Final = INTEGRATION_ROOT / "source-lock.json" +TEMPLATE_PATH: Final = ( + ROOT / "splunk_dashboard_studio" / "template_data" / "rcastley_splunk_health.json" +) +PORTABLE_TEMPLATE_PATH: Final = ( + ROOT / "splunk_dashboard_studio" / "template_data" / "rcastley_splunk_health_portable.json" +) +TEMPLATE_MANIFEST: Final = ROOT / "splunk_dashboard_studio" / "template_data" / "manifest.json" +REPOSITORY: Final = "https://github.com/rcastley/splunk-custom-visualizations" +REVISION: Final = "7424755c461712022367c3fa081fd7e0edc91001" +APP_SOURCE: Final = Path("splunk_health") +DEFINITION_SOURCE: Final = APP_SOURCE / "default/data/ui/views/splunk_health.xml" +HEALTH_VISUALIZATIONS: Final = ( + "forwarder_heatmap", + "index_storage", + "indexing_pipeline_flow", + "license_gauge", + "resource_gauge", + "scheduler_health", + "search_activity", + "splunk_status_board", +) +EXCLUDED_APP_FILES: Final = {Path("splunk_health/.gitignore"), Path("splunk_health/build.sh")} +PORTABLE_VISUALIZATION_TYPES: Final = { + "splunk_health.forwarder_heatmap": "splunk.table", + "splunk_health.index_storage": "splunk.table", + "splunk_health.indexing_pipeline_flow": "splunk.table", + "splunk_health.license_gauge": "splunk.singlevalue", + "splunk_health.resource_gauge": "splunk.table", + "splunk_health.scheduler_health": "splunk.table", + "splunk_health.search_activity": "splunk.table", + "splunk_health.splunk_status_board": "splunk.table", +} + + +def _sha256(content: bytes) -> str: + return hashlib.sha256(content).hexdigest() + + +def _revision(source: Path) -> str: + result = subprocess.run( + ["git", "-C", str(source), "rev-parse", "HEAD"], + check=True, + capture_output=True, + text=True, + ) + return result.stdout.strip() + + +def _definition(source: Path) -> tuple[dict[str, Any], str]: + xml = (source / DEFINITION_SOURCE).read_text(encoding="utf-8") + match = re.search(r"", xml, re.DOTALL) + if match is None: + raise ValueError(f"No Dashboard Studio definition found in {DEFINITION_SOURCE}") + payload = json.loads(match.group(1)) + if not isinstance(payload, dict): + raise ValueError("Upstream Dashboard Studio definition must be a JSON object") + normalized = json.dumps( + payload, + ensure_ascii=False, + separators=(",", ":"), + sort_keys=True, + ).encode("utf-8") + return payload, _sha256(normalized) + + +def _portable_definition(definition: dict[str, Any]) -> tuple[dict[str, Any], str]: + """Adapt the pinned source dashboard to app-free built-ins without changing its SPL.""" + + payload = copy.deepcopy(definition) + payload["title"] = "Splunk Health (Portable)" + payload["description"] = ( + "App-free built-in visualization port for Splunk Enterprise 9.4 and later." + ) + visualizations = payload.get("visualizations") + if not isinstance(visualizations, dict): + raise ValueError("Upstream Dashboard Studio definition requires visualizations") + for visualization_id, visualization in visualizations.items(): + if not isinstance(visualization, dict): + raise ValueError(f"Visualization {visualization_id!r} must be an object") + source_type = visualization.get("type") + if not isinstance(source_type, str) or source_type not in PORTABLE_VISUALIZATION_TYPES: + raise ValueError( + f"Visualization {visualization_id!r} has unmapped source type {source_type!r}" + ) + visualization["type"] = PORTABLE_VISUALIZATION_TYPES[source_type] + visualization["options"] = {} + normalized = json.dumps( + payload, + ensure_ascii=False, + separators=(",", ":"), + sort_keys=True, + ).encode("utf-8") + return payload, _sha256(normalized) + + +def _app_files(source: Path) -> list[Path]: + return [ + path.relative_to(source) + for path in sorted((source / APP_SOURCE).rglob("*")) + if path.is_file() and path.relative_to(source) not in EXCLUDED_APP_FILES + ] + + +def _tree_hash(files: dict[str, str]) -> str: + content = "".join(f"{digest} {path}\n" for path, digest in sorted(files.items())) + return _sha256(content.encode("utf-8")) + + +def _harness_source(name: str) -> Path: + return Path(f"examples/{name}/appserver/static/visualizations/{name}/harness.json") + + +def _expected(source: Path) -> tuple[dict[str, Any], dict[str, str], dict[Path, bytes]]: + revision = _revision(source) + if revision != REVISION: + raise ValueError(f"Source revision {revision!r} must equal pinned revision {REVISION!r}") + definition, definition_hash = _definition(source) + portable_definition, portable_definition_hash = _portable_definition(definition) + generated: dict[Path, bytes] = { + TEMPLATE_PATH: ( + json.dumps(definition, indent=2, sort_keys=True, ensure_ascii=False) + "\n" + ).encode("utf-8"), + PORTABLE_TEMPLATE_PATH: ( + json.dumps(portable_definition, indent=2, sort_keys=True, ensure_ascii=False) + "\n" + ).encode("utf-8"), + VENDOR_ROOT / "LICENSE": (source / "LICENSE").read_bytes(), + } + + app_hashes: dict[str, str] = {} + for source_path in _app_files(source): + content = (source / source_path).read_bytes() + app_hashes[source_path.as_posix()] = _sha256(content) + generated[VENDOR_ROOT / source_path] = content + + harnesses = [] + for name in HEALTH_VISUALIZATIONS: + source_path = _harness_source(name) + content = (source / source_path).read_bytes() + vendor_path = Path("harness") / f"{name}.json" + generated[VENDOR_ROOT / vendor_path] = content + harnesses.append( + { + "name": name, + "sha256": _sha256(content), + "source_path": source_path.as_posix(), + "vendor_path": (VENDOR_ROOT.relative_to(ROOT) / vendor_path).as_posix(), + } + ) + + lock = { + "schema_version": "splunk-source-template-lock/v1", + "repository": REPOSITORY, + "revision": REVISION, + "license": "Apache-2.0", + "license_path": (VENDOR_ROOT.relative_to(ROOT) / "LICENSE").as_posix(), + "license_sha256": _sha256((source / "LICENSE").read_bytes()), + "definition": { + "source_path": DEFINITION_SOURCE.as_posix(), + "package_path": TEMPLATE_PATH.relative_to(ROOT).as_posix(), + "sha256": definition_hash, + }, + "app": { + "app_id": "splunk_health", + "source_path": APP_SOURCE.as_posix(), + "vendor_path": (VENDOR_ROOT.relative_to(ROOT) / APP_SOURCE).as_posix(), + "tree_sha256": _tree_hash(app_hashes), + "files": app_hashes, + }, + "harnesses": harnesses, + } + generated[LOCK_PATH] = ( + json.dumps(lock, indent=2, sort_keys=True, ensure_ascii=False) + "\n" + ).encode("utf-8") + definition_hashes = { + "rcastley_splunk_health": definition_hash, + "rcastley_splunk_health_portable": portable_definition_hash, + } + return lock, definition_hashes, generated + + +def _metadata_hashes() -> dict[str, str]: + manifest = json.loads(TEMPLATE_MANIFEST.read_text(encoding="utf-8")) + return { + str(record["entry"]["template_id"]): str(record["entry"]["origin"]["definition_sha256"]) + for record in manifest["templates"] + } + + +def sync(source: Path, *, check: bool) -> list[dict[str, str]]: + _, definition_hashes, expected = _expected(source.resolve()) + metadata_hashes = _metadata_hashes() + if any( + metadata_hashes.get(template_id) != digest + for template_id, digest in definition_hashes.items() + ): + raise ValueError( + "Package source-template metadata does not match the imported definition hashes" + ) + + failures: list[dict[str, str]] = [] + for path, content in sorted(expected.items()): + if check: + if not path.exists(): + failures.append({"path": str(path.relative_to(ROOT)), "reason": "missing"}) + elif path.read_bytes() != content: + failures.append({"path": str(path.relative_to(ROOT)), "reason": "drifted"}) + continue + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(content) + + if check and VENDOR_ROOT.exists(): + allowed = {path for path in expected if path.is_relative_to(VENDOR_ROOT)} + vendor_files = (candidate for candidate in VENDOR_ROOT.rglob("*") if candidate.is_file()) + for path in sorted(vendor_files): + if path not in allowed: + failures.append({"path": str(path.relative_to(ROOT)), "reason": "unexpected"}) + return failures + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--source", type=Path, required=True, help="Pinned upstream Git checkout") + mode = parser.add_mutually_exclusive_group(required=True) + mode.add_argument("--check", action="store_true") + mode.add_argument("--write", action="store_true") + arguments = parser.parse_args() + try: + failures = sync(arguments.source, check=arguments.check) + except (OSError, ValueError, subprocess.CalledProcessError, json.JSONDecodeError) as error: + print( + json.dumps( + {"status": "error", "error_type": type(error).__name__, "message": str(error)}, + sort_keys=True, + ) + ) + return 2 + print( + json.dumps( + { + "status": "drifted" if failures else "valid", + "mode": "check" if arguments.check else "write", + "revision": REVISION, + "failures": failures, + }, + indent=2, + sort_keys=True, + ) + ) + return 1 if failures else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/splunk_dashboard_studio/__init__.py b/splunk_dashboard_studio/__init__.py index a022ee3..f69a8b3 100644 --- a/splunk_dashboard_studio/__init__.py +++ b/splunk_dashboard_studio/__init__.py @@ -25,8 +25,13 @@ DashboardEvidenceManifest, ObservabilityFramework, PanelProvenance, + RequiredSplunkApp, SavedSearchSpec, SkillDescriptor, + SourceTemplateBundle, + SourceTemplateEntry, + SourceTemplateLesson, + SourceTemplateOrigin, TelemetryContract, TelemetryField, TelemetrySignal, @@ -42,6 +47,15 @@ from splunk_dashboard_studio.issues import ValidationIssue, ValidationReport from splunk_dashboard_studio.models import DashboardDefinition from splunk_dashboard_studio.profiles import EnterpriseProfile, available_profiles, profile_for +from splunk_dashboard_studio.source_templates import ( + SourceTemplateError, + SourceTemplateIntegrityError, + SourceTemplateNotFound, + SourceTemplateTargetUnsupported, + build_source_template, + build_source_template_bundle, + source_template_entries, +) from splunk_dashboard_studio.validation import validate_dashboard from splunk_dashboard_studio.version import EnterpriseVersion, TargetPlatform @@ -59,11 +73,20 @@ "GraphAnalysis", "ObservabilityFramework", "PanelProvenance", + "RequiredSplunkApp", "RoundTripComparison", "RoundTripDifference", "SavedSearchSpec", "SearchOptimizationPlan", "SkillDescriptor", + "SourceTemplateBundle", + "SourceTemplateEntry", + "SourceTemplateError", + "SourceTemplateIntegrityError", + "SourceTemplateLesson", + "SourceTemplateNotFound", + "SourceTemplateOrigin", + "SourceTemplateTargetUnsupported", "StudioView", "StudioViewCodecError", "TargetPlatform", @@ -77,6 +100,8 @@ "available_profiles", "build_catalog_bundle", "build_catalog_dashboard", + "build_source_template", + "build_source_template_bundle", "canonical_json", "catalog_entries", "compare_roundtrip", @@ -86,5 +111,6 @@ "plan_search_optimizations", "portable_telemetry_contract", "profile_for", + "source_template_entries", "validate_dashboard", ] diff --git a/splunk_dashboard_studio/_version.py b/splunk_dashboard_studio/_version.py index 020b4ea..cf03187 100644 --- a/splunk_dashboard_studio/_version.py +++ b/splunk_dashboard_studio/_version.py @@ -1,3 +1,3 @@ """Single-source runtime package version.""" -__version__ = "0.2.0" +__version__ = "0.2.1" diff --git a/splunk_dashboard_studio/catalog.py b/splunk_dashboard_studio/catalog.py index 5713afe..38d9f94 100644 --- a/splunk_dashboard_studio/catalog.py +++ b/splunk_dashboard_studio/catalog.py @@ -6,6 +6,8 @@ from dataclasses import dataclass from typing import Literal +from pydantic import JsonValue + from splunk_dashboard_studio._version import __version__ from splunk_dashboard_studio.contracts import ( CatalogEntry, @@ -295,6 +297,7 @@ class _PanelSpec: signals: tuple[TelemetrySignal, ...] required_fields: tuple[str, ...] drilldown_signals: tuple[TelemetrySignal, ...] = () + node_source_query: str | None = None @dataclass(frozen=True) @@ -323,6 +326,7 @@ def _panel( required_fields: tuple[str, ...], *, drilldown_signals: tuple[TelemetrySignal, ...] = (), + node_source_query: str | None = None, ) -> _PanelSpec: return _PanelSpec( slug=slug, @@ -334,6 +338,7 @@ def _panel( signals=signals, required_fields=required_fields, drilldown_signals=drilldown_signals, + node_source_query=node_source_query, ) @@ -745,6 +750,11 @@ def _panel( (TelemetrySignal.TRACE,), ("service.name", "peer.service"), drilldown_signals=(TelemetrySignal.LOG,), + node_source_query=( + "| eval nodeIds=mvappend(source,target) | mvexpand nodeIds " + "| stats sum(value) AS nodeValues by nodeIds " + "| eval nodeTexts=nodeIds | table nodeIds nodeTexts nodeValues" + ), ), _panel( "dependency_hotspots", @@ -1096,12 +1106,15 @@ def portable_telemetry_contract() -> TelemetryContract: def _provenance(panel: _PanelSpec) -> PanelProvenance: + data_source_ids: tuple[str, ...] = (f"ds_{panel.slug}",) + if panel.node_source_query is not None: + data_source_ids += (f"ds_{panel.slug}_nodes",) return PanelProvenance( panel_id=f"viz_{panel.slug}", purpose=panel.purpose, frameworks=panel.frameworks, signals=panel.signals, - data_source_ids=(f"ds_{panel.slug}",), + data_source_ids=data_source_ids, required_fields=panel.required_fields, drilldown_signals=panel.drilldown_signals, ) @@ -1203,13 +1216,39 @@ def build_catalog_dashboard( earliest=None, latest=None, ) + data_sources = {"primary": data_source_id} + visualization_options: dict[str, JsonValue] | None = None + visualization_context: dict[str, JsonValue] | None = None + if panel.node_source_query is not None: + node_source_id = builder.add_chain( + parent=data_source_id, + query=panel.node_source_query, + name=f"{panel.title} nodes", + data_source_id=f"ds_{panel.slug}_nodes", + ) + data_sources["nodeSource"] = node_source_id + visualization_options = { + "source": '> primary | seriesByName("source")', + "target": '> primary | seriesByName("target")', + "nodeIds": '> nodeSource | seriesByName("nodeIds")', + "nodeTexts": '> nodeSource | seriesByName("nodeTexts")', + "nodeValues": '> nodeSource | seriesByName("nodeValues")', + "nodeSize": 24, + "linkWidth": '> primary | seriesByName("value") | lerp(linkWidthScale)', + "layout": "grid", + "gridColumns": 2, + "showDirection": "oneWay", + } + visualization_context = {"linkWidthScale": {"outputMin": 2, "outputMax": 8}} builder.add_visualization( panel.visualization_type, name=panel.title, visualization_id=f"viz_{panel.slug}", - data_sources={"primary": data_source_id}, + data_sources=data_sources, title=panel.title, description=panel.purpose, + options=visualization_options, + context=visualization_context, ) return builder.build(canvas_width=1440) diff --git a/splunk_dashboard_studio/cli.py b/splunk_dashboard_studio/cli.py index 192ea3f..1d31e4f 100644 --- a/splunk_dashboard_studio/cli.py +++ b/splunk_dashboard_studio/cli.py @@ -27,6 +27,11 @@ dashboard_definition_schema, schema_bundle, ) +from splunk_dashboard_studio.source_templates import ( + build_source_template, + build_source_template_bundle, + source_template_entries, +) from splunk_dashboard_studio.validation import validate_dashboard @@ -94,6 +99,21 @@ def _parser() -> argparse.ArgumentParser: default="definition", ) catalog_build.add_argument("--output", default="-", help="Output path or '-' for stdout") + + template = subparsers.add_parser( + "template", help="Inspect or build provenance-locked source templates" + ) + template_commands = template.add_subparsers(dest="template_command", required=True) + template_commands.add_parser("list", help="List source-template provenance and requirements") + template_build = template_commands.add_parser("build", help="Build a source-template artifact") + template_build.add_argument("template_id") + template_build.add_argument("--target", required=True) + template_build.add_argument( + "--artifact", + choices=("definition", "bundle"), + default="definition", + ) + template_build.add_argument("--output", default="-", help="Output path or '-' for stdout") return parser @@ -140,12 +160,28 @@ def main(argv: list[str] | None = None) -> int: } ) return 0 - artifact = ( + catalog_artifact = ( build_catalog_dashboard(arguments.example_id, arguments.target) if arguments.artifact == "definition" else build_catalog_bundle(arguments.example_id, arguments.target) ) - _write_json(artifact, arguments.output) + _write_json(catalog_artifact, arguments.output) + return 0 + if arguments.command == "template": + if arguments.template_command == "list": + _print_json( + { + "schema_version": "dashboard-source-templates/v1", + "entries": source_template_entries(), + } + ) + return 0 + template_artifact = ( + build_source_template(arguments.template_id, arguments.target) + if arguments.artifact == "definition" + else build_source_template_bundle(arguments.template_id, arguments.target) + ) + _write_json(template_artifact, arguments.output) return 0 except (OSError, ValueError, ValidationError, json.JSONDecodeError) as error: _print_json({"status": "error", "message": str(error), "error_type": type(error).__name__}) diff --git a/splunk_dashboard_studio/contracts.py b/splunk_dashboard_studio/contracts.py index f1e0539..223e3ce 100644 --- a/splunk_dashboard_studio/contracts.py +++ b/splunk_dashboard_studio/contracts.py @@ -122,6 +122,45 @@ class DashboardArtifactBundle(FrozenContract): manifest: DashboardEvidenceManifest +class SourceTemplateOrigin(FrozenContract): + repository: str = Field(min_length=1) + revision: str = Field(pattern=r"^[0-9a-f]{40}$") + license: Literal["Apache-2.0"] + source_paths: tuple[str, ...] = Field(min_length=1) + definition_sha256: str = Field(pattern=r"^[0-9a-f]{64}$") + attribution: str = Field(min_length=1) + + +class RequiredSplunkApp(FrozenContract): + app_id: str = Field(pattern=r"^[a-z][a-z0-9_]*$") + repository: str = Field(min_length=1) + revision: str = Field(pattern=r"^[0-9a-f]{40}$") + install_scope: Literal["operator_or_integration"] = "operator_or_integration" + + +class SourceTemplateLesson(FrozenContract): + lesson_id: str = Field(pattern=r"^[a-z][a-z0-9_]*$") + summary: str = Field(min_length=1) + enforcement: tuple[str, ...] = Field(min_length=1) + + +class SourceTemplateEntry(FrozenContract): + template_id: str = Field(pattern=r"^[a-z][a-z0-9_]*$") + title: str = Field(min_length=1) + description: str = Field(min_length=1) + minimum_target: EnterpriseVersion + origin: SourceTemplateOrigin + required_apps: tuple[RequiredSplunkApp, ...] = () + adaptations: tuple[str, ...] = () + lessons: tuple[SourceTemplateLesson, ...] = Field(min_length=1) + tags: tuple[str, ...] = () + + +class SourceTemplateBundle(FrozenContract): + template: SourceTemplateEntry + definition: DashboardDefinition + + class AgentSkill(StrEnum): DATA_DISCOVERY = "data_discovery" SPL_OPTIMIZATION = "spl_optimization" diff --git a/splunk_dashboard_studio/corpus.py b/splunk_dashboard_studio/corpus.py index da1be90..a692d53 100644 --- a/splunk_dashboard_studio/corpus.py +++ b/splunk_dashboard_studio/corpus.py @@ -11,6 +11,10 @@ from splunk_dashboard_studio.catalog import build_catalog_dashboard, catalog_entries from splunk_dashboard_studio.generation import DashboardBuilder +from splunk_dashboard_studio.source_templates import ( + build_source_template, + source_template_entries, +) from splunk_dashboard_studio.version import TargetPlatform @@ -79,6 +83,23 @@ def generate_corpus(target: TargetPlatform | str) -> tuple[CorpusCase, ...]: ) ) + for source_entry in source_template_entries(): + if platform.version < source_entry.minimum_target: + continue + cases.append( + CorpusCase( + case_id=f"source-template-{source_entry.template_id}", + target=platform, + expected_native="valid", + expected_npm="skip" if source_entry.required_apps else "valid", + tags=("positive", "source-template", *source_entry.tags), + definition=build_source_template( + source_entry.template_id, + str(platform.version), + ).as_json_value(), + ) + ) + chain = copy.deepcopy(base) chain["dataSources"]["ds_base"] = { "type": "ds.search", diff --git a/splunk_dashboard_studio/schema.py b/splunk_dashboard_studio/schema.py index 8ca5bcf..2b2e84d 100644 --- a/splunk_dashboard_studio/schema.py +++ b/splunk_dashboard_studio/schema.py @@ -9,6 +9,8 @@ from splunk_dashboard_studio.contracts import ( DashboardArtifactBundle, SkillDescriptor, + SourceTemplateBundle, + SourceTemplateEntry, TelemetryContract, observability_skill_descriptors, ) @@ -50,6 +52,11 @@ def schema_bundle() -> dict[str, Any]: ), "dashboard": dashboard_definition_schema(), "skill_descriptor": SkillDescriptor.model_json_schema(mode="validation"), + "source_template_bundle": SourceTemplateBundle.model_json_schema( + by_alias=True, + mode="validation", + ), + "source_template_entry": SourceTemplateEntry.model_json_schema(mode="validation"), "telemetry_contract": TelemetryContract.model_json_schema(mode="validation"), }, "x-splunk-enterprise": profile_manifest(), diff --git a/splunk_dashboard_studio/source_templates.py b/splunk_dashboard_studio/source_templates.py new file mode 100644 index 0000000..530a24a --- /dev/null +++ b/splunk_dashboard_studio/source_templates.py @@ -0,0 +1,150 @@ +"""Provenance-locked dashboard templates adapted from external source repositories.""" + +from __future__ import annotations + +import hashlib +import json +from functools import cache, lru_cache +from importlib.resources import files +from pathlib import PurePosixPath +from typing import Any, Final + +from splunk_dashboard_studio.contracts import SourceTemplateBundle, SourceTemplateEntry +from splunk_dashboard_studio.models import DashboardDefinition +from splunk_dashboard_studio.validation import validate_dashboard +from splunk_dashboard_studio.version import EnterpriseVersion + +_SCHEMA_VERSION: Final = "dashboard-source-templates/v1" +_DATA_ROOT: Final = "template_data" +_MANIFEST_NAME: Final = "manifest.json" + + +class SourceTemplateError(ValueError): + """Base error for source-template lookup, integrity, or compatibility failures.""" + + +class SourceTemplateNotFound(SourceTemplateError): + pass + + +class SourceTemplateTargetUnsupported(SourceTemplateError): + pass + + +class SourceTemplateIntegrityError(SourceTemplateError): + pass + + +def _resource_text(name: str) -> str: + path = PurePosixPath(name) + if len(path.parts) != 1 or path.suffix != ".json": + raise SourceTemplateIntegrityError(f"Unsafe source-template resource name {name!r}") + return files("splunk_dashboard_studio").joinpath(_DATA_ROOT, name).read_text(encoding="utf-8") + + +@lru_cache(maxsize=1) +def _records() -> tuple[tuple[SourceTemplateEntry, str], ...]: + try: + manifest = json.loads(_resource_text(_MANIFEST_NAME)) + except (OSError, UnicodeError, json.JSONDecodeError) as error: + raise SourceTemplateIntegrityError( + f"Unable to load source-template manifest: {error}" + ) from error + if not isinstance(manifest, dict) or manifest.get("schema_version") != _SCHEMA_VERSION: + raise SourceTemplateIntegrityError( + f"Source-template manifest must use schema {_SCHEMA_VERSION!r}" + ) + raw_templates = manifest.get("templates") + if not isinstance(raw_templates, list) or not raw_templates: + raise SourceTemplateIntegrityError( + "Source-template manifest requires a non-empty templates array" + ) + + records: list[tuple[SourceTemplateEntry, str]] = [] + for raw_record in raw_templates: + if not isinstance(raw_record, dict) or set(raw_record) != {"definition_file", "entry"}: + raise SourceTemplateIntegrityError( + "Each source-template record requires only definition_file and entry" + ) + definition_file = raw_record["definition_file"] + if not isinstance(definition_file, str): + raise SourceTemplateIntegrityError("Source-template definition_file must be a string") + records.append((SourceTemplateEntry.model_validate(raw_record["entry"]), definition_file)) + identifiers = [entry.template_id for entry, _ in records] + if len(identifiers) != len(set(identifiers)): + raise SourceTemplateIntegrityError("Source-template IDs must be unique") + return tuple(records) + + +def source_template_entries() -> tuple[SourceTemplateEntry, ...]: + """Return immutable provenance and compatibility records for imported templates.""" + + return tuple(entry for entry, _ in _records()) + + +def _record(template_id: str) -> tuple[SourceTemplateEntry, str]: + try: + return next(record for record in _records() if record[0].template_id == template_id) + except StopIteration as error: + available = ", ".join(entry.template_id for entry, _ in _records()) + raise SourceTemplateNotFound( + f"Unknown source template {template_id!r}; available templates: {available}" + ) from error + + +def _source_hash(payload: Any) -> str: + encoded = json.dumps( + payload, + ensure_ascii=False, + separators=(",", ":"), + sort_keys=True, + ).encode("utf-8") + return hashlib.sha256(encoded).hexdigest() + + +@cache +def _definition(template_id: str) -> DashboardDefinition: + entry, definition_file = _record(template_id) + try: + payload = json.loads(_resource_text(definition_file)) + except (OSError, UnicodeError, json.JSONDecodeError) as error: + raise SourceTemplateIntegrityError( + f"Unable to load definition for {template_id!r}: {error}" + ) from error + actual_hash = _source_hash(payload) + expected_hash = entry.origin.definition_sha256 + if actual_hash != expected_hash: + raise SourceTemplateIntegrityError( + f"Source template {template_id!r} hash {actual_hash} does not match {expected_hash}" + ) + return DashboardDefinition.model_validate(payload) + + +def build_source_template(template_id: str, target: str) -> DashboardDefinition: + """Load one source-derived template after enforcing its target and native contracts.""" + + entry, _ = _record(template_id) + platform = EnterpriseVersion.parse(target) + if platform < entry.minimum_target: + raise SourceTemplateTargetUnsupported( + f"Source template {template_id!r} requires Splunk Enterprise " + f"{entry.minimum_target} or later; received {platform}" + ) + definition = _definition(template_id).model_copy(deep=True) + report = validate_dashboard(definition, target=target) + if not report.is_valid: + codes = ", ".join(sorted({issue.code for issue in report.issues})) + raise SourceTemplateTargetUnsupported( + f"Source template {template_id!r} is invalid for Splunk Enterprise {platform}: {codes}" + ) + return definition + + +def build_source_template_bundle(template_id: str, target: str) -> SourceTemplateBundle: + """Return the imported definition together with its complete provenance contract.""" + + entry, _ = _record(template_id) + return SourceTemplateBundle( + template=entry, + definition=build_source_template(template_id, target), + ) diff --git a/splunk_dashboard_studio/template_data/NOTICE.md b/splunk_dashboard_studio/template_data/NOTICE.md new file mode 100644 index 0000000..e4f325e --- /dev/null +++ b/splunk_dashboard_studio/template_data/NOTICE.md @@ -0,0 +1,6 @@ +The `rcastley_splunk_health.json` definition is adapted from +rcastley/splunk-custom-visualizations at revision +7424755c461712022367c3fa081fd7e0edc91001, by Robert Castley and contributors. + +Source: https://github.com/rcastley/splunk-custom-visualizations +License: Apache-2.0 diff --git a/splunk_dashboard_studio/template_data/manifest.json b/splunk_dashboard_studio/template_data/manifest.json new file mode 100644 index 0000000..4fd77ac --- /dev/null +++ b/splunk_dashboard_studio/template_data/manifest.json @@ -0,0 +1,153 @@ +{ + "schema_version": "dashboard-source-templates/v1", + "templates": [ + { + "definition_file": "rcastley_splunk_health.json", + "entry": { + "adaptations": [ + "The Python API normalizes the imported JSON through the stable DashboardDefinition model without changing the source-owned searches, panel types, options, or layout.", + "The live regression harness replaces only query strings in a disposable test copy, deriving rows from the upstream harness.json contracts.", + "The required splunk_health custom-visualization app is copied only into the disposable integration fixture and is never included in Python distributions." + ], + "description": "Eight-panel, glass-themed Splunk platform health dashboard using the upstream splunk_health custom visualization app.", + "lessons": [ + { + "enforcement": [ + "Pin the source repository revision and normalized definition SHA-256.", + "Reject runtime loading when packaged source content drifts from its lock." + ], + "lesson_id": "provenance_locked_import", + "summary": "Treat external templates as immutable source inputs with exact readback evidence." + }, + { + "enforcement": [ + "Generate fixture rows from the eight upstream harness.json files.", + "Keep original SPL validation separate from disposable render-query substitution." + ], + "lesson_id": "manifest_driven_render_contracts", + "summary": "Use visualization-owned field, formatter, no-data, size, and sample-row contracts for QA." + }, + { + "enforcement": [ + "Require Splunk Enterprise 10.2 or later for app-qualified custom visualization types.", + "Install the custom app only in eligible disposable live-test targets." + ], + "lesson_id": "explicit_custom_viz_boundary", + "summary": "Custom visualization templates require both a product-version contract and an installed app contract." + }, + { + "enforcement": [ + "Assert each custom panel exposes a visible non-zero canvas within its panel boundary.", + "Capture full-dashboard and per-panel screenshots with animations disabled." + ], + "lesson_id": "canvas_render_invariants", + "summary": "Visual QA must cover canvas visibility, sizing, no-data behavior, themes, and screenshot drift." + } + ], + "minimum_target": "10.2.0", + "origin": { + "attribution": "Splunk Custom Visualizations by Robert Castley, adapted under Apache-2.0.", + "definition_sha256": "0371e79ed06eb10ee6298d6e54f32d5a99b744e44d812400845ad141de72febd", + "license": "Apache-2.0", + "repository": "https://github.com/rcastley/splunk-custom-visualizations", + "revision": "7424755c461712022367c3fa081fd7e0edc91001", + "source_paths": [ + "splunk_health/default/data/ui/views/splunk_health.xml", + "splunk_health/appserver/static/visualizations/", + "examples/splunk_status_board/appserver/static/visualizations/splunk_status_board/harness.json", + "examples/license_gauge/appserver/static/visualizations/license_gauge/harness.json", + "examples/resource_gauge/appserver/static/visualizations/resource_gauge/harness.json", + "examples/indexing_pipeline_flow/appserver/static/visualizations/indexing_pipeline_flow/harness.json", + "examples/forwarder_heatmap/appserver/static/visualizations/forwarder_heatmap/harness.json", + "examples/search_activity/appserver/static/visualizations/search_activity/harness.json", + "examples/scheduler_health/appserver/static/visualizations/scheduler_health/harness.json", + "examples/index_storage/appserver/static/visualizations/index_storage/harness.json" + ] + }, + "required_apps": [ + { + "app_id": "splunk_health", + "install_scope": "operator_or_integration", + "repository": "https://github.com/rcastley/splunk-custom-visualizations", + "revision": "7424755c461712022367c3fa081fd7e0edc91001" + } + ], + "tags": [ + "source-derived", + "splunk-health", + "custom-visualization", + "canvas" + ], + "template_id": "rcastley_splunk_health", + "title": "Splunk Health" + } + }, + { + "definition_file": "rcastley_splunk_health_portable.json", + "entry": { + "adaptations": [ + "The eight source-owned SPL searches, data-source refresh settings, panel titles, and 1920 by 1080 layout are preserved.", + "Seven app-qualified Canvas panels are replaced with splunk.table and the license gauge is replaced with splunk.singlevalue.", + "All custom visualization options are removed so the definition has no splunk_health app dependency.", + "The live regression harness continues to derive deterministic rows from the pinned upstream harness.json contracts." + ], + "description": "App-free Splunk 9-compatible port of the eight-panel Splunk platform health dashboard using built-in Dashboard Studio visualizations.", + "lessons": [ + { + "enforcement": [ + "Pin the source repository revision and normalized adapted-definition SHA-256.", + "Regenerate the port deterministically from the pinned upstream definition." + ], + "lesson_id": "provenance_locked_port", + "summary": "Compatibility adaptations remain reproducible source transformations rather than hand-maintained forks." + }, + { + "enforcement": [ + "Use only splunk.table and splunk.singlevalue panel types.", + "Declare no required Splunk app and validate on the pinned 9.4.3 target." + ], + "lesson_id": "builtin_compatibility_fallback", + "summary": "Preserve operational questions and SPL when custom rendering is unavailable." + }, + { + "enforcement": [ + "Generate fixture rows from the eight upstream harness.json files.", + "Keep original SPL validation separate from disposable render-query substitution." + ], + "lesson_id": "manifest_driven_render_contracts", + "summary": "The portable and custom variants share the same source-owned data contracts." + } + ], + "minimum_target": "9.4.3", + "origin": { + "attribution": "Splunk Custom Visualizations by Robert Castley, compatibility port adapted under Apache-2.0.", + "definition_sha256": "738c77fb0938575037a39552e3c86742167b5abe5272f7a5a814bbedbb80fdf9", + "license": "Apache-2.0", + "repository": "https://github.com/rcastley/splunk-custom-visualizations", + "revision": "7424755c461712022367c3fa081fd7e0edc91001", + "source_paths": [ + "splunk_health/default/data/ui/views/splunk_health.xml", + "examples/splunk_status_board/appserver/static/visualizations/splunk_status_board/harness.json", + "examples/license_gauge/appserver/static/visualizations/license_gauge/harness.json", + "examples/resource_gauge/appserver/static/visualizations/resource_gauge/harness.json", + "examples/indexing_pipeline_flow/appserver/static/visualizations/indexing_pipeline_flow/harness.json", + "examples/forwarder_heatmap/appserver/static/visualizations/forwarder_heatmap/harness.json", + "examples/search_activity/appserver/static/visualizations/search_activity/harness.json", + "examples/scheduler_health/appserver/static/visualizations/scheduler_health/harness.json", + "examples/index_storage/appserver/static/visualizations/index_storage/harness.json" + ] + }, + "required_apps": [], + "tags": [ + "source-derived", + "splunk-health", + "portable", + "splunk-9", + "built-in-visualizations" + ], + "template_id": "rcastley_splunk_health_portable", + "title": "Splunk Health (Portable)" + } + } + ] +} diff --git a/splunk_dashboard_studio/template_data/rcastley_splunk_health.json b/splunk_dashboard_studio/template_data/rcastley_splunk_health.json new file mode 100644 index 0000000..ae72de9 --- /dev/null +++ b/splunk_dashboard_studio/template_data/rcastley_splunk_health.json @@ -0,0 +1,310 @@ +{ + "dataSources": { + "ds_forwarder_heatmap": { + "name": "Forwarder Health", + "options": { + "query": "index=_internal sourcetype=splunkd group=tcpin_connections | stats max(_time) as last_seen, avg(tcp_KBps) as avg_kbps, avg(tcp_eps) as eps by hostname | eval mins_ago=round((now()-last_seen)/60,1) | eval eps=round(eps,1) | rename hostname as host | table host mins_ago eps | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting forwarder data\", host=\"\", mins_ago=0, eps=0]", + "queryParameters": { + "earliest": "-5m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_index_storage": { + "name": "Index Storage", + "options": { + "query": "| dbinspect index=* | eval temp=case(state==\"hot\",\"hot\", state==\"warm\",\"warm\", state==\"cold\",\"cold\", 1=1,\"other\") | stats sum(sizeOnDiskMB) as sizeMB by index, temp | eval sizeGB=round(sizeMB/1024,2) | chart sum(sizeGB) as sizeGB by index, temp | rename index as title | eval hotGB=coalesce(hot,0), warmGB=coalesce(warm,0), coldGB=coalesce(cold,0) | eval sizeGB=hotGB+warmGB+coldGB | where sizeGB>0 | join type=outer title [| rest /services/data/indexes | eval maxGB=round(maxTotalDataSizeMB/1024,2) | table title maxGB] | table title sizeGB maxGB hotGB warmGB coldGB | sort -sizeGB | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting index data\", title=\"\", sizeGB=0, maxGB=0, hotGB=0, warmGB=0, coldGB=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_indexing_pipeline": { + "name": "Indexing Pipeline", + "options": { + "query": "index=_internal group=queue name IN (parsingqueue, mergingqueue, typingqueue, indexqueue) | stats avg(current_size_kb) as avg_size, avg(max_size_kb) as capacity by name | eval fill_pct=if(capacity>0, round((avg_size/capacity)*100, 1), 0) | table name fill_pct avg_size capacity | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting pipeline data\", name=\"parsingqueue\", fill_pct=0, avg_size=0, capacity=0]", + "queryParameters": { + "earliest": "-5m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_license_gauge": { + "name": "License Usage", + "options": { + "query": "| rest /services/licenser/pools | eval used_gb=round(used_bytes/1024/1024/1024,2) | eval quota_gb=round(effective_quota/1024/1024/1024,2) | stats sum(used_gb) as used_gb, max(quota_gb) as quota_gb | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting license data\", used_gb=0, quota_gb=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_resource_gauge": { + "name": "System Resources", + "options": { + "query": "index=_introspection sourcetype=splunk_resource_usage component=hostwide | stats latest(data.cpu_user_pct) as cpu_user, latest(data.cpu_system_pct) as cpu_sys, latest(data.mem_used) as mem_used, latest(data.mem) as mem_total, latest(data.swap_used) as swap_used, latest(data.swap) as swap_total by host | eval cpu_pct=round(cpu_user+cpu_sys, 1) | eval mem_pct=if(mem_total>0, round((mem_used/mem_total)*100, 1), 0) | eval disk_pct=if(swap_total>0, round((swap_used/swap_total)*100, 1), 0) | head 1 | table cpu_pct mem_pct disk_pct | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting resource data\", cpu_pct=0, mem_pct=0, disk_pct=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_scheduler_health": { + "name": "Scheduler Health", + "options": { + "query": "index=_internal sourcetype=scheduler status=* | stats count as total, count(eval(status=\"skipped\")) as skipped, count(eval(status=\"success\")) as success, avg(run_time) as avg_runtime | eval skip_pct=if(total>0, round((skipped/total)*100,1), 0) | eval success_pct=if(total>0, round((success/total)*100,1), 0) | eval avg_runtime=round(avg_runtime,2) | table skip_pct success_pct avg_runtime total skipped | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting scheduler data\", skip_pct=0, success_pct=0, avg_runtime=0, total=0, skipped=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_search_activity": { + "name": "Search Activity", + "options": { + "query": "| rest /services/server/status/resource-usage/splunk-processes | search search_props.sid=* | eval type=case(search_props.mode==\"historical\",\"scheduled\", search_props.mode==\"historical_fast\",\"scheduled\", search_props.provenance==\"UI:Search\",\"ad-hoc\", 1=1,\"other\") | stats count by type | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting search data\", type=\"\", count=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_status_board": { + "name": "Component Status", + "options": { + "query": "index=_internal sourcetype=splunkd component=* log_level=* | stats count(eval(log_level=\"ERROR\")) as errors, count(eval(log_level=\"WARN\")) as warns by component | eval status=if(errors>0, \"critical\", if(warns>0, \"warning\", \"ok\")) | eval health_score=case(status=\"critical\", 90, status=\"warning\", 60, 1=1, 10) | sort - errors - warns | head 20 | table component status errors warns health_score | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting component data\", component=\"\", status=\"ok\", errors=0, warns=0, health_score=0]", + "queryParameters": { + "earliest": "-15m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + } + }, + "defaults": { + "dataSources": { + "ds.o11y": { + "options": { + "queryParameters": { + "earliest": "$global_time.earliest$", + "latest": "$global_time.latest$" + } + } + } + } + }, + "description": "", + "inputs": {}, + "layout": { + "layoutDefinitions": { + "layout_1": { + "options": { + "display": "auto-scale", + "height": 1080, + "width": 1920 + }, + "structure": [ + { + "item": "viz_status_board", + "position": { + "h": 400, + "w": 1030, + "x": 10, + "y": 10 + }, + "type": "block" + }, + { + "item": "viz_license_gauge", + "position": { + "h": 350, + "w": 560, + "x": 10, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_resource_gauge", + "position": { + "h": 350, + "w": 460, + "x": 580, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_indexing_pipeline", + "position": { + "h": 400, + "w": 860, + "x": 1050, + "y": 10 + }, + "type": "block" + }, + { + "item": "viz_forwarder_heatmap", + "position": { + "h": 290, + "w": 810, + "x": 10, + "y": 780 + }, + "type": "block" + }, + { + "item": "viz_search_activity", + "position": { + "h": 350, + "w": 400, + "x": 1050, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_scheduler_health", + "position": { + "h": 350, + "w": 450, + "x": 1460, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_index_storage", + "position": { + "h": 290, + "w": 1080, + "x": 830, + "y": 780 + }, + "type": "block" + } + ], + "type": "absolute" + } + }, + "options": { + "showTitleAndDescription": false + }, + "tabs": { + "items": [ + { + "label": "New tab", + "layoutId": "layout_1" + } + ] + } + }, + "title": "Splunk Health", + "visualizations": { + "viz_forwarder_heatmap": { + "dataSources": { + "primary": "ds_forwarder_heatmap" + }, + "options": { + "splunk_health.forwarder_heatmap.colorTheme": "neon" + }, + "title": "Forwarder Health", + "type": "splunk_health.forwarder_heatmap" + }, + "viz_index_storage": { + "dataSources": { + "primary": "ds_index_storage" + }, + "options": { + "splunk_health.index_storage.colorTheme": "neon" + }, + "title": "Index Storage", + "type": "splunk_health.index_storage" + }, + "viz_indexing_pipeline": { + "dataSources": { + "primary": "ds_indexing_pipeline" + }, + "options": { + "splunk_health.indexing_pipeline_flow.colorTheme": "neon" + }, + "title": "Indexing Pipeline", + "type": "splunk_health.indexing_pipeline_flow" + }, + "viz_license_gauge": { + "dataSources": { + "primary": "ds_license_gauge" + }, + "options": { + "splunk_health.license_gauge.colorTheme": "neon" + }, + "title": "License Usage", + "type": "splunk_health.license_gauge" + }, + "viz_resource_gauge": { + "dataSources": { + "primary": "ds_resource_gauge" + }, + "options": { + "splunk_health.resource_gauge.colorTheme": "neon" + }, + "title": "System Resources", + "type": "splunk_health.resource_gauge" + }, + "viz_scheduler_health": { + "dataSources": { + "primary": "ds_scheduler_health" + }, + "options": { + "splunk_health.scheduler_health.colorTheme": "neon" + }, + "title": "Scheduler Health", + "type": "splunk_health.scheduler_health" + }, + "viz_search_activity": { + "dataSources": { + "primary": "ds_search_activity" + }, + "options": { + "splunk_health.search_activity.colorTheme": "neon" + }, + "title": "Search Activity", + "type": "splunk_health.search_activity" + }, + "viz_status_board": { + "dataSources": { + "primary": "ds_status_board" + }, + "options": { + "splunk_health.splunk_status_board.colorTheme": "neon" + }, + "title": "Component Status", + "type": "splunk_health.splunk_status_board" + } + } +} diff --git a/splunk_dashboard_studio/template_data/rcastley_splunk_health_portable.json b/splunk_dashboard_studio/template_data/rcastley_splunk_health_portable.json new file mode 100644 index 0000000..88724cc --- /dev/null +++ b/splunk_dashboard_studio/template_data/rcastley_splunk_health_portable.json @@ -0,0 +1,294 @@ +{ + "dataSources": { + "ds_forwarder_heatmap": { + "name": "Forwarder Health", + "options": { + "query": "index=_internal sourcetype=splunkd group=tcpin_connections | stats max(_time) as last_seen, avg(tcp_KBps) as avg_kbps, avg(tcp_eps) as eps by hostname | eval mins_ago=round((now()-last_seen)/60,1) | eval eps=round(eps,1) | rename hostname as host | table host mins_ago eps | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting forwarder data\", host=\"\", mins_ago=0, eps=0]", + "queryParameters": { + "earliest": "-5m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_index_storage": { + "name": "Index Storage", + "options": { + "query": "| dbinspect index=* | eval temp=case(state==\"hot\",\"hot\", state==\"warm\",\"warm\", state==\"cold\",\"cold\", 1=1,\"other\") | stats sum(sizeOnDiskMB) as sizeMB by index, temp | eval sizeGB=round(sizeMB/1024,2) | chart sum(sizeGB) as sizeGB by index, temp | rename index as title | eval hotGB=coalesce(hot,0), warmGB=coalesce(warm,0), coldGB=coalesce(cold,0) | eval sizeGB=hotGB+warmGB+coldGB | where sizeGB>0 | join type=outer title [| rest /services/data/indexes | eval maxGB=round(maxTotalDataSizeMB/1024,2) | table title maxGB] | table title sizeGB maxGB hotGB warmGB coldGB | sort -sizeGB | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting index data\", title=\"\", sizeGB=0, maxGB=0, hotGB=0, warmGB=0, coldGB=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_indexing_pipeline": { + "name": "Indexing Pipeline", + "options": { + "query": "index=_internal group=queue name IN (parsingqueue, mergingqueue, typingqueue, indexqueue) | stats avg(current_size_kb) as avg_size, avg(max_size_kb) as capacity by name | eval fill_pct=if(capacity>0, round((avg_size/capacity)*100, 1), 0) | table name fill_pct avg_size capacity | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting pipeline data\", name=\"parsingqueue\", fill_pct=0, avg_size=0, capacity=0]", + "queryParameters": { + "earliest": "-5m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_license_gauge": { + "name": "License Usage", + "options": { + "query": "| rest /services/licenser/pools | eval used_gb=round(used_bytes/1024/1024/1024,2) | eval quota_gb=round(effective_quota/1024/1024/1024,2) | stats sum(used_gb) as used_gb, max(quota_gb) as quota_gb | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting license data\", used_gb=0, quota_gb=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_resource_gauge": { + "name": "System Resources", + "options": { + "query": "index=_introspection sourcetype=splunk_resource_usage component=hostwide | stats latest(data.cpu_user_pct) as cpu_user, latest(data.cpu_system_pct) as cpu_sys, latest(data.mem_used) as mem_used, latest(data.mem) as mem_total, latest(data.swap_used) as swap_used, latest(data.swap) as swap_total by host | eval cpu_pct=round(cpu_user+cpu_sys, 1) | eval mem_pct=if(mem_total>0, round((mem_used/mem_total)*100, 1), 0) | eval disk_pct=if(swap_total>0, round((swap_used/swap_total)*100, 1), 0) | head 1 | table cpu_pct mem_pct disk_pct | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting resource data\", cpu_pct=0, mem_pct=0, disk_pct=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_scheduler_health": { + "name": "Scheduler Health", + "options": { + "query": "index=_internal sourcetype=scheduler status=* | stats count as total, count(eval(status=\"skipped\")) as skipped, count(eval(status=\"success\")) as success, avg(run_time) as avg_runtime | eval skip_pct=if(total>0, round((skipped/total)*100,1), 0) | eval success_pct=if(total>0, round((success/total)*100,1), 0) | eval avg_runtime=round(avg_runtime,2) | table skip_pct success_pct avg_runtime total skipped | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting scheduler data\", skip_pct=0, success_pct=0, avg_runtime=0, total=0, skipped=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_search_activity": { + "name": "Search Activity", + "options": { + "query": "| rest /services/server/status/resource-usage/splunk-processes | search search_props.sid=* | eval type=case(search_props.mode==\"historical\",\"scheduled\", search_props.mode==\"historical_fast\",\"scheduled\", search_props.provenance==\"UI:Search\",\"ad-hoc\", 1=1,\"other\") | stats count by type | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting search data\", type=\"\", count=0]", + "queryParameters": { + "earliest": "-1m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + }, + "ds_status_board": { + "name": "Component Status", + "options": { + "query": "index=_internal sourcetype=splunkd component=* log_level=* | stats count(eval(log_level=\"ERROR\")) as errors, count(eval(log_level=\"WARN\")) as warns by component | eval status=if(errors>0, \"critical\", if(warns>0, \"warning\", \"ok\")) | eval health_score=case(status=\"critical\", 90, status=\"warning\", 60, 1=1, 10) | sort - errors - warns | head 20 | table component status errors warns health_score | appendpipe [| stats count | where count=0 | eval _status=\"Awaiting component data\", component=\"\", status=\"ok\", errors=0, warns=0, health_score=0]", + "queryParameters": { + "earliest": "-15m", + "latest": "now" + }, + "refresh": "60s", + "refreshType": "delay" + }, + "type": "ds.search" + } + }, + "defaults": { + "dataSources": { + "ds.o11y": { + "options": { + "queryParameters": { + "earliest": "$global_time.earliest$", + "latest": "$global_time.latest$" + } + } + } + } + }, + "description": "App-free built-in visualization port for Splunk Enterprise 9.4 and later.", + "inputs": {}, + "layout": { + "layoutDefinitions": { + "layout_1": { + "options": { + "display": "auto-scale", + "height": 1080, + "width": 1920 + }, + "structure": [ + { + "item": "viz_status_board", + "position": { + "h": 400, + "w": 1030, + "x": 10, + "y": 10 + }, + "type": "block" + }, + { + "item": "viz_license_gauge", + "position": { + "h": 350, + "w": 560, + "x": 10, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_resource_gauge", + "position": { + "h": 350, + "w": 460, + "x": 580, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_indexing_pipeline", + "position": { + "h": 400, + "w": 860, + "x": 1050, + "y": 10 + }, + "type": "block" + }, + { + "item": "viz_forwarder_heatmap", + "position": { + "h": 290, + "w": 810, + "x": 10, + "y": 780 + }, + "type": "block" + }, + { + "item": "viz_search_activity", + "position": { + "h": 350, + "w": 400, + "x": 1050, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_scheduler_health", + "position": { + "h": 350, + "w": 450, + "x": 1460, + "y": 420 + }, + "type": "block" + }, + { + "item": "viz_index_storage", + "position": { + "h": 290, + "w": 1080, + "x": 830, + "y": 780 + }, + "type": "block" + } + ], + "type": "absolute" + } + }, + "options": { + "showTitleAndDescription": false + }, + "tabs": { + "items": [ + { + "label": "New tab", + "layoutId": "layout_1" + } + ] + } + }, + "title": "Splunk Health (Portable)", + "visualizations": { + "viz_forwarder_heatmap": { + "dataSources": { + "primary": "ds_forwarder_heatmap" + }, + "options": {}, + "title": "Forwarder Health", + "type": "splunk.table" + }, + "viz_index_storage": { + "dataSources": { + "primary": "ds_index_storage" + }, + "options": {}, + "title": "Index Storage", + "type": "splunk.table" + }, + "viz_indexing_pipeline": { + "dataSources": { + "primary": "ds_indexing_pipeline" + }, + "options": {}, + "title": "Indexing Pipeline", + "type": "splunk.table" + }, + "viz_license_gauge": { + "dataSources": { + "primary": "ds_license_gauge" + }, + "options": {}, + "title": "License Usage", + "type": "splunk.singlevalue" + }, + "viz_resource_gauge": { + "dataSources": { + "primary": "ds_resource_gauge" + }, + "options": {}, + "title": "System Resources", + "type": "splunk.table" + }, + "viz_scheduler_health": { + "dataSources": { + "primary": "ds_scheduler_health" + }, + "options": {}, + "title": "Scheduler Health", + "type": "splunk.table" + }, + "viz_search_activity": { + "dataSources": { + "primary": "ds_search_activity" + }, + "options": {}, + "title": "Search Activity", + "type": "splunk.table" + }, + "viz_status_board": { + "dataSources": { + "primary": "ds_status_board" + }, + "options": {}, + "title": "Component Status", + "type": "splunk.table" + } + } +} diff --git a/splunk_dashboard_studio/validation.py b/splunk_dashboard_studio/validation.py index 238bf68..d63d333 100644 --- a/splunk_dashboard_studio/validation.py +++ b/splunk_dashboard_studio/validation.py @@ -92,7 +92,9 @@ def _detected_features(definition: DashboardDefinition) -> set[Feature]: features.add(Feature.CHART_TRELLIS) if visualization_type in {"splunk.timeline", "viz.timeline"}: features.add(Feature.TIMELINE) - if visualization_type.startswith("viz.") and visualization_type != "viz.timeline": + if "." in visualization_type and not ( + visualization_type.startswith("splunk.") or visualization_type == "viz.timeline" + ): features.add(Feature.CUSTOM_VISUALIZATIONS) if visualization_type in { "splunk.networkGraph", diff --git a/tests/test_catalog.py b/tests/test_catalog.py index 5f5a416..3a0d62c 100644 --- a/tests/test_catalog.py +++ b/tests/test_catalog.py @@ -113,6 +113,12 @@ def test_catalog_bundle_hashes_the_canonical_definition() -> None: assert bundle.manifest.saved_searches[0].ownership == "external" +def test_service_map_provenance_includes_link_and_node_sources() -> None: + bundle = build_catalog_bundle("microservice_service_map", "10.4.0") + panel = next(item for item in bundle.manifest.panels if item.panel_id == "viz_dependency_map") + assert panel.data_source_ids == ("ds_dependency_map", "ds_dependency_map_nodes") + + def test_catalog_cli_lists_and_builds_artifacts( capsys: pytest.CaptureFixture[str], tmp_path: Path, diff --git a/tests/test_dashboard_samples.py b/tests/test_dashboard_samples.py new file mode 100644 index 0000000..a523101 --- /dev/null +++ b/tests/test_dashboard_samples.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +import json +import struct + +from scripts.sync_dashboard_samples import MANIFEST_PATH, OUTPUT, SAMPLES, sync + + +def test_dashboard_samples_are_exact_reviewed_baseline_copies() -> None: + assert sync(write=False) == [] + manifest = json.loads(MANIFEST_PATH.read_text(encoding="utf-8")) + assert manifest["schema_version"] == "dashboard-sample-gallery/v1" + assert len(manifest["samples"]) == len(SAMPLES) == 5 + assert {record["target"] for record in manifest["samples"]} == { + "9.4.3", + "10.2.0", + "10.4.0", + } + for sample in SAMPLES: + image = (OUTPUT / sample["output"]).read_bytes() + assert image.startswith(b"\x89PNG\r\n\x1a\n") + assert struct.unpack(">II", image[16:24]) == (1440, 1100) diff --git a/tests/test_distribution_guard.py b/tests/test_distribution_guard.py index 06d4543..19ee8fa 100644 --- a/tests/test_distribution_guard.py +++ b/tests/test_distribution_guard.py @@ -40,10 +40,19 @@ def test_distribution_guard_rejects_node_assets_in_wheel_and_sdist(tmp_path: Pat sdist = tmp_path / "bad.tar.gz" with tarfile.open(sdist, "w:gz") as archive: data = b"" - info = tarfile.TarInfo("package/helper.cjs") - info.size = len(data) - archive.addfile(info, io.BytesIO(data)) - assert guard.prohibited_members(sdist) == ["package/helper.cjs"] + for name in ( + "package/helper.cjs", + "package/integration/splunk-visual/package-lock.json", + "package/integration/splunk-visual/tests/render.spec.ts", + ): + info = tarfile.TarInfo(name) + info.size = len(data) + archive.addfile(info, io.BytesIO(data)) + assert guard.prohibited_members(sdist) == [ + "package/helper.cjs", + "package/integration/splunk-visual/package-lock.json", + "package/integration/splunk-visual/tests/render.spec.ts", + ] def test_distribution_guard_rejects_unknown_archive_type(tmp_path: Path) -> None: diff --git a/tests/test_release_evidence.py b/tests/test_release_evidence.py index 143c6ec..366051a 100644 --- a/tests/test_release_evidence.py +++ b/tests/test_release_evidence.py @@ -8,29 +8,62 @@ def test_release_tag_matches_project_and_runtime_versions() -> None: - assert verify_release_tag("v0.2.0") == "0.2.0" + assert verify_release_tag("v0.2.1") == "0.2.1" with pytest.raises(ValueError, match="must equal"): - verify_release_tag("v0.2.1") + verify_release_tag("v0.2.0") def test_release_evidence_requires_both_distribution_formats(tmp_path: Path) -> None: - (tmp_path / "splunk_dashboard_studio_python-0.2.0-py3-none-any.whl").write_bytes(b"wheel") + (tmp_path / "splunk_dashboard_studio_python-0.2.1-py3-none-any.whl").write_bytes(b"wheel") with pytest.raises(ValueError, match="requires exactly one sdist"): - build_release_evidence("v0.2.0", tmp_path) + build_release_evidence("v0.2.1", tmp_path) def test_release_evidence_is_deterministic(tmp_path: Path) -> None: - (tmp_path / "splunk_dashboard_studio_python-0.2.0-py3-none-any.whl").write_bytes(b"wheel") - (tmp_path / "splunk_dashboard_studio_python-0.2.0.tar.gz").write_bytes(b"sdist") - first = build_release_evidence("v0.2.0", tmp_path) - second = build_release_evidence("v0.2.0", tmp_path) + (tmp_path / "splunk_dashboard_studio_python-0.2.1-py3-none-any.whl").write_bytes(b"wheel") + (tmp_path / "splunk_dashboard_studio_python-0.2.1.tar.gz").write_bytes(b"sdist") + first = build_release_evidence("v0.2.1", tmp_path) + second = build_release_evidence("v0.2.1", tmp_path) assert first == second assert first["schema_version"] == "release-evidence/v1" assert len(first["catalog"]) == 10 + assert first["source_templates"] == [ + { + "template_id": "rcastley_splunk_health", + "minimum_target": "10.2.0", + "repository": "https://github.com/rcastley/splunk-custom-visualizations", + "revision": "7424755c461712022367c3fa081fd7e0edc91001", + "license": "Apache-2.0", + "source_definition_sha256": ( + "0371e79ed06eb10ee6298d6e54f32d5a99b744e44d812400845ad141de72febd" + ), + "normalized_definition_sha256": first["source_templates"][0][ + "normalized_definition_sha256" + ], + "required_apps": ["splunk_health"], + }, + { + "template_id": "rcastley_splunk_health_portable", + "minimum_target": "9.4.3", + "repository": "https://github.com/rcastley/splunk-custom-visualizations", + "revision": "7424755c461712022367c3fa081fd7e0edc91001", + "license": "Apache-2.0", + "source_definition_sha256": ( + "738c77fb0938575037a39552e3c86742167b5abe5272f7a5a814bbedbb80fdf9" + ), + "normalized_definition_sha256": first["source_templates"][1][ + "normalized_definition_sha256" + ], + "required_apps": [], + }, + ] + assert first["verification"]["live_splunk_roundtrip"] == ( + "validated by the release visual matrix, including pinned source templates" + ) def test_release_evidence_rejects_stale_artifact_versions(tmp_path: Path) -> None: (tmp_path / "splunk_dashboard_studio_python-0.1.0-py3-none-any.whl").write_bytes(b"wheel") (tmp_path / "splunk_dashboard_studio_python-0.1.0.tar.gz").write_bytes(b"sdist") with pytest.raises(ValueError, match="does not match release"): - build_release_evidence("v0.2.0", tmp_path) + build_release_evidence("v0.2.1", tmp_path) diff --git a/tests/test_schema_corpus_cli.py b/tests/test_schema_corpus_cli.py index db293f0..b874bca 100644 --- a/tests/test_schema_corpus_cli.py +++ b/tests/test_schema_corpus_cli.py @@ -32,6 +32,8 @@ def test_agent_schema_contains_aliases_and_capability_extension() -> None: "artifact_bundle", "dashboard", "skill_descriptor", + "source_template_bundle", + "source_template_entry", "telemetry_contract", } @@ -55,7 +57,7 @@ def test_corpus_is_deterministic_and_writable(tmp_path: Path) -> None: assert first == second assert first.endswith("\n") cases = [json.loads(line) for line in first.splitlines()] - assert len(cases) == 17 + assert len(cases) == 19 assert {case["case_id"] for case in cases} == { case.case_id for case in generate_corpus("10.2.0") } @@ -81,7 +83,7 @@ def test_cli_schema_profiles_and_corpus(capsys: pytest.CaptureFixture[str], tmp_ output = tmp_path / "generated.jsonl" assert main(["corpus", "--target", "9.4.3", "--output", str(output)]) == 0 - assert len(output.read_text(encoding="utf-8").splitlines()) == 17 + assert len(output.read_text(encoding="utf-8").splitlines()) == 18 def test_cli_validate_optimize_and_error( diff --git a/tests/test_source_templates.py b/tests/test_source_templates.py new file mode 100644 index 0000000..91dc2c4 --- /dev/null +++ b/tests/test_source_templates.py @@ -0,0 +1,168 @@ +from __future__ import annotations + +import json +from pathlib import Path + +import pytest + +from splunk_dashboard_studio import ( + SourceTemplateNotFound, + SourceTemplateTargetUnsupported, + build_source_template, + build_source_template_bundle, + canonical_json, + source_template_entries, +) +from splunk_dashboard_studio.cli import main +from splunk_dashboard_studio.validation import validate_dashboard + + +def test_source_template_registry_preserves_upstream_provenance() -> None: + entries = source_template_entries() + assert len(entries) == 2 + by_id = {entry.template_id: entry for entry in entries} + entry = by_id["rcastley_splunk_health"] + assert entry.template_id == "rcastley_splunk_health" + assert str(entry.minimum_target) == "10.2.0" + assert entry.origin.repository == "https://github.com/rcastley/splunk-custom-visualizations" + assert entry.origin.revision == "7424755c461712022367c3fa081fd7e0edc91001" + assert entry.origin.license == "Apache-2.0" + assert entry.origin.definition_sha256 == ( + "0371e79ed06eb10ee6298d6e54f32d5a99b744e44d812400845ad141de72febd" + ) + assert entry.required_apps[0].app_id == "splunk_health" + assert {lesson.lesson_id for lesson in entry.lessons} == { + "canvas_render_invariants", + "explicit_custom_viz_boundary", + "manifest_driven_render_contracts", + "provenance_locked_import", + } + portable = by_id["rcastley_splunk_health_portable"] + assert str(portable.minimum_target) == "9.4.3" + assert portable.required_apps == () + assert portable.origin.repository == entry.origin.repository + assert portable.origin.revision == entry.origin.revision + assert portable.origin.definition_sha256 == ( + "738c77fb0938575037a39552e3c86742167b5abe5272f7a5a814bbedbb80fdf9" + ) + + +@pytest.mark.parametrize("target", ["10.2.0", "10.4.0"]) +def test_source_template_build_is_deterministic_and_natively_valid(target: str) -> None: + first = build_source_template("rcastley_splunk_health", target) + second = build_source_template("rcastley_splunk_health", target) + assert canonical_json(first) == canonical_json(second) + assert first is not second + assert first.title == "Splunk Health" + assert len(first.visualizations) == len(first.data_sources) == 8 + assert {visualization.type for visualization in first.visualizations.values()} == { + "splunk_health.forwarder_heatmap", + "splunk_health.index_storage", + "splunk_health.indexing_pipeline_flow", + "splunk_health.license_gauge", + "splunk_health.resource_gauge", + "splunk_health.scheduler_health", + "splunk_health.search_activity", + "splunk_health.splunk_status_board", + } + layout = first.layout.layout_definitions["layout_1"] # type: ignore[index] + assert layout.options == {"display": "auto-scale", "height": 1080, "width": 1920} + assert validate_dashboard(first, target=target).is_valid + + +def test_source_template_build_rejects_unknown_and_pre_10_2_targets() -> None: + with pytest.raises(SourceTemplateNotFound, match="available templates"): + build_source_template("missing", "10.4.0") + with pytest.raises( + SourceTemplateTargetUnsupported, + match=r"requires Splunk Enterprise 10\.2\.0", + ): + build_source_template("rcastley_splunk_health", "10.0.0") + + +@pytest.mark.parametrize("target", ["9.4.3", "10.0.0", "10.2.0", "10.4.0"]) +def test_portable_source_template_uses_only_app_free_builtins(target: str) -> None: + definition = build_source_template("rcastley_splunk_health_portable", target) + assert definition.title == "Splunk Health (Portable)" + assert len(definition.visualizations) == len(definition.data_sources) == 8 + types = {visualization.type for visualization in definition.visualizations.values()} + assert types == {"splunk.singlevalue", "splunk.table"} + assert all(not visualization.options for visualization in definition.visualizations.values()) + assert validate_dashboard(definition, target=target).is_valid + + source = build_source_template("rcastley_splunk_health", "10.2.0") + assert { + source.data_sources[source_id].options["query"] for source_id in source.data_sources + } == { + definition.data_sources[source_id].options["query"] for source_id in definition.data_sources + } + + +def test_source_template_bundle_keeps_definition_and_origin_together() -> None: + bundle = build_source_template_bundle("rcastley_splunk_health", "10.2.0") + assert bundle.template.template_id == "rcastley_splunk_health" + assert bundle.definition.title == bundle.template.title + + +def test_source_template_cli_lists_and_builds_machine_readable_artifacts( + capsys: pytest.CaptureFixture[str], + tmp_path: Path, +) -> None: + assert main(["template", "list"]) == 0 + listing = json.loads(capsys.readouterr().out) + assert listing["schema_version"] == "dashboard-source-templates/v1" + assert listing["entries"][0]["origin"]["license"] == "Apache-2.0" + + output = tmp_path / "splunk-health.json" + assert ( + main( + [ + "template", + "build", + "rcastley_splunk_health", + "--target", + "10.2.0", + "--artifact", + "bundle", + "--output", + str(output), + ] + ) + == 0 + ) + artifact = json.loads(output.read_text(encoding="utf-8")) + assert artifact["definition"]["title"] == "Splunk Health" + assert artifact["template"]["origin"]["revision"].startswith("7424755c") + + portable_output = tmp_path / "splunk-health-portable.json" + assert ( + main( + [ + "template", + "build", + "rcastley_splunk_health_portable", + "--target", + "9.4.3", + "--output", + str(portable_output), + ] + ) + == 0 + ) + assert json.loads(portable_output.read_text(encoding="utf-8"))["title"] == ( + "Splunk Health (Portable)" + ) + + assert ( + main( + [ + "template", + "build", + "rcastley_splunk_health", + "--target", + "10.0.0", + ] + ) + == 2 + ) + assert json.loads(capsys.readouterr().out)["error_type"] == ("SourceTemplateTargetUnsupported") diff --git a/tests/test_validation.py b/tests/test_validation.py index c94f733..a2af739 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -103,6 +103,16 @@ def test_single_value_trellis_is_available_in_enterprise_9_4( assert validate_dashboard(payload, target="9.4.3").is_valid +def test_app_qualified_custom_visualization_uses_10_2_feature_boundary( + dashboard_payload: dict[str, Any], +) -> None: + payload = copy.deepcopy(dashboard_payload) + payload["visualizations"]["viz_events"]["type"] = "splunk_health.license_gauge" + older = validate_dashboard(payload, target="10.0.0") + assert any(issue.feature == "dashboard.visualization.custom" for issue in older.issues) + assert validate_dashboard(payload, target="10.2.0").is_valid + + def test_dos_validation_is_scoped_to_option_surfaces(dashboard_payload: dict[str, Any]) -> None: payload = copy.deepcopy(dashboard_payload) payload["description"] = "> This is prose, not Dynamic Options Syntax" diff --git a/tests/test_visual_harness.py b/tests/test_visual_harness.py new file mode 100644 index 0000000..f48b271 --- /dev/null +++ b/tests/test_visual_harness.py @@ -0,0 +1,382 @@ +from __future__ import annotations + +import hashlib +import importlib.util +import json +import sys +from pathlib import Path +from types import ModuleType +from typing import Any + +import pytest + +from splunk_dashboard_studio import ( + build_catalog_dashboard, + canonical_json, + compare_roundtrip, +) + +REPO_ROOT = Path(__file__).resolve().parents[1] +HARNESS_PATH = REPO_ROOT / "integration" / "splunk-visual" / "scripts" / "harness.py" +RUNNER_PATH = REPO_ROOT / "integration" / "splunk-visual" / "run.sh" +DEFAULTS_PATH = REPO_ROOT / "integration" / "splunk-visual" / "defaults.yml" +COMPOSE_PATH = REPO_ROOT / "integration" / "splunk-visual" / "compose.yaml" +SOURCE_COMPOSE_PATH = REPO_ROOT / "integration" / "splunk-visual" / "compose.source-template.yaml" +BASELINES_PATH = REPO_ROOT / "integration" / "splunk-visual" / "baselines" +IMAGES_PATH = REPO_ROOT / "integration" / "splunk-visual" / "images.json" +VISUAL_PACKAGE_PATH = REPO_ROOT / "integration" / "splunk-visual" / "package.json" +VISUAL_WORKFLOW_PATH = REPO_ROOT / ".github" / "workflows" / "visual-regression.yml" +SOURCE_LOCK_PATH = REPO_ROOT / "integration" / "splunk-visual" / "source-lock.json" + + +def load_harness() -> ModuleType: + spec = importlib.util.spec_from_file_location("splunk_visual_harness", HARNESS_PATH) + assert spec is not None + assert spec.loader is not None + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module + + +def load_manifest(path: Path) -> dict[str, object]: + return json.loads(path.read_text(encoding="utf-8")) + + +def test_image_registry_pins_every_supported_target_by_digest() -> None: + harness = load_harness() + records = [harness.image_record(target) for target in ("9.4.3", "10.0.0", "10.2.0", "10.4.0")] + assert all("@sha256:" in record["image"] for record in records) + assert records[0]["requires_general_terms"] is False + assert all(record["requires_general_terms"] is True for record in records[1:]) + + +def test_runner_automatically_passes_target_appropriate_acceptance_flags() -> None: + runner = RUNNER_PATH.read_text(encoding="utf-8") + workflow = VISUAL_WORKFLOW_PATH.read_text(encoding="utf-8") + assert "SPLUNK_TERMS_ACCEPTED" not in runner + assert "SPLUNK_TERMS_ACCEPTED" not in workflow + assert 'export SPLUNK_START_ARGS="--accept-license"' in runner + assert 'if [[ "${requires_general_terms}" == "true" ]]' in runner + assert 'export SPLUNK_GENERAL_TERMS="--accept-sgt-current-at-splunk-com"' in runner + assert 'export SPLUNK_GENERAL_TERMS=""' in runner + assert "up --detach --wait --wait-timeout 900" in runner + assert 'if [[ -d "${output}/apps/splunk_health" ]]' in runner + assert "compose.source-template.yaml" in runner + assert 'chown -R "$(id -u):$(id -g)" /opt/splunk/etc/apps/splunk_health' in runner + + +def test_free_fixture_enables_remote_management_only_for_local_rest_checks() -> None: + defaults = DEFAULTS_PATH.read_text(encoding="utf-8") + compose = COMPOSE_PATH.read_text(encoding="utf-8") + assert "allowRemoteLogin: always" in defaults + assert "SPLUNK_DEFAULTS_URL: file:///tmp/visual-qa-defaults.yml" in compose + assert "./defaults.yml:/tmp/visual-qa-defaults.yml:ro" in compose + assert "127.0.0.1:${SPLUNK_WEB_PORT:-8000}:8000" in compose + assert "127.0.0.1:${SPLUNK_MGMT_PORT:-8089}:8089" in compose + source_compose = SOURCE_COMPOSE_PATH.read_text(encoding="utf-8") + assert "SPLUNK_HEALTH_APP_PATH" in source_compose + assert ":/opt/splunk/etc/apps/splunk_health" in source_compose + + +def test_source_snapshot_matches_every_locked_app_and_harness_file() -> None: + harness = load_harness() + lock = harness._source_snapshot() + assert lock == load_manifest(SOURCE_LOCK_PATH) + assert lock["revision"] == "7424755c461712022367c3fa081fd7e0edc91001" + assert len(lock["app"]["files"]) == 42 + assert len(lock["harnesses"]) == 8 + + +def test_baseline_manifest_matches_harness_platform_and_browser_lock() -> None: + baseline_manifest = load_manifest(BASELINES_PATH / "manifest.json") + image_manifest = load_manifest(IMAGES_PATH) + visual_package = load_manifest(VISUAL_PACKAGE_PATH) + assert baseline_manifest["schema_version"] == "splunk-visual-baselines/v1" + assert baseline_manifest["architecture"] == image_manifest["architecture"] + assert baseline_manifest["playwright"] == visual_package["devDependencies"]["@playwright/test"] + + +@pytest.mark.parametrize("target", ("9.4.3", "10.0.0", "10.2.0", "10.4.0")) +def test_reviewed_full_baseline_inventory_is_complete(target: str, tmp_path: Path) -> None: + harness = load_harness() + run_manifest = load_manifest( + harness.prepare( + target=target, + suite="full", + output=tmp_path, + include_state_cases=True, + ) + ) + expected = { + f"{dashboard['example_id']}-full.png".replace("_", "-") + for dashboard in run_manifest["dashboards"] + } + expected.update( + f"{dashboard['example_id']}-{panel['panel_id']}.png".replace("_", "-") + for dashboard in run_manifest["dashboards"] + for panel in dashboard["panels"] + ) + actual = {path.name for path in (BASELINES_PATH / target).glob("*.png")} + assert actual == expected + + baseline_manifest = load_manifest(BASELINES_PATH / "manifest.json") + target_record = baseline_manifest["targets"][target] + assert target_record["image"] == harness.image_record(target)["image"] + assert target_record["result"] == "passed" + assert target_record["suite"] == "full" + assert target_record["screenshot_count"] == len(expected) + digest_input = b"".join( + f"{hashlib.sha256(path.read_bytes()).hexdigest()} {path.name}\n".encode() + for path in sorted((BASELINES_PATH / target).glob("*.png")) + ) + assert target_record["baseline_set_sha256"] == hashlib.sha256(digest_input).hexdigest() + + +def test_prepare_smoke_generates_fixture_views_without_mutating_catalog(tmp_path: Path) -> None: + harness = load_harness() + production_before = canonical_json(build_catalog_dashboard("business_journey_slo", "10.4.0")) + + manifest_path = harness.prepare( + target="10.4.0", + suite="smoke", + output=tmp_path, + include_state_cases=True, + ) + + manifest = load_manifest(manifest_path) + assert manifest["schema_version"] == "splunk-visual-run/v1" + assert manifest["suite"] == "smoke" + assert manifest["target"] == "10.4.0" + assert manifest["indexes"]["otel_metrics"] == "metric" + dashboards = manifest["dashboards"] + assert [item["example_id"] for item in dashboards] == [ + "microservice_service_map", + "business_journey_slo", + "rcastley_splunk_health", + "state_no_data", + "state_search_error", + ] + assert manifest["source_snapshot"]["revision"] == ("7424755c461712022367c3fa081fd7e0edc91001") + assert manifest["required_apps"] == [ + { + "app_id": "splunk_health", + "path": "apps/splunk_health", + "revision": "7424755c461712022367c3fa081fd7e0edc91001", + } + ] + assert (tmp_path / "apps" / "splunk_health" / "default" / "app.conf").is_file() + + catalog_dashboards = [item for item in dashboards if item["expected_state"] == "ready"] + assert all(item["source_queries"] for item in catalog_dashboards) + assert all( + search["fixture_query"].startswith("| makeresults") + for dashboard in dashboards + for search in dashboard["fixture_searches"] + ) + assert all( + "makeresults" not in source["query"] + for dashboard in catalog_dashboards + for source in dashboard["source_queries"] + ) + assert canonical_json(build_catalog_dashboard("business_journey_slo", "10.4.0")) == ( + production_before + ) + + source_template = next( + item for item in dashboards if item["example_id"] == "rcastley_splunk_health" + ) + assert source_template["source_kind"] == "source_template" + assert source_template["title_visible"] is False + assert source_template["template_origin"]["definition_sha256"] == ( + "0371e79ed06eb10ee6298d6e54f32d5a99b744e44d812400845ad141de72febd" + ) + assert len(source_template["panels"]) == 8 + assert all(panel["render_kind"] == "canvas" for panel in source_template["panels"]) + license_panel = next( + panel + for panel in source_template["panels"] + if panel["visualization_type"] == "splunk_health.license_gauge" + ) + assert license_panel["expected_rows"] == [{"used_gb": "42.5", "quota_gb": "100"}] + assert license_panel["no_data_message"] == "Awaiting license data" + assert license_panel["formatter_defaults"]["warningThreshold"] == "80" + + single_value = next( + panel + for dashboard in dashboards + for panel in dashboard["panels"] + if panel["visualization_type"] == "splunk.singlevalue" + ) + assert single_value["expected_rows"] == [{"value": "99.95"}] + assert single_value["ui_markers"] == ["100"] + + service_map = next( + item for item in dashboards if item["example_id"] == "microservice_service_map" + ) + assert service_map["title_visible"] is True + network_graph = next( + panel + for panel in service_map["panels"] + if panel["visualization_type"] == "splunk.networkGraph" + ) + assert network_graph["ui_markers"] == ["gateway", "catalog", "checkout", "payments"] + node_fixture = next( + search + for search in service_map["fixture_searches"] + if search["data_source_id"] == "ds_dependency_map_nodes" + ) + assert node_fixture["expected_rows"] == [ + {"nodeIds": "catalog", "nodeTexts": "catalog", "nodeValues": "120"}, + {"nodeIds": "checkout", "nodeTexts": "checkout", "nodeValues": "137"}, + {"nodeIds": "gateway", "nodeTexts": "gateway", "nodeValues": "215"}, + {"nodeIds": "payments", "nodeTexts": "payments", "nodeValues": "42"}, + ] + service_map_definition = json.loads( + (tmp_path / service_map["definition_path"]).read_text(encoding="utf-8") + ) + assert service_map_definition["dataSources"]["ds_dependency_map_nodes"]["type"] == ("ds.chain") + assert service_map_definition["visualizations"]["viz_dependency_map"]["dataSources"] == { + "nodeSource": "ds_dependency_map_nodes", + "primary": "ds_dependency_map", + } + + no_data = next(item for item in dashboards if item["expected_state"] == "no_data") + assert "no search results returned" in no_data["panels"][0]["ui_patterns"] + + for dashboard in dashboards: + xml = (tmp_path / dashboard["view_xml_path"]).read_text(encoding="utf-8") + assert compare_roundtrip(xml, xml).equivalent + definition = json.loads((tmp_path / dashboard["definition_path"]).read_text()) + assert definition["title"] == dashboard["title"] + + +def test_prepare_removes_only_stale_harness_artifacts(tmp_path: Path) -> None: + harness = load_harness() + (tmp_path / "screenshots" / "stale").mkdir(parents=True) + (tmp_path / "screenshots" / "stale" / "old.png").write_bytes(b"old") + (tmp_path / "qa-overview.json").write_text("{}", encoding="utf-8") + (tmp_path / "visual_qa_stale.xml").write_text("stale", encoding="utf-8") + (tmp_path / "keep.txt").write_text("unrelated", encoding="utf-8") + + harness.prepare( + target="10.4.0", + suite="smoke", + output=tmp_path, + include_state_cases=False, + ) + + assert not (tmp_path / "screenshots").exists() + assert not (tmp_path / "qa-overview.json").exists() + assert not (tmp_path / "visual_qa_stale.xml").exists() + assert (tmp_path / "keep.txt").read_text(encoding="utf-8") == "unrelated" + + +def test_full_suite_respects_catalog_minimum_target(tmp_path: Path) -> None: + harness = load_harness() + target_94 = harness.prepare( + target="9.4.3", + suite="full", + output=tmp_path / "94", + include_state_cases=False, + ) + target_104 = harness.prepare( + target="10.4.0", + suite="full", + output=tmp_path / "104", + include_state_cases=False, + ) + ids_94 = {item["example_id"] for item in load_manifest(target_94)["dashboards"]} + ids_104 = {item["example_id"] for item in load_manifest(target_104)["dashboards"]} + assert len(ids_94) == 10 + assert len(ids_104) == 11 + assert "microservice_service_map" not in ids_94 + assert "microservice_service_map" in ids_104 + assert "rcastley_splunk_health" not in ids_94 + assert "rcastley_splunk_health_portable" in ids_94 + assert "rcastley_splunk_health" in ids_104 + assert "rcastley_splunk_health_portable" not in ids_104 + + +def test_splunk_9_suite_uses_portable_template_without_installing_app(tmp_path: Path) -> None: + harness = load_harness() + manifest = load_manifest( + harness.prepare( + target="9.4.3", + suite="smoke", + output=tmp_path, + include_state_cases=False, + ) + ) + assert manifest["required_apps"] == [] + assert manifest["source_snapshot"]["revision"] == ("7424755c461712022367c3fa081fd7e0edc91001") + assert not (tmp_path / "apps").exists() + source_template = next( + item + for item in manifest["dashboards"] + if item["example_id"] == "rcastley_splunk_health_portable" + ) + assert source_template["source_kind"] == "source_template" + assert {panel["visualization_type"] for panel in source_template["panels"]} == { + "splunk.singlevalue", + "splunk.table", + } + assert all("render_kind" not in panel for panel in source_template["panels"]) + + +def test_search_dispatch_prefix_preserves_generating_commands() -> None: + harness = load_harness() + assert harness._search_value("| makeresults") == "| makeresults" + assert harness._search_value("search index=main") == "search index=main" + assert harness._search_value("index=main | stats count") == "search index=main | stats count" + + +def test_fixture_search_validation_accepts_declared_error_state( + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + harness = load_harness() + manifest_path = harness.prepare( + target="10.4.0", + suite="smoke", + output=tmp_path, + include_state_cases=True, + ) + manifest = load_manifest(manifest_path) + expected_by_query = { + search["fixture_query"]: search["expected_rows"] + for dashboard in manifest["dashboards"] + for search in dashboard["fixture_searches"] + } + + def fake_run_search( + _client: object, query: str + ) -> tuple[list[dict[str, str]], list[dict[str, str]]]: + if "visual_qa_command_does_not_exist" in query: + return [], [{"type": "ERROR", "text": "Unknown search command"}] + return expected_by_query[query], [] + + monkeypatch.setattr(harness, "run_search", fake_run_search) + result = harness.validate_searches(object(), manifest_path, kind="fixture") + assert result["failures"] == [] + error_check = next(item for item in result["checks"] if "state_search_error" in item["id"]) + assert error_check["passed"] is True + assert error_check["rows"] == [] + + +def test_search_export_accepts_structured_http_400_error() -> None: + harness = load_harness() + + class FakeClient: + allowed: tuple[int, ...] | None = None + + def request(self, *_args: Any, **kwargs: Any) -> object: + self.allowed = kwargs["allowed"] + body = b'{"messages":[{"type":"ERROR","text":"bad command"}]}\n' + return harness.SplunkResponse(400, body) + + client = FakeClient() + rows, messages = harness.run_search(client, "| invalid") + assert client.allowed == (200, 400) + assert rows == [] + assert messages == [{"type": "ERROR", "text": "bad command"}] diff --git a/uv.lock b/uv.lock index 94ff727..13decfa 100644 --- a/uv.lock +++ b/uv.lock @@ -500,7 +500,7 @@ wheels = [ [[package]] name = "splunk-dashboard-studio-python" -version = "0.2.0" +version = "0.2.1" source = { editable = "." } dependencies = [ { name = "pydantic" },