Commit Graph

6329 Commits

Author SHA1 Message Date
Charlie Egan 8e31a0f1e7 Update Regal docs to v0.40.0 (#8538)
Add new rule docs, update adopters, and remove automated docs workflow
(broken due to hardening).

Signed-off-by: Charlie Egan <charlie_egan@apple.com>
2026-04-21 14:32:37 +00:00
Charlie Egan f8c50574d8 Add generated output.jsons for docs examples (#8535)
This allows us to show the results of example evaluation before the user
clicks evaluate, but also for chatbots to see the output when viewing
without interaction.

Signed-off-by: Charlie Egan <charlie_egan@apple.com>
2026-04-21 13:01:02 +00:00
bakayolo 6e1e935a45 server: Skip chmod for abstract Unix domain sockets (#8536)
Abstract Unix sockets (paths prefixed with @) exist only in the
kernel socket namespace and have no filesystem representation.
Calling os.Chmod on them fails with "no such file or directory".

The --unix-socket-perm flag (added in v0.53.0 via PR #5888) defaults
to "755" and always triggers a chmod on the socket path after the
listener is created. This makes it impossible to use abstract Unix
sockets with OPA >= v0.53.0.

The fix adds a guard to skip chmod when the socket path starts with
"@", matching the existing guard that already skips os.Remove for
abstract sockets a few lines above.





Amp-Thread-ID: https://ampcode.com/threads/T-019d9906-2625-774e-8f1c-a0c288630be4

Signed-off-by: Ben Abderrazak <babderrazak@squareup.com>
Signed-off-by: Ben Apprederisse <bena@squareup.com>
Co-authored-by: Amp <amp@ampcode.com>
2026-04-20 19:36:49 +00:00
Sebastian Spaink 22f8e8d0cd fmt: restore indention level when handling unexpected comments (#8534)
* fmt: restore indention level when handling unexpected comments

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* add another test

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* support "rego-check-pr" in merge group

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

---------

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-20 14:57:40 +00:00
Charlie Egan 13a123beac build: Exclude domains that cause false positives (#8533)
Several external domains frequently timeout during link checking.
Fixes #8495

Signed-off-by: Charlie Egan <charlie_egan@apple.com>
2026-04-20 14:17:05 +00:00
Stof a85e5c2807 Add vulnetix ecosystem entry (#8532)
* docs/ecosystem: Add Vulnetix to the OPA Ecosystem

Vulnetix is a CLI security scanner that evaluates SCA, IaC, container,
secrets, SAST, license and SBOM findings using Rego, with 250+ built-in
rules and support for custom policy-as-code rule repositories. Adding it
to the ecosystem helps users discover an OPA-powered option for unified,
policy-driven security scanning.

Signed-off-by: Christopher Langton <chris@vulnetix.com>

* docs/ecosystem: Update Vulnetix entry links

Point the entry to the Vulnetix CLI repository and link to the custom
rules and CI/agent integration docs so readers can go directly to the
policy-as-code and integration material.

Signed-off-by: Christopher Langton <chris@vulnetix.com>

---------

Signed-off-by: Christopher Langton <chris@vulnetix.com>
2026-04-17 16:22:51 +00:00
Sebastian Spaink d11fece3a3 Fix benchmarks check files changed (#8530)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-17 08:35:21 -05:00
Sebastian Spaink f6202bc049 Update benchmarks.yaml to use pr_check.rego (#8526)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-17 12:11:14 +00:00
Sebastian Spaink a505c63ab1 docs: various typo fixes (#8529)
* docs: various typo fixes

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* fmt

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

---------

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-17 12:10:45 +00:00
Sebastian Spaink 2ad3e3eb30 Test OCP and Regal during merge queue (#8528)
* Test OCP and Regal during merge queue

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* Test OCP and Regal during merge queue

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* fix permissions

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* ignore zizmor

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* set persist credentials to false

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

---------

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-16 20:53:52 +00:00
Sebastian Spaink 26bc74f07c Don't post netlify preview on non-doc changes (#8527)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-16 15:30:48 -05:00
Sebastian Spaink fb5427972e Run benchmarks in the merge queue (#8525)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-16 19:01:35 +00:00
Sebastian Spaink 68eaef29dc Add the latest videos to the README presentations section (#8523)
* Add the latest videos to the README presentations section

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* support merge queues in files changed check

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* zizmor ignore

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* zizmor ignore on run line

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* run PR checks as well so that the required PR check summary is run

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

* give github action lint permission to upload

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>

---------

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-16 18:17:49 +00:00
Sebastian Spaink 069dc91cae add merge_group build trigger to benchmarks (#8522)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-16 10:48:16 -05:00
Sebastian Spaink edab2a5f3c Update opa test to stream test case results (#8517)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-16 08:25:24 -05:00
Sebastian Spaink e123cdb007 Fix type checker to recognize numeric index in generated map (#8518)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-16 07:16:16 -05:00
Johan Fylling 4e104b0c94 server: Drop HTML index page (#8478)
Fixes: #8477

Signed-off-by: Johan Fylling <johan.dev@fylling.se>
2026-04-16 12:59:28 +02:00
dependabot[bot] cc44823d58 build(deps): bump dompurify from 3.3.2 to 3.4.0 in /docs
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.3.2 to 3.4.0.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.3.2...3.4.0)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.4.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-16 11:26:08 +02:00
dependabot[bot] 7d51f3dc48 build(deps): bump hono in /e2e/api/compile/prisma
Bumps [hono](https://github.com/honojs/hono) from 4.12.12 to 4.12.14.
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.12.12...v4.12.14)

---
updated-dependencies:
- dependency-name: hono
  dependency-version: 4.12.14
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-16 11:25:52 +02:00
Sebastian Spaink a7bd374b00 Prevent fmt from formatting single attribute objects with comments (#8519)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-16 10:09:50 +02:00
Stephan Renatus cd955f69d0 workflows: attempt to fix slack notifications
Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
2026-04-15 11:03:19 +02:00
Stephan Renatus ef9c47973b workflows/nightly: use OCP ref (temporary workaround)
This should make the tests pass in CI, giving us a green nightly build.
On the next OCP release, we can revert this and go back to pulling the
latest release/tag.

Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
2026-04-15 11:03:19 +02:00
Stephan Renatus 159fe6b28d workflows: fix nightly and release-vuln-check
Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
2026-04-15 09:17:01 +02:00
Stephan Renatus e7ccaed26f benchmarks: bump nodejs (24 -> 25)
Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
2026-04-15 09:17:01 +02:00
Sebastian Spaink 27f34789f5 Fix type checker match error for objects with set keys
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-15 08:40:27 +02:00
davidmarne-wf 55a9eb6ffa fix: reachable_paths does not return all reachable paths (#8510)
* topdown: add failing tests for graph.reachable_paths with shared ancestors

Adds a regression test (shared_ancestor) reproducing the bug reported in
#5871: given a graph where node 4 has edges to both 3 and 2, and 3 also
has an edge to 2, graph.reachable_paths from 5 drops the path [5,4,2,1].

Also corrects the expected result for the existing cycle_1022_3 test, which
was asserting the buggy output ([one,five,six] truncated) rather than the
correct complete path [one,five,six,seven,eight,three].

Signed-off-by: David Marne <david.marne@workiva.com>

* topdown: fix graph.reachable_paths dropping paths with shared ancestors

graph.reachable_paths had two bugs that caused paths to be silently dropped
when a node is reachable via multiple routes (diamond-shaped graphs).

Bug 1: the `reached` set was mutated and shared across sibling recursive
calls. After branch A finished traversal and added nodes to `reached`,
branch B would see those nodes as already visited and terminate early,
emitting a truncated path instead of continuing.

Fix: copy `reached` once per pathBuilder invocation and pass the copy to
all recursive calls. Each branch now has its own ancestor-only visited set.

Bug 2: ast.NewArray stores the slice it receives directly (elems: a)
without copying. When sibling calls appended to a shared backing array,
the in-place write by one sibling corrupted the already-committed path
term of a previous sibling.

Fix: pass append([]*ast.Term(nil), path...) to each recursive call,
giving each branch its own independent backing array.

Signed-off-by: David Marne <david.marne@workiva.com>

---------

Signed-off-by: David Marne <david.marne@workiva.com>
2026-04-14 10:45:43 -05:00
dependabot[bot] 6a79368e86 build(deps): bump follow-redirects from 1.15.11 to 1.16.0 in /docs (#8513)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.11 to 1.16.0.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.11...v1.16.0)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-version: 1.16.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-14 08:48:25 -05:00
Stephan Renatus b530a7dd2e build: bump wasmtime-go to v43.0.2
Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
2026-04-14 09:35:49 +02:00
Stephan Renatus 42baad2bc4 ast: fix parenthesis in String() of {obj,arr,set} comprehensions
This should fix the issue underlying

https://github.com/open-policy-agent/opa-control-plane/issues/321

Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
2026-04-14 09:29:39 +02:00
Sebastian Spaink 1de861f2d6 Add support for days, weeks and years in parse_duration_ns (#8463)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-13 20:20:51 +00:00
Stephan Renatus 04ee2c86ad ast: catch functions in dynamic extent of ref head rule
These currently fail, as laid out in #8461.

With this change, we'll return a controlled error, and don't let the
user run into an NPE or a cryptic error.

Fixes #8461.

Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
2026-04-13 09:28:45 +02:00
Ashutosh Narkar 9b90626150 docs: Add spec for OCP bundle status tracking API
Signed-off-by: Ashutosh Narkar <anarkar4387@gmail.com>
2026-04-09 12:07:29 -07:00
Anders Eknert 4b47732f77 fmt: Allow indenting all withs in expression (#8508)
```rego
test_something if {
    something
        with input.foo as 1
        with input.bar as 2
}
```
Would previously be formatted as:
```rego
test_something if {
    something with input.foo as 1
        with input.bar as 2
}
```
Now the formatter allows also the first `with` to be indented
as the rest if the first `with` is found below the line where
the expression begins.

Existing Rego files that have been formatted before should remain
the same when reformatted, and none of the existing formatter tests
have required changes. Only users who actively place the first `with`
in a group on a line below will now see that the formatter respects
their wish, and will indent it the same way as the following `with`s.

Signed-off-by: Anders Eknert <anders.eknert@apple.com>
2026-04-09 18:05:37 +00:00
Dominik Schulz e5427d5adb resolver/wasm: Add NewWithContext to allow passing context (#8499)
Previously, initializing a new WASM resolver always used a background
context. This prevented callers from passing down an existing context
for timeouts, cancellation, or tracing.

This change introduces `NewWithContext` in `v1/resolver/wasm` which accepts
a context and propagates it to `Entrypoints()`. The existing `New`
function has been updated to wrap `NewWithContext` using a background
context to preserve backwards compatibility. `LoadWasmResolversFromStore`
has been updated to pass the provided context appropriately.

Signed-off-by: Dominik Schulz <dschulz@google.com>
2026-04-09 19:10:19 +02:00
dependabot[bot] 65609fcf0a build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp (#8506)
Bumps [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp](https://github.com/open-telemetry/opentelemetry-go) from 1.42.0 to 1.43.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.42.0...v1.43.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
  dependency-version: 1.43.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-08 22:23:20 +00:00
dependabot[bot] ea46a00616 build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp (#8504)
Bumps [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp](https://github.com/open-telemetry/opentelemetry-go) from 1.42.0 to 1.43.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.42.0...v1.43.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
  dependency-version: 1.43.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-08 21:42:24 +00:00
dependabot[bot] cf0f5fd804 build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp (#8503)
Bumps [go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp](https://github.com/open-telemetry/opentelemetry-go) from 1.42.0 to 1.43.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.42.0...v1.43.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp
  dependency-version: 1.43.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-08 21:31:36 +00:00
Sebastian Spaink 261a4f6c04 type checker: identify compatible type from reference (#8485)
* type checker: identify compatible type from reference
* Update unifiesObjectsStatic to allow static keys with dynamic properties to be optional, similar to unify1Object

Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-08 19:55:49 +00:00
Stephan Renatus dc3313b189 plugins/rest: carry over all of *tls.Config (#8476)
- The tokenTLSConfig is cloned from DefaultTLSConfig(c) (which
includes RootCAs) and then InsecureSkipVerify is set explicitly from
c.AllowInsecureTLS, since DefaultTLSConfig only sets it when the service
URL is https, but the token URL is always https regardless.

- New test configures a service with tls.ca_cert pointing to the token
server's CA cert, without allow_insecure_tls. This directly reproduces
the bug report — before the fix, this would fail with x509: certificate
signed by unknown authority. Also removes some duplication we had
before.

Fixes #8473.

Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
2026-04-08 15:46:50 +00:00
Johan Fylling b10afee1b9 Updated roadmap link (#8501)
Signed-off-by: Johan Fylling <johan.dev@fylling.se>
2026-04-08 17:22:49 +02:00
Michael Munch 12b7290697 distributedtracing: export Prometheus metrics via OTLP (#8450)
* distributedtracing: export Prometheus metrics via OTLP

Add support for pushing OPA's existing Prometheus metrics to an
OpenTelemetry collector via OTLP, eliminating the need for a dedicated
scraper sidecar. Uses the OTel Prometheus bridge to read from OPA's
prometheus.Registry and export through an OTLP metric exporter (gRPC
or HTTP), reusing the same address and TLS configuration as traces.

New config fields: distributed_tracing.metrics (bool, default false)
and distributed_tracing.metrics_export_interval_ms (int, default 60000).

Fixes #7591

Signed-off-by: Michael Munch <mm.munk@gmail.com>

* metricsexport: decouple metrics export into top-level config section

Extract metrics export from distributed_tracing into its own
metrics_export config section with independent type (otlp/grpc,
otlp/http), address, and TLS settings. This allows exporting
Prometheus metrics via OTLP without enabling tracing, and to a
different endpoint than traces.

- Extract shared TLS helpers into internal/tlsutil
- Add MetricsExport field to top-level Config
- Create internal/metricsexport package with Init, config parsing
- Remove metrics fields from distributedtracing
- Update runtime to call metricsexport.Init separately
- Move e2e tests to v1/test/e2e/metricsexport
- Add Metrics Export section to configuration docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Munch <mm.munk@gmail.com>

* ci: retrigger checks

Signed-off-by: Michael Munch <mm.munk@gmail.com>

* go.mod: upgrade dependencies downgraded during rebase

Modules like containerd, go-sqlbuilder, OpenTelemetry, and golang.org/x/*
were at older versions than main after a rebase. Upgrade them to match or
exceed main.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Munch <mm.munk@gmail.com>

* Update internal/distributedtracing/distributedtracing_test.go

Signed-off-by: Michael Munch <mm.munk@gmail.com>

---------

Signed-off-by: Michael Munch <mm.munk@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 14:09:51 +00:00
dependabot[bot] 1434b4c040 build(deps): bump hono from 4.12.9 to 4.12.12 in /e2e/api/compile/prisma (#8498)
Bumps [hono](https://github.com/honojs/hono) from 4.12.9 to 4.12.12.
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.12.9...v4.12.12)

---
updated-dependencies:
- dependency-name: hono
  dependency-version: 4.12.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-08 13:00:49 +00:00
Sebastian Spaink e7b6a90e66 build: bump go 1.26.2 (#8497)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-08 14:07:27 +02:00
Charlie Egan f226d07b1c Remove old redirects, add new management redirect (#8491)
Fixes https://github.com/open-policy-agent/opa/issues/8424

Signed-off-by: Charlie Egan <charlie_egan@apple.com>
2026-04-07 16:30:16 +00:00
Charlie Egan cf6b6faf1d Add banner to show when event has passed (#8493)
Move event status message to prominent banner at top of page.
Replace heading-only note as it was not clear.

Signed-off-by: Charlie Egan <charlie_egan@apple.com>
2026-04-07 16:02:24 +00:00
dependabot[bot] bb1293a544 build(deps): bump lodash from 4.17.23 to 4.18.1 in /docs (#8494)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.23 to 4.18.1.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.18.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-07 10:06:09 -05:00
Charlie Egan a57f2ef42d cicd: Split link checker into docs & repo checks (#8492)
We have fixed most of the broken links! But,
https://github.com/open-policy-agent/opa/issues/8464 is mostly not useful now
as we are checking the docs site internal links which are already checked at
build time which is done in PRs.

This change makes two jobs, one for the repo, and one for the docs site. The
OPA domain is ignored for website checks.

Signed-off-by: Charlie Egan <charlie_egan@apple.com>
2026-04-07 15:05:44 +01:00
Raajhesh Kannaa Chidambaram f9401259dc docs: add Windows development notes to dev reference guide (#8422)
Signed-off-by: Raajhesh Kannaa Chidambaram <495042+raajheshkannaa@users.noreply.github.com>
2026-04-03 10:13:27 -05:00
Sebastian Spaink 918b8cc969 fmt: add new line between METADATA blocks (#8483)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-03 06:53:36 -05:00
Sebastian Spaink 7d266cb687 Allow Back-to-back metadata blocks (#8482)
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
2026-04-02 20:14:02 +00:00