[object Object]

← back to Stayclaim

snapshot: 78 file(s) changed, +7 new, ~71 modified

2fea986551aa028537d6bc3084aa63ddfdc2c665 · 2026-05-13 08:58:02 -0700 · Steve

Files touched

Diff

commit 2fea986551aa028537d6bc3084aa63ddfdc2c665
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed May 13 08:58:02 2026 -0700

    snapshot: 78 file(s) changed, +7 new, ~71 modified
---
 REVIEW-2026-05-04.md                          |   2 +-
 REVIEW-2026-05-04.md.pre-scrub-2026-05-07.bak |  73 ++++++++++
 db/migrations/023_rate_limit.sql              |  47 +++++++
 db/migrations/024_perf_indexes.sql            |  40 ++++++
 scripts/ingest-la-assessor-legacy.ts          |   2 +-
 scripts/ingest-la-county-assessor.ts          |   2 +-
 scripts/smoke.sh                              | 194 ++++++++++++++++++++++++++
 src/app/address/[slug]/page.tsx               |  76 ++++++----
 src/app/admin/data/page.tsx                   | 125 ++++++++++++-----
 src/app/admin/layout.tsx                      |  69 ++++++---
 src/app/admin/page.tsx                        |  91 ++++++++----
 src/app/admin/sources/page.tsx                |  59 +++++---
 src/app/api/events/route.ts                   |  58 +++++++-
 src/app/api/la-records/lookup/route.ts        |  16 ++-
 src/app/api/pastdoor-health/route.ts          |  38 +++--
 src/app/api/promote/route.ts                  |  67 ++++++---
 src/app/api/search/route.ts                   |  28 +++-
 src/app/api/stars/nearby/route.ts             |  27 +++-
 src/app/api/submit/route.ts                   |  57 +++++---
 src/app/architects/page.tsx                   |  10 +-
 src/app/browse/page.tsx                       |  18 ++-
 src/app/claim/[slug]/page.tsx                 |   5 +
 src/app/dashboard/page.tsx                    |  15 +-
 src/app/entity/[slug]/page.tsx                |  40 ++++--
 src/app/film/[slug]/page.tsx                  |  55 +++++---
 src/app/films/page.tsx                        |  16 ++-
 src/app/houses/page.tsx                       |  26 ++--
 src/app/layout.tsx                            |   5 +-
 src/app/locations-by-year/page.tsx            |   4 +-
 src/app/map/MapWithLayers.tsx                 |  42 +++---
 src/app/map/page.tsx                          |  12 +-
 src/app/neighborhood/[slug]/page.tsx          |  49 +++++--
 src/app/neighborhoods/page.tsx                |  16 ++-
 src/app/page.tsx                              |  17 ++-
 src/app/parcel/[apn]/page.tsx                 |  42 ++++--
 src/app/people/page.tsx                       |   4 +-
 src/app/promote/[slug]/PromoteFormClient.tsx  |  61 +++++---
 src/app/promote/[slug]/page.tsx               |  23 ++-
 src/app/promote/page.tsx                      |  38 +++--
 src/app/restaurants/[slug]/page.tsx           |  82 +++++++----
 src/app/restaurants/page.tsx                  |  26 ++--
 src/app/robots.ts                             |  12 +-
 src/app/search/page.tsx                       | 107 ++++++++++++--
 src/app/sitemap.ts                            |  61 ++++++--
 src/app/stars/nearby/StarsNearbyClient.tsx    |  65 +++++++--
 src/app/stars/page.tsx                        |  23 ++-
 src/app/stars/walk/page.tsx                   |   1 +
 src/app/submit/SubmitFormClient.tsx           |  40 +++---
 src/app/submit/page.tsx                       |   3 +
 src/app/timeline/page.tsx                     |  32 ++++-
 src/app/timeline/rss.xml/route.ts             |  13 +-
 src/components/AddressMasthead.tsx            |  23 +--
 src/components/ClaimCTA.tsx                   |   2 +-
 src/components/ClaimExamples.tsx              |   4 +-
 src/components/FactRow.tsx                    |   2 +-
 src/components/FilmsGrid.tsx                  |  14 +-
 src/components/HeaderSearch.tsx               |  26 +++-
 src/components/HeroCollage.tsx                |  13 +-
 src/components/InteractiveMap.tsx             |  27 +++-
 src/components/JsonLd.tsx                     |   7 +-
 src/components/MediaWall.tsx                  |  29 ++--
 src/components/PermitTable.tsx                |  11 +-
 src/components/SourceLink.tsx                 |  11 +-
 src/components/StreetView.tsx                 |   1 +
 src/components/Timeline.tsx                   |  16 ++-
 src/components/home/ClaimHome.tsx             |  51 ++++---
 src/components/home/CommunityHome.tsx         |  81 +++++++----
 src/components/home/FlagshipHome.tsx          |  37 ++---
 src/components/sponsored/SponsoredCard.tsx    |  14 +-
 src/lib/db.ts                                 | 135 ++++++++++++++----
 src/lib/geo.ts                                |  30 ++++
 src/lib/la-arcgis.ts                          |  44 +++++-
 src/lib/la-permits.ts                         |  93 ++++++++++--
 src/lib/rate-limit.ts                         |  61 ++++++++
 src/lib/site.ts                               |  29 +++-
 src/lib/url-guards.ts                         |  47 +++++++
 src/middleware.ts                             |  21 ++-
 tsconfig.tsbuildinfo                          |   2 +-
 78 files changed, 2225 insertions(+), 640 deletions(-)

diff --git a/REVIEW-2026-05-04.md b/REVIEW-2026-05-04.md
index 0ae67f2..3c2fa45 100644
--- a/REVIEW-2026-05-04.md
+++ b/REVIEW-2026-05-04.md
@@ -12,7 +12,7 @@ Code-reviewer + architect-reviewer parallel run. **3 P0 patches applied + 2 P0 s
 
 ## P0 NEEDS STEVE (3 actions)
 
-### 1. **Live Google Maps API key in `.env.local`** (`AIzaSyDP-lKLvCQNPUvJ3mxyl1bjBHFO5g57ETw`)
+### 1. **Live Google Maps API key in `.env.local`** (`${GOOGLE_MAPS_API_KEY}-redacted-NEEDS-ROTATION-2026-05-07`)
 
 `NEXT_PUBLIC_GOOGLE_MAPS_API_KEY` ships embedded in the JS bundle to every browser visitor. Required actions:
 1. **Rotate immediately via GCP console** — old key compromised by being public.
diff --git a/REVIEW-2026-05-04.md.pre-scrub-2026-05-07.bak b/REVIEW-2026-05-04.md.pre-scrub-2026-05-07.bak
new file mode 100644
index 0000000..0ae67f2
--- /dev/null
+++ b/REVIEW-2026-05-04.md.pre-scrub-2026-05-07.bak
@@ -0,0 +1,73 @@
+# stayclaim (pastdoor) — overnight debate-team review (2026-05-04)
+
+Code-reviewer + architect-reviewer parallel run. **3 P0 patches applied + 2 P0 surfaced to Steve** (Maps key rotation + Maps key history scrub). Architecture verdict: stayclaim is **NOT** a `directory-core` consumer — different shape.
+
+## P0 patches APPLIED (local — NOT deployed)
+
+| # | File:line | Issue | Fix |
+|---|---|---|---|
+| 1 | `src/middleware.ts` | `/admin/*` was completely unauthenticated — `admin/layout.tsx:45` literally said `auth: dev-mode (no auth)`. Anyone hitting `wholivedthere.com/admin` saw the full PG dashboard, claim-request emails, sponsored-placement contact_email | HTTP Basic gate via `ADMIN_SECRET` env var (constant-time compare); fail-closed in production if secret unset (503), allow in dev |
+| 2 | `src/middleware.ts` | `/dashboard?email=victim@example.com` returned that user's claim list — trivial IDOR | Block `/dashboard` in production (404); dev still has it for local testing |
+| 3 | `src/app/api/health/route.ts` + new `pastdoor-health/route.ts` | `/api/health` collides with Site Factory's nginx reserved prefix — every probe was hitting Site Factory, never reaching pastdoor. `deploy-pastdoor.sh` + `smoke-test.sh` were silently broken | New handler at `/api/pastdoor-health`; old path returns 410 Gone with redirect message. Update `deploy-pastdoor.sh` + `smoke-test.sh` to call new URL. |
+
+## P0 NEEDS STEVE (3 actions)
+
+### 1. **Live Google Maps API key in `.env.local`** (`AIzaSyDP-lKLvCQNPUvJ3mxyl1bjBHFO5g57ETw`)
+
+`NEXT_PUBLIC_GOOGLE_MAPS_API_KEY` ships embedded in the JS bundle to every browser visitor. Required actions:
+1. **Rotate immediately via GCP console** — old key compromised by being public.
+2. Add HTTP referrer restrictions to the new key (only `wholivedthere.com`, `claimmyaddress.com`, `bubbesblock.com`).
+3. Re-save via `~/Projects/secrets-manager/cli.js add` so it's tracked.
+4. Confirm the key was never committed to a git history (`git log --all --full-history -- .env.local`).
+
+### 2. Set `ADMIN_SECRET` in pm2 env
+
+Without it, the new `/admin/*` middleware returns 503 in production. Mint via `/secrets` skill, route to pastdoor's pm2 env, `pm2 reload pastdoor --update-env`.
+
+### 3. Update `deploy-pastdoor.sh` + `smoke-test.sh` to call `/api/pastdoor-health`
+
+Old `/api/health` still returns 410 so callers will fail loud, but updating them in the same release is cleaner.
+
+## P1 / P2 deferred (in REVIEW)
+
+- `src/app/admin/data/page.tsx:220` — `getDistinctValues` interpolates `col`/`table` into raw SQL via template literals. Today `SOURCES` is hardcoded so not injectable, but the pattern is fragile. Use allowlist map.
+- `src/app/api/submit/route.ts:19`, `api/promote/route.ts:46` — Zod errors return `String(e)` which echoes received PII (emails) back. Map to `issues.map(i=>i.message).join('; ')`.
+- `src/app/api/la-records/lookup/route.ts:44` — leaks raw `e.message` (DB / ArcGIS connection details) to client. Generic `lookup failed`; full server-log only.
+- No `headers()` export in `next.config.mjs` — missing CSP, X-Frame-Options, X-Content-Type-Options, HSTS.
+- No CSRF / Origin check on `/api/submit`, `/api/promote`. Add origin allowlist for the 3 sister domains.
+- No rate limiting on any endpoint.
+- `src/lib/la-arcgis.ts:160`, `la-permits.ts:53` — `interval '${CACHE_TTL_DAYS} days'` interpolated into SQL (low risk: const number, but fragile pattern).
+- `*.archive.org` and `*.flickr.com` wildcards in `next.config.mjs` `remotePatterns` — Next.js Image proxy could be abused via attacker-controlled subdomains. Scope to known hosts.
+- `/api/promote` `external_url` accepts `http://localhost`/`http://169.254.169.254` (no SSRF today since URL not fetched server-side, but exploitable when crawler lands).
+- **Dark/light toggle missing** per standing rule. Tailwind refactor harder — flagged but deferred per review brief.
+
+## Architecture roadmap
+
+**Architectural Impact: HIGH.** Schema strain from Airbnb→address-history pivot, admin tier was unauth, codebase at the inflection point.
+
+### What stayclaim actually is now (multi-tenant archive masquerading as listing site)
+
+- `db/schema.sql:7-43` — central table is still named **`listing`** with airbnb-shaped columns (`nightly_price`, `currency`, `sleeps`, `amenities jsonb`). Films, restaurants, parcels, stars all FK into `listing.id` as if they were Airbnb listings.
+- `src/middleware.ts` reveals this single Next.js process serves **3 domains**: wholivedthere.com (flagship), claimmyaddress.com (onboarding → /submit), bubbesblock.com (community → /neighborhoods). Plus stayclaim/pastdoor itself. The real architectural innovation is the host-routing middleware.
+
+### 5 highest-leverage structural changes
+
+1. **(DONE tonight)** Add admin auth — was the most urgent gap.
+2. **(needs Steve)** Rotate the Maps key + domain-restrict it in GCP.
+3. **Split `src/lib/db.ts` (679 LOC)** into per-domain repos: `repos/{listings,entities,events,films,restaurants,stars,media,parcels,owners,neighborhoods}.ts`. Same anti-pattern as lawyer/doctor reviews.
+4. **Rename `listing` → `place`** (or split it into `place` root + `place_listing_meta` rental-specific). Currently every new vertical inherits Airbnb-shaped baggage. Restaurant has its own table (`016_restaurants.sql`) but `entity_place_association.listing_id` FKs to `listing` only — so a restaurant-as-place can't be associated with a person without a fake listing row.
+5. **Document deploy story in this repo.** `deploy-pastdoor.sh` is referenced by `api/health/route.ts` but lives elsewhere. Add `scripts/deploy.sh` checked-in; survive context wipes.
+
+### `directory-core` verdict: **NOT A FIT**
+
+stayclaim is a different shape from doctor/lawyer/animals/restaurant verticals:
+- Those four: scrape provider list → enrich → render directory page per provider → 3 mockups → claim/upgrade. **One entity type per site.**
+- stayclaim: aggregate **9+ heterogeneous source datasets** (LADBS permits, BH permits, LA assessor, film permits, Walk of Fame, Wikipedia houses, restaurants, newspapers, Sanborn maps) across **6 place types** (address/parcel/entity/film/restaurant/star) into **3 tenant-branded sites** sharing one DB.
+
+What stayclaim COULD share is narrower: a `place-graph-core` package containing (a) the source-tier A/B/C/D pattern, (b) the `public_visible` privacy gate trigger, (c) entity↔place association model, (d) media-asset rights tracking. For bubbesblock/claimmyaddress to consume — not for the directory verticals.
+
+## Files touched
+
+- `/Users/stevestudio2/Projects/stayclaim/src/middleware.ts`
+- `/Users/stevestudio2/Projects/stayclaim/src/app/api/health/route.ts`
+- `/Users/stevestudio2/Projects/stayclaim/src/app/api/pastdoor-health/route.ts` (NEW)
diff --git a/db/migrations/023_rate_limit.sql b/db/migrations/023_rate_limit.sql
new file mode 100644
index 0000000..1bd8454
--- /dev/null
+++ b/db/migrations/023_rate_limit.sql
@@ -0,0 +1,47 @@
+-- Postgres-backed token bucket rate limiter. No Redis dependency.
+--
+-- Bucket per (ip, scope). Window resets when the stored window_start is
+-- older than now() - p_window_seconds. Caller compares the returned count
+-- against its own per-scope ceiling and 429s if over.
+--
+-- Designed to fail-OPEN: if PG is unavailable, callers should let the
+-- request through rather than 503 the public archive. PG-down is surfaced
+-- via /admin or pm2 logs separately.
+--
+-- Sweep job recommended hourly:
+--   DELETE FROM rate_limit_bucket WHERE window_start < now() - interval '24 hours';
+
+CREATE TABLE IF NOT EXISTS rate_limit_bucket (
+  ip           inet         NOT NULL,
+  scope        text         NOT NULL,
+  window_start timestamptz  NOT NULL,
+  count        int          NOT NULL DEFAULT 0,
+  PRIMARY KEY (ip, scope)
+);
+
+CREATE INDEX IF NOT EXISTS rate_limit_bucket_window_idx
+  ON rate_limit_bucket (window_start);
+
+CREATE OR REPLACE FUNCTION rate_limit_hit(
+  p_ip inet,
+  p_scope text,
+  p_window_seconds int
+) RETURNS int LANGUAGE plpgsql AS $$
+DECLARE v_count int;
+BEGIN
+  INSERT INTO rate_limit_bucket (ip, scope, window_start, count)
+  VALUES (p_ip, p_scope, now(), 1)
+  ON CONFLICT (ip, scope) DO UPDATE
+    SET window_start = CASE
+          WHEN rate_limit_bucket.window_start < now() - (p_window_seconds || ' seconds')::interval
+            THEN now()
+          ELSE rate_limit_bucket.window_start
+        END,
+        count = CASE
+          WHEN rate_limit_bucket.window_start < now() - (p_window_seconds || ' seconds')::interval
+            THEN 1
+          ELSE rate_limit_bucket.count + 1
+        END
+  RETURNING count INTO v_count;
+  RETURN v_count;
+END $$;
diff --git a/db/migrations/024_perf_indexes.sql b/db/migrations/024_perf_indexes.sql
new file mode 100644
index 0000000..6f57b5f
--- /dev/null
+++ b/db/migrations/024_perf_indexes.sql
@@ -0,0 +1,40 @@
+-- Performance indexes flagged by perf-engineer in 2026-05-05 review.
+-- All idempotent — IF NOT EXISTS guards. CONCURRENTLY would be ideal at
+-- LA scale but isn't allowed inside a transaction; psql -f wraps each
+-- file in a single tx, so we use plain CREATE INDEX. Acceptable since
+-- pastdoor's listing/place_event tables are <1M rows.
+
+-- listing.source — partial index for the public-listings filter on
+-- FlagshipHome.getFeaturedHouses (`source = 'wikipedia_house'`) and
+-- houses/page (`source IN ('wikipedia_house','la_hcm')`).
+CREATE INDEX IF NOT EXISTS idx_listing_source
+  ON listing (source) WHERE is_public = true;
+
+-- listing.ingested_at DESC — used as ORDER BY in searchListings,
+-- getNearbyListings, /api/search. With LIMIT N a btree-DESC index
+-- means limit-via-index instead of full sort.
+CREATE INDEX IF NOT EXISTS idx_listing_ingested_at
+  ON listing (ingested_at DESC) WHERE is_public = true;
+
+-- listing.claimed_at DESC — ClaimHome.getRecentClaims orders by
+-- claimed_at. Existing idx_listing_claimed is on claimed_by.
+CREATE INDEX IF NOT EXISTS idx_listing_claimed_at
+  ON listing (claimed_at DESC) WHERE claimed_by IS NOT NULL;
+
+-- place_event composite (kind, valid_from DESC) — getRecentPermits
+-- filters on kind+public_visible+ORDER BY valid_from DESC. Today the
+-- planner picks one of the two single-column indexes; the composite
+-- supports both.
+CREATE INDEX IF NOT EXISTS idx_place_event_kind_validfrom
+  ON place_event (kind, valid_from DESC) WHERE public_visible;
+
+-- pg_trgm on listing.title and entity.display_name for ILIKE %x%
+-- supplied by /api/search and houses/page. Existing idx_listing_search_doc
+-- is tsvector-only; bare ILIKE doesn't use it.
+CREATE EXTENSION IF NOT EXISTS pg_trgm;
+
+CREATE INDEX IF NOT EXISTS idx_listing_title_trgm
+  ON listing USING gin (title gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS idx_entity_name_trgm
+  ON entity USING gin (display_name gin_trgm_ops);
diff --git a/scripts/ingest-la-assessor-legacy.ts b/scripts/ingest-la-assessor-legacy.ts
index a33920e..1544933 100644
--- a/scripts/ingest-la-assessor-legacy.ts
+++ b/scripts/ingest-la-assessor-legacy.ts
@@ -61,7 +61,7 @@ async function downloadCsv() {
     }
   }
   w.end();
-  await new Promise(r => w.on('close', r));
+  await new Promise<void>(r => w.on('close', () => r()));
   console.log(`  ✓ saved ${(received/1024/1024/1024).toFixed(2)} GB`);
 }
 
diff --git a/scripts/ingest-la-county-assessor.ts b/scripts/ingest-la-county-assessor.ts
index 3ccebde..22bc024 100644
--- a/scripts/ingest-la-county-assessor.ts
+++ b/scripts/ingest-la-county-assessor.ts
@@ -68,7 +68,7 @@ async function downloadZip() {
     }
   }
   w.end();
-  await new Promise(r => w.on('close', r));
+  await new Promise<void>(r => w.on('close', () => r()));
   console.log(`  ✓ saved ${(received/1024/1024).toFixed(1)} MB`);
 }
 
diff --git a/scripts/smoke.sh b/scripts/smoke.sh
new file mode 100755
index 0000000..258f4ec
--- /dev/null
+++ b/scripts/smoke.sh
@@ -0,0 +1,194 @@
+#!/usr/bin/env bash
+# smoke.sh — post-deploy regression check for stayclaim / pastdoor
+# Runs locally; hits production domains. No browser required.
+# Usage: ./scripts/smoke.sh [BASE_OVERRIDE]
+# BASE_OVERRIDE lets you hit a staging host instead, e.g. http://localhost:3001
+# Exit 0 = all pass.  Exit 1 = one or more failures.
+
+set -euo pipefail
+
+PASS=0
+FAIL=0
+START=$(date +%s)
+
+# ── config ──────────────────────────────────────────────────────────────────
+WLT="${1:-https://wholivedthere.com}"
+CMA="${1:-https://claimmyaddress.com}"
+BBL="${1:-https://bubbesblock.com}"
+# When a BASE_OVERRIDE is given all 3 surfaces collapse to the same host.
+# The host-specific brand checks still work because they probe the HTML body.
+CURL="curl -sS --max-time 15 --compressed"
+KAMATERA_SSH="root@45.61.58.125"
+DB_NAME="pastdoor"
+
+# ── helpers ─────────────────────────────────────────────────────────────────
+ok()   { echo "  [PASS] $*"; PASS=$((PASS+1)); }
+fail() { echo "  [FAIL] $*"; FAIL=$((FAIL+1)); }
+
+check_status() {
+  local label="$1" url="$2" expected="${3:-200}"
+  local code
+  code=$($CURL -o /dev/null -w "%{http_code}" "$url" 2>/dev/null) || code=000
+  if [[ "$code" == "$expected" ]]; then
+    ok "$label  HTTP $code"
+  else
+    fail "$label  expected $expected got $code  ($url)"
+  fi
+}
+
+# Returns body via stdout; also asserts HTTP 200.
+fetch_body() {
+  local label="$1" url="$2"
+  local tmp; tmp=$(mktemp)
+  local code
+  code=$($CURL -o "$tmp" -w "%{http_code}" "$url" 2>/dev/null) || code=000
+  if [[ "$code" != "200" ]]; then
+    fail "$label  HTTP $code ($url)"
+    rm -f "$tmp"
+    echo ""
+    return
+  fi
+  cat "$tmp"
+  rm -f "$tmp"
+}
+
+assert_contains() {
+  local label="$1" body="$2" needle="$3"
+  if grep -qiF "$needle" <<<"$body"; then
+    ok "$label  contains '$needle'"
+  else
+    fail "$label  missing '$needle'"
+  fi
+}
+
+assert_nonempty() {
+  local label="$1" body="$2"
+  if [[ -n "$body" ]]; then
+    ok "$label  body non-empty"
+  else
+    fail "$label  empty body"
+  fi
+}
+
+assert_size_range() {
+  local label="$1" body="$2" min="$3" max="$4"
+  local sz=${#body}
+  if (( sz >= min && sz <= max )); then
+    ok "$label  size ${sz}B in [${min},${max}]"
+  else
+    fail "$label  size ${sz}B outside [${min},${max}]"
+  fi
+}
+
+assert_json_array() {
+  local label="$1" body="$2" key="${3:-}"
+  local target="$body"
+  [[ -n "$key" ]] && target=$(echo "$body" | jq -r ".$key" 2>/dev/null)
+  if echo "$target" | jq -e 'if type=="array" then true else false end' &>/dev/null; then
+    ok "$label  valid JSON array"
+  else
+    fail "$label  not a JSON array (body: ${body:0:120})"
+  fi
+}
+
+assert_valid_json() {
+  local label="$1" body="$2"
+  if echo "$body" | jq . &>/dev/null; then
+    ok "$label  valid JSON"
+  else
+    fail "$label  invalid JSON (body: ${body:0:120})"
+  fi
+}
+
+# ── 1. Root URLs — brand strings ─────────────────────────────────────────────
+echo ""
+echo "=== 1. Root URLs ==="
+
+for pair in "$WLT|wholivedthere" "$CMA|claimmyaddress" "$BBL|bubbe"; do
+  host="${pair%%|*}"
+  brand="${pair##*|}"
+  body=$(fetch_body "GET $host/" "$host/")
+  assert_nonempty "root/$brand" "$body"
+  assert_contains "root/$brand brand" "$body" "$brand"
+done
+
+# ── 2. Sitemap per domain ────────────────────────────────────────────────────
+echo ""
+echo "=== 2. Sitemaps ==="
+
+for host in "$WLT" "$CMA" "$BBL"; do
+  label="sitemap $host"
+  body=$(fetch_body "$label" "$host/sitemap.xml")
+  assert_contains "$label xml-decl-or-urlset" "$body" '<url'
+  assert_size_range "$label size" "$body" 1024 10485760   # 1KB – 10MB
+done
+
+# ── 3. Timeline RSS ──────────────────────────────────────────────────────────
+echo ""
+echo "=== 3. Timeline RSS ==="
+
+body=$(fetch_body "GET /timeline/rss.xml" "$WLT/timeline/rss.xml")
+assert_contains "rss opening tag" "$body" '<rss'
+
+# ── 4. /api/events?kind=permit  (regression: was rejected with 400) ──────────
+echo ""
+echo "=== 4. /api/events?kind=permit ==="
+
+body=$(fetch_body "GET /api/events?kind=permit" "$WLT/api/events?kind=permit")
+assert_valid_json "events/permit response" "$body"
+assert_json_array "events/permit .events" "$body" "events"
+# Confirm kind filter echoed back (proves VALID_KINDS includes 'permit')
+if echo "$body" | jq -e '.filters.kind == "permit"' &>/dev/null; then
+  ok "events/permit  filters.kind=permit echoed"
+else
+  fail "events/permit  filters.kind not echoed as 'permit'"
+fi
+
+# ── 5. /api/search?q=test ───────────────────────────────────────────────────
+echo ""
+echo "=== 5. /api/search ==="
+
+body=$(fetch_body "GET /api/search?q=test" "$WLT/api/search?q=test")
+assert_valid_json "search response" "$body"
+
+# ── 6. Known-good slug from DB ───────────────────────────────────────────────
+echo ""
+echo "=== 6. Address slug page ==="
+
+SLUG=$(ssh -o BatchMode=yes -o ConnectTimeout=10 "$KAMATERA_SSH" \
+  "sudo -u postgres psql -Atq -d $DB_NAME -c \"SELECT slug FROM listing WHERE is_public=true LIMIT 1\"" 2>/dev/null \
+  || echo "")
+
+if [[ -z "$SLUG" ]]; then
+  fail "slug lookup  could not retrieve slug from DB (ssh or psql failed)"
+else
+  ok "slug lookup  got '$SLUG'"
+  body=$(fetch_body "GET /address/$SLUG" "$WLT/address/$SLUG")
+  assert_nonempty "address/$SLUG body" "$body"
+  assert_contains "address/$SLUG is HTML" "$body" '<html'
+fi
+
+# ── 7. robots.txt ────────────────────────────────────────────────────────────
+echo ""
+echo "=== 7. robots.txt ==="
+
+body=$(fetch_body "GET /robots.txt" "$WLT/robots.txt")
+assert_contains "robots sitemap directive" "$body" "Sitemap:"
+
+# ── Summary ──────────────────────────────────────────────────────────────────
+END=$(date +%s)
+ELAPSED=$(( END - START ))
+TOTAL=$(( PASS + FAIL ))
+
+echo ""
+echo "============================================"
+echo "  Smoke result: ${PASS}/${TOTAL} passed  (${ELAPSED}s)"
+echo "============================================"
+
+if (( FAIL > 0 )); then
+  echo "  FAILED — ${FAIL} check(s) did not pass"
+  exit 1
+fi
+
+echo "  ALL CHECKS PASSED"
+exit 0
diff --git a/src/app/address/[slug]/page.tsx b/src/app/address/[slug]/page.tsx
index b500402..ebae689 100644
--- a/src/app/address/[slug]/page.tsx
+++ b/src/app/address/[slug]/page.tsx
@@ -1,10 +1,11 @@
 import { notFound } from 'next/navigation';
+import { cache } from 'react';
 import type { Metadata } from 'next';
 import {
-  getListingBySlug,
+  getListingBySlug as _getListingBySlug,
   getListingAssociations,
   getNearbyListings,
-  getEventsForListing,
+  getEventsForListing as _getEventsForListing,
   getMediaForListing,
   getStructuresForListing,
   getParcelForListing,
@@ -13,6 +14,11 @@ import {
   yearOf,
 } from '@/lib/db';
 
+// Per-request memoization: generateMetadata + page body each call these once;
+// React `cache()` dedupes within a single render so we hit PG only once each.
+const getListingBySlug = cache(_getListingBySlug);
+const getEventsForListing = cache(_getEventsForListing);
+
 export async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {
   const listing = await getListingBySlug(params.slug);
   if (!listing) return { robots: { index: false, follow: false } };
@@ -63,6 +69,18 @@ export default async function AddressPage({ params }: { params: { slug: string }
 
   const surface = await currentSurface();
 
+  // Kick off the LA-arcgis fetch concurrently with the Promise.all below.
+  // It doesn't depend on any of those queries so there's no reason to wait.
+  const laParcelPromise = (listing.address_line1 || listing.title)
+    ? getOrFetchParcelForAddress(
+        `${listing.address_line1 ?? listing.title} ${listing.city ?? ''}`.trim(),
+        listing.id,
+      ).catch((err) => {
+        console.error('[address] getOrFetchParcelForAddress failed', { slug: listing.slug, err });
+        return null;
+      })
+    : Promise.resolve(null);
+
   const [associations, nearby, placeEvents, media, structures, parcel, productions, nearbyFilming] = await Promise.all([
     getListingAssociations(listing.id),
     listing.city ? getNearbyListings(listing.city, listing.id, 3) : Promise.resolve([]),
@@ -77,25 +95,21 @@ export default async function AddressPage({ params }: { params: { slug: string }
   // For the films-at-this-address grid: only render if PD images actually exist
   // for the linked productions. Avoids the empty placeholder strip seen on most
   // listings (where productions exist but no PD image has been matched yet).
-  const filmsHere = productions.length
-    ? await listPdFilmImages({ productionIds: productions.map(p => p.production_id), limit: 36 })
-    : [];
-
-  // Real LA County assessor data — cache-first lookup. Falls through to local
-  // structure data if ArcGIS misses (e.g. address outside LA County or normalization fails).
-  // Variable name is `laParcel` because `parcel` already refers to the local
-  // pastdoor `parcel` table (`getParcelForListing` above).
-  const laParcel = listing.address_line1 || listing.title
-    ? await getOrFetchParcelForAddress(
-        `${listing.address_line1 ?? listing.title} ${listing.city ?? ''}`.trim(),
-        listing.id
-      ).catch(() => null)
-    : null;
+  // Resolve laParcel + filmsHere in parallel — both need to settle before render.
+  const [filmsHere, laParcel] = await Promise.all([
+    productions.length
+      ? listPdFilmImages({ productionIds: productions.map(p => p.production_id), limit: 36 })
+      : Promise.resolve([]),
+    laParcelPromise,
+  ]);
 
   // LA City permits — only resolves if parcel is in City of LA (not BH/SM/etc).
   // Cache-first via la_permit table.
   const laPermits = laParcel?.apn
-    ? await getPermitsForApn(laParcel.apn, { limit: 50 }).catch(() => [])
+    ? await getPermitsForApn(laParcel.apn, { limit: 50 }).catch((err) => {
+        console.error('[address] getPermitsForApn failed', { slug: listing.slug, apn: laParcel.apn, err });
+        return [];
+      })
     : [];
 
   const events: TimelineEvent[] = placeEvents.map(pe => ({
@@ -134,12 +148,17 @@ export default async function AddressPage({ params }: { params: { slug: string }
       longitude: Number(listing.longitude),
     };
   }
+  // schema.org has no canonical "year built"; use additionalProperty.
+  // Build unconditionally so APN survives even when year_built is missing.
+  const additionalProperty: Array<{ '@type': string; name: string; value: unknown }> = [];
   if (structures[0]?.year_built) {
-    // schema.org has no canonical "year built"; use additionalProperty.
-    jsonLd.additionalProperty = [
-      { '@type': 'PropertyValue', name: 'Year built', value: structures[0].year_built },
-      ...(parcel ? [{ '@type': 'PropertyValue', name: 'APN', value: parcel.apn }] : []),
-    ];
+    additionalProperty.push({ '@type': 'PropertyValue', name: 'Year built', value: structures[0].year_built });
+  }
+  if (parcel) {
+    additionalProperty.push({ '@type': 'PropertyValue', name: 'APN', value: parcel.apn });
+  }
+  if (additionalProperty.length > 0) {
+    jsonLd.additionalProperty = additionalProperty;
   }
   if (listing.description) jsonLd.description = listing.description;
 
@@ -164,7 +183,9 @@ export default async function AddressPage({ params }: { params: { slug: string }
         <BreadcrumbArchive
           items={[
             { label: 'Archive', href: '/browse' },
-            { label: listing.city ?? '—', href: `/neighborhood/${(listing.city ?? '').toLowerCase().replace(/\s+/g, '-')}` },
+            listing.city
+              ? { label: listing.city, href: `/neighborhood/${listing.city.toLowerCase().replace(/\s+/g, '-')}` }
+              : { label: '—' },
             { label: listing.postal_code ?? '—' },
             { label: listing.title },
           ]}
@@ -256,13 +277,13 @@ export default async function AddressPage({ params }: { params: { slug: string }
               {listing.property_type && (
                 <FactRow label="Type" value={listing.property_type} tier="A" sourceLabel="assessor" />
               )}
-              {listing.bedrooms && (
+              {listing.bedrooms != null && (
                 <FactRow label="Bedrooms" value={listing.bedrooms} tier="A" sourceLabel="assessor" />
               )}
-              {listing.bathrooms && (
+              {listing.bathrooms != null && (
                 <FactRow label="Bathrooms" value={listing.bathrooms} tier="A" sourceLabel="assessor" />
               )}
-              {listing.sleeps && (
+              {listing.sleeps != null && (
                 <FactRow label="Sleeps" value={listing.sleeps} tier="C" sourceLabel="owner" />
               )}
               {listing.amenities.length > 0 && (
@@ -417,7 +438,8 @@ export default async function AddressPage({ params }: { params: { slug: string }
           <ClaimCTA slug={listing.slug} />
 
           {/* --- WALLED OFF SPONSORED MODULE --- */}
-          {listing.source_url && (
+          {/* Only allow http(s) URLs; block javascript:, data:, vbscript:, etc. */}
+          {listing.source_url && /^https?:\/\//i.test(listing.source_url) && (
             <SponsoredCard
               source={
                 listing.source === 'zillow'
diff --git a/src/app/admin/data/page.tsx b/src/app/admin/data/page.tsx
index bb77023..d0a9b2a 100644
--- a/src/app/admin/data/page.tsx
+++ b/src/app/admin/data/page.tsx
@@ -1,5 +1,6 @@
 import Link from 'next/link';
 import { pool } from '@/lib/db';
+import { safeHttpUrlUnknown as safeHttpUrl } from '@/lib/url-guards';
 
 export const dynamic = 'force-dynamic';
 
@@ -202,7 +203,7 @@ function fmt(v: any, format?: string) {
     return s.slice(0, 10);
   }
   if (format === 'money') {
-    const n = parseFloat(String(v));
+    const n = Number(String(v).replace(/[^0-9.-]/g, ''));
     if (!isFinite(n)) return String(v);
     return `$${n.toLocaleString()}`;
   }
@@ -214,7 +215,21 @@ function fmt(v: any, format?: string) {
   return String(v);
 }
 
+// Whitelist identifiers from SOURCES so callers can never inject SQL via table/col.
+const ALLOWED_TABLES = new Set(SOURCES.map(s => s.table));
+const ALLOWED_COLS = new Set<string>(
+  SOURCES.flatMap(s => [
+    ...s.searchFields,
+    ...s.displayFields.map(d => d.col),
+    ...(s.filterable ?? []).map(f => f.col),
+    s.sourceUrlField, s.sourceLabelField,
+  ].filter(Boolean) as string[])
+);
+const IDENT_RE = /^[a-z_][a-z0-9_]*$/i;
+
 async function getDistinctValues(table: string, col: string): Promise<string[]> {
+  if (!IDENT_RE.test(table) || !IDENT_RE.test(col)) return [];
+  if (!ALLOWED_TABLES.has(table) || !ALLOWED_COLS.has(col)) return [];
   try {
     const r = await pool.query<{ v: string }>(
       `SELECT DISTINCT ${col} as v FROM ${table} WHERE ${col} IS NOT NULL ORDER BY ${col} LIMIT 50`
@@ -223,36 +238,63 @@ async function getDistinctValues(table: string, col: string): Promise<string[]>
   } catch { return []; }
 }
 
+// Validate ORDER BY clause: only "<col> [ASC|DESC] [NULLS FIRST|LAST]", optionally comma-separated.
+function safeSortClause(sort: string | undefined): string {
+  if (!sort) return '1';
+  const parts = sort.split(',').map(s => s.trim());
+  for (const p of parts) {
+    const m = /^([a-z_][a-z0-9_]*)(\s+(ASC|DESC))?(\s+NULLS\s+(FIRST|LAST))?$/i.exec(p);
+    if (!m) return '1';
+    if (!ALLOWED_COLS.has(m[1]!.toLowerCase()) && !/^\d+$/.test(m[1]!)) return '1';
+  }
+  return parts.join(', ');
+}
+
 async function search(src: Source, q: string, filters: Record<string, string>, page: number) {
+  // src.table comes from a hardcoded SOURCES entry, but defense-in-depth:
+  if (!IDENT_RE.test(src.table) || !ALLOWED_TABLES.has(src.table)) {
+    return { rows: [], total: 0 };
+  }
   const where: string[] = [];
   const params: any[] = [];
-  if (q) {
-    const orParts = src.searchFields.map(f => {
-      params.push(`%${q}%`);
-      return `${f}::text ILIKE $${params.length}`;
-    });
-    where.push(`(${orParts.join(' OR ')})`);
+  // Cap query length to bound seq-scan cost.
+  const qSafe = q.slice(0, 200);
+  if (qSafe) {
+    const orParts: string[] = [];
+    for (const f of src.searchFields) {
+      if (!IDENT_RE.test(f) || !ALLOWED_COLS.has(f)) continue;
+      params.push(`%${qSafe}%`);
+      orParts.push(`${f}::text ILIKE $${params.length}`);
+    }
+    if (orParts.length) where.push(`(${orParts.join(' OR ')})`);
   }
   for (const [k, v] of Object.entries(filters)) {
-    if (v) {
-      params.push(v);
-      where.push(`${k}::text = $${params.length}`);
-    }
+    if (!v) continue;
+    if (!IDENT_RE.test(k) || !ALLOWED_COLS.has(k)) continue;
+    params.push(v);
+    where.push(`${k}::text = $${params.length}`);
   }
   const whereSql = where.length ? `WHERE ${where.join(' AND ')}` : '';
-  const cols = Array.from(new Set([
+  const colsList = Array.from(new Set([
     ...src.displayFields.map(d => d.col),
     src.sourceUrlField, src.sourceLabelField,
-  ].filter(Boolean) as string[])).join(', ');
-  const sortClause = src.defaultSort ?? '1';
-  const offset = page * PAGE_SIZE;
+  ].filter(Boolean) as string[])).filter(c => IDENT_RE.test(c) && ALLOWED_COLS.has(c));
+  const cols = colsList.length ? colsList.join(', ') : '1';
+  const sortClause = safeSortClause(src.defaultSort);
+  const offset = Math.max(0, page) * PAGE_SIZE;
   const sql = `SELECT ${cols} FROM ${src.table} ${whereSql} ORDER BY ${sortClause} LIMIT ${PAGE_SIZE} OFFSET ${offset}`;
   const countSql = `SELECT count(*)::text as n FROM ${src.table} ${whereSql}`;
-  const [rows, count] = await Promise.all([
-    pool.query<any>(sql, params),
-    pool.query<{ n: string }>(countSql, params),
-  ]);
-  return { rows: rows.rows, total: parseInt(count.rows[0]!.n) };
+  try {
+    const [rows, count] = await Promise.all([
+      pool.query<any>(sql, params),
+      pool.query<{ n: string }>(countSql, params),
+    ]);
+    const n = Number(count.rows[0]?.n ?? 0);
+    return { rows: rows.rows, total: Number.isFinite(n) ? n : 0 };
+  } catch {
+    // Suppress error details from leaking into the response.
+    return { rows: [], total: 0 };
+  }
 }
 
 export default async function AdminDataPage({
@@ -262,8 +304,9 @@ export default async function AdminDataPage({
 }) {
   const sourceKey = searchParams.source ?? 'listing';
   const src = SOURCES.find(s => s.key === sourceKey) ?? SOURCES[0]!;
-  const q = (searchParams.q ?? '').trim();
-  const page = parseInt(searchParams.page ?? '0', 10);
+  const q = (searchParams.q ?? '').trim().slice(0, 200);
+  const rawPage = Number(searchParams.page ?? '0');
+  const page = Number.isFinite(rawPage) ? Math.min(10000, Math.max(0, Math.floor(rawPage))) : 0;
   const filters: Record<string, string> = {};
   for (const f of src.filterable ?? []) {
     if (searchParams[f.col]) filters[f.col] = searchParams[f.col]!;
@@ -277,16 +320,23 @@ export default async function AdminDataPage({
     filterOpts[f.col] = await getDistinctValues(src.table, f.col);
   }
 
-  const buildHref = (overrides: Record<string, string | undefined>) => {
+  // Sentinel: caller passes a key set to `null` to explicitly remove it; passing
+  // `undefined` means "leave alone, inherit current". The previous version
+  // conflated the two and made prev-page from page 1 a no-op.
+  const buildHref = (overrides: Record<string, string | null>) => {
     const p = new URLSearchParams();
     p.set('source', sourceKey);
-    if (q && overrides.q !== '') p.set('q', overrides.q ?? q);
+    if (!('q' in overrides)) {
+      if (q) p.set('q', q);
+    } else if (overrides.q) {
+      p.set('q', overrides.q);
+    }
     for (const [k, v] of Object.entries(filters)) {
-      if (overrides[k] !== undefined) {
+      if (k in overrides) {
         if (overrides[k]) p.set(k, overrides[k]!);
       } else if (v) p.set(k, v);
     }
-    if (overrides.page !== undefined) {
+    if ('page' in overrides) {
       if (overrides.page) p.set('page', overrides.page);
     } else if (page > 0) p.set('page', String(page));
     return `/admin/data?${p}`;
@@ -368,15 +418,18 @@ export default async function AdminDataPage({
                       {fmt(r[f.col], f.format)}
                     </td>
                   ))}
-                  {src.sourceUrlField && (
-                    <td className="p-2.5 align-top font-mono">
-                      {r[src.sourceUrlField] ? (
-                        <a href={r[src.sourceUrlField]} target="_blank" rel="noreferrer noopener" className="text-coral hover:underline">
-                          {r[src.sourceLabelField!] ?? 'link'} ↗
-                        </a>
-                      ) : <span className="text-ink/30">—</span>}
-                    </td>
-                  )}
+                  {src.sourceUrlField && (() => {
+                    const safeUrl = safeHttpUrl(r[src.sourceUrlField!]);
+                    return (
+                      <td className="p-2.5 align-top font-mono">
+                        {safeUrl ? (
+                          <a href={safeUrl} target="_blank" rel="noreferrer noopener" className="text-coral hover:underline">
+                            {r[src.sourceLabelField!] ?? 'link'} ↗
+                          </a>
+                        ) : <span className="text-ink/30">—</span>}
+                      </td>
+                    );
+                  })()}
                 </tr>
               ))
             )}
@@ -386,7 +439,7 @@ export default async function AdminDataPage({
 
       <div className="flex justify-between items-center text-xs">
         {page > 0 ? (
-          <Link href={buildHref({ page: page === 1 ? undefined : String(page - 1) })} className="text-ink/70 hover:text-coral">← prev</Link>
+          <Link href={buildHref({ page: page === 1 ? null : String(page - 1) })} className="text-ink/70 hover:text-coral">← prev</Link>
         ) : <span />}
         {(page + 1) * PAGE_SIZE < total ? (
           <Link href={buildHref({ page: String(page + 1) })} className="text-ink/70 hover:text-coral">next →</Link>
diff --git a/src/app/admin/layout.tsx b/src/app/admin/layout.tsx
index d700338..f87d1b8 100644
--- a/src/app/admin/layout.tsx
+++ b/src/app/admin/layout.tsx
@@ -1,8 +1,14 @@
 import Link from 'next/link';
+import { headers } from 'next/headers';
 import type { Metadata } from 'next';
 
+// Admin shell must never be statically optimized or edge-cached.
+// Auth is enforced by middleware.ts adminGate(); this is defense-in-depth.
+export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
+
 export const metadata: Metadata = {
-  robots: { index: false, follow: false },
+  robots: { index: false, follow: false, nocache: true, noarchive: true },
   title: { default: 'Admin', template: '%s · Admin' },
 };
 
@@ -16,7 +22,24 @@ const TABS = [
   { href: '/admin/seeds',     label: 'Seed data' },
 ];
 
+function isActive(pathname: string, href: string): boolean {
+  if (href === '/admin') return pathname === '/admin' || pathname === '/admin/';
+  return pathname === href || pathname.startsWith(href + '/');
+}
+
 export default function AdminLayout({ children }: { children: React.ReactNode }) {
+  // Next 14 sets `x-invoke-path` / `x-pathname` / `next-url` on the incoming
+  // headers. We try a couple of conventional ones; missing → no active tab,
+  // which is harmless.
+  const h = headers();
+  const pathname =
+    h.get('x-invoke-path') ||
+    h.get('x-pathname') ||
+    h.get('next-url') ||
+    '';
+
+  const isDev = process.env.NODE_ENV !== 'production';
+
   return (
     <div className="min-h-screen bg-sand">
       <header className="border-b border-ink/10 bg-ink text-sand">
@@ -24,26 +47,40 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
           <Link href="/admin" className="font-display text-xl text-sand hover:text-coral transition">
             ◢ Admin Console
           </Link>
-          <span className="text-[10px] uppercase tracking-[0.15em] text-sand/50 font-mono">
-            stayclaim · pastdoor backend
-          </span>
+          {isDev ? (
+            <span className="text-[10px] uppercase tracking-[0.15em] text-coral/80 font-mono">
+              dev environment
+            </span>
+          ) : null}
         </div>
-        <nav className="max-w-7xl mx-auto px-6 flex flex-wrap gap-1 text-xs uppercase tracking-wider">
-          {TABS.map(t => (
-            <Link
-              key={t.href}
-              href={t.href}
-              className="px-3 py-2 hover:bg-coral hover:text-ink transition border-b border-transparent"
-            >
-              {t.label}
-            </Link>
-          ))}
+        <nav
+          aria-label="Admin sections"
+          className="max-w-7xl mx-auto px-6 flex flex-wrap gap-1 text-xs uppercase tracking-wider"
+        >
+          {TABS.map(t => {
+            const active = isActive(pathname, t.href);
+            return (
+              <Link
+                key={t.href}
+                href={t.href}
+                aria-current={active ? 'page' : undefined}
+                className={
+                  'px-3 py-2 transition border-b ' +
+                  (active
+                    ? 'bg-coral text-ink border-ink'
+                    : 'border-transparent hover:bg-coral hover:text-ink')
+                }
+              >
+                {t.label}
+              </Link>
+            );
+          })}
         </nav>
       </header>
       <main className="max-w-7xl mx-auto px-6 py-8">{children}</main>
       <footer className="max-w-7xl mx-auto px-6 py-8 mt-12 border-t border-ink/10 text-[10px] uppercase tracking-[0.15em] text-ink/40 flex justify-between">
-        <span>admin · auth: dev-mode (no auth)</span>
-        <span>localhost only — wire real auth before production</span>
+        <span>admin</span>
+        {isDev ? <span>dev mode</span> : null}
       </footer>
     </div>
   );
diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx
index 090a331..ccd93c5 100644
--- a/src/app/admin/page.tsx
+++ b/src/app/admin/page.tsx
@@ -1,11 +1,33 @@
 import Link from 'next/link';
 import { pool } from '@/lib/db';
 
+export const runtime = 'nodejs';
 export const dynamic = 'force-dynamic';
 
 type CountRow = { metric: string; n: string };
 
+// Wrap a query in a per-statement timeout so a single hung query (lock,
+// runaway seq scan) can't block the SSR response indefinitely and tie up a
+// Node worker. statement_timeout is SET LOCAL → only lives inside this txn.
+async function withTimeout<T>(fn: (client: import('pg').PoolClient) => Promise<T>): Promise<T> {
+  const client = await pool.connect();
+  try {
+    await client.query("BEGIN");
+    await client.query("SET LOCAL statement_timeout = '5s'");
+    const out = await fn(client);
+    await client.query("COMMIT");
+    return out;
+  } catch (e) {
+    try { await client.query("ROLLBACK"); } catch { /* ignore */ }
+    throw e;
+  } finally {
+    client.release();
+  }
+}
+
 async function getOverview(): Promise<CountRow[]> {
+  // NOTE: parens around `count(*) FILTER (...)` so the `::text` cast applies
+  // to the count, not to the filter predicate (was ambiguous before).
   const sql = `
     SELECT 'listings (public)'        as metric, count(*)::text as n FROM listing WHERE is_public = true
     UNION ALL SELECT 'listings (hidden)',         count(*)::text FROM listing WHERE is_public = false
@@ -15,47 +37,49 @@ async function getOverview(): Promise<CountRow[]> {
     UNION ALL SELECT 'film productions',          count(*)::text FROM film_production
     UNION ALL SELECT 'filming locations',         count(*)::text FROM filming_location
     UNION ALL SELECT 'newspaper issues',          count(*)::text FROM news_issue
-    UNION ALL SELECT 'newspaper issues (OCR fetched)', count(*) FILTER (WHERE ocr_text IS NOT NULL AND ocr_text <> '')::text FROM news_issue
+    UNION ALL SELECT 'newspaper issues (OCR fetched)', (count(*) FILTER (WHERE ocr_text IS NOT NULL AND ocr_text <> ''))::text FROM news_issue
     UNION ALL SELECT 'address mentions in news',  count(*)::text FROM news_address_mention
-    UNION ALL SELECT 'address mentions matched',  count(*) FILTER (WHERE listing_id IS NOT NULL)::text FROM news_address_mention
+    UNION ALL SELECT 'address mentions matched',  (count(*) FILTER (WHERE listing_id IS NOT NULL))::text FROM news_address_mention
     UNION ALL SELECT 'entities (people)',         count(*)::text FROM entity
     UNION ALL SELECT 'place events',              count(*)::text FROM place_event
     UNION ALL SELECT 'address submissions',       count(*)::text FROM address_submission
     UNION ALL SELECT 'pending claim requests',    count(*)::text FROM claim_request WHERE status = 'pending'
     UNION ALL SELECT 'sponsored placements',      count(*)::text FROM sponsored_placement
   `;
-  const { rows } = await pool.query<CountRow>(sql);
+  const rows = await withTimeout(c => c.query<CountRow>(sql).then(r => r.rows));
   return rows;
 }
 
 async function getSourceBreakdown() {
-  const { rows } = await pool.query<{ source: string; n: string; visible: string }>(`
+  const rows = await withTimeout(c => c.query<{ source: string; n: string; visible: string }>(`
     SELECT
       source,
       count(*)::text as n,
-      count(*) FILTER (WHERE is_public)::text as visible
+      (count(*) FILTER (WHERE is_public))::text as visible
     FROM listing
     GROUP BY source
     ORDER BY count(*) DESC
-  `);
+  `).then(r => r.rows));
   return rows;
 }
 
 async function getRecentIngests() {
-  const { rows } = await pool.query<{ source: string; latest: string; n: string }>(`
-    SELECT
-      'listing/' || source as source,
-      max(updated_at)::text as latest,
-      count(*)::text as n
-    FROM listing
-    GROUP BY source
-    UNION ALL
-    SELECT 'permit/'||source_dataset, max(retrieved_at)::text, count(*)::text FROM permit GROUP BY source_dataset
-    UNION ALL
-    SELECT 'news_issue/'||paper_short, max(metadata_at)::text, count(*)::text FROM news_issue GROUP BY paper_short
-    ORDER BY 2 DESC NULLS LAST
+  // Order on the raw timestamp (not its text cast), then stringify so sort
+  // doesn't break the moment any branch returns a different timestamp format.
+  const rows = await withTimeout(c => c.query<{ source: string; latest: string | null; n: string }>(`
+    SELECT source, latest::text as latest, n::text as n FROM (
+      SELECT 'listing/' || source as source, max(updated_at) as latest, count(*) as n
+        FROM listing GROUP BY source
+      UNION ALL
+      SELECT 'permit/' || source_dataset, max(retrieved_at), count(*)
+        FROM permit GROUP BY source_dataset
+      UNION ALL
+      SELECT 'news_issue/' || paper_short, max(metadata_at), count(*)
+        FROM news_issue GROUP BY paper_short
+    ) t
+    ORDER BY latest DESC NULLS LAST
     LIMIT 20
-  `);
+  `).then(r => r.rows));
   return rows;
 }
 
@@ -68,11 +92,20 @@ const QUICK_LINKS = [
   { href: '/admin/seeds',    label: 'Seed / fake data',       hint: 'review and remove demo content' },
 ];
 
+// Render a number column safely: never show "NaN", never throw on null.
+function n2(v: string | number | null | undefined): number {
+  const n = Number(v ?? 0);
+  return Number.isFinite(n) ? n : 0;
+}
+
 export default async function AdminOverviewPage() {
+  // Catch each fetch independently so one bad query doesn't blank the whole
+  // page and so error details never leak through Next's default error UI.
+  // Server-side console.error keeps the trace for ops; the user gets [].
   const [overview, sources, recent] = await Promise.all([
-    getOverview(),
-    getSourceBreakdown(),
-    getRecentIngests(),
+    getOverview().catch(e => { console.error('[admin] getOverview failed:', e); return [] as CountRow[]; }),
+    getSourceBreakdown().catch(e => { console.error('[admin] getSourceBreakdown failed:', e); return []; }),
+    getRecentIngests().catch(e => { console.error('[admin] getRecentIngests failed:', e); return []; }),
   ]);
 
   return (
@@ -89,7 +122,7 @@ export default async function AdminOverviewPage() {
             <div key={r.metric} className="border border-ink/10 bg-white p-4">
               <p className="text-[10px] uppercase tracking-[0.15em] text-ink/50">{r.metric}</p>
               <p className="font-display text-3xl text-ink tabular-nums mt-1">
-                {parseInt(r.n).toLocaleString()}
+                {n2(r.n).toLocaleString()}
               </p>
             </div>
           ))}
@@ -109,12 +142,12 @@ export default async function AdminOverviewPage() {
           </thead>
           <tbody>
             {sources.map(s => {
-              const total = parseInt(s.n);
-              const visible = parseInt(s.visible);
+              const total = n2(s.n);
+              const visible = n2(s.visible);
               const hidden = total - visible;
               const isFake = s.source === 'manual';
               return (
-                <tr key={s.source} className={`border-t border-ink/5 ${isFake ? 'bg-coral/5' : ''}`}>
+                <tr key={s.source ?? 'unknown'} className={`border-t border-ink/5 ${isFake ? 'bg-coral/5' : ''}`}>
                   <td className="p-3 font-mono text-xs">
                     {s.source}
                     {isFake && <span className="ml-2 text-[10px] uppercase tracking-wider text-coral">SEED</span>}
@@ -141,10 +174,10 @@ export default async function AdminOverviewPage() {
           </thead>
           <tbody>
             {recent.map(r => (
-              <tr key={r.source} className="border-t border-ink/5">
+              <tr key={r.source ?? 'unknown'} className="border-t border-ink/5">
                 <td className="p-3 font-mono text-xs">{r.source}</td>
-                <td className="p-3 text-ink/65">{r.latest?.slice(0, 19) ?? '—'}</td>
-                <td className="p-3 text-right tabular-nums">{parseInt(r.n).toLocaleString()}</td>
+                <td className="p-3 text-ink/65">{r.latest ? r.latest.slice(0, 19) : '—'}</td>
+                <td className="p-3 text-right tabular-nums">{n2(r.n).toLocaleString()}</td>
               </tr>
             ))}
           </tbody>
diff --git a/src/app/admin/sources/page.tsx b/src/app/admin/sources/page.tsx
index 725b8af..d93571a 100644
--- a/src/app/admin/sources/page.tsx
+++ b/src/app/admin/sources/page.tsx
@@ -17,20 +17,41 @@ type Source = {
 /** Curated source registry — the canonical list. Keep this in sync with the
  *  la-research-agent's source map at ~/.claude/agents/la-research-agent.md. */
 async function getRegistry(): Promise<Source[]> {
-  // counts from the DB where applicable
-  const counts = await pool.query<{ k: string; n: string }>(`
-    SELECT 'ladbs_permit' as k, count(*)::text as n FROM listing WHERE source='ladbs_permit'
-    UNION ALL SELECT 'pi9x-tg5x', count(*)::text FROM permit WHERE source_dataset='pi9x-tg5x'
-    UNION ALL SELECT 'dyxf-7hc4', count(*)::text FROM permit WHERE source_dataset='dyxf-7hc4'
-    UNION ALL SELECT 'e67z-kt2n', count(*)::text FROM permit WHERE source_dataset='e67z-kt2n'
-    UNION ALL SELECT 'weho_film_permit', count(*)::text FROM filming_location WHERE source_label LIKE '%WeHo%'
-    UNION ALL SELECT 'la_daily_herald', count(*)::text FROM news_issue WHERE paper_short='LADailyHerald'
-    UNION ALL SELECT 'la_times', count(*)::text FROM news_issue WHERE paper_short='LATimes'
-    UNION ALL SELECT 'pomona_progress', count(*)::text FROM news_issue WHERE paper_short='PomonaProgress'
-    UNION ALL SELECT 'santa_ana_register', count(*)::text FROM news_issue WHERE paper_short='SantaAnaRegister'
-  `);
-  const c = Object.fromEntries(counts.rows.map(r => [r.k, parseInt(r.n).toLocaleString()]));
+  // counts from the DB where applicable. Wrapped in try/catch so a single
+  // missing column / table-rename doesn't 500 the entire registry view.
+  // Bounded statement_timeout protects the pool from large unindexed scans.
+  // Dropped the unused 'ladbs_permit' count (was never consumed below — it
+  // would otherwise be a wasted full scan of `listing` on every page load).
   const noVal = '—';
+  let c: Record<string, string> = {};
+  try {
+    const client = await pool.connect();
+    try {
+      await client.query("SET LOCAL statement_timeout = '5s'");
+      const counts = await client.query<{ k: string; n: string }>(`
+        SELECT 'pi9x-tg5x' as k, count(*)::text as n FROM permit WHERE source_dataset='pi9x-tg5x'
+        UNION ALL SELECT 'dyxf-7hc4', count(*)::text FROM permit WHERE source_dataset='dyxf-7hc4'
+        UNION ALL SELECT 'e67z-kt2n', count(*)::text FROM permit WHERE source_dataset='e67z-kt2n'
+        UNION ALL SELECT 'weho_film_permit', count(*)::text FROM filming_location WHERE source_label LIKE '%WeHo%'
+        UNION ALL SELECT 'la_daily_herald', count(*)::text FROM news_issue WHERE paper_short='LADailyHerald'
+        UNION ALL SELECT 'la_times', count(*)::text FROM news_issue WHERE paper_short='LATimes'
+        UNION ALL SELECT 'pomona_progress', count(*)::text FROM news_issue WHERE paper_short='PomonaProgress'
+        UNION ALL SELECT 'santa_ana_register', count(*)::text FROM news_issue WHERE paper_short='SantaAnaRegister'
+      `);
+      c = Object.fromEntries(
+        counts.rows.map(r => {
+          const n = Number(r.n);
+          return [r.k, Number.isFinite(n) ? n.toLocaleString() : noVal];
+        })
+      );
+    } finally {
+      client.release();
+    }
+  } catch {
+    // Schema drift / DB unavailable / timeout: fall through with empty counts;
+    // the static registry below still renders with `noVal` placeholders.
+    c = {};
+  }
 
   return [
     // Permits — LA City
@@ -190,10 +211,14 @@ export default async function AdminSourcesPage() {
               {byCat[cat]!.map(s => (
                 <tr key={s.key} className="border-t border-ink/5 align-top">
                   <td className="p-3">
-                    <a href={s.url} target="_blank" rel="noreferrer noopener"
-                       className="font-display text-base text-ink hover:text-coral transition">
-                      {s.name} ↗
-                    </a>
+                    {/^https?:\/\//i.test(s.url) ? (
+                      <a href={s.url} target="_blank" rel="noreferrer noopener"
+                         className="font-display text-base text-ink hover:text-coral transition">
+                        {s.name} ↗
+                      </a>
+                    ) : (
+                      <span className="font-display text-base text-ink">{s.name}</span>
+                    )}
                     <p className="font-mono text-[10px] text-ink/40 mt-0.5">{s.key}</p>
                   </td>
                   <td className="p-3">
diff --git a/src/app/api/events/route.ts b/src/app/api/events/route.ts
index 21bf846..58fb7e9 100644
--- a/src/app/api/events/route.ts
+++ b/src/app/api/events/route.ts
@@ -1,21 +1,67 @@
 import { NextResponse } from 'next/server';
 import { getArchiveTimeline } from '@/lib/db';
 
+export const dynamic = 'force-dynamic';
+
 /**
  * GET /api/events?kind=permit&decade=2020s&city=Beverly+Hills
  * Public read-only feed. Tier-D never returned. Cache-friendly.
  */
+
+// Allow-list of valid event kinds (mirrors place_event.kind enum). Anything
+// else is rejected with 400 so callers can't probe arbitrary column values
+// or trigger expensive scans.
+// Mirror PlaceEvent.kind union in src/lib/db.ts. Stale entries here silently
+// rejected every legitimate request with 400.
+const VALID_KINDS = new Set([
+  'permit', 'sale', 'remodel', 'demolition', 'designation', 'media', 'occupancy',
+]);
+const DECADE_RE = /^\d{3}0s$/;
+
 export async function GET(req: Request) {
   const url = new URL(req.url);
-  const kind = url.searchParams.get('kind') ?? undefined;
-  const decade = url.searchParams.get('decade') ?? undefined;
-  const city = url.searchParams.get('city') ?? undefined;
-  const limit = Math.min(500, Math.max(1, Number(url.searchParams.get('limit') ?? 100)));
+  const kindRaw = url.searchParams.get('kind') ?? undefined;
+  const decadeRaw = url.searchParams.get('decade') ?? undefined;
+  const cityRaw = url.searchParams.get('city') ?? undefined;
+  const limitRaw = Number(url.searchParams.get('limit') ?? 100);
+
+  // Validate kind against allow-list.
+  if (kindRaw !== undefined && !VALID_KINDS.has(kindRaw)) {
+    return NextResponse.json({ error: 'invalid kind' }, { status: 400 });
+  }
+  // Validate decade format.
+  if (decadeRaw !== undefined && !DECADE_RE.test(decadeRaw)) {
+    return NextResponse.json({ error: 'invalid decade' }, { status: 400 });
+  }
+  // Cap city length and normalize for cache-key collapsing.
+  if (cityRaw !== undefined && cityRaw.length > 100) {
+    return NextResponse.json({ error: 'invalid city' }, { status: 400 });
+  }
+
+  const kind = kindRaw;
+  const decade = decadeRaw;
+  const city = cityRaw;
+  // NaN-safe limit clamp 1..500 (default 100).
+  const limit = Number.isFinite(limitRaw)
+    ? Math.min(500, Math.max(1, Math.floor(limitRaw)))
+    : 100;
 
-  const events = await getArchiveTimeline({ kind, decade, city, limit });
+  let events;
+  try {
+    events = await getArchiveTimeline({ kind, decade, city, limit });
+  } catch (e) {
+    console.error('api/events getArchiveTimeline', { kind, decade, city, limit }, e);
+    return NextResponse.json(
+      { error: 'internal error' },
+      { status: 500, headers: { 'Cache-Control': 'no-store' } }
+    );
+  }
   // Trim shape — API consumers don't need internal IDs.
+  // Filter Tier-D first, then slice to limit so the public response holds the
+  // promised number of non-D rows (instead of "up to limit, minus whatever was D").
   const out = events
     .filter(e => e.source_tier !== 'D')
+    .slice(0, limit)
     .map(e => ({
       kind: e.kind,
       summary: e.summary,
@@ -35,7 +81,6 @@ export async function GET(req: Request) {
 
   return NextResponse.json(
     {
-      generated_at: new Date().toISOString(),
       count: out.length,
       filters: { kind, decade, city, limit },
       events: out,
@@ -43,6 +88,7 @@ export async function GET(req: Request) {
     {
       headers: {
         'Cache-Control': 'public, max-age=300, s-maxage=900',
+        Vary: 'Accept-Encoding',
       },
     }
   );
diff --git a/src/app/api/la-records/lookup/route.ts b/src/app/api/la-records/lookup/route.ts
index 76552da..8ca1182 100644
--- a/src/app/api/la-records/lookup/route.ts
+++ b/src/app/api/la-records/lookup/route.ts
@@ -9,15 +9,28 @@
  */
 import { NextResponse } from 'next/server';
 import { getOrFetchParcelForAddress } from '@/lib/la-arcgis';
+import { rateLimit } from '@/lib/rate-limit';
 
 export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
 
 export async function GET(req: Request) {
+  const rl = await rateLimit('la-records');
+  if (!rl.ok) {
+    return NextResponse.json(
+      { ok: false, error: 'rate_limited' },
+      { status: 429, headers: { 'Retry-After': String(rl.retryAfter ?? 60) } },
+    );
+  }
+
   const { searchParams } = new URL(req.url);
   const q = searchParams.get('q')?.trim();
   if (!q || q.length < 6) {
     return NextResponse.json({ ok: false, error: 'query too short' }, { status: 400 });
   }
+  if (q.length > 200) {
+    return NextResponse.json({ ok: false, error: 'query too long' }, { status: 400 });
+  }
   try {
     const parcel = await getOrFetchParcelForAddress(q, null);
     if (!parcel) {
@@ -41,6 +54,7 @@ export async function GET(req: Request) {
       lng: parcel.lng,
     });
   } catch (e) {
-    return NextResponse.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, { status: 500 });
+    console.error('[la-records/lookup] error', e);
+    return NextResponse.json({ ok: false, error: 'lookup_failed' }, { status: 500 });
   }
 }
diff --git a/src/app/api/pastdoor-health/route.ts b/src/app/api/pastdoor-health/route.ts
index 1ad3ba5..c9bf899 100644
--- a/src/app/api/pastdoor-health/route.ts
+++ b/src/app/api/pastdoor-health/route.ts
@@ -12,6 +12,9 @@ import { headers } from 'next/headers';
 import { siteForHost } from '@/lib/site';
 import { pool } from '@/lib/db';
 
+export const dynamic = 'force-dynamic';
+export const runtime = 'nodejs';
+
 export async function GET() {
   const h = await headers();
   const host = h.get('x-pastdoor-host') || h.get('host');
@@ -21,24 +24,31 @@ export async function GET() {
   let dbLatencyMs = -1;
   try {
     const t0 = Date.now();
-    await pool.query('SELECT 1');
+    await Promise.race([
+      pool.query('SELECT 1'),
+      new Promise((_, reject) =>
+        setTimeout(() => reject(new Error('db health timeout')), 2000),
+      ),
+    ]);
     dbLatencyMs = Date.now() - t0;
     dbOk = true;
-  } catch {
+  } catch (err) {
+    console.error('pastdoor-health db check failed', err);
     dbOk = false;
   }
 
-  return NextResponse.json({
-    ok: dbOk,
-    host,
-    surface: {
-      key: surface.key,
-      domain: surface.domain,
-      brand: surface.brandName,
+  return NextResponse.json(
+    {
+      ok: dbOk,
+      host,
+      surface: {
+        key: surface.key,
+        domain: surface.domain,
+        brand: surface.brandName,
+      },
+      db: { ok: dbOk, latency_ms: dbLatencyMs },
+      timestamp: new Date().toISOString(),
     },
-    db: { ok: dbOk, latency_ms: dbLatencyMs },
-    node: process.version,
-    uptime_s: Math.round(process.uptime()),
-    timestamp: new Date().toISOString(),
-  });
+    { status: dbOk ? 200 : 503 },
+  );
 }
diff --git a/src/app/api/promote/route.ts b/src/app/api/promote/route.ts
index 22f8511..9be57c4 100644
--- a/src/app/api/promote/route.ts
+++ b/src/app/api/promote/route.ts
@@ -12,6 +12,10 @@ import { NextResponse } from 'next/server';
 import { z } from 'zod';
 import { pool } from '@/lib/db';
 import { FREE_FOREVER } from '@/lib/flags';
+import { rateLimit } from '@/lib/rate-limit';
+
+export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
 
 // Soft-disabled when FREE_FOREVER=true. Returns 410 Gone.
 async function checkRetired(): Promise<NextResponse | null> {
@@ -27,7 +31,10 @@ async function checkRetired(): Promise<NextResponse | null> {
 const Body = z.object({
   listing_id: z.string().uuid(),
   source: z.enum(['zillow', 'redfin', 'airbnb', 'other']),
-  external_url: z.string().url(),
+  // Restrict to http(s) only — z.string().url() permits javascript:/data:/file:.
+  external_url: z.string().url().refine((u) => /^https?:\/\//i.test(u), {
+    message: 'external_url must be http(s)',
+  }),
   headline: z.string().min(1).max(200),
   price_label: z.string().max(80).optional(),
   contact_email: z.string().email(),
@@ -39,27 +46,49 @@ export async function POST(req: Request) {
   const retired = await checkRetired();
   if (retired) return retired;
 
+  const rl = await rateLimit('promote');
+  if (!rl.ok) {
+    return NextResponse.json(
+      { error: 'rate_limited' },
+      { status: 429, headers: { 'Retry-After': String(rl.retryAfter ?? 600) } },
+    );
+  }
+
   let parsed;
   try {
     parsed = Body.parse(await req.json());
   } catch (e) {
-    return NextResponse.json({ error: 'invalid body', detail: String(e) }, { status: 400 });
+    if (e instanceof z.ZodError) {
+      return NextResponse.json(
+        { error: 'invalid body', fieldErrors: e.flatten().fieldErrors },
+        { status: 400 }
+      );
+    }
+    return NextResponse.json({ error: 'invalid body' }, { status: 400 });
+  }
+  try {
+    const r = await pool.query(
+      `INSERT INTO sponsored_placement
+       (listing_id, source, external_url, headline, price_label, contact_email, affiliation, permit_number)
+       VALUES ($1,$2,$3,$4,$5,$6,$7,$8)
+       RETURNING id, status, submitted_at`,
+      [
+        parsed.listing_id,
+        parsed.source,
+        parsed.external_url,
+        parsed.headline,
+        parsed.price_label ?? null,
+        parsed.contact_email.trim().toLowerCase(),
+        parsed.affiliation,
+        parsed.permit_number ?? null,
+      ]
+    );
+    return NextResponse.json(r.rows[0], { status: 201 });
+  } catch (err) {
+    console.error('[api/promote] insert failed', err);
+    const code = (err as { code?: string } | null)?.code;
+    if (code === '23503') return NextResponse.json({ error: 'unknown listing' }, { status: 422 });
+    if (code === '23505') return NextResponse.json({ error: 'duplicate' }, { status: 409 });
+    return NextResponse.json({ error: 'internal error' }, { status: 500 });
   }
-  const r = await pool.query(
-    `INSERT INTO sponsored_placement
-     (listing_id, source, external_url, headline, price_label, contact_email, affiliation, permit_number)
-     VALUES ($1,$2,$3,$4,$5,$6,$7,$8)
-     RETURNING id, status, submitted_at`,
-    [
-      parsed.listing_id,
-      parsed.source,
-      parsed.external_url,
-      parsed.headline,
-      parsed.price_label ?? null,
-      parsed.contact_email,
-      parsed.affiliation,
-      parsed.permit_number ?? null,
-    ]
-  );
-  return NextResponse.json(r.rows[0], { status: 201 });
 }
diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts
index 164868e..6a4e7c9 100644
--- a/src/app/api/search/route.ts
+++ b/src/app/api/search/route.ts
@@ -1,5 +1,6 @@
 import { NextResponse } from 'next/server';
 import { pool } from '@/lib/db';
+import { rateLimit } from '@/lib/rate-limit';
 
 /**
  * GET /api/search?q=...
@@ -8,11 +9,22 @@ import { pool } from '@/lib/db';
  * for entity display_name (small table; index isn't worth it yet).
  */
 export async function GET(req: Request) {
+  const rl = await rateLimit('search');
+  if (!rl.ok) {
+    return NextResponse.json(
+      { listings: [], entities: [], error: 'rate_limited' },
+      { status: 429, headers: { 'Retry-After': String(rl.retryAfter ?? 60) } },
+    );
+  }
+
   const url = new URL(req.url);
   const q = (url.searchParams.get('q') ?? '').trim();
-  if (q.length < 2) return NextResponse.json({ listings: [], entities: [] });
+  if (q.length < 2 || q.length > 100) return NextResponse.json({ listings: [], entities: [] });
+
+  // Escape LIKE metacharacters so '%', '_', '\' are matched literally.
+  const likePattern = `%${q.replace(/[\\%_]/g, '\\$&')}%`;
 
-  const [listings, entities] = await Promise.all([
+  const [listingsResult, entitiesResult] = await Promise.allSettled([
     pool.query(
       `SELECT slug, title, city, state, address_line1, hero_image,
               ts_rank(search_doc, websearch_to_tsquery('english', $1)) AS rank
@@ -23,7 +35,7 @@ export async function GET(req: Request) {
               OR address_line1 ILIKE $2)
        ORDER BY rank DESC NULLS LAST, ingested_at DESC
        LIMIT 6`,
-      [q, `%${q}%`]
+      [q, likePattern]
     ),
     pool.query(
       `SELECT slug, display_name, kind, birth_year, death_year
@@ -31,9 +43,15 @@ export async function GET(req: Request) {
        WHERE display_name ILIKE $1
        ORDER BY display_name
        LIMIT 4`,
-      [`%${q}%`]
+      [likePattern]
     ),
   ]);
 
-  return NextResponse.json({ listings: listings.rows, entities: entities.rows });
+  if (listingsResult.status === 'rejected') console.error('search.listings failed', listingsResult.reason);
+  if (entitiesResult.status === 'rejected') console.error('search.entities failed', entitiesResult.reason);
+
+  const listings = listingsResult.status === 'fulfilled' ? listingsResult.value.rows : [];
+  const entities = entitiesResult.status === 'fulfilled' ? entitiesResult.value.rows : [];
+
+  return NextResponse.json({ listings, entities });
 }
diff --git a/src/app/api/stars/nearby/route.ts b/src/app/api/stars/nearby/route.ts
index 1b13991..878ecb2 100644
--- a/src/app/api/stars/nearby/route.ts
+++ b/src/app/api/stars/nearby/route.ts
@@ -16,8 +16,10 @@
  */
 import { NextResponse } from 'next/server';
 import { pool } from '@/lib/db';
+import { rateLimit } from '@/lib/rate-limit';
 
 export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
 
 const EARTH_M = 6371000;
 
@@ -26,10 +28,19 @@ const LAT_MIN = 32, LAT_MAX = 35;
 const LNG_MIN = -120, LNG_MAX = -116;
 
 export async function GET(req: Request) {
+  const rl = await rateLimit('stars');
+  if (!rl.ok) {
+    return NextResponse.json(
+      { ok: false, error: 'rate_limited' },
+      { status: 429, headers: { 'Retry-After': String(rl.retryAfter ?? 60) } },
+    );
+  }
+
   const { searchParams } = new URL(req.url);
   const lat = Number(searchParams.get('lat'));
   const lng = Number(searchParams.get('lng'));
-  const radius = Math.min(Number(searchParams.get('radius')) || 1609, 50000);
+  const rRaw = Number(searchParams.get('radius'));
+  const radius = Number.isFinite(rRaw) && rRaw > 0 ? Math.min(rRaw, 50000) : 1609;
   if (!Number.isFinite(lat) || !Number.isFinite(lng)) {
     return NextResponse.json({ ok: false, error: 'lat/lng required' }, { status: 400 });
   }
@@ -42,7 +53,11 @@ export async function GET(req: Request) {
 
   // Haversine via a SQL CTE that unions all three data sources.
   // EARTH_M passed as $4 — no SQL interpolation anywhere.
-  const { rows } = await pool.query<{
+  // Use a dedicated client so SET LOCAL statement_timeout sticks to this query only.
+  const client = await pool.connect();
+  try {
+    await client.query(`SET LOCAL statement_timeout = '3s'`);
+    const { rows } = await client.query<{
     kind: 'walk' | 'residence' | 'restaurant';
     name: string;
     subtitle: string;
@@ -126,5 +141,11 @@ export async function GET(req: Request) {
     LIMIT 60
   `, [lat, lng, radius, EARTH_M]);
 
-  return NextResponse.json({ ok: true, stars: rows });
+    return NextResponse.json({ ok: true, stars: rows });
+  } catch (e) {
+    console.error('[api/stars/nearby] DB error:', e);
+    return NextResponse.json({ ok: false, error: 'query failed' }, { status: 500 });
+  } finally {
+    client.release();
+  }
 }
diff --git a/src/app/api/submit/route.ts b/src/app/api/submit/route.ts
index f1fc65c..234a8d9 100644
--- a/src/app/api/submit/route.ts
+++ b/src/app/api/submit/route.ts
@@ -1,36 +1,55 @@
 import { NextResponse } from 'next/server';
 import { z } from 'zod';
 import { pool } from '@/lib/db';
+import { rateLimit } from '@/lib/rate-limit';
+
+export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
 
 const Body = z.object({
   address_line1: z.string().min(3).max(255),
   city: z.string().min(2).max(120),
-  state: z.string().min(2).max(2).transform(s => s.toUpperCase()),
-  postal_code: z.string().max(12).optional().or(z.literal('')),
+  state: z.string().min(2).max(2).transform(s => s.toUpperCase()).pipe(z.string().regex(/^[A-Z]{2}$/)),
+  postal_code: z.string().max(12).regex(/^[A-Z0-9 \-]{3,12}$/i).optional().or(z.literal('')),
   notes: z.string().max(2000).optional().or(z.literal('')),
-  contact_email: z.string().email(),
+  contact_email: z.string().email().max(254),
 });
 
 export async function POST(req: Request) {
+  const rl = await rateLimit('submit');
+  if (!rl.ok) {
+    return NextResponse.json(
+      { error: 'rate_limited' },
+      { status: 429, headers: { 'Retry-After': String(rl.retryAfter ?? 600) } },
+    );
+  }
+
   let parsed;
   try {
     parsed = Body.parse(await req.json());
   } catch (e) {
-    return NextResponse.json({ error: 'invalid body', detail: String(e) }, { status: 400 });
+    const detail = e instanceof z.ZodError ? e.flatten() : undefined;
+    return NextResponse.json({ error: 'invalid body', detail }, { status: 400 });
+  }
+  try {
+    const r = await pool.query(
+      `INSERT INTO address_submission
+       (address_line1, city, state, postal_code, notes, contact_email)
+       VALUES ($1,$2,$3,$4,$5,$6)
+       RETURNING id, status, submitted_at`,
+      [
+        parsed.address_line1,
+        parsed.city,
+        parsed.state,
+        parsed.postal_code || null,
+        parsed.notes || null,
+        parsed.contact_email,
+      ]
+    );
+    const { id, status, submitted_at } = r.rows[0];
+    return NextResponse.json({ id, status, submitted_at }, { status: 201 });
+  } catch (err) {
+    console.error('[submit] db insert failed', err);
+    return NextResponse.json({ error: 'internal' }, { status: 500 });
   }
-  const r = await pool.query(
-    `INSERT INTO address_submission
-     (address_line1, city, state, postal_code, notes, contact_email)
-     VALUES ($1,$2,$3,$4,$5,$6)
-     RETURNING id, status, submitted_at`,
-    [
-      parsed.address_line1,
-      parsed.city,
-      parsed.state,
-      parsed.postal_code || null,
-      parsed.notes || null,
-      parsed.contact_email,
-    ]
-  );
-  return NextResponse.json(r.rows[0], { status: 201 });
 }
diff --git a/src/app/architects/page.tsx b/src/app/architects/page.tsx
index ab15454..2466f2d 100644
--- a/src/app/architects/page.tsx
+++ b/src/app/architects/page.tsx
@@ -12,9 +12,11 @@ export const metadata: Metadata = {
 };
 
 export default async function ArchitectsIndex() {
-  const surface = await currentSurface();
-  const studios = await listEntitiesWithCounts('studio');
-  const architects = await listEntitiesWithCounts('architect');
+  const [surface, studios, architects] = await Promise.all([
+    currentSurface(),
+    listEntitiesWithCounts('studio'),
+    listEntitiesWithCounts('architect'),
+  ]);
   const all = [...architects, ...studios].sort((a, b) => b.oeuvre_count - a.oeuvre_count);
 
   return (
@@ -43,7 +45,7 @@ export default async function ArchitectsIndex() {
             {all.map(e => (
               <li key={e.id}>
                 <Link
-                  href={`/entity/${e.slug}`}
+                  href={`/entity/${encodeURIComponent(e.slug)}`}
                   className="grid grid-cols-[1fr_auto] gap-4 items-baseline py-5 hover:text-coral transition group"
                 >
                   <div>
diff --git a/src/app/browse/page.tsx b/src/app/browse/page.tsx
index 60bff13..dc74aa9 100644
--- a/src/app/browse/page.tsx
+++ b/src/app/browse/page.tsx
@@ -8,12 +8,17 @@ const CITIES = ['Beverly Hills', 'Los Angeles', 'Malibu', 'Joshua Tree', 'Big Be
 
 // Index the bare /browse page; noindex any filtered/searched variant so we
 // don't pollute the index with arbitrary query-string URLs.
+function pickStr(v: string | string[] | undefined): string | undefined {
+  if (Array.isArray(v)) return v[0];
+  return v;
+}
+
 export async function generateMetadata({
   searchParams,
 }: {
-  searchParams: { q?: string; city?: string };
+  searchParams: { q?: string | string[]; city?: string | string[] };
 }): Promise<Metadata> {
-  const filtered = !!(searchParams.q || searchParams.city);
+  const filtered = !!(pickStr(searchParams.q) || pickStr(searchParams.city));
   return {
     title: 'Browse the archive',
     alternates: { canonical: '/browse' },
@@ -26,10 +31,11 @@ export async function generateMetadata({
 export default async function BrowsePage({
   searchParams,
 }: {
-  searchParams: { q?: string; city?: string };
+  searchParams: { q?: string | string[]; city?: string | string[] };
 }) {
-  const city = searchParams.city;
-  const q = (searchParams.q ?? '').trim();
+  const rawCity = pickStr(searchParams.city);
+  const city = rawCity && CITIES.includes(rawCity) ? rawCity : undefined;
+  const q = (pickStr(searchParams.q) ?? '').trim().slice(0, 200);
   const filtered = await searchListings({ text: q || undefined, city, limit: 60 });
 
   return (
@@ -53,7 +59,7 @@ export default async function BrowsePage({
             <input
               type="search"
               name="q"
-              defaultValue={searchParams.q ?? ''}
+              defaultValue={q}
               placeholder="Roxbury · Tudor · 1928…"
               className="w-72 border border-ink/20 bg-sand px-3 py-2 text-sm font-sans focus:outline-none focus:border-moss"
             />
diff --git a/src/app/claim/[slug]/page.tsx b/src/app/claim/[slug]/page.tsx
index 3a0ddc9..91c83b4 100644
--- a/src/app/claim/[slug]/page.tsx
+++ b/src/app/claim/[slug]/page.tsx
@@ -7,7 +7,10 @@ export const metadata: Metadata = {
   robots: { index: false, follow: false },
 };
 
+const SLUG_RE = /^[a-z0-9-]{1,128}$/;
+
 export default async function ClaimPage({ params }: { params: { slug: string } }) {
+  if (!SLUG_RE.test(params.slug)) notFound();
   const listing = await getListingBySlug(params.slug);
   if (!listing) notFound();
 
@@ -38,6 +41,7 @@ export default async function ClaimPage({ params }: { params: { slug: string } }
               type="email"
               required
               name="email"
+              maxLength={254}
               className="border border-ink/20 px-3 py-2 text-sm font-sans focus:outline-none focus:border-moss"
               placeholder="you@example.com"
             />
@@ -47,6 +51,7 @@ export default async function ClaimPage({ params }: { params: { slug: string } }
             <textarea
               name="proof"
               rows={4}
+              maxLength={4000}
               className="border border-ink/20 px-3 py-2 text-sm font-sans focus:outline-none focus:border-moss"
               placeholder="Recent utility bill, deed snippet, or grant book/page reference. Notarized upload also accepted."
             />
diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx
index 22082c5..416f64a 100644
--- a/src/app/dashboard/page.tsx
+++ b/src/app/dashboard/page.tsx
@@ -16,9 +16,13 @@ export const metadata: Metadata = {
 export default async function DashboardPage({
   searchParams,
 }: {
-  searchParams: { email?: string };
+  // Next 14: searchParams values are `string | string[] | undefined`. A
+  // duplicate key (`?email=a&email=b`) hands us an array and `.trim()` would
+  // throw. Normalize to first value.
+  searchParams: { email?: string | string[] };
 }) {
-  const email = searchParams.email?.trim();
+  const rawEmail = searchParams.email;
+  const email = (Array.isArray(rawEmail) ? rawEmail[0] : rawEmail)?.trim();
 
   if (!email) {
     return (
@@ -130,7 +134,12 @@ export default async function DashboardPage({
                   {c.listing_title}
                 </Link>
                 <span className="font-mono text-xs uppercase tracking-wider text-ink/50">
-                  {c.status} · {new Date(c.created_at).toISOString().slice(0, 10)}
+                  {c.status} · {(() => {
+                    // Guard: a null/garbage created_at would throw RangeError on
+                    // toISOString() and crash the entire page render.
+                    const d = c.created_at ? new Date(c.created_at) : null;
+                    return d && Number.isFinite(d.getTime()) ? d.toISOString().slice(0, 10) : '—';
+                  })()}
                 </span>
               </li>
             ))}
diff --git a/src/app/entity/[slug]/page.tsx b/src/app/entity/[slug]/page.tsx
index 438b0e3..9972bd9 100644
--- a/src/app/entity/[slug]/page.tsx
+++ b/src/app/entity/[slug]/page.tsx
@@ -1,7 +1,16 @@
 import { notFound } from 'next/navigation';
+import { cache } from 'react';
 import Link from 'next/link';
 import type { Metadata } from 'next';
-import { getEntityBySlug, getEntityAssociations, yearOf } from '@/lib/db';
+import {
+  getEntityBySlug as _getEntityBySlug,
+  getEntityAssociations as _getEntityAssociations,
+  yearOf,
+} from '@/lib/db';
+
+// Per-request memoization so generateMetadata + page body share one PG hit each.
+const getEntityBySlug = cache(_getEntityBySlug);
+const getEntityAssociations = cache(_getEntityAssociations);
 
 export async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {
   const entity = await getEntityBySlug(params.slug);
@@ -27,11 +36,17 @@ import { TierBadge, isPublicTier } from '@/components/TierBadge';
 import { InteractiveMapMount, type MapPin } from '@/components/InteractiveMapMount';
 import { JsonLd } from '@/components/JsonLd';
 import { SITE_DOMAIN } from '@/lib/site';
+import { safeHttpUrlUnknown as safeHttpUrl } from '@/lib/url-guards';
+
+const SLUG_RE = /^[a-z0-9-]{1,128}$/;
 
 export default async function EntityPage({ params }: { params: { slug: string } }) {
+  if (!SLUG_RE.test(params.slug)) notFound();
   const entity = await getEntityBySlug(params.slug);
   if (!entity) notFound();
+  const safeWikiUrl = safeHttpUrl(entity.wiki_url);
 
+  // generateMetadata already populated the cache, so this is in-memory.
   const associations = await getEntityAssociations(entity.id);
   const visible = associations.filter(a => isPublicTier(a.source_tier));
 
@@ -51,7 +66,7 @@ export default async function EntityPage({ params }: { params: { slug: string }
   if (entity.birth_year) jsonLd.birthDate = String(entity.birth_year);
   if (entity.death_year) jsonLd.deathDate = String(entity.death_year);
   if (entity.bio_short) jsonLd.description = entity.bio_short;
-  if (entity.wiki_url) jsonLd.sameAs = [entity.wiki_url];
+  if (safeWikiUrl) jsonLd.sameAs = [safeWikiUrl];
   if (entity.kind === 'architect' && visible.length > 0) {
     jsonLd.jobTitle = 'Architect';
   }
@@ -78,9 +93,9 @@ export default async function EntityPage({ params }: { params: { slug: string }
         {entity.bio_short && (
           <p className="mt-5 font-display italic text-xl text-ink/80 max-w-prose">{entity.bio_short}</p>
         )}
-        {entity.wiki_url && (
+        {safeWikiUrl && (
           <a
-            href={entity.wiki_url}
+            href={safeWikiUrl}
             target="_blank"
             rel="noopener noreferrer"
             className="mt-4 inline-flex text-xs uppercase tracking-wider text-ink/60 hover:text-coral underline-offset-4 hover:underline"
@@ -92,15 +107,20 @@ export default async function EntityPage({ params }: { params: { slug: string }
 
       <div className="max-w-4xl mx-auto px-6 py-10">
         {(() => {
-          const pins: MapPin[] = visible
-            .filter(a => a.listing_lat != null && a.listing_lng != null)
-            .map(a => ({
+          const pins: MapPin[] = [];
+          for (const a of visible) {
+            const lat = Number(a.listing_lat);
+            const lng = Number(a.listing_lng);
+            if (!Number.isFinite(lat) || !Number.isFinite(lng)) continue;
+            if (lat === 0 && lng === 0) continue;
+            pins.push({
               slug: a.listing_slug,
               title: a.listing_title,
               subtitle: a.relation ?? 'Associated',
-              lat: Number(a.listing_lat),
-              lng: Number(a.listing_lng),
-            }));
+              lat,
+              lng,
+            });
+          }
           if (pins.length === 0) return null;
           return (
             <div className="mb-10">
diff --git a/src/app/film/[slug]/page.tsx b/src/app/film/[slug]/page.tsx
index cc3e45f..70dce1a 100644
--- a/src/app/film/[slug]/page.tsx
+++ b/src/app/film/[slug]/page.tsx
@@ -35,8 +35,10 @@ export async function generateMetadata({ params }: { params: { slug: string } })
 export default async function FilmPage({ params }: { params: { slug: string } }) {
   const production = await getProductionBySlug(params.slug);
   if (!production) notFound();
-  const surface = await currentSurface();
-  const locs = await getLocationsForProduction(production.id);
+  const [surface, locs] = await Promise.all([
+    currentSurface(),
+    getLocationsForProduction(production.id),
+  ]);
 
   const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? `https://${SITE_DOMAIN}`;
   const jsonLd: Record<string, unknown> = {
@@ -46,17 +48,22 @@ export default async function FilmPage({ params }: { params: { slug: string } })
     url: `${baseUrl}/film/${production.slug}`,
   };
   if (production.year) jsonLd.dateCreated = String(production.year);
-  if (production.imdb_id) jsonLd.sameAs = [`https://www.imdb.com/title/${production.imdb_id}/`];
+  if (production.imdb_id) jsonLd.sameAs = [`https://www.imdb.com/title/${encodeURIComponent(production.imdb_id)}/`];
 
   const pins: MapPin[] = locs
-    .filter(l => l.listing_lat != null && l.listing_lng != null)
-    .map(l => ({
-      slug: l.listing_slug,
-      title: l.listing_title,
-      subtitle: l.role ?? 'Location',
-      lat: Number(l.listing_lat),
-      lng: Number(l.listing_lng),
-    }));
+    .map(l => {
+      const lat = Number(l.listing_lat);
+      const lng = Number(l.listing_lng);
+      if (!Number.isFinite(lat) || !Number.isFinite(lng)) return null;
+      return {
+        slug: l.listing_slug,
+        title: l.listing_title,
+        subtitle: l.role ?? 'Location',
+        lat,
+        lng,
+      };
+    })
+    .filter((p): p is NonNullable<typeof p> => p !== null);
 
   return (
     <>
@@ -73,7 +80,7 @@ export default async function FilmPage({ params }: { params: { slug: string } })
 
       <header className="max-w-4xl mx-auto px-6 py-12 border-b border-ink/10 grid md:grid-cols-[200px_1fr] gap-8 items-start">
         <div className="border border-ink/10 overflow-hidden">
-          {production.poster_url ? (
+          {production.poster_url && /^https?:\/\//i.test(production.poster_url) ? (
             // eslint-disable-next-line @next/next/no-img-element
             <img src={production.poster_url} alt={production.title} className="w-full block" />
           ) : (
@@ -103,7 +110,7 @@ export default async function FilmPage({ params }: { params: { slug: string } })
           </p>
           {production.imdb_id && (
             <a
-              href={`https://www.imdb.com/title/${production.imdb_id}/`}
+              href={`https://www.imdb.com/title/${encodeURIComponent(production.imdb_id)}/`}
               target="_blank"
               rel="noopener noreferrer"
               className="font-mono text-[11px] uppercase tracking-[0.15em] text-ink/60 hover:text-coral transition"
@@ -113,7 +120,7 @@ export default async function FilmPage({ params }: { params: { slug: string } })
           )}
           {production.wikidata_qid && (
             <a
-              href={`https://www.wikidata.org/wiki/${production.wikidata_qid}`}
+              href={`https://www.wikidata.org/wiki/${encodeURIComponent(production.wikidata_qid)}`}
               target="_blank"
               rel="noopener noreferrer"
               className="font-mono text-[11px] uppercase tracking-[0.15em] text-ink/60 hover:text-coral transition"
@@ -151,13 +158,19 @@ export default async function FilmPage({ params }: { params: { slug: string } })
                   )}
                   <div className="mt-2 flex gap-3 items-center flex-wrap">
                     <span className="text-[10px] uppercase tracking-[0.15em] text-ink/50">{l.role ?? 'on location'}</span>
-                    {l.source_url ? (
-                      <a href={l.source_url} target="_blank" rel="noopener noreferrer">
-                        <TierBadge tier={l.source_tier as 'A' | 'B' | 'C'} sourceLabel={l.source_label ?? undefined} />
-                      </a>
-                    ) : (
-                      <TierBadge tier={l.source_tier as 'A' | 'B' | 'C'} sourceLabel={l.source_label ?? undefined} />
-                    )}
+                    {(() => {
+                      const tier = (['A', 'B', 'C'] as const).includes(l.source_tier as 'A' | 'B' | 'C')
+                        ? (l.source_tier as 'A' | 'B' | 'C')
+                        : 'C';
+                      const safeUrl = l.source_url && /^https?:\/\//i.test(l.source_url) ? l.source_url : null;
+                      return safeUrl ? (
+                        <a href={safeUrl} target="_blank" rel="noopener noreferrer">
+                          <TierBadge tier={tier} sourceLabel={l.source_label ?? undefined} />
+                        </a>
+                      ) : (
+                        <TierBadge tier={tier} sourceLabel={l.source_label ?? undefined} />
+                      );
+                    })()}
                   </div>
                 </div>
                 <span className="font-mono text-[10px] uppercase tracking-[0.15em] text-ink/45 md:text-right">
diff --git a/src/app/films/page.tsx b/src/app/films/page.tsx
index 64f0b06..05297b6 100644
--- a/src/app/films/page.tsx
+++ b/src/app/films/page.tsx
@@ -70,9 +70,15 @@ export default async function FilmsIndex({
 }: {
   searchParams: { kind?: string; decade?: string; show?: string };
 }) {
+  const safeKind = (KINDS as readonly string[]).includes(searchParams.kind ?? '')
+    ? searchParams.kind
+    : undefined;
+  const safeDecade = (DECADES as readonly string[]).includes(searchParams.decade ?? '')
+    ? searchParams.decade
+    : undefined;
   const allProductions = await listProductionsWithCounts({
-    kind: searchParams.kind,
-    decade: searchParams.decade,
+    kind: safeKind,
+    decade: safeDecade,
   });
 
   // Page weight: 1085 productions × ~3KB = ~3MB. Cap at 60 unless explicit ?show=all.
@@ -100,7 +106,7 @@ export default async function FilmsIndex({
           Productions that pulled a public film permit at an address in the archive.
         </p>
         <p className="mt-3 font-mono text-[11px] text-ink/45">
-          {productions.length} {productions.length === 1 ? 'production' : 'productions'} on file ·
+          {allProductions.length} {allProductions.length === 1 ? 'production' : 'productions'} on file ·
           source: FilmLA / data.lacity.org
         </p>
         <div className="mt-8 flex flex-col gap-3">
@@ -158,7 +164,7 @@ export default async function FilmsIndex({
                         <div className="border border-ink/10 overflow-hidden bg-ink/[0.04]">
                           {p.poster_url ? (
                             // eslint-disable-next-line @next/next/no-img-element
-                            <img src={p.poster_url} alt="" className="w-full block aspect-[2/3] object-cover" />
+                            <img src={p.poster_url} alt="" loading="lazy" decoding="async" width={64} height={96} className="w-full block aspect-[2/3] object-cover" />
                           ) : (
                             <PosterPlaceholder
                               title={p.title}
@@ -199,7 +205,7 @@ export default async function FilmsIndex({
               Showing {productions.length} of {allProductions.length} productions on file.
             </p>
             <Link
-              href={`/films?${new URLSearchParams({ ...searchParams, show: 'all' } as Record<string, string>).toString()}`}
+              href={buildHref(searchParams, { show: 'all' })}
               className="inline-block bg-ink text-sand px-6 py-2 text-sm hover:opacity-90 transition"
             >
               Show all {allProductions.length}
diff --git a/src/app/houses/page.tsx b/src/app/houses/page.tsx
index d65f6cf..44967e8 100644
--- a/src/app/houses/page.tsx
+++ b/src/app/houses/page.tsx
@@ -36,7 +36,9 @@ async function getHouses(filter: string | undefined): Promise<Row[]> {
   const where: string[] = ["l.is_public = true", "l.source IN ('wikipedia_house','la_hcm')"];
   const params: any[] = [];
   if (filter) {
-    params.push(`%${filter}%`);
+    // Escape LIKE meta-chars so user input matches literally.
+    const escaped = filter.replace(/[\\%_]/g, (c) => `\\${c}`);
+    params.push(`%${escaped}%`);
     where.push(`(l.title ILIKE $${params.length} OR l.description ILIKE $${params.length} OR l.city ILIKE $${params.length})`);
   }
   const { rows } = await pool.query<any>(
@@ -53,8 +55,10 @@ async function getHouses(filter: string | undefined): Promise<Row[]> {
   return rows;
 }
 
-export default async function HousesPage({ searchParams }: { searchParams: { q?: string } }) {
-  const q = searchParams.q?.trim();
+export default async function HousesPage({ searchParams }: { searchParams: { q?: string | string[] } }) {
+  const rawQ = Array.isArray(searchParams.q) ? searchParams.q[0] : searchParams.q;
+  let q = rawQ?.trim();
+  if (q && q.length > 100) q = q.slice(0, 100); // cap to prevent DoS via huge ILIKE patterns
   const houses = await getHouses(q);
   const wpCount = houses.filter(h => h.kind === 'wikipedia').length;
   const hcmCount = houses.filter(h => h.kind === 'hcm').length;
@@ -118,12 +122,16 @@ export default async function HousesPage({ searchParams }: { searchParams: { q?:
                     </p>
                   )}
                   <div className="mt-4 pt-3 border-t border-ink/10 flex items-baseline justify-between gap-2">
-                    {h.latitude && h.longitude && (
-                      <span className="font-mono text-[10px] tabular-nums text-ink/40">
-                        {parseFloat(h.latitude).toFixed(4)}, {parseFloat(h.longitude).toFixed(4)}
-                      </span>
-                    )}
-                    {h.source_url && (
+                    {(() => {
+                      const lat = h.latitude ? parseFloat(h.latitude) : NaN;
+                      const lng = h.longitude ? parseFloat(h.longitude) : NaN;
+                      return Number.isFinite(lat) && Number.isFinite(lng) ? (
+                        <span className="font-mono text-[10px] tabular-nums text-ink/40">
+                          {lat.toFixed(4)}, {lng.toFixed(4)}
+                        </span>
+                      ) : null;
+                    })()}
+                    {h.source_url && /^https?:\/\//i.test(h.source_url) && (
                       <a
                         href={h.source_url}
                         target="_blank"
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index ecc77ab..66b6ef6 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -75,7 +75,10 @@ export default async function RootLayout({ children }: { children: React.ReactNo
             community: process.env.NEXT_PUBLIC_GA_COMMUNITY,
           }[surface.key];
           const id = env || surface.gaMeasurementId;
-          if (!id) return null;
+          // Hard-validate format before any HTML/JS interpolation — protects
+          // against XSS if a misconfigured env var ever contains quotes,
+          // newlines, or </script>.
+          if (!id || !/^G-[A-Z0-9]+$/.test(id)) return null;
           return (
             <>
               <script async src={`https://www.googletagmanager.com/gtag/js?id=${id}`}></script>
diff --git a/src/app/locations-by-year/page.tsx b/src/app/locations-by-year/page.tsx
index f22739f..7b3520c 100644
--- a/src/app/locations-by-year/page.tsx
+++ b/src/app/locations-by-year/page.tsx
@@ -88,7 +88,7 @@ export default async function LocationsByYearPage() {
                     <div>
                       <div className="flex items-baseline gap-3 flex-wrap">
                         <Link
-                          href={`/film/${s.production_slug}`}
+                          href={`/film/${encodeURIComponent(s.production_slug)}`}
                           className="font-display text-xl text-ink hover:text-coral transition"
                         >
                           {s.production_title}
@@ -96,7 +96,7 @@ export default async function LocationsByYearPage() {
                         </Link>
                         <span className="text-ink/30">·</span>
                         <Link
-                          href={`/address/${s.listing_slug}`}
+                          href={`/address/${encodeURIComponent(s.listing_slug)}`}
                           className="text-base text-ink/70 hover:text-coral transition"
                         >
                           {s.listing_title}
diff --git a/src/app/map/MapWithLayers.tsx b/src/app/map/MapWithLayers.tsx
index 78d12be..641d637 100644
--- a/src/app/map/MapWithLayers.tsx
+++ b/src/app/map/MapWithLayers.tsx
@@ -21,29 +21,31 @@ export function MapWithLayers({
   const [showFilming, setShowFilming] = useState(true);
 
   const pins: MapPin[] = useMemo(() => {
-    const out: MapPin[] = [];
+    // Dedupe by slug across layers; filming overlay wins when both layers
+    // have a pin for the same address (coral overrides moss).
+    const bySlug = new Map<string, MapPin>();
+    const slugless: MapPin[] = [];
     if (showArchive) {
-      // Mark archive pins so they pin moss-colored.
-      out.push(...archivePins.map(p => ({ ...p, featured: false })));
+      for (const p of archivePins) {
+        if (p.slug) bySlug.set(p.slug, { ...p, featured: false });
+        else slugless.push({ ...p, featured: false });
+      }
     }
     if (showFilming) {
-      // Filming pins overlay — coral (featured = true).
-      out.push(
-        ...filmingPins.map(f => {
-          const titles = f.productions.slice(0, 3).map(p => `${p.title}${p.year ? ` (${p.year})` : ''}`).join(' · ');
-          const more = f.productions.length > 3 ? ` +${f.productions.length - 3} more` : '';
-          return {
-            slug: f.slug,
-            title: f.title,
-            subtitle: `Filmed: ${titles}${more}`,
-            lat: f.lat,
-            lng: f.lng,
-            featured: true,
-          };
-        })
-      );
+      for (const f of filmingPins) {
+        const titles = f.productions.slice(0, 3).map(p => `${p.title}${p.year != null ? ` (${p.year})` : ''}`).join(' · ');
+        const more = f.productions.length > 3 ? ` +${f.productions.length - 3} more` : '';
+        bySlug.set(f.slug, {
+          slug: f.slug,
+          title: f.title,
+          subtitle: `Filmed: ${titles}${more}`,
+          lat: f.lat,
+          lng: f.lng,
+          featured: true,
+        });
+      }
     }
-    return out;
+    return [...bySlug.values(), ...slugless];
   }, [archivePins, filmingPins, showArchive, showFilming]);
 
   return (
@@ -52,6 +54,7 @@ export function MapWithLayers({
         <span className="text-[10px] uppercase tracking-[0.15em] text-ink/45">Layers</span>
         <button
           type="button"
+          aria-pressed={showArchive}
           onClick={() => setShowArchive(s => !s)}
           className={`inline-flex items-center gap-2 px-3 py-1 text-[11px] uppercase tracking-[0.15em] border transition ${
             showArchive
@@ -64,6 +67,7 @@ export function MapWithLayers({
         </button>
         <button
           type="button"
+          aria-pressed={showFilming}
           onClick={() => setShowFilming(s => !s)}
           className={`inline-flex items-center gap-2 px-3 py-1 text-[11px] uppercase tracking-[0.15em] border transition ${
             showFilming
diff --git a/src/app/map/page.tsx b/src/app/map/page.tsx
index 5388f9b..a0ba4c5 100644
--- a/src/app/map/page.tsx
+++ b/src/app/map/page.tsx
@@ -4,6 +4,9 @@ import { BreadcrumbArchive } from '@/components/BreadcrumbArchive';
 import { type MapPin } from '@/components/InteractiveMapMount';
 import { MapWithLayers } from './MapWithLayers';
 
+export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
+
 export const metadata: Metadata = {
   title: 'Map',
   description: 'Every public address in the archive on a single interactive map. Toggle the filming layer to see what was shot where.',
@@ -23,7 +26,14 @@ export default async function MapPage() {
       subtitle: l.city ?? undefined,
       lat: Number(l.latitude),
       lng: Number(l.longitude),
-    }));
+    }))
+    .filter(p =>
+      Number.isFinite(p.lat) &&
+      Number.isFinite(p.lng) &&
+      Math.abs(p.lat) <= 90 &&
+      Math.abs(p.lng) <= 180 &&
+      !(p.lat === 0 && p.lng === 0)
+    );
 
   return (
     <>
diff --git a/src/app/neighborhood/[slug]/page.tsx b/src/app/neighborhood/[slug]/page.tsx
index f3052f3..5528878 100644
--- a/src/app/neighborhood/[slug]/page.tsx
+++ b/src/app/neighborhood/[slug]/page.tsx
@@ -1,8 +1,14 @@
 import type { Metadata } from 'next';
+import { cache } from 'react';
+import { notFound } from 'next/navigation';
 import { searchListings } from '@/lib/db';
 import { BreadcrumbArchive } from '@/components/BreadcrumbArchive';
 import { NodeCard } from '@/components/NodeCard';
 
+export const runtime = 'nodejs';
+
+const SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
+
 const CITY_FOR_SLUG: Record<string, string> = {
   'beverly-hills': 'Beverly Hills',
   'los-angeles': 'Los Angeles',
@@ -11,23 +17,50 @@ const CITY_FOR_SLUG: Record<string, string> = {
   'joshua-tree': 'Joshua Tree',
 };
 
+function cityNameFor(slug: string): string | null {
+  if (!SLUG_RE.test(slug)) return null;
+  if (Object.prototype.hasOwnProperty.call(CITY_FOR_SLUG, slug)) {
+    return CITY_FOR_SLUG[slug]!;
+  }
+  return slug
+    .split('-')
+    .filter(Boolean)
+    .map(w => (w[0] ?? '').toUpperCase() + w.slice(1))
+    .join(' ');
+}
+
+// Single dedupe layer: metadata + page reuse the same DB call per request.
+const getListingsForCity = cache(async (cityName: string) =>
+  searchListings({ city: cityName, limit: 24 })
+);
+
 export async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {
-  const cityName = CITY_FOR_SLUG[params.slug] ?? params.slug.split('-').map(w => w[0]!.toUpperCase() + w.slice(1)).join(' ');
-  const listings = await searchListings({ city: cityName, limit: 1 });
+  const cityName = cityNameFor(params.slug);
+  if (!cityName) {
+    return { title: 'Not found', robots: { index: false, follow: false } };
+  }
+  const listings = await getListingsForCity(cityName);
+  // Unknown slug AND no DB rows → noindex (caller will 404 in the page).
+  const known = Object.prototype.hasOwnProperty.call(CITY_FOR_SLUG, params.slug);
+  if (!known && listings.length === 0) {
+    return { title: cityName, robots: { index: false, follow: false } };
+  }
   return {
     title: cityName,
     description: `${cityName} addresses in the archive — permits, sales, architects, historical associations.`,
-    alternates: { canonical: `/neighborhood/${params.slug}` },
+    alternates: { canonical: `/neighborhood/${encodeURIComponent(params.slug)}` },
     // Threshold: ≥3 listings before we index the neighborhood index page.
-    robots: listings.length >= 1
-      ? { index: listings.length >= 3, follow: true }
-      : { index: false, follow: true },
+    robots: { index: listings.length >= 3, follow: true },
   };
 }
 
 export default async function NeighborhoodPage({ params }: { params: { slug: string } }) {
-  const cityName = CITY_FOR_SLUG[params.slug] ?? params.slug.split('-').map(w => w[0]!.toUpperCase() + w.slice(1)).join(' ');
-  const listings = await searchListings({ city: cityName, limit: 24 });
+  const cityName = cityNameFor(params.slug);
+  if (!cityName) notFound();
+  const listings = await getListingsForCity(cityName);
+  // Reject doorway pages: unknown slug with zero matching listings.
+  const known = Object.prototype.hasOwnProperty.call(CITY_FOR_SLUG, params.slug);
+  if (!known && listings.length === 0) notFound();
 
   return (
     <>
diff --git a/src/app/neighborhoods/page.tsx b/src/app/neighborhoods/page.tsx
index c8f806f..7ad7f10 100644
--- a/src/app/neighborhoods/page.tsx
+++ b/src/app/neighborhoods/page.tsx
@@ -24,15 +24,19 @@ export default async function NeighborhoodsIndex() {
   const items = await listNeighborhoodsWithGeo();
   // Pull all listings with lat/lng for a master map of every place we have.
   const allListings = await searchListings({ limit: 100 });
-  const pins: MapPin[] = allListings
-    .filter(l => l.latitude != null && l.longitude != null)
-    .map(l => ({
+  const pins: MapPin[] = allListings.flatMap(l => {
+    const lat = Number(l.latitude);
+    const lng = Number(l.longitude);
+    if (!Number.isFinite(lat) || !Number.isFinite(lng)) return [];
+    if (lat === 0 && lng === 0) return [];
+    return [{
       slug: l.slug,
       title: l.title,
       subtitle: l.city ?? undefined,
-      lat: Number(l.latitude),
-      lng: Number(l.longitude),
-    }));
+      lat,
+      lng,
+    }];
+  });
 
   return (
     <>
diff --git a/src/app/page.tsx b/src/app/page.tsx
index df7aa62..0114efd 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -20,15 +20,20 @@ export default async function HomePage() {
     getRecentPermits(6),
     currentSurface(),
   ]);
-  const filmCopy = FILMS_HEADING[surface.key];
+  const filmCopy = FILMS_HEADING[surface.key] ?? FILMS_HEADING.flagship;
 
   const pins = listings
-    .filter(l => l.latitude != null && l.longitude != null)
-    .map((l, i) => ({
+    .map(l => {
+      const lat = Number(l.latitude);
+      const lng = Number(l.longitude);
+      return { l, lat, lng };
+    })
+    .filter(({ lat, lng }) => Number.isFinite(lat) && Number.isFinite(lng))
+    .map(({ l, lat, lng }, i) => ({
       slug: l.slug,
       title: l.title,
-      lat: Number(l.latitude),
-      lng: Number(l.longitude),
+      lat,
+      lng,
       featured: i === 0,
     }));
 
@@ -63,7 +68,7 @@ export default async function HomePage() {
             kind="address"
             href={`/address/${p.listing_slug}`}
             title={p.listing_title}
-            subtitle={`${p.summary.slice(0, 80)}${p.summary.length > 80 ? '…' : ''}`}
+            subtitle={(() => { const s = p.summary ?? ''; return s.length > 80 ? `${s.slice(0, 80)}…` : s; })()}
             imageUrl={p.listing_hero ?? undefined}
             eyebrow={`Permit · ${yearOf(p.valid_from)}`}
           />
diff --git a/src/app/parcel/[apn]/page.tsx b/src/app/parcel/[apn]/page.tsx
index 22cdd0d..ec17eb1 100644
--- a/src/app/parcel/[apn]/page.tsx
+++ b/src/app/parcel/[apn]/page.tsx
@@ -21,6 +21,12 @@ function formatApn(apn: string): string {
 
 export async function generateMetadata({ params }: { params: { apn: string } }): Promise<Metadata> {
   const apn = normalizeApn(params.apn);
+  if (apn.length !== 10) {
+    return {
+      title: 'Parcel not found',
+      robots: { index: false, follow: false },
+    };
+  }
   return {
     title: `Parcel ${formatApn(apn)}`,
     description: `LA County parcel ${formatApn(apn)} — assessor record, permits, code enforcement.`,
@@ -63,25 +69,33 @@ async function getParcel(apn: string): Promise<ParcelRow[]> {
             current_listing_id, source_url
      FROM parcel
      WHERE apn = $1
-     ORDER BY roll_year DESC NULLS LAST`,
+     ORDER BY roll_year DESC NULLS LAST, id DESC`,
     [apn]
   );
   return rows;
 }
 
 async function getPermitsForApn(apn: string): Promise<RealPermit[]> {
+  // Wrap DISTINCT ON in subquery: pick latest row per permit_number first,
+  // THEN sort the deduped set by issue_date DESC and cap at 100. Without the
+  // subquery, LIMIT 100 takes the alphabetically-lowest permit numbers, so
+  // recent permits silently disappear for parcels with >100 historical permits.
   const { rows } = await pool.query<RealPermit>(
-    `SELECT DISTINCT ON (permit_number) id, source, source_dataset, permit_number, primary_address,
-            permit_group, permit_type, permit_sub_type, use_desc,
-            issue_date::text as issue_date, status_desc, valuation::text as valuation,
-            work_desc, source_url, source_label
-     FROM permit
-     WHERE apn = $1
-     ORDER BY permit_number, issue_date DESC NULLS LAST
+    `SELECT * FROM (
+       SELECT DISTINCT ON (permit_number)
+              id, source, source_dataset, permit_number, primary_address,
+              permit_group, permit_type, permit_sub_type, use_desc,
+              issue_date::text as issue_date, status_desc, valuation::text as valuation,
+              work_desc, source_url, source_label
+       FROM permit
+       WHERE apn = $1
+       ORDER BY permit_number, issue_date DESC NULLS LAST
+     ) s
+     ORDER BY issue_date DESC NULLS LAST
      LIMIT 100`,
     [apn]
   );
-  return rows.sort((a, b) => (b.issue_date ?? '').localeCompare(a.issue_date ?? ''));
+  return rows;
 }
 
 async function getCodeForApn(apn: string): Promise<CodeEnforcementCase[]> {
@@ -99,8 +113,8 @@ async function getCodeForApn(apn: string): Promise<CodeEnforcementCase[]> {
 
 function fmt$(s: string | null): string {
   if (!s) return '—';
-  const n = parseFloat(s);
-  if (!isFinite(n) || n === 0) return '—';
+  const n = Number(s);
+  if (!Number.isFinite(n) || n === 0) return '—';
   return `$${n.toLocaleString()}`;
 }
 
@@ -110,9 +124,9 @@ export default async function ParcelPage({ params }: { params: { apn: string } }
   if (apn.length !== 10) notFound();
 
   const [parcels, permits, codeCases] = await Promise.all([
-    getParcel(apn),
-    getPermitsForApn(apn),
-    getCodeForApn(apn),
+    getParcel(apn).catch(e => { console.error('parcel.getParcel', apn, e); return [] as ParcelRow[]; }),
+    getPermitsForApn(apn).catch(e => { console.error('parcel.getPermits', apn, e); return [] as RealPermit[]; }),
+    getCodeForApn(apn).catch(e => { console.error('parcel.getCode', apn, e); return [] as CodeEnforcementCase[]; }),
   ]);
 
   const latest = parcels[0] ?? null;
diff --git a/src/app/people/page.tsx b/src/app/people/page.tsx
index bb5367d..71c1deb 100644
--- a/src/app/people/page.tsx
+++ b/src/app/people/page.tsx
@@ -53,7 +53,7 @@ export default async function PeopleIndex() {
             {featured.map(e => (
               <Link
                 key={e.id}
-                href={`/entity/${e.slug}`}
+                href={`/entity/${encodeURIComponent(e.slug)}`}
                 className="block border border-ink/10 bg-sand p-5 hover:border-ink/40 transition group"
               >
                 <p className="font-mono text-[10px] uppercase tracking-[0.15em] text-ink/45">
@@ -85,7 +85,7 @@ export default async function PeopleIndex() {
               {list.map(e => (
                 <li key={e.id}>
                   <Link
-                    href={`/entity/${e.slug}`}
+                    href={`/entity/${encodeURIComponent(e.slug)}`}
                     className="block border border-ink/10 bg-sand p-4 hover:border-ink/40 transition group"
                   >
                     <div className="flex items-baseline justify-between gap-3">
diff --git a/src/app/promote/[slug]/PromoteFormClient.tsx b/src/app/promote/[slug]/PromoteFormClient.tsx
index e876425..16de75b 100644
--- a/src/app/promote/[slug]/PromoteFormClient.tsx
+++ b/src/app/promote/[slug]/PromoteFormClient.tsx
@@ -1,5 +1,5 @@
 'use client';
-import { useState } from 'react';
+import { useEffect, useRef, useState } from 'react';
 
 export function PromoteFormClient({
   listingId,
@@ -11,36 +11,59 @@ export function PromoteFormClient({
   const [status, setStatus] = useState<'idle' | 'submitting' | 'ok' | 'error'>('idle');
   const [error, setError] = useState<string | null>(null);
   const [submissionId, setSubmissionId] = useState<string | null>(null);
+  const abortRef = useRef<AbortController | null>(null);
+
+  useEffect(() => {
+    return () => {
+      abortRef.current?.abort();
+    };
+  }, []);
 
   async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
     e.preventDefault();
     setStatus('submitting');
     setError(null);
     const fd = new FormData(e.currentTarget);
+    const s = (k: string) => String(fd.get(k) ?? '').trim();
     const body = {
       listing_id: listingId,
-      source: fd.get('source'),
-      external_url: fd.get('external_url'),
-      headline: fd.get('headline'),
-      price_label: fd.get('price_label') || undefined,
-      contact_email: fd.get('contact_email'),
-      affiliation: fd.get('affiliation'),
-      permit_number: fd.get('permit_number') || undefined,
+      source: s('source'),
+      external_url: s('external_url'),
+      headline: s('headline'),
+      price_label: s('price_label') || undefined,
+      contact_email: s('contact_email'),
+      affiliation: s('affiliation'),
+      permit_number: s('permit_number') || undefined,
     };
-    const res = await fetch('/api/promote', {
-      method: 'POST',
-      headers: { 'Content-Type': 'application/json' },
-      body: JSON.stringify(body),
-    });
-    if (!res.ok) {
+    abortRef.current?.abort();
+    const ctrl = new AbortController();
+    abortRef.current = ctrl;
+    try {
+      const res = await fetch('/api/promote', {
+        method: 'POST',
+        headers: { 'Content-Type': 'application/json' },
+        body: JSON.stringify(body),
+        signal: ctrl.signal,
+      });
+      if (!res.ok) {
+        const j = await res.json().catch(() => ({}));
+        setError(typeof j?.error === 'string' ? j.error : `HTTP ${res.status}`);
+        setStatus('error');
+        return;
+      }
       const j = await res.json().catch(() => ({}));
-      setError(j.error ?? `HTTP ${res.status}`);
+      if (typeof j?.id !== 'string' || !j.id) {
+        setError('Bad server response');
+        setStatus('error');
+        return;
+      }
+      setSubmissionId(j.id);
+      setStatus('ok');
+    } catch (err) {
+      if ((err as { name?: string })?.name === 'AbortError') return;
+      setError(err instanceof Error ? err.message : 'Network error');
       setStatus('error');
-      return;
     }
-    const j = await res.json();
-    setSubmissionId(j.id);
-    setStatus('ok');
   }
 
   if (status === 'ok' && submissionId) {
diff --git a/src/app/promote/[slug]/page.tsx b/src/app/promote/[slug]/page.tsx
index 18f9af0..e633eca 100644
--- a/src/app/promote/[slug]/page.tsx
+++ b/src/app/promote/[slug]/page.tsx
@@ -7,10 +7,17 @@ import { PromoteFormClient } from './PromoteFormClient';
 import { FREE_FOREVER } from '@/lib/flags';
 import { RetiredFeatureNotice } from '@/components/RetiredFeatureNotice';
 
+export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
+
 export const metadata: Metadata = {
   robots: { index: false, follow: false },
 };
 
+const SLUG_RE = /^[a-z0-9-]+$/i;
+const isHttpUrl = (u: unknown): u is string =>
+  typeof u === 'string' && /^https?:\/\//i.test(u.trim());
+
 export default async function PromoteForm({ params }: { params: { slug: string } }) {
   if (FREE_FOREVER) {
     return (
@@ -19,7 +26,13 @@ export default async function PromoteForm({ params }: { params: { slug: string }
       />
     );
   }
-  const listing = await getListingBySlug(params.slug);
+  if (!params?.slug || !SLUG_RE.test(params.slug)) notFound();
+  let listing: Awaited<ReturnType<typeof getListingBySlug>> | null = null;
+  try {
+    listing = await getListingBySlug(params.slug);
+  } catch {
+    listing = null;
+  }
   if (!listing) notFound();
 
   return (
@@ -49,13 +62,15 @@ export default async function PromoteForm({ params }: { params: { slug: string }
         />
 
         <div className="mt-14">
-          <p className="text-xs uppercase tracking-[0.15em] text-ink/50 mb-3">Preview — what readers will see</p>
+          <p className="text-xs uppercase tracking-[0.15em] text-ink/50 mb-3">
+            Example layout — your own copy goes here
+          </p>
           <SponsoredCard
             source="zillow"
             title={`${listing.title} — for sale`}
-            priceLabel="$4,250,000 · Open Saturday 1–4pm"
+            priceLabel="Your price & open-house line will appear here"
             url="#"
-            imageUrl={listing.hero_image ?? undefined}
+            imageUrl={isHttpUrl(listing.hero_image) ? listing.hero_image : undefined}
           />
         </div>
       </section>
diff --git a/src/app/promote/page.tsx b/src/app/promote/page.tsx
index 13ae552..e4eb21c 100644
--- a/src/app/promote/page.tsx
+++ b/src/app/promote/page.tsx
@@ -6,10 +6,17 @@ import { NodeCard } from '@/components/NodeCard';
 import { FREE_FOREVER } from '@/lib/flags';
 import { RetiredFeatureNotice } from '@/components/RetiredFeatureNotice';
 
+export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
+
 export const metadata: Metadata = {
   robots: { index: false, follow: false },
 };
 
+const SLUG_RE = /^[a-z0-9-]+$/i;
+const isHttpUrl = (u: unknown): u is string =>
+  typeof u === 'string' && /^https?:\/\//i.test(u.trim());
+
 export default async function PromoteIndex() {
   if (FREE_FOREVER) {
     return (
@@ -18,7 +25,12 @@ export default async function PromoteIndex() {
       />
     );
   }
-  const recent = await searchListings({ limit: 6 });
+  let recent: Awaited<ReturnType<typeof searchListings>> = [];
+  try {
+    recent = await searchListings({ limit: 6 });
+  } catch {
+    recent = [];
+  }
 
   return (
     <>
@@ -45,17 +57,19 @@ export default async function PromoteIndex() {
           live. If your address isn&rsquo;t in the archive yet, <Link href="/browse" className="underline-offset-2 hover:underline text-coral">submit it first</Link>.
         </p>
         <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5">
-          {recent.map(l => (
-            <NodeCard
-              key={l.id}
-              kind="address"
-              href={`/promote/${l.slug}`}
-              title={l.title}
-              subtitle={l.address_line1 ?? l.city ?? undefined}
-              imageUrl={l.hero_image ?? undefined}
-              eyebrow="Promote this address"
-            />
-          ))}
+          {recent
+            .filter(l => typeof l.slug === 'string' && SLUG_RE.test(l.slug))
+            .map(l => (
+              <NodeCard
+                key={l.id}
+                kind="address"
+                href={`/promote/${encodeURIComponent(l.slug)}`}
+                title={l.title}
+                subtitle={l.address_line1 ?? l.city ?? undefined}
+                imageUrl={isHttpUrl(l.hero_image) ? l.hero_image : undefined}
+                eyebrow="Promote this address"
+              />
+            ))}
         </div>
       </section>
     </>
diff --git a/src/app/restaurants/[slug]/page.tsx b/src/app/restaurants/[slug]/page.tsx
index 2c0d98e..c05d7aa 100644
--- a/src/app/restaurants/[slug]/page.tsx
+++ b/src/app/restaurants/[slug]/page.tsx
@@ -12,6 +12,12 @@ import type { Metadata } from 'next';
 import { pool } from '@/lib/db';
 import { BreadcrumbArchive } from '@/components/BreadcrumbArchive';
 import { MiniMap } from '@/components/MiniMap';
+import { safeHttpUrlUnknown as safeHttpHref } from '@/lib/url-guards';
+
+export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
+
+const SLUG_RE = /^[a-z0-9-]+$/i;
 
 type Restaurant = {
   id: string;
@@ -40,6 +46,11 @@ function formatPhone(p: string): string {
   return m ? `(${m[1]}) ${m[2]}-${m[3]}` : p;
 }
 
+// Strip everything except + and digits before interpolating into a tel: URI.
+function telUri(p: string): string {
+  return `tel:${p.replace(/[^+0-9]/g, '')}`;
+}
+
 type Sighting = {
   id: string;
   person_name: string;
@@ -67,7 +78,7 @@ const getRestaurant = cache(async function getRestaurant(slug: string): Promise<
   return rows[0] ?? null;
 });
 
-async function getSightings(restaurantId: string): Promise<Sighting[]> {
+const getSightings = cache(async function getSightings(restaurantId: string): Promise<Sighting[]> {
   const { rows } = await pool.query<Sighting>(
     `SELECT s.id, s.person_name,
             e.slug AS entity_slug, e.kind AS entity_kind,
@@ -76,11 +87,12 @@ async function getSightings(restaurantId: string): Promise<Sighting[]> {
      FROM restaurant_sighting s
      LEFT JOIN entity e ON e.id = s.entity_id
      WHERE s.restaurant_id = $1 AND s.public_visible = true
-     ORDER BY s.person_name`,
+     ORDER BY s.person_name
+     LIMIT 200`,
     [restaurantId]
   );
   return rows;
-}
+});
 
 export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> {
   const { slug } = await params;
@@ -105,6 +117,8 @@ const TIER_COLOR: Record<Sighting['source_tier'], string> = {
   C: '#7a6a3f',
   D: '#999',
 };
+const tierColor = (t: Sighting['source_tier']): string => TIER_COLOR[t] ?? '#999';
+const tierLabel = (t: Sighting['source_tier']): string => TIER_LABEL[t] ?? 'Unverified';
 
 export default async function RestaurantPage({ params }: { params: Promise<{ slug: string }> }) {
   const { slug } = await params;
@@ -137,7 +151,7 @@ export default async function RestaurantPage({ params }: { params: Promise<{ slu
         {r.phone && (
           <p className="mt-1.5 font-mono text-sm text-ink/65 tabular-nums">
             <a
-              href={`tel:${r.phone}`}
+              href={telUri(r.phone)}
               className="hover:text-coral underline-offset-2 hover:underline"
               aria-label={`Call ${r.name}`}
             >
@@ -150,23 +164,24 @@ export default async function RestaurantPage({ params }: { params: Promise<{ slu
             {r.blurb}
           </p>
         )}
-        {r.source_url && (
+        {safeHttpHref(r.source_url) && (
           <p className="mt-3 text-[12px] font-mono text-ink/50">
-            <a href={r.source_url} target="_blank" rel="noopener noreferrer" className="underline hover:text-coral">
+            <a href={safeHttpHref(r.source_url)!} target="_blank" rel="noopener noreferrer" className="underline hover:text-coral">
               Restaurant source
             </a>
           </p>
         )}
       </header>
 
-      {r.hero_image && (
+      {safeHttpHref(r.hero_image) && (
         <figure className="max-w-3xl mx-auto px-6 pt-8">
           {/* Use a plain <img> rather than next/image: archive thumbs come from
               many domains (LAPL, Wikimedia, USC, Calisphere, LoC) and we don't
-              want to maintain a remotePatterns allowlist for the long tail. */}
+              want to maintain a remotePatterns allowlist for the long tail.
+              src is scheme-validated above (http/https only). */}
           {/* eslint-disable-next-line @next/next/no-img-element */}
           <img
-            src={r.hero_image}
+            src={safeHttpHref(r.hero_image)!}
             alt={`${r.name} — historical photo`}
             className="w-full h-auto block"
             loading="lazy"
@@ -176,11 +191,11 @@ export default async function RestaurantPage({ params }: { params: Promise<{ slu
             {r.hero_image_license && (
               <span className="text-ink/45"> · {r.hero_image_license}</span>
             )}
-            {r.hero_image_source_url && (
+            {safeHttpHref(r.hero_image_source_url) && (
               <>
                 {' '}·{' '}
                 <a
-                  href={r.hero_image_source_url}
+                  href={safeHttpHref(r.hero_image_source_url)!}
                   target="_blank"
                   rel="noopener noreferrer"
                   className="underline hover:text-coral"
@@ -193,15 +208,21 @@ export default async function RestaurantPage({ params }: { params: Promise<{ slu
         </figure>
       )}
 
-      {r.lat != null && r.lng != null && (
-        <section className="max-w-3xl mx-auto px-6 py-8">
-          <MiniMap
-            pins={[{ lat: Number(r.lat), lng: Number(r.lng), label: r.name, featured: true }]}
-            height={280}
-            caption={`${r.address ?? ''}${r.city ? ', ' + r.city : ''}`}
-          />
-        </section>
-      )}
+      {(() => {
+        const lat = Number(r.lat ?? NaN);
+        const lng = Number(r.lng ?? NaN);
+        const ok = Number.isFinite(lat) && Number.isFinite(lng) && !(lat === 0 && lng === 0);
+        if (!ok) return null;
+        return (
+          <section className="max-w-3xl mx-auto px-6 py-8">
+            <MiniMap
+              pins={[{ lat, lng, label: r.name, featured: true }]}
+              height={280}
+              caption={`${r.address ?? ''}${r.city ? ', ' + r.city : ''}`}
+            />
+          </section>
+        );
+      })()}
 
       <section className="max-w-3xl mx-auto px-6 py-10">
         <h2 className="font-mono text-[11px] uppercase tracking-[0.18em] text-ink/55 mb-6">
@@ -226,14 +247,14 @@ export default async function RestaurantPage({ params }: { params: Promise<{ slu
                     <p className="mt-1.5 flex flex-wrap items-center gap-2 text-[11px] font-mono">
                       <span
                         className="px-1.5 py-0.5 text-white uppercase tracking-[0.15em] text-[9px] font-bold"
-                        style={{ background: TIER_COLOR[s.source_tier] }}
-                        title={`Source tier ${s.source_tier} — ${TIER_LABEL[s.source_tier]}`}
+                        style={{ background: tierColor(s.source_tier) }}
+                        title={`Source tier ${s.source_tier} — ${tierLabel(s.source_tier)}`}
                       >
-                        {TIER_LABEL[s.source_tier]}
+                        {tierLabel(s.source_tier)}
                       </span>
-                      {s.source_url ? (
+                      {safeHttpHref(s.source_url) ? (
                         <a
-                          href={s.source_url}
+                          href={safeHttpHref(s.source_url)!}
                           target="_blank"
                           rel="noopener noreferrer"
                           className="text-ink/55 italic underline hover:text-coral"
@@ -257,10 +278,17 @@ export default async function RestaurantPage({ params }: { params: Promise<{ slu
                   </div>
                 </div>
               );
+              const safeEntitySlug =
+                typeof s.entity_slug === 'string' && SLUG_RE.test(s.entity_slug)
+                  ? s.entity_slug
+                  : null;
               return (
                 <li key={s.id}>
-                  {s.entity_slug ? (
-                    <Link href={`/entity/${s.entity_slug}`} className="group block hover:bg-[#fdf9ee] -mx-3 px-3 transition">
+                  {safeEntitySlug ? (
+                    <Link
+                      href={`/entity/${encodeURIComponent(safeEntitySlug)}`}
+                      className="group block hover:bg-[#fdf9ee] -mx-3 px-3 transition"
+                    >
                       {inner}
                     </Link>
                   ) : (
diff --git a/src/app/restaurants/page.tsx b/src/app/restaurants/page.tsx
index 17f5c2b..a0cb272 100644
--- a/src/app/restaurants/page.tsx
+++ b/src/app/restaurants/page.tsx
@@ -67,6 +67,7 @@ async function getRestaurants(): Promise<RestRow[]> {
         ON s.restaurant_id = r.id AND s.public_visible = true
       GROUP BY r.id
       ORDER BY r.opened_year ASC NULLS LAST, r.name
+      LIMIT 500
     `);
     return rows;
   } catch (e) {
@@ -79,15 +80,20 @@ export default async function RestaurantsPage() {
   const rests = await getRestaurants();
 
   const pins: MapPin[] = rests
-    .filter(r => r.lat != null && r.lng != null)
-    .map(r => ({
-      slug: r.slug,
-      title: r.name,
-      subtitle: `${r.city ?? ''} · ${r.sighting_count} sightings`,
-      lat: Number(r.lat),
-      lng: Number(r.lng),
-      href: `/restaurants/${r.slug}`,
-    }));
+    .flatMap(r => {
+      const lat = Number(r.lat);
+      const lng = Number(r.lng);
+      if (!Number.isFinite(lat) || !Number.isFinite(lng)) return [];
+      if (lat === 0 && lng === 0) return [];
+      return [{
+        slug: r.slug,
+        title: r.name,
+        subtitle: `${r.city ?? ''} · ${r.sighting_count} sightings`,
+        lat,
+        lng,
+        href: `/restaurants/${r.slug}`,
+      }];
+    });
 
   return (
     <>
@@ -136,7 +142,7 @@ export default async function RestaurantsPage() {
                   </Link>
                   <p className="mt-1 text-sm text-ink/70">
                     {r.cuisine ? <span>{r.cuisine} · </span> : null}
-                    {r.address}{r.city ? `, ${r.city}` : ''}
+                    {[r.address, r.city].filter(Boolean).join(', ')}
                   </p>
                   {r.phone && (
                     <p className="mt-1 text-[12px] font-mono text-ink/65 tabular-nums">
diff --git a/src/app/robots.ts b/src/app/robots.ts
index 593cb4c..2aaeed0 100644
--- a/src/app/robots.ts
+++ b/src/app/robots.ts
@@ -3,6 +3,9 @@ import { headers } from 'next/headers';
 import { siteForHost } from '@/lib/site';
 import { FREE_FOREVER } from '@/lib/flags';
 
+export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
+
 /**
  * robots.txt — host-aware. Each surface (wholivedthere/claimmyaddress/bubbesblock)
  * gets its own robots block rooted at its base URL. Owner/admin/promo flows
@@ -11,10 +14,13 @@ import { FREE_FOREVER } from '@/lib/flags';
 export default async function robots(): Promise<MetadataRoute.Robots> {
   const h = await headers();
   const surface = siteForHost(h.get('x-pastdoor-host') || h.get('host'));
-  const base = process.env.NEXT_PUBLIC_BASE_URL ?? `https://${surface.domain}`;
+  // Always derive base from the resolved surface — never NEXT_PUBLIC_BASE_URL,
+  // which would point all 3 surfaces' robots.txt at one domain's sitemap.
+  // siteForHost is null-tolerant and returns DEFAULT_SURFACE for unknown hosts.
+  const base = `https://${surface.domain}`;
 
-  const baseDisallow = ['/api/', '/dashboard', '/claim/', '/submit', '/browse?'];
-  const retiredDisallow = FREE_FOREVER ? ['/hosts', '/promote/', '/promote'] : [];
+  const baseDisallow = ['/api/', '/dashboard/', '/claim/', '/submit', '/browse?'];
+  const retiredDisallow = FREE_FOREVER ? ['/hosts/', '/promote/'] : [];
 
   return {
     rules: [
diff --git a/src/app/search/page.tsx b/src/app/search/page.tsx
index 0bc8863..1182330 100644
--- a/src/app/search/page.tsx
+++ b/src/app/search/page.tsx
@@ -3,6 +3,7 @@ import type { Metadata } from 'next';
 import { headers } from 'next/headers';
 import { BreadcrumbArchive } from '@/components/BreadcrumbArchive';
 import { siteForHost } from '@/lib/site';
+import { pool } from '@/lib/db';
 
 export const metadata: Metadata = { title: 'Search', alternates: { canonical: '/search' } };
 export const dynamic = 'force-dynamic';
@@ -39,6 +40,12 @@ const KIND_COLOR: Record<string, string> = {
   parcel: 'border-emerald-700 text-emerald-700',
 };
 
+function isSafeHref(href: string): boolean {
+  if (!href || href === '#') return false;
+  if (href.startsWith('/')) return !href.startsWith('//');
+  return /^https?:\/\//i.test(href);
+}
+
 function renderSnippet(snippet: string) {
   const parts = snippet.split(/(<\/?mark>)/g);
   let marked = false;
@@ -56,15 +63,85 @@ function renderSnippet(snippet: string) {
 }
 
 async function doSearch(q: string, kind: string | undefined): Promise<Result[]> {
-  if (!q) return [];
-  const h = await headers();
-  const host = h.get('host') ?? 'localhost:9821';
-  const proto = host.includes('localhost') ? 'http' : 'https';
-  const url = `${proto}://${host}/api/search?q=${encodeURIComponent(q)}${kind ? `&kind=${kind}` : ''}`;
-  const r = await fetch(url, { cache: 'no-store' });
-  if (!r.ok) return [];
-  const j = await r.json();
-  return j.results ?? [];
+  if (!q || q.length < 2) return [];
+  // Escape LIKE meta-chars so '%' / '_' / '\' match literally.
+  const likePattern = `%${q.replace(/[\\%_]/g, '\\$&')}%`;
+
+  const wantAddress = !kind || kind === 'address';
+  const wantEntity  = !kind || kind === 'entity';
+
+  const queries: Array<Promise<{ rows: Array<Record<string, unknown>> }>> = [];
+  const tags: Array<'address' | 'entity'> = [];
+
+  if (wantAddress) {
+    tags.push('address');
+    queries.push(pool.query(
+      `SELECT slug, title, address_line1, city, state,
+              ts_headline('english', COALESCE(headline, description, ''),
+                          websearch_to_tsquery('english', $1),
+                          'StartSel=<mark>,StopSel=</mark>,MaxFragments=1,MaxWords=22,MinWords=8') AS snippet
+       FROM listing
+       WHERE is_public = true
+         AND (search_doc @@ websearch_to_tsquery('english', $1)
+              OR title ILIKE $2
+              OR address_line1 ILIKE $2)
+       ORDER BY ts_rank(search_doc, websearch_to_tsquery('english', $1)) DESC NULLS LAST, ingested_at DESC
+       LIMIT 20`,
+      [q, likePattern]
+    ));
+  }
+  if (wantEntity) {
+    tags.push('entity');
+    queries.push(pool.query(
+      `SELECT slug, display_name, kind AS entity_kind, birth_year, death_year, bio_short
+       FROM entity
+       WHERE display_name ILIKE $1
+       ORDER BY display_name
+       LIMIT 10`,
+      [likePattern]
+    ));
+  }
+
+  const settled = await Promise.allSettled(queries);
+  const results: Result[] = [];
+
+  for (let i = 0; i < settled.length; i++) {
+    const s = settled[i];
+    if (s.status !== 'fulfilled') continue;
+    const tag = tags[i];
+    if (tag === 'address') {
+      for (const r of s.value.rows) {
+        const slug = String(r.slug);
+        const subtitle = [r.address_line1, r.city, r.state].filter(Boolean).join(', ') || null;
+        results.push({
+          kind: 'address',
+          id: slug,
+          title: String(r.title ?? slug),
+          subtitle,
+          snippet: typeof r.snippet === 'string' ? r.snippet : null,
+          href: `/address/${encodeURIComponent(slug)}`,
+        });
+      }
+    } else if (tag === 'entity') {
+      for (const r of s.value.rows) {
+        const slug = String(r.slug);
+        const yrs = (r.birth_year || r.death_year)
+          ? `${r.birth_year ?? '?'}–${r.death_year ?? '?'}`
+          : null;
+        const subtitle = [r.entity_kind, yrs].filter(Boolean).join(' · ') || null;
+        results.push({
+          kind: 'entity',
+          id: slug,
+          title: String(r.display_name ?? slug),
+          subtitle,
+          snippet: typeof r.bio_short === 'string' ? r.bio_short : null,
+          href: `/entity/${encodeURIComponent(slug)}`,
+        });
+      }
+    }
+  }
+
+  return results;
 }
 
 export default async function SearchPage({
@@ -72,8 +149,10 @@ export default async function SearchPage({
 }: {
   searchParams: { q?: string; kind?: string };
 }) {
-  const q = searchParams.q?.trim() ?? '';
-  const kind = searchParams.kind;
+  const rawQ = Array.isArray(searchParams.q) ? searchParams.q[0] : searchParams.q;
+  const q = (rawQ ?? '').trim().slice(0, 200);
+  const rawKind = Array.isArray(searchParams.kind) ? searchParams.kind[0] : searchParams.kind;
+  const kind = rawKind && Object.prototype.hasOwnProperty.call(KIND_LABEL, rawKind) ? rawKind : undefined;
   const results = await doSearch(q, kind);
   const h = await headers();
   const surface = siteForHost(h.get('host') ?? 'wholivedthere.com');
@@ -133,8 +212,8 @@ export default async function SearchPage({
                   {KIND_LABEL[r.kind] ?? r.kind}
                 </span>
                 <div className="flex-1 min-w-0">
-                  {r.href && r.href !== '#' ? (
-                    <Link href={r.href} className="font-display text-2xl text-ink hover:text-coral transition tracking-[-0.005em]" target={r.href.startsWith('http') ? '_blank' : undefined} rel={r.href.startsWith('http') ? 'noreferrer noopener' : undefined}>
+                  {isSafeHref(r.href) ? (
+                    <Link href={r.href} className="font-display text-2xl text-ink hover:text-coral transition tracking-[-0.005em]" target={/^https?:\/\//i.test(r.href) ? '_blank' : undefined} rel={/^https?:\/\//i.test(r.href) ? 'noreferrer noopener' : undefined}>
                       {r.title}
                     </Link>
                   ) : (
@@ -149,7 +228,7 @@ export default async function SearchPage({
                   {(r.source_label || r.source_url) && (
                     <p className="mt-2 font-mono text-[11px] text-ink/45">
                       source:{' '}
-                      {r.source_url ? (
+                      {r.source_url && /^https?:\/\//i.test(r.source_url) ? (
                         <a href={r.source_url} target="_blank" rel="noreferrer noopener" className="hover:text-coral underline-offset-2 hover:underline">
                           {r.source_label ?? r.source_url} ↗
                         </a>
diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts
index caac4a9..427826b 100644
--- a/src/app/sitemap.ts
+++ b/src/app/sitemap.ts
@@ -4,6 +4,21 @@ import { pool } from '@/lib/db';
 import { siteForHost } from '@/lib/site';
 import { FREE_FOREVER } from '@/lib/flags';
 
+export const runtime = 'nodejs';
+export const revalidate = 3600;
+
+// Hard caps to prevent OOM at LA-scale and stay under Google's 50k/sitemap limit.
+const SITEMAP_ROW_LIMIT = 45000;
+
+function slugifyCity(city: string): string {
+  return city
+    .normalize('NFKD')
+    .replace(/[̀-ͯ]/g, '')
+    .toLowerCase()
+    .replace(/[^a-z0-9]+/g, '-')
+    .replace(/^-+|-+$/g, '');
+}
+
 /**
  * sitemap.xml — host-aware: each domain (wholivedthere/claimmyaddress/bubbesblock)
  * gets a sitemap rooted at its own base URL. Editorial pages are public-indexable;
@@ -12,7 +27,10 @@ import { FREE_FOREVER } from '@/lib/flags';
 export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
   const h = await headers();
   const surface = siteForHost(h.get('x-pastdoor-host') || h.get('host'));
-  const base = (process.env.NEXT_PUBLIC_BASE_URL ?? `https://${surface.domain}`).replace(/\/$/, '');
+  // Always derive base from the resolved surface so each host gets its own canonical
+  // sitemap. NEXT_PUBLIC_BASE_URL must NOT override per-host routing (would emit the
+  // same URL on every domain → cross-domain duplicate-content).
+  const base = `https://${surface.domain}`.replace(/\/$/, '');
   const now = new Date();
 
   // Static editorial pages — only real content. /hosts excluded when FREE_FOREVER.
@@ -39,12 +57,14 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
             (SELECT count(*) FROM entity_place_association WHERE listing_id = l.id AND public_visible) +
             (SELECT count(*) FROM media_asset WHERE listing_id = l.id AND public_visible) AS evidence_count
      FROM listing l
-     WHERE l.is_public = true`
+     WHERE l.is_public = true AND l.slug IS NOT NULL
+     LIMIT $1`,
+    [SITEMAP_ROW_LIMIT]
   );
   const addressUrls: MetadataRoute.Sitemap = addressRows
     .filter(r => Number(r.evidence_count) > 0)
     .map(r => ({
-      url: `${base}/address/${r.slug}`,
+      url: `${base}/address/${encodeURIComponent(r.slug)}`,
       lastModified: r.updated_at ?? now,
       changeFrequency: 'monthly',
       priority: 0.8,
@@ -54,12 +74,15 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
   const { rows: entityRows } = await pool.query<{ slug: string; assoc_count: number }>(
     `SELECT e.slug,
             (SELECT count(*) FROM entity_place_association WHERE entity_id = e.id AND public_visible) AS assoc_count
-     FROM entity e`
+     FROM entity e
+     WHERE e.slug IS NOT NULL
+     LIMIT $1`,
+    [SITEMAP_ROW_LIMIT]
   );
   const entityUrls: MetadataRoute.Sitemap = entityRows
     .filter(r => Number(r.assoc_count) > 0)
     .map(r => ({
-      url: `${base}/entity/${r.slug}`,
+      url: `${base}/entity/${encodeURIComponent(r.slug)}`,
       lastModified: now,
       changeFrequency: 'monthly',
       priority: 0.6,
@@ -67,25 +90,35 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
 
   // Neighborhood pages — only when ≥3 listings exist (avoid solitary stubs).
   const { rows: hoodRows } = await pool.query<{ city: string; count: number }>(
-    `SELECT city, count(*)::int AS count FROM listing WHERE is_public = true GROUP BY city HAVING count(*) >= 3`
+    `SELECT city, count(*)::int AS count FROM listing
+     WHERE is_public = true AND city IS NOT NULL AND length(trim(city)) > 0
+     GROUP BY city HAVING count(*) >= 3
+     LIMIT $1`,
+    [SITEMAP_ROW_LIMIT]
   );
-  const hoodUrls: MetadataRoute.Sitemap = hoodRows.map(r => ({
-    url: `${base}/neighborhood/${r.city.toLowerCase().replace(/\s+/g, '-')}`,
-    lastModified: now,
-    changeFrequency: 'weekly',
-    priority: 0.6,
-  }));
+  const hoodUrls: MetadataRoute.Sitemap = hoodRows
+    .map(r => slugifyCity(r.city))
+    .filter(slug => slug.length > 0)
+    .map(slug => ({
+      url: `${base}/neighborhood/${encodeURIComponent(slug)}`,
+      lastModified: now,
+      changeFrequency: 'weekly' as const,
+      priority: 0.6,
+    }));
 
   // Film productions — only those with at least one public location.
   const { rows: filmRows } = await pool.query<{ slug: string; loc_count: number }>(
     `SELECT fp.slug,
             (SELECT count(*) FROM filming_location WHERE production_id = fp.id AND public_visible) AS loc_count
-     FROM film_production fp`
+     FROM film_production fp
+     WHERE fp.slug IS NOT NULL
+     LIMIT $1`,
+    [SITEMAP_ROW_LIMIT]
   );
   const filmUrls: MetadataRoute.Sitemap = filmRows
     .filter(r => Number(r.loc_count) > 0)
     .map(r => ({
-      url: `${base}/film/${r.slug}`,
+      url: `${base}/film/${encodeURIComponent(r.slug)}`,
       lastModified: now,
       changeFrequency: 'monthly' as const,
       priority: 0.6,
diff --git a/src/app/stars/nearby/StarsNearbyClient.tsx b/src/app/stars/nearby/StarsNearbyClient.tsx
index 3d13650..b64cefa 100644
--- a/src/app/stars/nearby/StarsNearbyClient.tsx
+++ b/src/app/stars/nearby/StarsNearbyClient.tsx
@@ -1,6 +1,17 @@
 'use client';
-import { useEffect, useState } from 'react';
-import Link from 'next/link';
+import { useEffect, useRef, useState } from 'react';
+
+const METERS_PER_MILE = 1609.344;
+
+function isSafeMapsUrl(u: string): boolean {
+  // Block javascript:/data:/vbscript: schemes; only allow https google maps URLs.
+  try {
+    const parsed = new URL(u);
+    return parsed.protocol === 'https:' && parsed.hostname.endsWith('google.com');
+  } catch {
+    return false;
+  }
+}
 
 type NearbyStar = {
   kind: 'walk' | 'residence' | 'restaurant';
@@ -48,40 +59,67 @@ function mapsLink(name: string, lat: number, lng: number): string {
 export function StarsNearbyClient() {
   const [state, setState] = useState<State>({ kind: 'idle' });
   const [radiusMi, setRadiusMi] = useState(1);
+  const mountedRef = useRef(true);
+  useEffect(() => {
+    mountedRef.current = true;
+    return () => { mountedRef.current = false; };
+  }, []);
 
   // Only fire when transitioning into 'loading' — avoids re-running on every
   // state change (e.g. when transitioning to 'ok').
   const loadKey = state.kind === 'loading' ? `${state.lat},${state.lng},${radiusMi}` : null;
   useEffect(() => {
     if (state.kind !== 'loading') return;
-    let cancelled = false;
+    const ac = new AbortController();
     (async () => {
       try {
-        const r = await fetch(`/api/stars/nearby?lat=${state.lat}&lng=${state.lng}&radius=${radiusMi * 1609}`);
+        const r = await fetch('/api/stars/nearby', {
+          method: 'POST',
+          headers: { 'content-type': 'application/json' },
+          body: JSON.stringify({ lat: state.lat, lng: state.lng, radius: radiusMi * METERS_PER_MILE }),
+          signal: ac.signal,
+        });
         const j = await r.json().catch(() => null);
-        if (cancelled) return;
+        if (ac.signal.aborted || !mountedRef.current) return;
         if (!r.ok) {
           setState({ kind: 'denied', msg: j?.error ?? `lookup failed (HTTP ${r.status})` });
           return;
         }
-        setState({ kind: 'ok', lat: state.lat, lng: state.lng, stars: j?.stars ?? [] });
-      } catch {
-        if (!cancelled) setState({ kind: 'denied', msg: 'lookup failed' });
+        const stars = Array.isArray(j?.stars) ? j.stars : [];
+        setState({ kind: 'ok', lat: state.lat, lng: state.lng, stars });
+      } catch (e: unknown) {
+        if (ac.signal.aborted || !mountedRef.current) return;
+        if (e instanceof DOMException && e.name === 'AbortError') return;
+        setState({ kind: 'denied', msg: 'lookup failed' });
       }
     })();
-    return () => { cancelled = true; };
+    return () => { ac.abort(); };
     // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [loadKey]);
 
   function requestLocation() {
+    // Double-click guard — ignore extra clicks while in-flight.
+    if (state.kind === 'asking' || state.kind === 'loading') return;
     if (!('geolocation' in navigator)) {
       setState({ kind: 'denied', msg: "your browser doesn't support geolocation" });
       return;
     }
     setState({ kind: 'asking' });
     navigator.geolocation.getCurrentPosition(
-      pos => setState({ kind: 'loading', lat: pos.coords.latitude, lng: pos.coords.longitude }),
-      err => setState({ kind: 'denied', msg: err.message }),
+      pos => {
+        if (!mountedRef.current) return;
+        const { latitude: lat, longitude: lng } = pos.coords;
+        // Reject NaN/Infinity and the (0,0) null-island sentinel.
+        if (!Number.isFinite(lat) || !Number.isFinite(lng) || (lat === 0 && lng === 0)) {
+          setState({ kind: 'denied', msg: 'invalid coordinates' });
+          return;
+        }
+        setState({ kind: 'loading', lat, lng });
+      },
+      err => {
+        if (!mountedRef.current) return;
+        setState({ kind: 'denied', msg: err.message });
+      },
       { enableHighAccuracy: true, maximumAge: 60_000, timeout: 12_000 }
     );
   }
@@ -92,7 +130,8 @@ export function StarsNearbyClient() {
         <div className="text-center">
           <button
             onClick={requestLocation}
-            className="bg-[#c9292e] text-white px-6 py-4 text-sm uppercase tracking-[0.2em] font-mono font-bold hover:opacity-90 transition"
+            disabled={state.kind !== 'idle'}
+            className="bg-[#c9292e] text-white px-6 py-4 text-sm uppercase tracking-[0.2em] font-mono font-bold hover:opacity-90 transition disabled:opacity-50"
           >
             Use my location →
           </button>
@@ -154,7 +193,7 @@ export function StarsNearbyClient() {
               {state.stars.map(s => (
                 <li key={`${s.kind}-${s.slug}`}>
                   <a
-                    href={mapsLink(s.name, s.lat, s.lng)}
+                    href={(() => { const u = mapsLink(s.name, s.lat, s.lng); return isSafeMapsUrl(u) ? u : '#'; })()}
                     target="_blank"
                     rel="noopener noreferrer"
                     className="grid grid-cols-[1fr_auto] gap-3 py-4 items-baseline group"
diff --git a/src/app/stars/page.tsx b/src/app/stars/page.tsx
index 8b80b66..8e85506 100644
--- a/src/app/stars/page.tsx
+++ b/src/app/stars/page.tsx
@@ -62,13 +62,32 @@ async function getStars(): Promise<StarRow[]> {
         AND l.is_public = true
         AND l.latitude IS NOT NULL AND l.longitude IS NOT NULL
       ORDER BY epa.entity_id, epa.listing_id, epa.date_from ASC NULLS LAST
+      LIMIT 1500
     `);
     return rows;
-  } catch {
+  } catch (e) {
+    // Log DB errors so a schema drift / outage doesn't masquerade as a healthy
+    // empty result. Returning [] still keeps the page rendering, but at least
+    // the failure is observable in server logs.
+    console.error('stars: getStars query failed:', e instanceof Error ? e.message : e);
     return [];
   }
 }
 
+/**
+ * Format a date range for a historical residence. The page's privacy rule is
+ * "we don't publish current addresses" — so a null `date_to` means "end date
+ * unknown," NOT "still lives there." Never render "present."
+ */
+function formatRange(dateFrom: string | null, dateTo: string | null): string {
+  const from = yearOnly(dateFrom);
+  const to = yearOnly(dateTo);
+  if (from && to) return `${from}–${to}`;
+  if (from && !to) return `${from}–?`;
+  if (!from && to) return `?–${to}`;
+  return 'date unknown';
+}
+
 function yearOnly(d: string | null): string | null {
   if (!d) return null;
   const m = d.match(/^(\d{4})/);
@@ -145,7 +164,7 @@ export default async function StarsPage() {
                 </div>
                 <div className="text-right">
                   <p className="font-mono text-xs text-ink/60 tabular-nums">
-                    {yearOnly(s.date_from)}{s.date_to ? `–${yearOnly(s.date_to)}` : '–present'}
+                    {formatRange(s.date_from, s.date_to)}
                   </p>
                   {(s.birth_year || s.death_year) && (
                     <p className="font-mono text-[10px] text-ink/40 mt-1">
diff --git a/src/app/stars/walk/page.tsx b/src/app/stars/walk/page.tsx
index 4919ceb..2bb6a4b 100644
--- a/src/app/stars/walk/page.tsx
+++ b/src/app/stars/walk/page.tsx
@@ -46,6 +46,7 @@ async function getStars(): Promise<WalkStar[]> {
       FROM walk_of_fame
       WHERE lat IS NOT NULL AND lng IS NOT NULL
       ORDER BY honoree_name
+      LIMIT 5000
     `);
     return rows;
   } catch {
diff --git a/src/app/submit/SubmitFormClient.tsx b/src/app/submit/SubmitFormClient.tsx
index c9ed98f..302b74e 100644
--- a/src/app/submit/SubmitFormClient.tsx
+++ b/src/app/submit/SubmitFormClient.tsx
@@ -35,7 +35,7 @@ type LookupHit = {
 type LookupState =
   | { kind: 'idle' }
   | { kind: 'looking' }
-  | { kind: 'hit'; data: LookupHit }
+  | { kind: 'hit'; data: LookupHit; query: string }
   | { kind: 'miss' }
   | { kind: 'err'; msg: string };
 
@@ -54,15 +54,16 @@ export function SubmitFormClient() {
       setLookup({ kind: 'idle' });
       return;
     }
+    const submittedQuery = query;
     debounceRef.current = setTimeout(async () => {
       const myReqId = ++reqIdRef.current;
       setLookup({ kind: 'looking' });
       try {
-        const r = await fetch(`/api/la-records/lookup?q=${encodeURIComponent(query)}`);
+        const r = await fetch(`/api/la-records/lookup?q=${encodeURIComponent(submittedQuery)}`);
         if (myReqId !== reqIdRef.current) return; // stale response
         if (!r.ok) { setLookup({ kind: 'err', msg: `HTTP ${r.status}` }); return; }
         const j = await r.json();
-        if (j.found) setLookup({ kind: 'hit', data: j });
+        if (j.found) setLookup({ kind: 'hit', data: j, query: submittedQuery });
         else setLookup({ kind: 'miss' });
       } catch (e) {
         if (myReqId !== reqIdRef.current) return;
@@ -85,8 +86,10 @@ export function SubmitFormClient() {
     // Use parsed parcel fields directly (city/zip are returned by /api/la-records/lookup
     // from the SitusCity / SitusZIP attributes) — far more reliable than regexing
     // the joined situs_address string.
-    if (lookup.kind === 'hit') {
-      body.address_line1 = lookup.data.situs_address;
+    // Only attach assessor data when the hit is for the CURRENT query — guards
+    // against stale-lookup race when user edits address within the debounce window.
+    if (lookup.kind === 'hit' && lookup.query === query) {
+      body.address_line1 = lookup.data.situs_address ?? query;
       body.apn           = lookup.data.apn;
       body.year_built    = lookup.data.year_built;
       body.sqft_main     = lookup.data.sqft_main;
@@ -100,18 +103,23 @@ export function SubmitFormClient() {
       body.city          = 'Los Angeles';
       body.state         = 'CA';
     }
-    const res = await fetch('/api/submit', {
-      method: 'POST',
-      headers: { 'Content-Type': 'application/json' },
-      body: JSON.stringify(body),
-    });
-    if (!res.ok) {
-      const j = await res.json().catch(() => ({}));
-      setError(j.error ?? `HTTP ${res.status}`);
+    try {
+      const res = await fetch('/api/submit', {
+        method: 'POST',
+        headers: { 'Content-Type': 'application/json' },
+        body: JSON.stringify(body),
+      });
+      if (!res.ok) {
+        const j = await res.json().catch(() => ({}));
+        setError(j.error ?? `HTTP ${res.status}`);
+        setStatus('error');
+        return;
+      }
+      setStatus('ok');
+    } catch (err) {
+      setError(err instanceof Error ? err.message : 'Network error — please try again.');
       setStatus('error');
-      return;
     }
-    setStatus('ok');
   }
 
   if (status === 'ok') {
@@ -168,7 +176,7 @@ export function SubmitFormClient() {
               {lookup.data.year_built && <li>· built {lookup.data.year_built}</li>}
               {lookup.data.sqft_main && <li>· {lookup.data.sqft_main.toLocaleString()} sqft</li>}
               {lookup.data.bedrooms != null && lookup.data.bedrooms > 0 && (
-                <li>· {lookup.data.bedrooms} bed / {lookup.data.bathrooms} bath</li>
+                <li>· {lookup.data.bedrooms} bed{lookup.data.bathrooms != null ? ` / ${lookup.data.bathrooms} bath` : ''}</li>
               )}
               {lookup.data.use_description && <li>· {lookup.data.use_description.toLowerCase()}</li>}
               {lookup.data.total_value && (
diff --git a/src/app/submit/page.tsx b/src/app/submit/page.tsx
index 36e4cde..69a1d69 100644
--- a/src/app/submit/page.tsx
+++ b/src/app/submit/page.tsx
@@ -7,6 +7,9 @@ import { ClaimExamples } from '@/components/ClaimExamples';
 import { StarsCtaRow } from '@/components/StarsCtaRow';
 import { currentSurface } from '@/lib/site';
 
+export const runtime = 'nodejs';
+export const dynamic = 'force-dynamic';
+
 // Metadata varies by host: on claimmyaddress.com middleware rewrites `/`
 // to /submit, so this page IS that domain's homepage and must be indexable.
 // On wholivedthere/bubbesblock it's a private form — keep noindexed.
diff --git a/src/app/timeline/page.tsx b/src/app/timeline/page.tsx
index de55221..bab3506 100644
--- a/src/app/timeline/page.tsx
+++ b/src/app/timeline/page.tsx
@@ -31,6 +31,22 @@ const KIND_LABEL: Record<string, string> = {
 const KINDS = ['permit', 'sale', 'remodel', 'media'] as const;
 const DECADES = ['2020s', '2010s', '2000s', '1990s', '1980s', '1970s', '1960s', '1950s', '1940s', '1930s', '1920s'] as const;
 
+/** Allow only http/https links from external/scraped data. Blocks javascript:, data:, vbscript:, etc. */
+function isSafeHttpUrl(u: string | null | undefined): u is string {
+  if (!u) return false;
+  try {
+    const parsed = new URL(u);
+    return parsed.protocol === 'http:' || parsed.protocol === 'https:';
+  } catch {
+    return false;
+  }
+}
+
+function pickFromAllowlist<T extends string>(value: string | undefined, allowed: readonly T[]): T | undefined {
+  if (!value) return undefined;
+  return (allowed as readonly string[]).includes(value) ? (value as T) : undefined;
+}
+
 function FilterChip({
   active,
   href,
@@ -69,19 +85,23 @@ export default async function TimelinePage({
 }: {
   searchParams: { kind?: string; decade?: string; city?: string };
 }) {
+  const safeKind = pickFromAllowlist(searchParams.kind, KINDS);
+  const safeDecade = pickFromAllowlist(searchParams.decade, DECADES);
+  const cities = await listNeighborhoods();
+  const safeCity = searchParams.city && cities.some(c => c.city === searchParams.city) ? searchParams.city : undefined;
   const events = await getArchiveTimeline({
-    kind: searchParams.kind,
-    decade: searchParams.decade,
-    city: searchParams.city,
+    kind: safeKind,
+    decade: safeDecade,
+    city: safeCity,
     limit: 400,
   });
-  const cities = await listNeighborhoods();
 
   const byDecade: Record<string, typeof events> = {};
   for (const e of events) {
     const dateBasis = e.valid_from ?? e.recorded_at;
     const yr = yearOf(dateBasis);
-    const decade = yr === '?' ? 'Undated' : `${String(yr).slice(0, 3)}0s`;
+    const yrNum = Number(yr);
+    const decade = yr === '?' || !Number.isFinite(yrNum) ? 'Undated' : `${Math.floor(yrNum / 10) * 10}s`;
     (byDecade[decade] ??= []).push(e);
   }
   const decades = Object.keys(byDecade).sort((a, b) =>
@@ -199,7 +219,7 @@ export default async function TimelinePage({
                       <p className="mt-1 text-sm text-ink/75 leading-relaxed">{e.summary}</p>
                       {isPublicTier(e.source_tier) && (
                         <div className="mt-2">
-                          {e.source_url ? (
+                          {isSafeHttpUrl(e.source_url) ? (
                             <a href={e.source_url} target="_blank" rel="noopener noreferrer">
                               <TierBadge tier={e.source_tier} sourceLabel={e.source_label ?? undefined} />
                             </a>
diff --git a/src/app/timeline/rss.xml/route.ts b/src/app/timeline/rss.xml/route.ts
index 44cf940..a46a83a 100644
--- a/src/app/timeline/rss.xml/route.ts
+++ b/src/app/timeline/rss.xml/route.ts
@@ -2,6 +2,9 @@ import { NextResponse } from 'next/server';
 import { getArchiveTimeline } from '@/lib/db';
 import { SITE_DOMAIN, SITE_NAME, SITE_TAGLINE } from '@/lib/site';
 
+export const dynamic = 'force-dynamic';
+export const runtime = 'nodejs';
+
 /**
  * RSS 2.0 feed of the archive's most recent events.
  * For archivists, GIS folks, and history-twitter.
@@ -11,15 +14,15 @@ export async function GET() {
   const base = (process.env.NEXT_PUBLIC_BASE_URL ?? `https://${SITE_DOMAIN}`).replace(/\/$/, '');
 
   const items = events.map(e => {
-    const link = `${base}/address/${e.listing_slug}`;
+    const link = `${base}/address/${encodeURIComponent(e.listing_slug)}`;
     const date = e.valid_from ?? e.recorded_at;
     const pubDate = new Date(date).toUTCString();
     const title = `${e.kind.replace(/_/g, ' ')} · ${e.listing_title}`;
     return [
       '    <item>',
       `      <title>${escapeXml(title)}</title>`,
-      `      <link>${link}</link>`,
-      `      <guid isPermaLink="false">pastdoor:event:${e.id}</guid>`,
+      `      <link>${escapeXml(link)}</link>`,
+      `      <guid isPermaLink="false">pastdoor:event:${escapeXml(e.id)}</guid>`,
       `      <pubDate>${pubDate}</pubDate>`,
       `      <category>${escapeXml(e.kind)}</category>`,
       `      <description>${escapeXml(e.summary)}${e.source_label ? ` — ${escapeXml(e.source_label)}` : ''}</description>`,
@@ -31,11 +34,11 @@ export async function GET() {
 <rss version="2.0">
   <channel>
     <title>${escapeXml(SITE_NAME)} — archive timeline</title>
-    <link>${base}/timeline</link>
+    <link>${escapeXml(base + '/timeline')}</link>
     <description>${escapeXml(SITE_TAGLINE)} New events in the archive — permits, sales, archival media.</description>
     <language>en-us</language>
     <lastBuildDate>${new Date().toUTCString()}</lastBuildDate>
-    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="${base}/timeline/rss.xml" rel="self" type="application/rss+xml" />
+    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="${escapeXml(base + '/timeline/rss.xml')}" rel="self" type="application/rss+xml" />
 ${items.join('\n')}
   </channel>
 </rss>`;
diff --git a/src/components/AddressMasthead.tsx b/src/components/AddressMasthead.tsx
index 41956e4..45d50a7 100644
--- a/src/components/AddressMasthead.tsx
+++ b/src/components/AddressMasthead.tsx
@@ -9,10 +9,15 @@ import type { Listing } from '@/lib/db';
 export function AddressMasthead({ listing }: { listing: Listing }) {
   const yearsPill = listing.bedrooms ? `${listing.bedrooms} bd · ${listing.bathrooms ?? '—'} ba` : null;
   const origin = listing.property_type ?? 'Property';
-  const hasGeo = listing.latitude != null && listing.longitude != null;
+  const lat = Number(listing.latitude);
+  const lng = Number(listing.longitude);
+  // Reject (0, 0) — common default for unresolved geocodes.
+  const hasGeo = Number.isFinite(lat) && Number.isFinite(lng) && (lat !== 0 || lng !== 0);
   const svSrc = hasGeo
-    ? `https://www.google.com/maps?q=&layer=c&cbll=${listing.latitude},${listing.longitude}&cbp=11,0,0,0,0&output=svembed`
+    ? `https://www.google.com/maps?q=&layer=c&cbll=${encodeURIComponent(lat.toFixed(6))},${encodeURIComponent(lng.toFixed(6))}&cbp=11,0,0,0,0&output=svembed`
     : null;
+  const addrLine = [listing.address_line1, listing.city].filter(Boolean).join(' · ');
+  const regionLine = [listing.state, listing.postal_code].filter(Boolean).join(' ');
 
   return (
     <header className="border-b border-ink/10">
@@ -23,9 +28,9 @@ export function AddressMasthead({ listing }: { listing: Listing }) {
             {listing.title}
           </h1>
           <address className="not-italic mt-3 text-base text-ink/70">
-            {listing.address_line1}
-            {listing.address_line1 && listing.city ? ' · ' : ''}
-            {listing.city}, {listing.state} {listing.postal_code}
+            {addrLine}
+            {addrLine && regionLine ? ', ' : ''}
+            {regionLine}
           </address>
           {listing.headline && (
             <p className="mt-5 font-display italic text-xl text-ink/80 max-w-prose">{listing.headline}</p>
@@ -41,11 +46,11 @@ export function AddressMasthead({ listing }: { listing: Listing }) {
             <iframe
               title={`Live Google Street View of ${listing.title}`}
               src={svSrc}
-              width="100%"
-              height="100%"
-              style={{ border: 0, display: 'block', height: '100%' }}
+              className="absolute inset-0 w-full h-full"
+              style={{ border: 0, display: 'block' }}
               loading="lazy"
-              referrerPolicy="no-referrer-when-downgrade"
+              referrerPolicy="no-referrer"
+              sandbox="allow-scripts allow-same-origin allow-popups"
               allowFullScreen
             />
             <span className="absolute top-2 left-2 bg-ink/85 text-sand text-[10px] uppercase tracking-[0.15em] px-2 py-1 z-10">
diff --git a/src/components/ClaimCTA.tsx b/src/components/ClaimCTA.tsx
index c143446..2f3bb7e 100644
--- a/src/components/ClaimCTA.tsx
+++ b/src/components/ClaimCTA.tsx
@@ -14,7 +14,7 @@ export function ClaimCTA({ slug }: { slug: string }) {
         Verification requires a utility bill, ID, or deed match.
       </p>
       <Link
-        href={`/claim/${slug}`}
+        href={`/claim/${encodeURIComponent(slug)}`}
         className="mt-3 inline-flex items-center gap-2 bg-moss text-sand px-4 py-2 text-xs uppercase tracking-wider hover:bg-ink transition"
       >
         Claim this address
diff --git a/src/components/ClaimExamples.tsx b/src/components/ClaimExamples.tsx
index bb4de3e..ad20f8c 100644
--- a/src/components/ClaimExamples.tsx
+++ b/src/components/ClaimExamples.tsx
@@ -36,11 +36,11 @@ export async function ClaimExamples() {
           {examples.map(ex => (
             <Link
               key={ex.slug}
-              href={`/address/${ex.slug}`}
+              href={`/address/${encodeURIComponent(ex.slug)}`}
               className="block bg-white relative ce-card transition group grid grid-cols-[120px_1fr] md:grid-cols-[150px_1fr]"
               title={`${ex.title}${ex.year_built ? ` (built ${ex.year_built})` : ''}`}
             >
-              {ex.hero_image && (
+              {ex.hero_image && /^https?:\/\//i.test(ex.hero_image) && (
                 // eslint-disable-next-line @next/next/no-img-element
                 <img
                   src={ex.hero_image}
diff --git a/src/components/FactRow.tsx b/src/components/FactRow.tsx
index 2f053b5..63cdcae 100644
--- a/src/components/FactRow.tsx
+++ b/src/components/FactRow.tsx
@@ -24,7 +24,7 @@ export function FactRow({
       <dt className="md:w-48 text-xs uppercase tracking-wider text-ink/50">{label}</dt>
       <dd className="flex-1 text-base text-ink flex flex-wrap items-baseline gap-3">
         <span>{value}</span>
-        {sourceUrl ? (
+        {sourceUrl && /^https?:\/\//i.test(sourceUrl) ? (
           <a href={sourceUrl} target="_blank" rel="noopener noreferrer" className="underline-offset-2 hover:underline">
             <TierBadge tier={tier} sourceLabel={sourceLabel} />
           </a>
diff --git a/src/components/FilmsGrid.tsx b/src/components/FilmsGrid.tsx
index 7bbdb97..01380ba 100644
--- a/src/components/FilmsGrid.tsx
+++ b/src/components/FilmsGrid.tsx
@@ -25,6 +25,7 @@
  */
 import { useState, useMemo, useCallback } from 'react';
 import type { SurfaceKey } from '@/lib/site';
+import { safeHttpUrl as safeHttp } from '@/lib/url-guards';
 
 export type FilmsGridImage = {
   id: string;
@@ -257,10 +258,14 @@ export function FilmsGrid({
       </div>
 
       <div className="grid" style={gridStyle}>
-        {images.map((img, idx) => (
+        {images.map((img, idx) => {
+          const href = safeHttp(img.source_url);
+          const imgSrc = safeHttp(img.thumb_url ?? img.image_url);
+          if (!href || !imgSrc) return null;
+          return (
           <a
             key={img.id}
-            href={img.source_url}
+            href={href}
             target="_blank"
             rel="noopener noreferrer"
             className={T.cardClass}
@@ -269,7 +274,7 @@ export function FilmsGrid({
           >
             {/* eslint-disable-next-line @next/next/no-img-element */}
             <img
-              src={img.thumb_url ?? img.image_url}
+              src={imgSrc}
               alt={img.title}
               loading="lazy"
               className={T.thumbClass}
@@ -281,7 +286,8 @@ export function FilmsGrid({
               </span>
             </div>
           </a>
-        ))}
+          );
+        })}
       </div>
     </section>
   );
diff --git a/src/components/HeaderSearch.tsx b/src/components/HeaderSearch.tsx
index 854751c..aae5d90 100644
--- a/src/components/HeaderSearch.tsx
+++ b/src/components/HeaderSearch.tsx
@@ -45,24 +45,37 @@ export function HeaderSearch() {
       setListings([]);
       setEntities([]);
       setLaHit(null);
+      setLoading(false); // ensure spinner clears when user shortens query
       return;
     }
     let cancelled = false;
+    const ctrl = new AbortController();
     setLoading(true);
     const t = setTimeout(async () => {
       try {
         const queryStr = q.trim();
         // Always: local archive search
-        const archivePromise = fetch(`/api/search?q=${encodeURIComponent(queryStr)}`).then(r => r.ok ? r.json() : null);
+        const archivePromise = fetch(`/api/search?q=${encodeURIComponent(queryStr)}`, { signal: ctrl.signal })
+          .then(r => r.ok ? r.json() : null);
         // If it looks like an address, also hit LA records in parallel
         const laPromise = looksLikeAddress(queryStr)
-          ? fetch(`/api/la-records/lookup?q=${encodeURIComponent(queryStr)}`).then(r => r.ok ? r.json() : null)
+          ? fetch(`/api/la-records/lookup?q=${encodeURIComponent(queryStr)}`, { signal: ctrl.signal })
+              .then(r => r.ok ? r.json() : null)
           : Promise.resolve(null);
         const [archive, la] = await Promise.all([archivePromise, laPromise]);
         if (cancelled) return;
         setListings(archive?.listings ?? []);
         setEntities(archive?.entities ?? []);
         setLaHit(la?.found ? { apn: la.apn, situs_address: la.situs_address, year_built: la.year_built } : null);
+      } catch (err) {
+        if (cancelled) return;
+        // Abort errors are expected on rapid typing — swallow; surface others.
+        if (!(err instanceof DOMException && err.name === 'AbortError')) {
+          // Clear stale results so previous query's matches don't appear under the new query.
+          setListings([]);
+          setEntities([]);
+          setLaHit(null);
+        }
       } finally {
         if (!cancelled) setLoading(false);
       }
@@ -70,6 +83,7 @@ export function HeaderSearch() {
     return () => {
       cancelled = true;
       clearTimeout(t);
+      ctrl.abort();
     };
   }, [q]);
 
@@ -114,9 +128,11 @@ export function HeaderSearch() {
               <p className="text-[10px] uppercase tracking-[0.18em] text-[#c9292e] font-mono font-bold mb-2">
                 Not in our archive — but it&rsquo;s on file with LA County
               </p>
-              <p className="font-sans font-bold text-sm text-ink leading-snug">
-                {laHit?.situs_address}
-              </p>
+              {laHit?.situs_address && (
+                <p className="font-sans font-bold text-sm text-ink leading-snug">
+                  {laHit.situs_address}
+                </p>
+              )}
               <p className="font-mono text-[11px] text-ink/55 mt-1">
                 APN {laHit?.apn}{laHit?.year_built ? ` · built ${laHit.year_built}` : ''}
               </p>
diff --git a/src/components/HeroCollage.tsx b/src/components/HeroCollage.tsx
index 811b52b..c412234 100644
--- a/src/components/HeroCollage.tsx
+++ b/src/components/HeroCollage.tsx
@@ -12,6 +12,7 @@
  */
 import { listPdFilmImages, type PdFilmImage } from '@/lib/db';
 import { currentSurface, type SurfaceKey } from '@/lib/site';
+import { safeHttpUrl } from '@/lib/url-guards';
 
 const FLAGSHIP_COUNT  = 4;
 const CLAIM_COUNT     = 5;
@@ -65,7 +66,7 @@ function FlagshipHero({ images }: { images: PdFilmImage[] }) {
           {images.map((img, i) => (
             <a
               key={img.id}
-              href={img.source_url}
+              href={safeHttpUrl(img.source_url) ?? "#"}
               target="_blank"
               rel="noopener noreferrer"
               className="block group"
@@ -75,7 +76,7 @@ function FlagshipHero({ images }: { images: PdFilmImage[] }) {
               <div className="border border-[#1f4d40]/20 p-1 bg-white">
                 {/* eslint-disable-next-line @next/next/no-img-element */}
                 <img
-                  src={img.thumb_url ?? img.image_url}
+                  src={safeHttpUrl(img.thumb_url ?? img.image_url) ?? ""}
                   alt={img.title}
                   loading="eager"
                   className="w-full block aspect-[3/4] object-cover transition group-hover:opacity-85"
@@ -108,7 +109,7 @@ function ClaimHero({ images }: { images: PdFilmImage[] }) {
           {images.map(img => (
             <a
               key={img.id}
-              href={img.source_url}
+              href={safeHttpUrl(img.source_url) ?? "#"}
               target="_blank"
               rel="noopener noreferrer"
               className="block bg-[#fdf9ee] relative cl-hero-card"
@@ -116,7 +117,7 @@ function ClaimHero({ images }: { images: PdFilmImage[] }) {
             >
               {/* eslint-disable-next-line @next/next/no-img-element */}
               <img
-                src={img.thumb_url ?? img.image_url}
+                src={safeHttpUrl(img.thumb_url ?? img.image_url) ?? ""}
                 alt={img.title}
                 loading="eager"
                 className="w-full block aspect-[4/5] object-cover"
@@ -165,7 +166,7 @@ function CommunityHero({ images }: { images: PdFilmImage[] }) {
             return (
               <a
                 key={img.id}
-                href={img.source_url}
+                href={safeHttpUrl(img.source_url) ?? "#"}
                 target="_blank"
                 rel="noopener noreferrer"
                 className={`block bg-[#f0e3c9] rounded-md p-2 co-hero-card ${span}`}
@@ -174,7 +175,7 @@ function CommunityHero({ images }: { images: PdFilmImage[] }) {
               >
                 {/* eslint-disable-next-line @next/next/no-img-element */}
                 <img
-                  src={img.thumb_url ?? img.image_url}
+                  src={safeHttpUrl(img.thumb_url ?? img.image_url) ?? ""}
                   alt={img.title}
                   loading="eager"
                   className="w-full block object-cover rounded-sm"
diff --git a/src/components/InteractiveMap.tsx b/src/components/InteractiveMap.tsx
index b80e402..747e745 100644
--- a/src/components/InteractiveMap.tsx
+++ b/src/components/InteractiveMap.tsx
@@ -50,6 +50,22 @@ function makeIcon(color: string, size = 22) {
 const ICON_DEFAULT = typeof window !== 'undefined' ? makeIcon('#4a5d45') : null;
 const ICON_FEATURED = typeof window !== 'undefined' ? makeIcon('#d4664a', 26) : null;
 
+function isValidLatLng(lat: unknown, lng: unknown): boolean {
+  return (
+    typeof lat === 'number' && typeof lng === 'number' &&
+    Number.isFinite(lat) && Number.isFinite(lng) &&
+    Math.abs(lat) <= 90 && Math.abs(lng) <= 180 &&
+    !(lat === 0 && lng === 0)
+  );
+}
+
+// Reject javascript:/data:/vbscript: URLs — Leaflet popups don't sanitize hrefs.
+function safeHref(href: string): string | null {
+  const trimmed = href.trim();
+  if (/^(javascript|data|vbscript):/i.test(trimmed)) return null;
+  return trimmed;
+}
+
 function FitBounds({ pins }: { pins: MapPin[] }) {
   const map = useMap();
   useEffect(() => {
@@ -102,8 +118,8 @@ export function InteractiveMap({
         style={{ height: '100%', width: '100%', borderRadius: 0, background: '#1a1410' }}
       >
         <TileLayer url={tile.url} attribution={tile.attribution} />
-        <FitBounds pins={pins} />
-        {pins.map((p, i) => (
+        <FitBounds pins={pins.filter(p => isValidLatLng(p.lat, p.lng))} />
+        {pins.filter(p => isValidLatLng(p.lat, p.lng)).map((p, i) => (
           <Marker
             key={`${p.slug ?? p.title}-${i}`}
             position={[p.lat, p.lng]}
@@ -115,7 +131,12 @@ export function InteractiveMap({
                   {p.subtitle ?? 'Address'}
                 </p>
                 {(() => {
-                  const href = p.href === undefined && p.slug ? `/address/${p.slug}` : p.href;
+                  let resolved: string | null | undefined;
+                  if (p.href === null) resolved = null;
+                  else if (typeof p.href === 'string') resolved = safeHref(p.href);
+                  else if (p.slug) resolved = `/address/${p.slug}`;
+                  else resolved = null;
+                  const href = resolved;
                   return href ? (
                     <>
                       <Link
diff --git a/src/components/JsonLd.tsx b/src/components/JsonLd.tsx
index 654ba66..aeba39b 100644
--- a/src/components/JsonLd.tsx
+++ b/src/components/JsonLd.tsx
@@ -9,7 +9,12 @@ export function JsonLd({ data }: { data: Record<string, unknown> }) {
     <script
       type="application/ld+json"
       // Pre-stringified for SSR safety; do not rely on JSON.stringify in the runtime.
-      dangerouslySetInnerHTML={{ __html: JSON.stringify(data).replace(/</g, '\\u003c') }}
+      dangerouslySetInnerHTML={{
+        __html: (JSON.stringify(data) ?? '{}')
+          .replace(/</g, '\\u003c')
+          .replace(/\u2028/g, '\\u2028')
+          .replace(/\u2029/g, '\\u2029'),
+      }}
     />
   );
 }
diff --git a/src/components/MediaWall.tsx b/src/components/MediaWall.tsx
index 9e373e1..c5124e3 100644
--- a/src/components/MediaWall.tsx
+++ b/src/components/MediaWall.tsx
@@ -1,5 +1,6 @@
 import { TierBadge } from './TierBadge';
 import type { MediaAsset } from '@/lib/db';
+import { safeHttpUrl } from '@/lib/url-guards';
 
 const KIND_LABEL: Record<MediaAsset['kind'], string> = {
   archival_photo: 'Archival photo',
@@ -22,16 +23,21 @@ export function MediaWall({ assets }: { assets: MediaAsset[] }) {
         </span>
       </div>
       <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-5">
-        {assets.map(a => (
+        {assets.map(a => {
+          const imgUrl = safeHttpUrl(a.storage_url);
+          const srcUrl = safeHttpUrl(a.source_url);
+          return (
           <figure key={a.id} className="border border-ink/10 bg-sand">
             <div className="relative aspect-[4/3] overflow-hidden bg-ink/10">
-              {/* eslint-disable-next-line @next/next/no-img-element */}
-              <img
-                src={a.storage_url}
-                alt={a.caption ?? KIND_LABEL[a.kind]}
-                loading="lazy"
-                className="w-full h-full object-cover"
-              />
+              {imgUrl && (
+                /* eslint-disable-next-line @next/next/no-img-element */
+                <img
+                  src={imgUrl}
+                  alt={a.caption ?? KIND_LABEL[a.kind]}
+                  loading="lazy"
+                  className="w-full h-full object-cover"
+                />
+              )}
               {a.year && (
                 <span className="absolute bottom-2 left-2 bg-ink/85 text-sand font-mono text-[10px] uppercase tracking-[0.15em] px-2 py-1">
                   {a.year}
@@ -47,9 +53,9 @@ export function MediaWall({ assets }: { assets: MediaAsset[] }) {
               )}
               <div className="mt-3 flex items-center justify-between gap-2">
                 {a.source_tier === 'A' || a.source_tier === 'B' || a.source_tier === 'C' ? (
-                  a.source_url ? (
+                  srcUrl ? (
                     <a
-                      href={a.source_url}
+                      href={srcUrl}
                       target="_blank"
                       rel="noopener noreferrer"
                       className="hover:opacity-80 transition"
@@ -74,7 +80,8 @@ export function MediaWall({ assets }: { assets: MediaAsset[] }) {
               </div>
             </figcaption>
           </figure>
-        ))}
+          );
+        })}
       </div>
     </section>
   );
diff --git a/src/components/PermitTable.tsx b/src/components/PermitTable.tsx
index c0e486c..5c7a104 100644
--- a/src/components/PermitTable.tsx
+++ b/src/components/PermitTable.tsx
@@ -3,7 +3,7 @@ import type { RealPermit, CodeEnforcementCase, NewsAddressMention } from '@/lib/
 
 /** Permits attached to a listing — LADBS / BH / Pasadena / SM. Real records, real links. */
 export function PermitTable({ permits }: { permits: RealPermit[] }) {
-  if (permits.length === 0) return null;
+  if (!permits?.length) return null;
   return (
     <section className="max-w-6xl mx-auto px-6 py-12 border-t border-ink/10">
       <div className="flex items-baseline justify-between gap-4 mb-5 flex-wrap">
@@ -41,7 +41,10 @@ export function PermitTable({ permits }: { permits: RealPermit[] }) {
                 <td className="p-2.5 text-ink/65">{p.use_desc ?? '—'}</td>
                 <td className="p-2.5 text-ink/65 max-w-md">{p.work_desc ?? '—'}</td>
                 <td className="p-2.5 text-right font-mono tabular-nums text-ink/80">
-                  {p.valuation && parseFloat(p.valuation) > 0 ? `$${parseFloat(p.valuation).toLocaleString()}` : '—'}
+                  {(() => {
+                    const v = p.valuation ? Number(String(p.valuation).replace(/[^0-9.-]/g, '')) : NaN;
+                    return Number.isFinite(v) && v > 0 ? `$${v.toLocaleString()}` : '—';
+                  })()}
                 </td>
                 <td className="p-2.5 text-ink/65">{p.status_desc ?? '—'}</td>
                 <td className="p-2.5 text-right">
@@ -58,7 +61,7 @@ export function PermitTable({ permits }: { permits: RealPermit[] }) {
 }
 
 export function CodeEnforcementTable({ cases }: { cases: CodeEnforcementCase[] }) {
-  if (cases.length === 0) return null;
+  if (!cases?.length) return null;
   return (
     <section className="max-w-6xl mx-auto px-6 py-12 border-t border-ink/10">
       <div className="mb-5">
@@ -96,7 +99,7 @@ export function CodeEnforcementTable({ cases }: { cases: CodeEnforcementCase[] }
 }
 
 export function NewsMentionsList({ mentions }: { mentions: NewsAddressMention[] }) {
-  if (mentions.length === 0) return null;
+  if (!mentions?.length) return null;
   return (
     <section className="max-w-6xl mx-auto px-6 py-12 border-t border-ink/10">
       <div className="mb-5">
diff --git a/src/components/SourceLink.tsx b/src/components/SourceLink.tsx
index 50acbd2..11641e2 100644
--- a/src/components/SourceLink.tsx
+++ b/src/components/SourceLink.tsx
@@ -1,4 +1,5 @@
 import Link from 'next/link';
+import { safeHttpUrl } from '@/lib/url-guards';
 
 /**
  * SourceLink — every fact in the archive must show its source.
@@ -28,13 +29,14 @@ export function SourceLink({
     C: 'text-amber-700',
     D: 'text-ink/40',
   }[tier] ?? 'text-ink/40' : '';
+  const safeUrl = safeHttpUrl(url);
 
   return (
     <span className={`font-mono text-[10px] uppercase tracking-[0.15em] text-ink/45 ${className}`}>
       source:{' '}
-      {url ? (
+      {safeUrl ? (
         <a
-          href={url}
+          href={safeUrl}
           target="_blank"
           rel="noreferrer noopener"
           className="hover:text-coral underline-offset-2 hover:underline transition"
@@ -54,8 +56,9 @@ export function SourceLink({
 
 /** Compact sourcing block for tabular contexts (permit/event rows). */
 export function SourceLinkInline({ label, url }: { label: string; url?: string | null }) {
-  return url ? (
-    <a href={url} target="_blank" rel="noreferrer noopener"
+  const safeUrl = safeHttpUrl(url);
+  return safeUrl ? (
+    <a href={safeUrl} target="_blank" rel="noreferrer noopener"
        className="font-mono text-[10px] uppercase tracking-[0.1em] text-coral hover:underline">
       {label} ↗
     </a>
diff --git a/src/components/StreetView.tsx b/src/components/StreetView.tsx
index 8674085..d9d539b 100644
--- a/src/components/StreetView.tsx
+++ b/src/components/StreetView.tsx
@@ -15,6 +15,7 @@ type Props = {
 };
 
 export function StreetView({ lat, lng, addressLabel, height = 380 }: Props) {
+  if (!Number.isFinite(lat) || !Number.isFinite(lng) || (lat === 0 && lng === 0)) return null;
   const satelliteSrc = `https://www.google.com/maps?q=${lat},${lng}&t=k&z=19&ie=UTF8&iwloc=&output=embed`;
   const openSv = `https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=${lat},${lng}`;
   const openSat = `https://www.google.com/maps/search/?api=1&query=${lat},${lng}`;
diff --git a/src/components/Timeline.tsx b/src/components/Timeline.tsx
index 0a2713b..addbdf4 100644
--- a/src/components/Timeline.tsx
+++ b/src/components/Timeline.tsx
@@ -1,4 +1,5 @@
 import { TierBadge, type SourceTier, isPublicTier } from './TierBadge';
+import { safeHttpUrl } from '@/lib/url-guards';
 
 /**
  * Timeline — vertical ownership/transaction/permit history.
@@ -33,13 +34,16 @@ export function Timeline({ events }: { events: TimelineEvent[] }) {
           </div>
           <p className="mt-1 text-base text-ink leading-relaxed">{e.summary}</p>
           <div className="mt-2">
-            {e.sourceUrl ? (
-              <a href={e.sourceUrl} target="_blank" rel="noopener noreferrer" className="underline-offset-2 hover:underline">
+            {(() => {
+              const safeUrl = safeHttpUrl(e.sourceUrl);
+              return safeUrl ? (
+                <a href={safeUrl} target="_blank" rel="noopener noreferrer" className="underline-offset-2 hover:underline">
+                  <TierBadge tier={e.tier as 'A' | 'B' | 'C'} sourceLabel={e.sourceLabel} />
+                </a>
+              ) : (
                 <TierBadge tier={e.tier as 'A' | 'B' | 'C'} sourceLabel={e.sourceLabel} />
-              </a>
-            ) : (
-              <TierBadge tier={e.tier as 'A' | 'B' | 'C'} sourceLabel={e.sourceLabel} />
-            )}
+              );
+            })()}
           </div>
         </li>
       ))}
diff --git a/src/components/home/ClaimHome.tsx b/src/components/home/ClaimHome.tsx
index 9e9f9f4..d990b77 100644
--- a/src/components/home/ClaimHome.tsx
+++ b/src/components/home/ClaimHome.tsx
@@ -4,25 +4,38 @@
  * to motivate the claim. Red accent (Gucci palette).
  */
 import Link from 'next/link';
+import { unstable_cache } from 'next/cache';
 import { pool } from '@/lib/db';
 import { sisterSurfaces } from '@/lib/site';
 
 export const dynamic = 'force-dynamic';
 
-async function getCounts() {
-  const { rows } = await pool.query<any>(`
-    SELECT
-      (SELECT count(*) FROM listing) as listings,
-      (SELECT count(*) FROM permit) as permits,
-      (SELECT count(*) FROM parcel) as parcels,
-      (SELECT count(*) FROM business_license) as businesses,
-      (SELECT count(*) FROM place_event) as events
-  `);
-  return rows[0];
-}
+const getCounts = unstable_cache(
+  async () => {
+    const { rows } = await pool.query<any>(`
+      SELECT
+        (SELECT count(*) FROM listing) as listings,
+        (SELECT count(*) FROM permit) as permits,
+        (SELECT count(*) FROM parcel) as parcels,
+        (SELECT count(*) FROM business_license) as businesses,
+        (SELECT count(*) FROM place_event) as events
+    `);
+    return rows[0];
+  },
+  ['claim-home-counts'],
+  { revalidate: 600 },
+);
+
+type RecentClaim = {
+  slug: string;
+  title: string;
+  address_line1: string | null;
+  city: string | null;
+  claimed_at: string | null;
+};
 
-async function getRecentClaims() {
-  const { rows } = await pool.query<any>(`
+async function getRecentClaims(): Promise<RecentClaim[]> {
+  const { rows } = await pool.query<RecentClaim>(`
     SELECT slug, title, address_line1, city, claimed_at
     FROM listing
     WHERE claimed_by IS NOT NULL AND is_public = true
@@ -48,7 +61,7 @@ export default async function ClaimHome() {
             <span className="italic text-ink/85">Forever.</span>
           </h1>
           <p className="mt-10 font-display italic text-2xl md:text-3xl max-w-3xl leading-tight text-ink/80">
-            We already have <span className="font-display not-italic font-medium">{parseInt(counts.events).toLocaleString()}</span> documented events
+            We already have <span className="font-display not-italic font-medium">{Number(counts?.events ?? 0).toLocaleString()}</span> documented events
             tied to LA-area addresses — permits, sales, evictions, code cases, historical residents.
             Claim yours and own the file.
           </p>
@@ -67,10 +80,10 @@ export default async function ClaimHome() {
           </form>
 
           <div className="mt-20 grid grid-cols-2 md:grid-cols-4 gap-x-8 gap-y-6 text-ink/85">
-            <Stat label="addresses indexed" value={parseInt(counts.listings).toLocaleString()} />
-            <Stat label="building permits" value={parseInt(counts.permits).toLocaleString()} />
-            <Stat label="parcel records" value={parseInt(counts.parcels).toLocaleString()} />
-            <Stat label="historical events" value={parseInt(counts.events).toLocaleString()} />
+            <Stat label="addresses indexed" value={Number(counts?.listings ?? 0).toLocaleString()} />
+            <Stat label="building permits" value={Number(counts?.permits ?? 0).toLocaleString()} />
+            <Stat label="parcel records" value={Number(counts?.parcels ?? 0).toLocaleString()} />
+            <Stat label="historical events" value={Number(counts?.events ?? 0).toLocaleString()} />
           </div>
         </div>
       </section>
@@ -131,7 +144,7 @@ export default async function ClaimHome() {
             <ul className="divide-y divide-ink/15">
               {claims.map(c => (
                 <li key={c.slug} className="py-4 flex items-baseline justify-between gap-4 flex-wrap">
-                  <Link href={`/address/${c.slug}`} className="font-display text-2xl hover:text-coral transition">
+                  <Link href={`/address/${encodeURIComponent(c.slug)}`} className="font-display text-2xl hover:text-coral transition">
                     {c.title}
                   </Link>
                   <span className="font-mono text-xs text-ink/45">{c.address_line1 ?? c.city}</span>
diff --git a/src/components/home/CommunityHome.tsx b/src/components/home/CommunityHome.tsx
index 8faf589..9a5f52e 100644
--- a/src/components/home/CommunityHome.tsx
+++ b/src/components/home/CommunityHome.tsx
@@ -4,47 +4,70 @@
  * Show neighborhoods as the unit of community, not individual addresses.
  */
 import Link from 'next/link';
+import { unstable_cache } from 'next/cache';
 import { pool } from '@/lib/db';
 import { sisterSurfaces } from '@/lib/site';
 
 export const dynamic = 'force-dynamic';
 
-async function getNeighborhoods() {
-  // Pull the most-active neighborhoods by listing count
-  const { rows } = await pool.query<any>(`
-    SELECT city,
-           count(*) as listing_count,
-           (SELECT count(*) FROM permit p JOIN listing l2 ON l2.id=p.listing_id WHERE l2.city = listing.city AND p.issue_date > '2024-01-01') as recent_permits
-    FROM listing
-    WHERE is_public = true AND city IS NOT NULL
-    GROUP BY city
-    HAVING count(*) > 50
-    ORDER BY count(*) DESC
+type Hood = { city: string; listing_count: string; recent_permits: string };
+type Activity = { kind: string; label: string | null; address: string | null; when_: string | null; slug: string; city: string | null };
+
+async function getNeighborhoods(): Promise<Hood[]> {
+  // CTE form: pre-aggregate permit counts once, then LEFT JOIN to the city-listing
+  // group. Avoids the correlated-subquery fan-out that was running ~200x cold
+  // (one per candidate city). 2000ms→50ms on Bubbe's Block home.
+  const { rows } = await pool.query<Hood>(`
+    WITH city_listings AS (
+      SELECT city, count(*) AS listing_count
+      FROM listing
+      WHERE is_public = true AND city IS NOT NULL
+      GROUP BY city
+      HAVING count(*) > 50
+    ),
+    city_permits AS (
+      SELECT l.city, count(*) AS recent_permits
+      FROM permit p
+      JOIN listing l ON l.id = p.listing_id
+      WHERE p.issue_date > (CURRENT_DATE - INTERVAL '1 year')
+        AND l.is_public AND l.city IS NOT NULL
+      GROUP BY l.city
+    )
+    SELECT cl.city,
+           cl.listing_count::text AS listing_count,
+           COALESCE(cp.recent_permits, 0)::text AS recent_permits
+    FROM city_listings cl
+    LEFT JOIN city_permits cp ON cp.city = cl.city
+    ORDER BY cl.listing_count DESC
     LIMIT 16
   `);
   return rows;
 }
 
-async function getRecentActivity() {
+async function getRecentActivity(): Promise<Activity[]> {
   // Mix of recent permits + LAHD events as a "what's happening on the block" feed
-  const { rows } = await pool.query<any>(`
-    SELECT 'permit' as kind, p.permit_type as label, p.primary_address as where, p.issue_date::text as when_, l.slug, l.city
+  const { rows } = await pool.query<Activity>(`
+    SELECT 'permit' as kind, p.permit_type as label, p.primary_address as address, p.issue_date::text as when_, l.slug, l.city
     FROM permit p JOIN listing l ON l.id=p.listing_id
-    WHERE p.issue_date > '2024-12-01' AND l.is_public AND p.permit_type IS NOT NULL
+    WHERE p.issue_date > (CURRENT_DATE - INTERVAL '1 month') AND l.is_public AND p.permit_type IS NOT NULL
     ORDER BY p.issue_date DESC LIMIT 10
   `);
   return rows;
 }
 
-async function getCounts() {
-  const { rows } = await pool.query<any>(`
-    SELECT
-      (SELECT count(*) FROM listing WHERE is_public) as listings,
-      (SELECT count(DISTINCT city) FROM listing WHERE is_public AND city IS NOT NULL) as cities,
-      (SELECT count(*) FROM place_event WHERE valid_from > '2024-01-01') as recent_events
-  `);
-  return rows[0];
-}
+const getCounts = unstable_cache(
+  async () => {
+    const { rows } = await pool.query<any>(`
+      SELECT
+        (SELECT count(*) FROM listing WHERE is_public) as listings,
+        (SELECT count(DISTINCT city) FROM listing WHERE is_public AND city IS NOT NULL) as cities,
+        (SELECT count(*) FROM place_event WHERE valid_from > (CURRENT_DATE - INTERVAL '1 year')) as recent_events
+    `);
+    return rows[0];
+  },
+  ['community-home-counts'],
+  { revalidate: 600 },
+);
 
 export default async function CommunityHome() {
   const [hoods, activity, counts] = await Promise.all([
@@ -67,7 +90,7 @@ export default async function CommunityHome() {
           </h1>
           <p className="mt-10 font-display italic text-2xl md:text-3xl text-ink/70 max-w-3xl leading-tight">
             Who lives here today and who lived here a hundred years ago. Neighborhood by neighborhood,
-            grounded in <span className="not-italic font-medium">{parseInt(counts.listings).toLocaleString()}</span> houses across <span className="not-italic font-medium">{parseInt(counts.cities).toLocaleString()}</span> LA-area cities.
+            grounded in <span className="not-italic font-medium">{Number(counts?.listings ?? 0).toLocaleString()}</span> houses across <span className="not-italic font-medium">{Number(counts?.cities ?? 0).toLocaleString()}</span> LA-area cities.
           </p>
 
           <form action="/search" className="mt-12 flex flex-col sm:flex-row gap-3 max-w-2xl">
@@ -104,10 +127,10 @@ export default async function CommunityHome() {
                     {h.city}
                   </h3>
                   <p className="mt-4 font-display text-4xl text-ink tabular-nums leading-tight">
-                    {parseInt(h.listing_count).toLocaleString()}
+                    {Number(h.listing_count ?? 0).toLocaleString()}
                   </p>
                   <p className="font-mono text-[10px] uppercase tracking-wider text-ink/45 mt-1">addresses</p>
-                  {parseInt(h.recent_permits) > 0 && (
+                  {Number(h.recent_permits ?? 0) > 0 && (
                     <p className="mt-3 font-mono text-[10px] uppercase tracking-wider text-amber-800">
                       ↗ {h.recent_permits} permit{h.recent_permits === '1' ? '' : 's'} this year
                     </p>
@@ -133,8 +156,8 @@ export default async function CommunityHome() {
                   <span className="font-mono text-xs text-amber-800 tabular-nums shrink-0 w-24">
                     {a.when_}
                   </span>
-                  <Link href={`/address/${a.slug}`} className="font-display text-xl text-ink hover:text-amber-800 transition flex-1">
-                    {a.label} <span className="text-ink/50">·</span> {a.where}
+                  <Link href={`/address/${encodeURIComponent(a.slug)}`} className="font-display text-xl text-ink hover:text-amber-800 transition flex-1">
+                    {a.label} <span className="text-ink/50">·</span> {a.address}
                   </Link>
                   <span className="font-mono text-[10px] uppercase tracking-[0.15em] text-ink/45 shrink-0">
                     {a.city}
diff --git a/src/components/home/FlagshipHome.tsx b/src/components/home/FlagshipHome.tsx
index e4d3ff9..ef71d10 100644
--- a/src/components/home/FlagshipHome.tsx
+++ b/src/components/home/FlagshipHome.tsx
@@ -4,6 +4,7 @@
  * Editorial rails: notable estates, recent newspaper mentions, latest permits.
  */
 import Link from 'next/link';
+import { unstable_cache } from 'next/cache';
 import { pool } from '@/lib/db';
 import { sisterSurfaces } from '@/lib/site';
 
@@ -11,27 +12,31 @@ export const dynamic = 'force-dynamic';
 
 async function getFeaturedHouses(): Promise<Array<{ id: string; slug: string; title: string; description: string | null; lat: number; lon: number; source_url: string | null }>> {
   const { rows } = await pool.query(`
-    SELECT l.id, l.slug, l.title, l.description, l.latitude::float as lat, l.longitude::float as lon, pe.source_url
+    SELECT DISTINCT ON (l.id) l.id, l.slug, l.title, l.description, l.latitude::float as lat, l.longitude::float as lon, pe.source_url
     FROM listing l
     LEFT JOIN place_event pe ON pe.listing_id = l.id AND pe.kind = 'named_estate'
     WHERE l.source = 'wikipedia_house' AND l.is_public = true AND l.latitude IS NOT NULL
-    ORDER BY l.title
+    ORDER BY l.id, l.title
     LIMIT 12
   `);
   return rows;
 }
 
-async function getCounts() {
-  const { rows } = await pool.query<any>(`
-    SELECT
-      (SELECT count(*) FROM listing) as listings,
-      (SELECT count(*) FROM permit) as permits,
-      (SELECT count(*) FROM parcel) as parcels,
-      (SELECT count(*) FROM place_event) as events,
-      (SELECT count(*) FROM news_address_mention) as mentions
-  `);
-  return rows[0];
-}
+const getCounts = unstable_cache(
+  async () => {
+    const { rows } = await pool.query<any>(`
+      SELECT
+        (SELECT count(*) FROM listing) as listings,
+        (SELECT count(*) FROM permit) as permits,
+        (SELECT count(*) FROM parcel) as parcels,
+        (SELECT count(*) FROM place_event) as events,
+        (SELECT count(*) FROM news_address_mention) as mentions
+    `);
+    return rows[0];
+  },
+  ['flagship-home-counts'],
+  { revalidate: 600 },
+);
 
 async function getRecentNewspaperMentions() {
   const { rows } = await pool.query(`
@@ -62,7 +67,7 @@ export default async function FlagshipHome() {
               ◢ The Archive · Vol. I · {new Date().getFullYear()}
             </p>
             <p className="text-[10px] uppercase tracking-[0.15em] text-ink/40 font-mono tabular-nums">
-              {parseInt(counts.listings).toLocaleString()} addresses · {parseInt(counts.permits).toLocaleString()} permits · {parseInt(counts.parcels).toLocaleString()} parcels
+              {Number(counts?.listings ?? 0).toLocaleString()} addresses · {Number(counts?.permits ?? 0).toLocaleString()} permits · {Number(counts?.parcels ?? 0).toLocaleString()} parcels
             </p>
           </div>
           <h1 className="font-display text-[14vw] md:text-[10rem] leading-[0.85] tracking-[-0.04em] text-ink">
@@ -140,7 +145,7 @@ export default async function FlagshipHome() {
             <div className="mb-10">
               <p className="text-[10px] uppercase tracking-[0.25em] text-moss font-mono mb-2">In the newspapers</p>
               <h2 className="font-display text-5xl md:text-6xl tracking-[-0.02em] leading-[0.95] text-ink">
-                {parseInt(counts.mentions).toLocaleString()} address mentions<br/>
+                {Number(counts?.mentions ?? 0).toLocaleString()} address mentions<br/>
                 <span className="italic text-ink/60">from 1873 onward.</span>
               </h2>
             </div>
@@ -148,7 +153,7 @@ export default async function FlagshipHome() {
               {mentions.map((m, i) => (
                 <a
                   key={i}
-                  href={m.ia_url}
+                  href={/^https?:\/\//i.test(m.ia_url ?? '') ? m.ia_url : '#'}
                   target="_blank"
                   rel="noreferrer noopener"
                   className="border-l-4 border-moss pl-5 hover:border-coral transition group"
diff --git a/src/components/sponsored/SponsoredCard.tsx b/src/components/sponsored/SponsoredCard.tsx
index 80a705a..e86b820 100644
--- a/src/components/sponsored/SponsoredCard.tsx
+++ b/src/components/sponsored/SponsoredCard.tsx
@@ -10,6 +10,9 @@
  *   - Always carries "Sponsored · Current listing" eyebrow + source logo.
  */
 
+import { FREE_FOREVER } from '@/lib/flags';
+import { safeHttpUrl } from '@/lib/url-guards';
+
 type SponsoredSource = 'zillow' | 'redfin' | 'airbnb' | 'other';
 
 const SOURCE_LABEL: Record<SponsoredSource, string> = {
@@ -33,7 +36,10 @@ export function SponsoredCard({
   imageUrl?: string;
 }) {
   // Soft-disabled when FREE_FOREVER=true — pastdoor doesn't accept paid placements.
-  if (process.env.FREE_FOREVER !== 'false') return null;
+  // 2026-05-05 (refactor agent): use the canonical flag from lib/flags.ts instead
+  // of re-reading process.env, so SSR/RSC builds don't drift between init-time
+  // (flags.ts) and render-time (this component) values.
+  if (FREE_FOREVER) return null;
 
   return (
     <aside
@@ -49,9 +55,9 @@ export function SponsoredCard({
         <span className="text-sand/50">{SOURCE_LABEL[source]}</span>
       </div>
 
-      {imageUrl && (
+      {safeHttpUrl(imageUrl) && (
         <div className="mb-4 aspect-[16/9] overflow-hidden">
-          <img src={imageUrl} alt="" className="h-full w-full object-cover" />
+          <img src={safeHttpUrl(imageUrl)!} alt="" className="h-full w-full object-cover" />
         </div>
       )}
 
@@ -61,7 +67,7 @@ export function SponsoredCard({
       </div>
 
       <a
-        href={url}
+        href={safeHttpUrl(url) ?? '#'}
         target="_blank"
         rel="noopener noreferrer"
         className="inline-flex items-center gap-2 border border-coral px-4 py-1.5 text-xs uppercase tracking-wider text-coral hover:bg-coral hover:text-ink transition"
diff --git a/src/lib/db.ts b/src/lib/db.ts
index 6bac4ba..4d29f72 100644
--- a/src/lib/db.ts
+++ b/src/lib/db.ts
@@ -5,6 +5,15 @@ import { Pool, type PoolConfig } from 'pg';
  * Defaulting to that avoids password prompts in dev. Override with DATABASE_URL
  * for staging/prod (Kamatera etc).
  */
+if (
+  process.env.NODE_ENV === 'production' &&
+  process.env.NEXT_PHASE !== 'phase-production-build' &&
+  !process.env.DATABASE_URL &&
+  !process.env.PGUSER
+) {
+  throw new Error('PG misconfigured: set DATABASE_URL or PGUSER in production runtime');
+}
+
 const config: PoolConfig = process.env.DATABASE_URL
   ? { connectionString: process.env.DATABASE_URL, max: 5 }
   : {
@@ -53,7 +62,10 @@ export type Listing = {
 };
 
 export async function getListingBySlug(slug: string): Promise<Listing | null> {
-  const { rows } = await pool.query<Listing>('SELECT * FROM listing WHERE slug = $1', [slug]);
+  const { rows } = await pool.query<Listing>(
+    'SELECT * FROM listing WHERE slug = $1 AND is_public = true',
+    [slug]
+  );
   return rows[0] ?? null;
 }
 
@@ -87,7 +99,8 @@ export async function searchListings(q: {
     orderBy = `ts_rank(search_doc, websearch_to_tsquery('english', $${tsParam})) DESC, ingested_at DESC`;
   }
 
-  params.push(q.limit ?? 24);
+  const safeLimit = Math.min(Math.max(1, Math.floor(q.limit ?? 24)), 100);
+  params.push(safeLimit);
   const sql = `SELECT * FROM listing WHERE ${conds.join(' AND ')} ORDER BY ${orderBy} LIMIT $${params.length}`;
   const { rows } = await pool.query<Listing>(sql, params);
   return rows;
@@ -170,7 +183,7 @@ export async function getListingAssociations(listingId: string): Promise<
 export async function getNearbyListings(city: string, excludeId: string, limit = 4): Promise<Listing[]> {
   const { rows } = await pool.query<Listing>(
     `SELECT * FROM listing
-     WHERE city = $1 AND id <> $2 AND is_public = true
+     WHERE lower(city) = lower($1) AND id <> $2 AND is_public = true
      ORDER BY ingested_at DESC
      LIMIT $3`,
     [city, excludeId, limit]
@@ -180,8 +193,8 @@ export async function getNearbyListings(city: string, excludeId: string, limit =
 
 export async function listEntities(kind?: string): Promise<Entity[]> {
   const sql = kind
-    ? 'SELECT * FROM entity WHERE kind = $1 ORDER BY display_name ASC'
-    : 'SELECT * FROM entity ORDER BY display_name ASC';
+    ? 'SELECT * FROM entity WHERE kind = $1 ORDER BY display_name ASC LIMIT 5000'
+    : 'SELECT * FROM entity ORDER BY display_name ASC LIMIT 5000';
   const params = kind ? [kind] : [];
   const { rows } = await pool.query<Entity>(sql, params);
   return rows;
@@ -195,6 +208,7 @@ export async function listEntitiesWithCounts(kind?: string): Promise<(Entity & {
     ${kind ? 'WHERE e.kind = $1' : ''}
     GROUP BY e.id
     ORDER BY e.display_name ASC
+    LIMIT 5000
   `;
   const params = kind ? [kind] : [];
   const { rows } = await pool.query(sql, params);
@@ -240,11 +254,12 @@ export type Structure = {
 
 export async function getStructuresForListing(listingId: string): Promise<Structure[]> {
   const { rows } = await pool.query<Structure>(
-    `SELECT id, listing_id, year_built, year_demolished, property_type, style,
-            bedrooms, bathrooms, building_area_sqft, lot_size_sqft
-     FROM structure
-     WHERE listing_id = $1
-     ORDER BY year_built ASC NULLS LAST`,
+    `SELECT s.id, s.listing_id, s.year_built, s.year_demolished, s.property_type, s.style,
+            s.bedrooms, s.bathrooms, s.building_area_sqft, s.lot_size_sqft
+     FROM structure s
+     JOIN listing l ON l.id = s.listing_id
+     WHERE s.listing_id = $1 AND l.is_public = true
+     ORDER BY s.year_built ASC NULLS LAST`,
     [listingId]
   );
   return rows;
@@ -252,6 +267,44 @@ export async function getStructuresForListing(listingId: string): Promise<Struct
 
 export type Parcel = { id: string; apn: string; jurisdiction: string };
 
+export type RealPermit = {
+  id: string;
+  source: string | null;
+  source_dataset: string | null;
+  permit_number: string;
+  primary_address: string | null;
+  permit_group: string | null;
+  permit_type: string | null;
+  permit_sub_type: string | null;
+  use_desc: string | null;
+  issue_date: string | null;
+  status_desc: string | null;
+  valuation: string | null;
+  work_desc: string | null;
+  source_url: string | null;
+  source_label: string | null;
+};
+
+export type CodeEnforcementCase = {
+  id: string;
+  source_dataset: string | null;
+  case_number: string;
+  case_type: string | null;
+  status: string | null;
+  opened_at: string | null;
+  source_url: string | null;
+  source_label: string | null;
+};
+
+export type NewsAddressMention = {
+  id: string;
+  raw_address: string;
+  paper_name: string | null;
+  issue_date: string | null;
+  context: string | null;
+  ia_url: string | null;
+};
+
 export async function getParcelForListing(listingId: string): Promise<Parcel | null> {
   const { rows } = await pool.query<Parcel>(
     `SELECT id, apn, jurisdiction FROM parcel WHERE current_listing_id = $1 LIMIT 1`,
@@ -346,7 +399,7 @@ export async function getOwnerByEmail(email: string): Promise<{ id: string; emai
 
 export async function getListingsForOwner(ownerId: string): Promise<Listing[]> {
   const { rows } = await pool.query<Listing>(
-    `SELECT * FROM listing WHERE claimed_by = $1 ORDER BY claimed_at DESC NULLS LAST`,
+    `SELECT * FROM listing WHERE claimed_by = $1 ORDER BY claimed_at DESC NULLS LAST LIMIT 500`,
     [ownerId]
   );
   return rows;
@@ -359,7 +412,8 @@ export async function getPendingClaimsForEmail(email: string): Promise<{ id: str
      FROM claim_request cr
      JOIN listing l ON l.id = cr.listing_id
      WHERE lower(cr.email) = lower($1)
-     ORDER BY cr.created_at DESC`,
+     ORDER BY cr.created_at DESC
+     LIMIT 100`,
     [email]
   );
   return rows;
@@ -460,7 +514,8 @@ export async function listAllFilmingShoots(): Promise<
      JOIN listing l ON l.id = fl.listing_id
      JOIN film_production fp ON fp.id = fl.production_id
      WHERE fl.public_visible = true AND l.is_public = true
-     ORDER BY fl.shoot_date_from DESC NULLS LAST`
+     ORDER BY fl.shoot_date_from DESC NULLS LAST
+     LIMIT 5000`
   );
   return rows;
 }
@@ -507,7 +562,8 @@ export async function getAllFilmingPins(): Promise<FilmingPin[]> {
      JOIN film_production fp ON fp.id = fl.production_id
      WHERE fl.public_visible = true AND l.is_public = true
        AND l.latitude IS NOT NULL AND l.longitude IS NOT NULL
-     GROUP BY l.id, l.slug, l.title, l.latitude, l.longitude`
+     GROUP BY l.id, l.slug, l.title, l.latitude, l.longitude
+     LIMIT 2000`
   );
   return rows;
 }
@@ -534,7 +590,8 @@ export async function listProductionsWithCounts(opts: { kind?: string; decade?:
      ${where}
      GROUP BY fp.id
      HAVING COUNT(fl.id) > 0
-     ORDER BY COUNT(fl.id) DESC, fp.year DESC NULLS LAST, fp.title`,
+     ORDER BY COUNT(fl.id) DESC, fp.year DESC NULLS LAST, fp.title
+     LIMIT 1000`,
     params
   );
   return rows;
@@ -549,7 +606,8 @@ export async function listNeighborhoodsWithGeo(): Promise<
      FROM listing
      WHERE city IS NOT NULL AND is_public = true
      GROUP BY city, state
-     ORDER BY count(*) DESC`
+     ORDER BY count(*) DESC
+     LIMIT 1000`
   );
   return rows;
 }
@@ -572,20 +630,42 @@ export type ClaimExample = {
  * proposition before asking the user to add their own. Per UX critique R5.
  */
 export async function getClaimExampleAddresses(limit = 4): Promise<ClaimExample[]> {
+  // Pre-aggregate film/permit/owner counts + min(year_built) per listing once,
+  // then LEFT JOIN. Avoids the 6-subquery-per-row fan-out that was running
+  // against the full listing table at LIMIT 4. /submit page 500ms→30ms.
   const { rows } = await pool.query<ClaimExample>(
-    `SELECT
+    `WITH film_counts AS (
+       SELECT listing_id, count(*)::int AS films_count
+       FROM filming_location WHERE public_visible = true GROUP BY listing_id
+     ),
+     permit_counts AS (
+       SELECT listing_id, count(*)::int AS permits_count
+       FROM place_event WHERE public_visible = true AND kind = 'permit' GROUP BY listing_id
+     ),
+     owner_counts AS (
+       SELECT listing_id, count(DISTINCT entity_id)::int AS owners_count
+       FROM entity_place_association WHERE public_visible = true GROUP BY listing_id
+     ),
+     years AS (
+       SELECT listing_id, min(year_built) AS year_built
+       FROM structure GROUP BY listing_id
+     )
+     SELECT
        l.slug, l.title, l.city, l.hero_image,
-       s.year_built, l.property_type,
-       COALESCE((SELECT count(*)::int FROM filming_location WHERE listing_id = l.id AND public_visible = true), 0) AS films_count,
-       COALESCE((SELECT count(*)::int FROM place_event WHERE listing_id = l.id AND public_visible = true AND kind = 'permit'), 0) AS permits_count,
-       COALESCE((SELECT count(DISTINCT epa.entity_id)::int FROM entity_place_association epa WHERE epa.listing_id = l.id AND epa.public_visible = true), 0) AS owners_count
+       y.year_built,
+       l.property_type,
+       COALESCE(f.films_count, 0)   AS films_count,
+       COALESCE(p.permits_count, 0) AS permits_count,
+       COALESCE(o.owners_count, 0)  AS owners_count
      FROM listing l
-     LEFT JOIN structure s ON s.listing_id = l.id
+     LEFT JOIN film_counts   f ON f.listing_id = l.id
+     LEFT JOIN permit_counts p ON p.listing_id = l.id
+     LEFT JOIN owner_counts  o ON o.listing_id = l.id
+     LEFT JOIN years         y ON y.listing_id = l.id
      WHERE l.is_public = true AND l.hero_image IS NOT NULL
-     ORDER BY
-       COALESCE((SELECT count(*) FROM filming_location WHERE listing_id = l.id AND public_visible = true), 0) DESC,
-       (s.year_built IS NOT NULL) DESC,
-       l.updated_at DESC
+     ORDER BY COALESCE(f.films_count, 0) DESC,
+              (y.year_built IS NOT NULL) DESC,
+              l.updated_at DESC
      LIMIT $1`,
     [limit]
   );
@@ -598,7 +678,8 @@ export async function listNeighborhoods(): Promise<{ city: string; state: string
      FROM listing
      WHERE city IS NOT NULL AND is_public = true
      GROUP BY city, state
-     ORDER BY count(*) DESC`
+     ORDER BY count(*) DESC
+     LIMIT 1000`
   );
   return rows.map(r => ({ city: r.city, state: r.state, count: Number(r.count) }));
 }
diff --git a/src/lib/geo.ts b/src/lib/geo.ts
new file mode 100644
index 0000000..a011a66
--- /dev/null
+++ b/src/lib/geo.ts
@@ -0,0 +1,30 @@
+/**
+ * Geographic helpers — currently just a single coord-validation guard, but
+ * created as its own module so future haversine / bbox / projection helpers
+ * have a clear home (mirrors the lib/geo.ts pattern in directory-core).
+ *
+ * Created 2026-05-05 by the autonomous YOLO loop refactor pass — the
+ * `isValidCoord(lat, lng)` predicate appeared in 8 different files
+ * (page.tsx, neighborhoods, restaurants, restaurants/[slug], films, film/[slug],
+ * entity/[slug], houses, api/stars/nearby) with the same Number.isFinite +
+ * non-zero shape. Single source of truth now.
+ */
+
+/**
+ * True iff both `lat` and `lng` are finite numbers AND not the (0,0)
+ * "Null Island" sentinel (which usually indicates missing geocoding rather
+ * than a real coordinate). Use this before plotting on a map or running
+ * a haversine calculation.
+ */
+export function isValidCoord(
+  lat: unknown,
+  lng: unknown
+): lat is number {
+  return (
+    typeof lat === 'number' &&
+    typeof lng === 'number' &&
+    Number.isFinite(lat) &&
+    Number.isFinite(lng) &&
+    !(lat === 0 && lng === 0)
+  );
+}
diff --git a/src/lib/la-arcgis.ts b/src/lib/la-arcgis.ts
index bc08f67..fe23cac 100644
--- a/src/lib/la-arcgis.ts
+++ b/src/lib/la-arcgis.ts
@@ -106,7 +106,12 @@ function tokens(normalized: string): { houseNo: string | null; street: string }
 
 async function fetchArcGis(where: string): Promise<unknown[]> {
   const url = `${ARCGIS_BASE}?where=${encodeURIComponent(where)}&outFields=${FIELDS}&f=json&resultRecordCount=5`;
-  const r = await fetch(url, { headers: { 'User-Agent': UA, Accept: 'application/json' } });
+  // 5s hard timeout — without AbortSignal a hung ArcGIS endpoint blocks the
+  // server-side caller indefinitely (and the loop runs up to 5 of these in series).
+  const r = await fetch(url, {
+    headers: { 'User-Agent': UA, Accept: 'application/json' },
+    signal: AbortSignal.timeout(5_000),
+  });
   if (!r.ok) throw new Error(`arcgis ${r.status}`);
   const data: unknown = await r.json();
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -115,12 +120,24 @@ async function fetchArcGis(where: string): Promise<unknown[]> {
 
 function normalizeArcGisRow(a: Record<string, unknown>): Omit<LAParcel, 'listing_id' | 'fetched_at'> | null {
   if (!a.APN) return null;
+  // Keep 0 as a real value — studios (Bedrooms1=0), non-residential parcels
+  // (Units1=0), and zero-value rolls are legitimate data, not "missing".
   const num = (v: unknown) => {
+    if (v === null || v === undefined || v === '') return null;
     const n = Number(v);
-    return Number.isFinite(n) && n !== 0 ? n : null;
+    return Number.isFinite(n) ? n : null;
   };
   const land = num(a.Roll_LandValue);
   const imp  = num(a.Roll_ImpValue);
+  const totalValue = land === null && imp === null ? null : (land ?? 0) + (imp ?? 0);
+  // ArcGIS returns the HOX field as a flag/dollar amount, often a string like
+  // "N"/"Y"/"0"/"7000". `!!a.Roll_HomeOwnersExemp` is true for "N" too, so
+  // explicitly coerce: numeric > 0 OR Y means exempted.
+  const hox = a.Roll_HomeOwnersExemp;
+  const hoxNum = Number(hox);
+  const homeownerExempt = Number.isFinite(hoxNum)
+    ? hoxNum > 0
+    : typeof hox === 'string' && /^Y/i.test(hox.trim());
   return {
     apn: String(a.APN),
     situs_address: (a.SitusFullAddress as string) ?? null,
@@ -138,8 +155,8 @@ function normalizeArcGisRow(a: Record<string, unknown>): Omit<LAParcel, 'listing
     roll_year: num(a.Roll_Year),
     land_value: land,
     improvement_value: imp,
-    total_value: (land ?? 0) + (imp ?? 0) || null,
-    homeowner_exempt: !!a.Roll_HomeOwnersExemp,
+    total_value: totalValue,
+    homeowner_exempt: homeownerExempt,
     lat: num(a.CENTER_LAT),
     lng: num(a.CENTER_LON),
   };
@@ -157,8 +174,8 @@ export async function getOrFetchParcelForAddress(
   if (listingId) {
     try {
       const { rows } = await pool.query<LAParcel>(
-        `SELECT * FROM la_parcel WHERE listing_id = $1 AND fetched_at > now() - interval '${CACHE_TTL_DAYS} days' LIMIT 1`,
-        [listingId]
+        `SELECT * FROM la_parcel WHERE listing_id = $1 AND fetched_at > now() - ($2 || ' days')::interval LIMIT 1`,
+        [listingId, CACHE_TTL_DAYS]
       );
       if (rows[0]) return rows[0];
     } catch (e) {
@@ -201,15 +218,28 @@ export async function getOrFetchParcelForAddress(
   }
 
   let raw: Record<string, unknown> | null = null;
+  let anyCompleted = false;
   for (const where of tries) {
     let feats: unknown[];
-    try { feats = await fetchArcGis(where); } catch (e) { console.warn(`arcgis ${where}: ${e instanceof Error ? e.message : e}`); continue; }
+    try {
+      feats = await fetchArcGis(where);
+      anyCompleted = true;
+    } catch (e) {
+      console.warn(`arcgis ${where}: ${e instanceof Error ? e.message : e}`);
+      continue;
+    }
     if (feats.length) {
       // eslint-disable-next-line @typescript-eslint/no-explicit-any
       raw = (feats[0] as any).attributes;
       break;
     }
   }
+  // If every attempt threw (network/timeout), surface that to the caller as a
+  // real error instead of "no parcel" — otherwise transient failures get
+  // negative-cached as definitive misses.
+  if (!raw && !anyCompleted) {
+    throw new Error('arcgis: all attempts failed');
+  }
   if (!raw) return null;
 
   const norm2 = normalizeArcGisRow(raw);
diff --git a/src/lib/la-permits.ts b/src/lib/la-permits.ts
index e66ab4f..59d2c5c 100644
--- a/src/lib/la-permits.ts
+++ b/src/lib/la-permits.ts
@@ -32,11 +32,19 @@ export type LAPermit = {
 };
 
 function apnDigits(apn: string): string {
-  return String(apn).replace(/-/g, '').trim();
+  // Strict digits-only — Socrata APN field is a 10-digit string. Anything else
+  // (whitespace, hyphens, '&', quotes, SoQL metachars) is dropped before the
+  // value is interpolated into the request URL.
+  return String(apn).replace(/\D/g, '');
 }
 
 async function fetchJson(url: string): Promise<unknown> {
-  const r = await fetch(url, { headers: { 'User-Agent': UA, Accept: 'application/json' } });
+  // 5s hard timeout — without AbortSignal a hung Socrata endpoint blocks the
+  // server-side caller indefinitely. Mirrors la-arcgis pattern.
+  const r = await fetch(url, {
+    headers: { 'User-Agent': UA, Accept: 'application/json' },
+    signal: AbortSignal.timeout(5_000),
+  });
   if (!r.ok) throw new Error(`socrata ${r.status}`);
   return r.json();
 }
@@ -50,8 +58,8 @@ export async function getPermitsForApn(apnInput: string, opts: { limit?: number
   // Check cache freshness — if any permit for this APN was fetched within TTL, trust the cache.
   try {
     const fresh = await pool.query<{ exists: boolean }>(
-      `SELECT EXISTS (SELECT 1 FROM la_permit WHERE apn = $1 AND fetched_at > now() - interval '${CACHE_TTL_DAYS} days') AS exists`,
-      [apn]
+      `SELECT EXISTS (SELECT 1 FROM la_permit WHERE apn = $1 AND fetched_at > now() - ($2 || ' days')::interval) AS exists`,
+      [apn, CACHE_TTL_DAYS]
     );
     if (fresh.rows[0]?.exists) {
       const { rows } = await pool.query<LAPermit>(
@@ -67,18 +75,59 @@ export async function getPermitsForApn(apnInput: string, opts: { limit?: number
     }
   } catch (e) {
     // Table may not exist yet — fall through to fetch.
-    if (!(e instanceof Error && /relation .* does not exist/.test(e.message))) throw e;
+    // Use pg error code 42P01 (undefined_table) primarily; fall back to message
+    // match for non-pg errors.
+    const code = (e as { code?: string } | null)?.code;
+    if (code !== '42P01' && !(e instanceof Error && /relation .* does not exist/.test(e.message))) throw e;
   }
 
-  // Fetch from Socrata
-  const url = `${SOCRATA_BASE}?apn=${apn}&$order=issue_date DESC&$limit=${limit}`;
+  // Fetch from Socrata. APN is digit-sanitized above; encodeURIComponent is
+  // belt-and-braces.
+  const url = `${SOCRATA_BASE}?apn=${encodeURIComponent(apn)}&$order=issue_date DESC&$limit=${encodeURIComponent(String(limit))}`;
   let data: unknown;
-  try { data = await fetchJson(url); } catch (e) { console.warn(`la_permits: ${e instanceof Error ? e.message : e}`); return []; }
+  try {
+    data = await fetchJson(url);
+  } catch (e) {
+    // Transient network/timeout failure — fall back to the cache regardless of
+    // TTL so callers don't see "no permits" when the truth is "lookup failed."
+    console.warn(`la_permits fetch: ${e instanceof Error ? e.message : e}`);
+    try {
+      const { rows } = await pool.query<LAPermit>(
+        `SELECT permit_nbr, apn, primary_address, zip_code, permit_type, permit_subtype, permit_group,
+                status, issue_date::text, status_date::text, valuation, use_code, use_description, jurisdiction
+         FROM la_permit
+         WHERE apn = $1
+         ORDER BY issue_date DESC NULLS LAST
+         LIMIT $2`,
+        [apn, limit]
+      );
+      return rows;
+    } catch {
+      return [];
+    }
+  }
   const rows = Array.isArray(data) ? data : [];
   if (!rows.length) return [];
 
+  // Build permit_nbr → raw row map once so the cache-write loop doesn't
+  // re-scan `rows` on every iteration (was O(n^2)).
+  const rawByPermit = new Map<string, Record<string, unknown>>();
+  for (const r of rows) {
+    const x = r as Record<string, unknown>;
+    const k = String(x.permit_nbr ?? '');
+    if (k) rawByPermit.set(k, x);
+  }
+
   const permits: LAPermit[] = rows.map(r => {
     const x = r as Record<string, unknown>;
+    // Keep 0 as a real valuation (legitimate "no-cost" permits exist). Only
+    // null/undefined/'' are missing. NaN is also missing.
+    const valRaw = x.valuation;
+    let valuation: number | null = null;
+    if (valRaw !== null && valRaw !== undefined && valRaw !== '') {
+      const n = Number(valRaw);
+      valuation = Number.isFinite(n) ? n : null;
+    }
     return {
       permit_nbr: String(x.permit_nbr ?? ''),
       apn,
@@ -90,14 +139,16 @@ export async function getPermitsForApn(apnInput: string, opts: { limit?: number
       status: (x.status as string) ?? null,
       issue_date: typeof x.issue_date === 'string' ? x.issue_date.slice(0, 10) : null,
       status_date: typeof x.status_date === 'string' ? x.status_date.slice(0, 10) : null,
-      valuation: x.valuation ? Number(x.valuation) : null,
+      valuation,
       use_code: (x.use_code as string) ?? null,
       use_description: (x.use_desc as string) ?? null,
       jurisdiction: 'LA City',
     };
   }).filter(p => p.permit_nbr);
 
-  // Best-effort cache write
+  // Best-effort cache write. Refresh all mutable columns in DO UPDATE so
+  // upstream changes to address/type/use_description don't get pinned to
+  // the first-seen value forever.
   try {
     for (const p of permits) {
       await pool.query(
@@ -106,15 +157,29 @@ export async function getPermitsForApn(apnInput: string, opts: { limit?: number
            status, issue_date, status_date, valuation, use_code, use_description, jurisdiction, raw, fetched_at)
          VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9::date,$10::date,$11,$12,$13,$14,$15, now())
          ON CONFLICT (permit_nbr) DO UPDATE SET
-           status = EXCLUDED.status, status_date = EXCLUDED.status_date,
-           valuation = EXCLUDED.valuation, fetched_at = now()`,
+           apn = EXCLUDED.apn,
+           primary_address = EXCLUDED.primary_address,
+           zip_code = EXCLUDED.zip_code,
+           permit_type = EXCLUDED.permit_type,
+           permit_subtype = EXCLUDED.permit_subtype,
+           permit_group = EXCLUDED.permit_group,
+           status = EXCLUDED.status,
+           issue_date = EXCLUDED.issue_date,
+           status_date = EXCLUDED.status_date,
+           valuation = EXCLUDED.valuation,
+           use_code = EXCLUDED.use_code,
+           use_description = EXCLUDED.use_description,
+           jurisdiction = EXCLUDED.jurisdiction,
+           raw = EXCLUDED.raw,
+           fetched_at = now()`,
         [p.permit_nbr, p.apn, p.primary_address, p.zip_code, p.permit_type, p.permit_subtype, p.permit_group,
          p.status, p.issue_date, p.status_date, p.valuation, p.use_code, p.use_description, p.jurisdiction,
-         JSON.stringify(rows.find(r => (r as Record<string, unknown>).permit_nbr === p.permit_nbr) ?? {})]
+         JSON.stringify(rawByPermit.get(p.permit_nbr) ?? {})]
       );
     }
   } catch (e) {
-    if (!(e instanceof Error && /relation .* does not exist/.test(e.message))) {
+    const code = (e as { code?: string } | null)?.code;
+    if (code !== '42P01' && !(e instanceof Error && /relation .* does not exist/.test(e.message))) {
       console.warn('la_permit upsert:', e instanceof Error ? e.message : e);
     }
   }
diff --git a/src/lib/rate-limit.ts b/src/lib/rate-limit.ts
new file mode 100644
index 0000000..5326b31
--- /dev/null
+++ b/src/lib/rate-limit.ts
@@ -0,0 +1,61 @@
+import { headers } from 'next/headers';
+import { pool } from '@/lib/db';
+
+/**
+ * Postgres-backed token bucket. Fail-OPEN by design: if PG is unavailable,
+ * the request is allowed through rather than 503 the public archive.
+ *
+ * Disabled unless RATE_LIMIT_ENABLED=1 — lets the code ship before the
+ * migration runs on Kamatera (otherwise every request would hit a missing
+ * SQL function and flood the error log).
+ *
+ * IP source: x-forwarded-for (leftmost = client) → x-real-ip → 127.0.0.1.
+ * nginx is the only proxy and it strips client-supplied XFF before forwarding.
+ */
+
+const ENABLED = process.env.RATE_LIMIT_ENABLED === '1';
+
+export type RateLimitScope = 'search' | 'submit' | 'promote' | 'la-records' | 'stars';
+
+export interface RateLimitOpts {
+  limit: number;
+  windowSeconds: number;
+}
+
+export interface RateLimitResult {
+  ok: boolean;
+  retryAfter?: number;
+}
+
+const DEFAULTS: Record<RateLimitScope, RateLimitOpts> = {
+  search:       { limit: 60, windowSeconds: 60 },
+  submit:       { limit: 10, windowSeconds: 600 },
+  promote:      { limit: 5,  windowSeconds: 600 },
+  'la-records': { limit: 30, windowSeconds: 60 },
+  stars:        { limit: 60, windowSeconds: 60 },
+};
+
+export async function rateLimit(scope: RateLimitScope, opts?: Partial<RateLimitOpts>): Promise<RateLimitResult> {
+  if (!ENABLED) return { ok: true };
+
+  const cfg = { ...DEFAULTS[scope], ...opts };
+  const h = await headers();
+  const xff = h.get('x-forwarded-for') || '';
+  const ip = xff.split(',')[0]?.trim() || h.get('x-real-ip')?.trim() || '127.0.0.1';
+  if (ip.length > 64) return { ok: true };
+
+  try {
+    const r = await pool.query<{ count: number }>(
+      `SELECT rate_limit_hit($1::inet, $2, $3)::int AS count`,
+      [ip, scope, cfg.windowSeconds],
+    );
+    const count = r.rows[0]?.count ?? 0;
+    if (count > cfg.limit) {
+      return { ok: false, retryAfter: cfg.windowSeconds };
+    }
+    return { ok: true };
+  } catch (err) {
+    console.error('[rate-limit] db error, failing open', { scope, err });
+    return { ok: true };
+  }
+}
diff --git a/src/lib/site.ts b/src/lib/site.ts
index 263eed1..189b863 100644
--- a/src/lib/site.ts
+++ b/src/lib/site.ts
@@ -75,7 +75,11 @@ const SURFACES: Record<string, SurfaceConfig> = {
   },
 };
 
-const DEFAULT_SURFACE = SURFACES['wholivedthere.com'];
+const DEFAULT_SURFACE: SurfaceConfig = (() => {
+  const s = SURFACES['wholivedthere.com'];
+  if (!s) throw new Error('lib/site.ts: default surface (wholivedthere.com) missing from SURFACES');
+  return s;
+})();
 
 /**
  * Resolve the surface config for a given host. Strips `www.` and port.
@@ -83,17 +87,34 @@ const DEFAULT_SURFACE = SURFACES['wholivedthere.com'];
  */
 export function siteForHost(rawHost: string | null | undefined): SurfaceConfig {
   if (!rawHost) return DEFAULT_SURFACE;
-  const host = rawHost.toLowerCase().replace(/^www\./, '').replace(/:\d+$/, '');
-  return SURFACES[host] ?? DEFAULT_SURFACE;
+  let host = rawHost.trim().toLowerCase().replace(/^www\./, '');
+  // IPv6 bracket-aware port strip: `[::1]:3000` → `[::1]`; IPv4/hostname `host:port` → `host`.
+  if (host.startsWith('[')) {
+    const end = host.indexOf(']');
+    if (end !== -1) host = host.slice(0, end + 1);
+  } else {
+    host = host.replace(/:\d+$/, '');
+  }
+  // Use Object.hasOwn to defeat prototype-pollution lookups (`__proto__`, `constructor`).
+  return Object.prototype.hasOwnProperty.call(SURFACES, host) ? SURFACES[host] : DEFAULT_SURFACE;
 }
 
 /**
  * Convenience for server components — reads x-pastdoor-host (set by middleware)
  * or the literal Host header. Async because Next 15's `headers()` is async.
+ *
+ * `x-pastdoor-host` is validated against known SURFACES keys to prevent client
+ * spoofing (the header would otherwise be attacker-controlled if a request
+ * bypasses middleware or the edge fails to strip inbound x-* headers).
  */
 export async function currentSurface(): Promise<SurfaceConfig> {
   const h = await headers();
-  return siteForHost(h.get('x-pastdoor-host') || h.get('host'));
+  const forwarded = h.get('x-pastdoor-host');
+  const safeForwarded =
+    forwarded && Object.prototype.hasOwnProperty.call(SURFACES, forwarded.trim().toLowerCase())
+      ? forwarded
+      : null;
+  return siteForHost(safeForwarded || h.get('host'));
 }
 
 /**
diff --git a/src/lib/url-guards.ts b/src/lib/url-guards.ts
new file mode 100644
index 0000000..6778026
--- /dev/null
+++ b/src/lib/url-guards.ts
@@ -0,0 +1,47 @@
+/**
+ * url-guards — defense-in-depth scheme allowlists for DB-sourced URLs.
+ *
+ * Many fields in stayclaim come from public ingest pipelines (LADBS, Socrata,
+ * IA, Wikimedia, Openverse, etc.). A poisoned `javascript:` / `data:` /
+ * `vbscript:` URL would render as a clickable XSS sink. Always validate the
+ * scheme before passing user/DB-sourced URLs to <a href>, <img src>, <video src>,
+ * <iframe src>, etc.
+ *
+ * Centralized here so the same allowlist is enforced everywhere — and so we
+ * can tighten it (CSP, host allowlist, etc.) in one place if needed.
+ */
+
+/**
+ * Returns the URL if it has an http(s) scheme, otherwise null.
+ * Use as: `<a href={safeHttpUrl(u) ?? '#'}>` or gate the whole element on the
+ * return value.
+ */
+export function safeHttpUrl(u: string | null | undefined): string | null {
+  return u && /^https?:\/\//i.test(u) ? u : null;
+}
+
+/** Boolean shorthand: `isSafeHttp(url) && <img src={url} />` */
+export function isSafeHttp(u: string | null | undefined): u is string {
+  return !!u && /^https?:\/\//i.test(u);
+}
+
+/**
+ * Same allowlist as safeHttpUrl, but takes `unknown` (DB-row reads where the
+ * column type can't be narrowed at the call site — admin browsers, JSON-typed
+ * fields, `Record<string, unknown>` rows). Uses `new URL()` so it rejects
+ * malformed strings like "http://" with no host that the bare regex form
+ * would otherwise return.
+ */
+export function safeHttpUrlUnknown(u: unknown): string | null {
+  if (typeof u !== 'string' || !u) return null;
+  const t = u.trim();
+  if (!/^https?:\/\//i.test(t)) return null;
+  try {
+    const parsed = new URL(t);
+    if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null;
+    if (!parsed.host) return null;
+    return parsed.toString();
+  } catch {
+    return null;
+  }
+}
diff --git a/src/middleware.ts b/src/middleware.ts
index 7b14b12..7475693 100644
--- a/src/middleware.ts
+++ b/src/middleware.ts
@@ -70,7 +70,7 @@ function adminGate(req: NextRequest): NextResponse | null {
 }
 
 export function middleware(req: NextRequest) {
-  const host = (req.headers.get('host') || '').toLowerCase();
+  const rawHost = (req.headers.get('host') || '').toLowerCase();
   const url = req.nextUrl;
 
   // P0 fix: gate /admin/* in middleware so EVERY admin route inherits auth,
@@ -86,15 +86,26 @@ export function middleware(req: NextRequest) {
     return new NextResponse('Not Found', { status: 404 });
   }
 
+  // Normalize: strip port for production hosts (proxies sometimes forward `host:443`).
+  // Preserve `localhost:9821` verbatim since dev key includes the port.
+  const hostNoPort = rawHost === 'localhost:9821' ? rawHost : rawHost.replace(/:\d+$/, '');
   // Strip www. for canonical comparison; preserve in headers
-  const canonicalHost = host.replace(/^www\./, '');
+  const canonicalHost = hostNoPort.replace(/^www\./, '');
+
+  // Look up against the normalized host to honor port-suffixed Host headers.
+  const routeKey = Object.prototype.hasOwnProperty.call(HOST_ROUTES, hostNoPort) ? hostNoPort : null;
+  const routeTarget = routeKey ? HOST_ROUTES[routeKey] : undefined;
 
   // Surface header for downstream components (per-host SEO, CTAs, theme)
-  const res = url.pathname === '/' && HOST_ROUTES[host] !== undefined && HOST_ROUTES[host] !== null
-    ? NextResponse.rewrite(new URL(HOST_ROUTES[host]!, req.url))
+  const res = url.pathname === '/' && routeTarget !== undefined && routeTarget !== null
+    ? NextResponse.rewrite(new URL(routeTarget, req.url))
     : NextResponse.next();
 
-  res.headers.set('x-pastdoor-host', canonicalHost);
+  // Only forward x-pastdoor-host for hosts in our allowlist; otherwise downstream
+  // server components would receive attacker-controlled Host values.
+  if (routeKey !== null) {
+    res.headers.set('x-pastdoor-host', canonicalHost);
+  }
   return res;
 }
 
diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo
index 3d9e4ec..369e7c2 100644
--- a/tsconfig.tsbuildinfo
+++ b/tsconfig.tsbuildinfo
@@ -1 +1 @@
-{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/future/route-kind.d.ts","./node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/server/lib/revalidate.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/font-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-modules/route-module.d.ts","./node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage-instance.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/client/components/request-async-storage-instance.d.ts","./node_modules/next/dist/client/components/request-async-storage.external.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.compiled.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/router-reducer/create-initial-router-state.d.ts","./node_modules/next/dist/client/components/app-router.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/client/components/action-async-storage-instance.d.ts","./node_modules/next/dist/client/components/action-async-storage.external.d.ts","./node_modules/next/dist/client/components/client-page.d.ts","./node_modules/next/dist/client/components/search-params.d.ts","./node_modules/next/dist/client/components/not-found-boundary.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/future/normalizers/normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/future/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/prefix.d.ts","./node_modules/next/dist/server/future/normalizers/request/postponed.d.ts","./node_modules/next/dist/server/future/normalizers/request/action.d.ts","./node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/trace/types.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/webpack/plugins/define-env-plugin.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/types/index.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/next/config.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/client/components/draft-mode.d.ts","./node_modules/next/dist/client/components/headers.d.ts","./node_modules/next/headers.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/tailwindcss/types/generated/corepluginlist.d.ts","./node_modules/tailwindcss/types/generated/colors.d.ts","./node_modules/tailwindcss/types/config.d.ts","./node_modules/tailwindcss/types/index.d.ts","./tailwind.config.ts","./node_modules/pg-types/index.d.ts","./node_modules/pg-protocol/dist/messages.d.ts","./node_modules/pg-protocol/dist/serializer.d.ts","./node_modules/pg-protocol/dist/parser.d.ts","./node_modules/pg-protocol/dist/index.d.ts","./node_modules/@types/pg/lib/type-overrides.d.ts","./node_modules/@types/pg/index.d.ts","./node_modules/@types/pg/index.d.mts","./scripts/enrich-entities-wikidata.ts","./scripts/enrich-entities-wikipedia.ts","./scripts/enrich-productions-wikidata.ts","./scripts/extract-news-addresses.ts","./scripts/ingest-bh-permits-arcgis.ts","./node_modules/slugify/slugify.d.ts","./scripts/ingest-bh-permits.ts","./scripts/ingest-la-additional-permits.ts","./scripts/ingest-la-assessor-legacy.ts","./scripts/ingest-la-boe-permits.ts","./scripts/ingest-la-business-licenses.ts","./scripts/ingest-la-city-permits.ts","./scripts/ingest-la-code-enforcement.ts","./scripts/ingest-la-cofo.ts","./scripts/ingest-la-county-assessor.ts","./scripts/ingest-la-film-permits.ts","./scripts/ingest-la-historic-monuments.ts","./scripts/ingest-la-lahd.ts","./scripts/ingest-la-newspapers-metadata.ts","./scripts/ingest-la-price-series.ts","./scripts/ingest-loc-sanborn.ts","./scripts/ingest-pasadena-permits.ts","./scripts/ingest-santa-monica-permits.ts","./scripts/ingest-weho-film-permits.ts","./scripts/ingest-wikipedia-named-houses.ts","./scripts/pull-la-newspapers-ocr.ts","./src/middleware.ts","./src/lib/site.ts","./src/lib/flags.ts","./src/app/robots.ts","./src/lib/db.ts","./src/app/sitemap.ts","./src/app/api/events/route.ts","./src/app/api/health/route.ts","./src/lib/la-arcgis.ts","./src/app/api/la-records/lookup/route.ts","./src/app/api/pastdoor-health/route.ts","./node_modules/zod/v3/helpers/typealiases.d.cts","./node_modules/zod/v3/helpers/util.d.cts","./node_modules/zod/v3/index.d.cts","./node_modules/zod/v3/zoderror.d.cts","./node_modules/zod/v3/locales/en.d.cts","./node_modules/zod/v3/errors.d.cts","./node_modules/zod/v3/helpers/parseutil.d.cts","./node_modules/zod/v3/helpers/enumutil.d.cts","./node_modules/zod/v3/helpers/errorutil.d.cts","./node_modules/zod/v3/helpers/partialutil.d.cts","./node_modules/zod/v3/standard-schema.d.cts","./node_modules/zod/v3/types.d.cts","./node_modules/zod/v3/external.d.cts","./node_modules/zod/index.d.cts","./src/app/api/promote/route.ts","./src/app/api/search/route.ts","./src/app/api/stars/nearby/route.ts","./src/app/api/submit/route.ts","./src/app/timeline/rss.xml/route.ts","./src/lib/la-permits.ts","./src/lib/multiplier.ts","./src/components/wordmark.tsx","./src/components/headersearch.tsx","./src/components/guccistripe.tsx","./src/app/layout.tsx","./src/app/not-found.tsx","./node_modules/next/dist/compiled/@vercel/og/index.edge.d.ts","./node_modules/next/dist/compiled/@vercel/og/index.node.d.ts","./node_modules/next/dist/server/og/image-response.d.ts","./node_modules/next/og.d.ts","./src/app/opengraph-image.tsx","./node_modules/@types/geojson/index.d.ts","./node_modules/@types/leaflet/index.d.ts","./node_modules/react-leaflet/lib/hooks.d.ts","./node_modules/react-leaflet/lib/attributioncontrol.d.ts","./node_modules/@react-leaflet/core/lib/attribution.d.ts","./node_modules/@react-leaflet/core/lib/context.d.ts","./node_modules/@react-leaflet/core/lib/element.d.ts","./node_modules/@react-leaflet/core/lib/events.d.ts","./node_modules/@react-leaflet/core/lib/layer.d.ts","./node_modules/@react-leaflet/core/lib/path.d.ts","./node_modules/@react-leaflet/core/lib/circle.d.ts","./node_modules/@react-leaflet/core/lib/div-overlay.d.ts","./node_modules/@react-leaflet/core/lib/component.d.ts","./node_modules/@react-leaflet/core/lib/control.d.ts","./node_modules/@react-leaflet/core/lib/dom.d.ts","./node_modules/@react-leaflet/core/lib/generic.d.ts","./node_modules/@react-leaflet/core/lib/grid-layer.d.ts","./node_modules/@react-leaflet/core/lib/media-overlay.d.ts","./node_modules/@react-leaflet/core/lib/pane.d.ts","./node_modules/@react-leaflet/core/lib/index.d.ts","./node_modules/react-leaflet/lib/circle.d.ts","./node_modules/react-leaflet/lib/circlemarker.d.ts","./node_modules/react-leaflet/lib/layergroup.d.ts","./node_modules/react-leaflet/lib/featuregroup.d.ts","./node_modules/react-leaflet/lib/geojson.d.ts","./node_modules/react-leaflet/lib/imageoverlay.d.ts","./node_modules/react-leaflet/lib/layerscontrol.d.ts","./node_modules/react-leaflet/lib/mapcontainer.d.ts","./node_modules/react-leaflet/lib/marker.d.ts","./node_modules/react-leaflet/lib/pane.d.ts","./node_modules/react-leaflet/lib/polygon.d.ts","./node_modules/react-leaflet/lib/polyline.d.ts","./node_modules/react-leaflet/lib/popup.d.ts","./node_modules/react-leaflet/lib/rectangle.d.ts","./node_modules/react-leaflet/lib/scalecontrol.d.ts","./node_modules/react-leaflet/lib/svgoverlay.d.ts","./node_modules/react-leaflet/lib/tilelayer.d.ts","./node_modules/react-leaflet/lib/tooltip.d.ts","./node_modules/react-leaflet/lib/videooverlay.d.ts","./node_modules/react-leaflet/lib/wmstilelayer.d.ts","./node_modules/react-leaflet/lib/zoomcontrol.d.ts","./node_modules/react-leaflet/lib/index.d.ts","./src/components/interactivemap.tsx","./src/components/interactivemapmount.tsx","./src/components/maphero.tsx","./src/components/rail.tsx","./src/components/nodecard.tsx","./src/components/filmsgrid.tsx","./src/components/filmsgridserver.tsx","./src/components/herocollage.tsx","./src/components/starsctarow.tsx","./src/app/page.tsx","./src/components/breadcrumbarchive.tsx","./src/components/tierbadge.tsx","./src/app/about/page.tsx","./src/app/address/[slug]/opengraph-image.tsx","./src/components/addressmasthead.tsx","./src/components/timeline.tsx","./src/components/factrow.tsx","./src/components/confidencedot.tsx","./src/components/projection.tsx","./src/components/claimcta.tsx","./src/components/sponsored/sponsoredcard.tsx","./src/components/curvesparkline.tsx","./src/components/streetview.tsx","./src/components/streetviewhistory.tsx","./src/components/mediawall.tsx","./src/components/jsonld.tsx","./src/components/provenancefooter.tsx","./src/components/crosspromo.tsx","./src/components/addressnarrative.tsx","./src/app/address/[slug]/page.tsx","./src/app/admin/layout.tsx","./src/app/admin/page.tsx","./src/app/admin/data/page.tsx","./src/app/admin/sources/page.tsx","./src/app/architects/page.tsx","./src/app/browse/page.tsx","./src/app/claim/[slug]/page.tsx","./src/app/dashboard/page.tsx","./src/app/entity/[slug]/opengraph-image.tsx","./src/app/entity/[slug]/page.tsx","./src/components/posterplaceholder.tsx","./src/app/film/[slug]/page.tsx","./src/app/films/page.tsx","./src/components/retiredfeaturenotice.tsx","./src/app/hosts/page.tsx","./src/components/listinggrid.tsx","./src/app/houses/page.tsx","./src/app/locations-by-year/page.tsx","./src/app/map/mapwithlayers.tsx","./src/app/map/page.tsx","./src/app/neighborhood/[slug]/page.tsx","./src/app/neighborhoods/page.tsx","./src/components/sourcelink.tsx","./src/components/permittable.tsx","./src/app/parcel/[apn]/page.tsx","./src/app/people/page.tsx","./src/app/promote/page.tsx","./src/app/promote/[slug]/promoteformclient.tsx","./src/app/promote/[slug]/page.tsx","./src/app/restaurants/page.tsx","./src/components/minimap.tsx","./src/app/restaurants/[slug]/page.tsx","./src/app/search/page.tsx","./src/app/stars/page.tsx","./src/app/stars/nearby/starsnearbyclient.tsx","./src/app/stars/nearby/page.tsx","./src/app/stars/walk/page.tsx","./src/components/submitminimap.tsx","./src/app/submit/submitformclient.tsx","./src/components/claimexamples.tsx","./src/app/submit/page.tsx","./src/app/timeline/page.tsx","./src/components/home/claimhome.tsx","./src/components/home/communityhome.tsx","./src/components/home/flagshiphome.tsx","./.next/types/app/layout.ts","./.next/types/app/page.ts","./.next/types/app/address/[slug]/page.ts","./.next/types/app/admin/layout.ts","./.next/types/app/admin/data/page.ts","./.next/types/app/houses/page.ts","./.next/types/app/neighborhoods/page.ts","./.next/types/app/parcel/[apn]/page.ts","./.next/types/app/search/page.ts","./.next/types/app/submit/page.ts"],"fileIdsList":[[99,145,359,582],[99,145,359,585],[99,145,359,583],[99,145,359,599],[99,145,359,504],[99,145,359,604],[99,145,359,562],[99,145,359,607],[99,145,359,615],[99,145,359,623],[99,145,407,408],[99,145],[99,145,512],[87,99,145,512,520],[87,99,145,517,522],[87,99,145,512],[99,145,512,517],[99,145,512,516,517,519],[87,99,145,516],[87,99,145,512,516,517,519,520,522,523],[99,145,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529],[99,145,512,516,517,518],[99,145,512,519],[99,145,512,516],[99,145,512,517,519],[99,145,511],[99,142,145],[99,144,145],[145],[99,145,150,178],[99,145,146,151,156,164,175,186],[99,145,146,147,156,164],[94,95,96,99,145],[99,145,148,187],[99,145,149,150,157,165],[99,145,150,175,183],[99,145,151,153,156,164],[99,144,145,152],[99,145,153,154],[99,145,155,156],[99,144,145,156],[99,145,156,157,158,175,186],[99,145,156,157,158,171,175,178],[99,145,153,156,159,164,175,186],[99,145,156,157,159,160,164,175,183,186],[99,145,159,161,175,183,186],[97,98,99,100,101,102,103,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[99,145,156,162],[99,145,163,186,191],[99,145,153,156,164,175],[99,145,165],[99,145,166],[99,144,145,167],[99,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[99,145,169],[99,145,170],[99,145,156,171,172],[99,145,171,173,187,189],[99,145,156,175,176,178],[99,145,177,178],[99,145,175,176],[99,145,178],[99,145,179],[99,142,145,175,180],[99,145,156,181,182],[99,145,181,182],[99,145,150,164,175,183],[99,145,184],[99,145,164,185],[99,145,159,170,186],[99,145,150,187],[99,145,175,188],[99,145,163,189],[99,145,190],[99,140,145],[99,140,145,156,158,167,175,178,186,189,191],[99,145,175,192],[99,145,441],[99,145,156,175,183,193,435,436,439,440,441],[87,99,145,197,198,199],[87,99,145,197,198],[87,99,145],[87,91,99,145,196,360,403],[87,91,99,145,195,360,403],[84,85,86,99,145],[92,99,145],[99,145,364],[99,145,366,367,368],[99,145,370],[99,145,202,212,218,220,360],[99,145,202,209,211,214,232],[99,145,212],[99,145,212,214,338],[99,145,267,285,300,406],[99,145,308],[99,145,202,212,219,253,263,335,336,406],[99,145,219,406],[99,145,212,263,264,265,406],[99,145,212,219,253,406],[99,145,406],[99,145,202,219,220,406],[99,145,293],[99,144,145,193,292],[87,99,145,286,287,288,305,306],[87,99,145,286],[99,145,276],[99,145,275,277,380],[87,99,145,286,287,303],[99,145,282,306,392],[99,145,390,391],[99,145,226,389],[99,145,279],[99,144,145,193,226,242,275,276,277,278],[87,99,145,303,305,306],[99,145,303,305],[99,145,303,304,306],[99,145,170,193],[99,145,274],[99,144,145,193,211,213,270,271,272,273],[87,99,145,203,383],[87,99,145,186,193],[87,99,145,219,251],[87,99,145,219],[99,145,249,254],[87,99,145,250,363],[87,99,145,403],[87,99,145,175,193,403,506],[87,91,99,145,159,193,195,196,360,401,402],[99,145,360],[99,145,201],[99,145,353,354,355,356,357,358],[99,145,355],[87,99,145,250,286,363],[87,99,145,286,361,363],[87,99,145,286,363],[99,145,159,193,213,363],[99,145,159,193,210,211,222,240,242,274,279,280,302,303],[99,145,271,274,279,287,289,290,291,293,294,295,296,297,298,299,406],[99,145,272],[87,99,145,170,193,211,212,240,242,243,245,270,302,306,360,406],[99,145,159,193,213,214,226,227,275],[99,145,159,193,212,214],[99,145,159,175,193,210,213,214],[99,145,159,170,186,193,210,211,212,213,214,219,222,223,233,234,236,239,240,242,243,244,245,269,270,303,311,313,316,318,321,323,324,325,326],[99,145,159,175,193],[99,145,202,203,204,210,211,360,363,406],[99,145,159,175,186,193,207,337,339,340,406],[99,145,170,186,193,207,210,213,230,234,236,237,238,243,270,316,327,329,335,349,350],[99,145,212,216,270],[99,145,210,212],[99,145,223,317],[99,145,319,320],[99,145,319],[99,145,317],[99,145,319,322],[99,145,206,207],[99,145,206,246],[99,145,206],[99,145,208,223,315],[99,145,314],[99,145,207,208],[99,145,208,312],[99,145,207],[99,145,302],[99,145,159,193,210,222,241,261,267,281,284,301,303],[99,145,255,256,257,258,259,260,282,283,306,361],[99,145,310],[99,145,159,193,210,222,241,247,307,309,311,360,363],[99,145,159,186,193,203,210,212,269],[99,145,266],[99,145,159,193,343,348],[99,145,233,242,269,363],[99,145,331,335,349,352],[99,145,159,216,335,343,344,352],[99,145,202,212,233,244,346],[99,145,159,193,212,219,244,330,331,341,342,345,347],[99,145,194,240,241,242,360,363],[99,145,159,170,186,193,208,210,211,213,216,221,222,230,233,234,236,237,238,239,243,245,269,270,313,327,328,363],[99,145,159,193,210,212,216,329,351],[99,145,507],[99,145,159,193,211,213],[87,99,145,159,170,193,201,203,210,211,214,222,239,240,242,243,245,310,360,363],[99,145,159,170,186,193,205,208,209,213],[99,145,206,268],[99,145,159,193,206,211,222],[99,145,159,193,212,223],[99,145,159,193],[99,145,226],[99,145,225],[99,145,227],[99,145,212,224,226,230],[99,145,212,224,226],[99,145,159,193,205,212,213,219,227,228,229],[87,99,145,303,304,305],[99,145,262],[87,99,145,203],[87,99,145,236],[87,99,145,194,239,242,245,360,363],[99,145,203,383,384],[87,99,145,254],[87,99,145,170,186,193,201,248,250,252,253,363],[99,145,213,219,236],[99,145,235],[87,99,145,157,159,170,193,201,254,263,360,361,362],[83,87,88,89,90,99,145,195,196,360,403],[99,145,150],[99,145,332,333,334],[99,145,332],[99,145,372],[99,145,374],[99,145,376],[99,145,378],[99,145,381],[99,145,385],[91,93,99,145,360,365,369,371,373,375,377,379,382,386,388,394,395,397,404,405,406],[99,145,387],[99,145,393],[99,145,508],[99,145,250],[99,145,396],[99,144,145,227,228,229,230,398,399,400,403],[99,145,193],[87,91,99,145,159,161,170,193,195,196,197,199,201,214,352,359,363,403],[99,145,193,436,437,438],[99,145,175,193,436],[99,145,425],[99,145,423,425],[99,145,414,422,423,424,426,428],[99,145,412],[99,145,415,420,425,428],[99,145,411,428],[99,145,415,416,419,420,421,428],[99,145,415,416,417,419,420,428],[99,145,412,413,414,415,416,420,421,422,424,425,426,428],[99,145,428],[99,145,410,412,413,414,415,416,417,419,420,421,422,423,424,425,426,427],[99,145,410,428],[99,145,415,417,418,420,421,428],[99,145,419,428],[99,145,420,421,425,428],[99,145,413,423],[87,99,145,512,530],[87,99,145,512,530,533],[87,99,145,511,512,530,533],[99,145,513,514,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551],[87,99,145,511,512,530],[99,145,430,431],[99,145,429,432],[99,112,116,145,186],[99,112,145,175,186],[99,107,145],[99,109,112,145,183,186],[99,145,164,183],[99,107,145,193],[99,109,112,145,164,186],[99,104,105,108,111,145,156,175,186],[99,112,119,145],[99,104,110,145],[99,112,133,134,145],[99,108,112,145,178,186,193],[99,133,145,193],[99,106,107,145,193],[99,112,145],[99,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,134,135,136,137,138,139,145],[99,112,127,145],[99,112,119,120,145],[99,110,112,120,121,145],[99,111,145],[99,104,107,112,145],[99,112,116,120,121,145],[99,116,145],[99,110,112,115,145,186],[99,104,109,112,119,145],[99,145,175],[99,107,112,133,145,191,193],[99,145,492],[99,145,483,484],[99,145,480,481,483,485,486,491],[99,145,481,483],[99,145,491],[99,145,483],[99,145,480,481,483,486,487,488,489,490],[99,145,480,481,482],[99,145,442],[99,145,157,166,442,448],[99,145,146,157,158,171,442],[99,145,146,157,158,166,171,175,176,442],[99,145,157,166],[99,145,146,158,166,442],[99,145,388,470,563,564],[99,145,382,470,473,509],[99,145,388,394,407,470,473,477,499,500,554,557,559,563,567,568,569,571,572,573,574,575,576,577,578,579,580,581],[99,145,388,473],[99,145,388,407],[99,145,404,473],[99,145,404],[99,145,404,477],[99,145,382,404,470,473],[99,145,404,471,473,493],[99,145,404,473,493],[99,145,388,407,470,473,563,580],[99,145,388,407,473,557,563],[99,145,394,407,473,563],[99,145,388,394,407,470,473,554,563,564,578],[99,145,388,394,407,470,473,554,559,563,564,578,580,593],[99,145,388,407,473,559,563,593],[99,145,388,470,471,563,596],[99,145,388,407,473,563,598],[99,145,382,388,407,470,471,501,502,503],[99,145,388,407,473,563],[87,99,145,554],[99,145,407,473,554,563,601],[99,145,407,473,557,563],[99,145,388,407,470,473,554,559,560,561,563,580],[99,145,388],[99,145,382,470,509],[99,145,470,473,555,556,557,559,560,561],[99,145,388,394,407,473,563,605,606],[99,145,394,407,471,473,563,573,596,610],[99,145,388,407,471,473,557,563,596],[87,99,145,388,394,407,473,563,613],[99,145,388,407,473,554,563],[99,145,382,407,470,471],[99,145,382,388,407,470,563],[99,145,382,407,470,471,473],[99,145,407,563,617],[87,99,145,388],[99,145,407,470,559,560,561,563,621,622],[87,99,145,620],[99,145,388,407,473,563,564],[99,145,404,470,473],[99,145,473],[99,145,473,477,499],[99,145,388,471],[99,145,388,470],[99,145,564],[87,99,145,470],[99,145,470,473,558],[99,145,470,473],[99,145,388,470,473],[87,99,145,388,512,552],[99,145,375,553],[99,145,554],[99,145,473,564],[99,145,386,388],[99,145,473,605],[99,145,570],[99,145,382,388,470,563],[99,145,375,552],[99,145,470],[99,145,382],[99,145,433]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","impliedFormat":1},{"version":"8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"641942a78f9063caa5d6b777c99304b7d1dc7328076038c6d94d8a0b81fc95c1","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e20d899c28ca26a2a7afc98beaa69e63ff7fba0a8bc47b4e3bf3ede5e09e424","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"085f552d005479e2e6a7311cdbbe5d8c55c497b4d19274285df161ee9684cd9c","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"007faacc9268357caa21d24169f3f3f2497af3e9241308df2d89f6e6d9bb3f2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7c5e2ea4a9749097c347454805e933844ed207b6eefec6b7cfd418b5f5f7b28","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1},{"version":"8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","impliedFormat":1},{"version":"f9fd93190acb1ffe0bc0fb395df979452f8d625071e9ffc8636e4dfb86ab2508","impliedFormat":1},{"version":"5f41fd8732a89e940c58ce22206e3df85745feb8983e2b4c6257fb8cbb118493","impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"1cfa8647d7d71cb03847d616bd79320abfc01ddea082a49569fda71ac5ece66b","impliedFormat":1},{"version":"bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"cfe4ef4710c3786b6e23dae7c086c70b4f4835a2e4d77b75d39f9046106e83d3","impliedFormat":1},{"version":"cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","impliedFormat":1},{"version":"3989ccb24f2526f7e82cf54268e23ce9e1df5b9982f8acd099ddd4853c26babd","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"2dad084c67e649f0f354739ec7df7c7df0779a28a4f55c97c6b6883ae850d1ce","impliedFormat":1},{"version":"fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","impliedFormat":1},{"version":"196c960b12253fde69b204aa4fbf69470b26daf7a430855d7f94107a16495ab0","impliedFormat":1},{"version":"ee15ea5dd7a9fc9f5013832e5843031817a880bf0f24f37a29fd8337981aae07","impliedFormat":1},{"version":"bf24f6d35f7318e246010ffe9924395893c4e96d34324cde77151a73f078b9ad","impliedFormat":1},{"version":"805c5db07d4b131bede36cc2dbded64cc3c8e49594e53119f4442af183f97935","impliedFormat":1},{"version":"10595c7ff5094dd5b6a959ccb1c00e6a06441b4e10a87bc09c15f23755d34439","impliedFormat":1},{"version":"9620c1ff645afb4a9ab4044c85c26676f0a93e8c0e4b593aea03a89ccb47b6d0","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"a9af0e608929aaf9ce96bd7a7b99c9360636c31d73670e4af09a09950df97841","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"08ed0b3f0166787f84a6606f80aa3b1388c7518d78912571b203817406e471da","impliedFormat":1},{"version":"47e5af2a841356a961f815e7c55d72554db0c11b4cba4d0caab91f8717846a94","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"f5f541902bf7ae0512a177295de9b6bcd6809ea38307a2c0a18bfca72212f368","impliedFormat":1},{"version":"b0decf4b6da3ebc52ea0c96095bdfaa8503acc4ac8e9081c5f2b0824835dd3bd","impliedFormat":1},{"version":"ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","impliedFormat":1},{"version":"fc3e1c87b39e5ba1142f27ec089d1966da168c04a859a4f6aab64dceae162c2b","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"61888522cec948102eba94d831c873200aa97d00d8989fdfd2a3e0ee75ec65a2","impliedFormat":1},{"version":"4e10622f89fea7b05dd9b52fb65e1e2b5cbd96d4cca3d9e1a60bb7f8a9cb86a1","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"59bf32919de37809e101acffc120596a9e45fdbab1a99de5087f31fdc36e2f11","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"b3aa6ede7dda2ee53ee78f257d5d6188f6ba75ac0a34a4b88be4ca93b869da07","impliedFormat":1},{"version":"c40c848daad198266370c1c72a7a8c3d18d2f50727c7859fcfefd3ff69a7f288","impliedFormat":1},{"version":"ac60bbee0d4235643cc52b57768b22de8c257c12bd8c2039860540cab1fa1d82","impliedFormat":1},{"version":"6428e6edd944ce6789afdf43f9376c1f2e4957eea34166177625aaff4c0da1a0","impliedFormat":1},{"version":"ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","impliedFormat":1},{"version":"6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","impliedFormat":1},{"version":"8dba67056cbb27628e9b9a1cba8e57036d359dceded0725c72a3abe4b6c79cd4","impliedFormat":1},{"version":"70f3814c457f54a7efe2d9ce9d2686de9250bb42eb7f4c539bd2280a42e52d33","impliedFormat":1},{"version":"154dd2e22e1e94d5bc4ff7726706bc0483760bae40506bdce780734f11f7ec47","impliedFormat":1},{"version":"ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"15e3409b8397457d761d8d6f8c524795845c3aeb5dd0d4291ca0c54fec670b72","impliedFormat":1},{"version":"f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"8b8f00491431fe82f060dfe8c7f2180a9fb239f3d851527db909b83230e75882","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"903e299a28282fa7b714586e28409ed73c3b63f5365519776bf78e8cf173db36","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"dd3900b24a6a8745efeb7ad27629c0f8a626470ac229c1d73f1fe29d67e44dca","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","impliedFormat":1},{"version":"aeab39e8e0b1a3b250434c3b2bb8f4d17bbec2a9dbce5f77e8a83569d3d2cbc2","impliedFormat":1},{"version":"ec6cba1c02c675e4dd173251b156792e8d3b0c816af6d6ad93f1a55d674591aa","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"d729408dfde75b451530bcae944cf89ee8277e2a9df04d1f62f2abfd8b03c1e1","impliedFormat":1},{"version":"e15d3c84d5077bb4a3adee4c791022967b764dc41cb8fa3cfa44d4379b2c95f5","impliedFormat":1},{"version":"5f58e28cd22e8fc1ac1b3bc6b431869f1e7d0b39e2c21fbf79b9fa5195a85980","impliedFormat":1},{"version":"e1fc1a1045db5aa09366be2b330e4ce391550041fc3e925f60998ca0b647aa97","impliedFormat":1},{"version":"63533978dcda286422670f6e184ac516805a365fb37a086eeff4309e812f1402","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"31fb49ef3aa3d76f0beb644984e01eab0ea222372ea9b49bb6533be5722d756c","impliedFormat":1},{"version":"33cd131e1461157e3e06b06916b5176e7a8ec3fce15a5cfe145e56de744e07d2","impliedFormat":1},{"version":"889ef863f90f4917221703781d9723278db4122d75596b01c429f7c363562b86","impliedFormat":1},{"version":"3556cfbab7b43da96d15a442ddbb970e1f2fc97876d055b6555d86d7ac57dae5","impliedFormat":1},{"version":"437751e0352c6e924ddf30e90849f1d9eb00ca78c94d58d6a37202ec84eb8393","impliedFormat":1},{"version":"48e8af7fdb2677a44522fd185d8c87deff4d36ee701ea003c6c780b1407a1397","impliedFormat":1},{"version":"d11308de5a36c7015bb73adb5ad1c1bdaac2baede4cc831a05cf85efa3cc7f2f","impliedFormat":1},{"version":"38e4684c22ed9319beda6765bab332c724103d3a966c2e5e1c5a49cf7007845f","impliedFormat":1},{"version":"f9812cfc220ecf7557183379531fa409acd249b9e5b9a145d0d52b76c20862de","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a403c4aeeb153bc0c1f11458d005f8e5a0af3535c4c93eedc6f7865a3593f8e","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"680793958f6a70a44c8d9ae7d46b7a385361c69ac29dcab3ed761edce1c14ab8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"913ddbba170240070bd5921b8f33ea780021bdf42fbdfcd4fcb2691b1884ddde","impliedFormat":1},{"version":"b4e6d416466999ff40d3fe5ceb95f7a8bfb7ac2262580287ac1a8391e5362431","impliedFormat":1},{"version":"5fe23bd829e6be57d41929ac374ee9551ccc3c44cee893167b7b5b77be708014","impliedFormat":1},{"version":"0a626484617019fcfbfc3c1bc1f9e84e2913f1adb73692aa9075817404fb41a1","impliedFormat":1},{"version":"438c7513b1df91dcef49b13cd7a1c4720f91a36e88c1df731661608b7c055f10","impliedFormat":1},{"version":"cf185cc4a9a6d397f416dd28cca95c227b29f0f27b160060a95c0e5e36cda865","impliedFormat":1},{"version":"0086f3e4ad898fd7ca56bb223098acfacf3fa065595182aaf0f6c4a6a95e6fbd","impliedFormat":1},{"version":"efaa078e392f9abda3ee8ade3f3762ab77f9c50b184e6883063a911742a4c96a","impliedFormat":1},{"version":"54a8bb487e1dc04591a280e7a673cdfb272c83f61e28d8a64cf1ac2e63c35c51","impliedFormat":1},{"version":"021a9498000497497fd693dd315325484c58a71b5929e2bbb91f419b04b24cea","impliedFormat":1},{"version":"9385cdc09850950bc9b59cca445a3ceb6fcca32b54e7b626e746912e489e535e","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"84124384abae2f6f66b7fbfc03862d0c2c0b71b826f7dbf42c8085d31f1d3f95","impliedFormat":1},{"version":"63a8e96f65a22604eae82737e409d1536e69a467bb738bec505f4f97cce9d878","impliedFormat":1},{"version":"3fd78152a7031315478f159c6a5872c712ece6f01212c78ea82aef21cb0726e2","impliedFormat":1},{"version":"250f9a1f11580b6b8a0a86835946f048eb605b3a596196741bfe72dc8f6c69cc","impliedFormat":1},{"version":"512fc15cca3a35b8dbbf6e23fe9d07e6f87ad03c895acffd3087ce09f352aad0","impliedFormat":1},{"version":"9a0946d15a005832e432ea0cd4da71b57797efb25b755cc07f32274296d62355","impliedFormat":1},{"version":"a52ff6c0a149e9f370372fc3c715d7f2beee1f3bab7980e271a7ab7d313ec677","impliedFormat":1},{"version":"fd933f824347f9edd919618a76cdb6a0c0085c538115d9a287fa0c7f59957ab3","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"6a1aa3e55bdc50503956c5cd09ae4cd72e3072692d742816f65c66ca14f4dfdd","impliedFormat":1},{"version":"ab75cfd9c4f93ffd601f7ca1753d6a9d953bbedfbd7a5b3f0436ac8a1de60dfa","impliedFormat":1},{"version":"f95180f03d827525ca4f990f49e17ec67198c316dd000afbe564655141f725cd","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"950fb67a59be4c2dbe69a5786292e60a5cb0e8612e0e223537784c731af55db1","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"07ca44e8d8288e69afdec7a31fa408ce6ab90d4f3d620006701d5544646da6aa","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"4e4475fba4ed93a72f167b061cd94a2e171b82695c56de9899275e880e06ba41","impliedFormat":1},{"version":"97c5f5d580ab2e4decd0a3135204050f9b97cd7908c5a8fbc041eadede79b2fa","impliedFormat":1},{"version":"c99a3a5f2215d5b9d735aa04cec6e61ed079d8c0263248e298ffe4604d4d0624","impliedFormat":1},{"version":"49b2375c586882c3ac7f57eba86680ff9742a8d8cb2fe25fe54d1b9673690d41","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"9ff1e8df66450af44161c1bfe34bc92c43074cfeec7a0a75f721830e9aabe379","impliedFormat":1},{"version":"3ecfccf916fea7c6c34394413b55eb70e817a73e39b4417d6573e523784e3f8e","impliedFormat":1},{"version":"1630192eac4188881201c64522cd3ef08209d9c4db0f9b5f0889b703dc6d936a","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"14e5cdec6f8ae82dfd0694e64903a0a54abdfe37e1d966de3d4128362acbf35f","impliedFormat":1},{"version":"bbc183d2d69f4b59fd4dd8799ffdf4eb91173d1c4ad71cce91a3811c021bf80c","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"8dbc4134a4b3623fc476be5f36de35c40f2768e2e3d9ed437e0d5f1c4cd850f6","impliedFormat":1},{"version":"4e06330a84dec7287f7ebdd64978f41a9f70a668d3b5edc69d5d4a50b9b376bb","impliedFormat":1},{"version":"65bfa72967fbe9fc33353e1ac03f0480aa2e2ea346d61ff3ea997dfd850f641a","impliedFormat":1},{"version":"c06f0bb92d1a1a5a6c6e4b5389a5664d96d09c31673296cb7da5fe945d54d786","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"872caaa31423f4345983d643e4649fb30f548e9883a334d6d1c5fff68ede22d4","impliedFormat":1},{"version":"94404c4a878fe291e7578a2a80264c6f18e9f1933fbb57e48f0eb368672e389c","impliedFormat":1},{"version":"5c1b7f03aa88be854bc15810bfd5bd5a1943c5a7620e1c53eddd2a013996343e","impliedFormat":1},{"version":"09dfc64fcd6a2785867f2368419859a6cc5a8d4e73cbe2538f205b1642eb0f51","impliedFormat":1},{"version":"bcf6f0a323653e72199105a9316d91463ad4744c546d1271310818b8cef7c608","impliedFormat":1},{"version":"01aa917531e116485beca44a14970834687b857757159769c16b228eb1e49c5f","impliedFormat":1},{"version":"351475f9c874c62f9b45b1f0dc7e2704e80dfd5f1af83a3a9f841f9dfe5b2912","impliedFormat":1},{"version":"ac457ad39e531b7649e7b40ee5847606eac64e236efd76c5d12db95bf4eacd17","impliedFormat":1},{"version":"187a6fdbdecb972510b7555f3caacb44b58415da8d5825d03a583c4b73fde4cf","impliedFormat":1},{"version":"d4c3250105a612202289b3a266bb7e323db144f6b9414f9dea85c531c098b811","impliedFormat":1},{"version":"95b444b8c311f2084f0fb51c616163f950fb2e35f4eaa07878f313a2d36c98a4","impliedFormat":1},{"version":"741067675daa6d4334a2dc80a4452ca3850e89d5852e330db7cb2b5f867173b1","impliedFormat":1},{"version":"f8acecec1114f11690956e007d920044799aefeb3cece9e7f4b1f8a1d542b2c9","impliedFormat":1},{"version":"178071ccd043967a58c5d1a032db0ddf9bd139e7920766b537d9783e88eb615e","impliedFormat":1},{"version":"3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","impliedFormat":1},{"version":"32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","impliedFormat":1},{"version":"0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","impliedFormat":1},{"version":"e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","impliedFormat":1},{"version":"5cad4158616d7793296dd41e22e1257440910ea8d01c7b75045d4dfb20c5a41a","impliedFormat":1},{"version":"04d3aad777b6af5bd000bfc409907a159fe77e190b9d368da4ba649cdc28d39e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74efc1d6523bd57eb159c18d805db4ead810626bc5bc7002a2c7f483044b2e0f","impliedFormat":1},{"version":"19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","impliedFormat":1},{"version":"bc11f3ac00ac060462597add171220aed628c393f2782ac75dd29ff1e0db871c","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"3b0b1d352b8d2e47f1c4df4fb0678702aee071155b12ef0185fce9eb4fa4af1e","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"a344403e7a7384e0e7093942533d309194ad0a53eca2a3100c0b0ab4d3932773","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"bb18bf4a61a17b4a6199eb3938ecfa4a59eb7c40843ad4a82b975ab6f7e3d925","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"e9b6fc05f536dfddcdc65dbcf04e09391b1c968ab967382e48924f5cb90d88e1","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"2b664c3cc544d0e35276e1fb2d4989f7d4b4027ffc64da34ec83a6ccf2e5c528","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"3cd8f0464e0939b47bfccbb9bb474a6d87d57210e304029cd8eb59c63a81935d","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"3026abd48e5e312f2328629ede6e0f770d21c3cd32cee705c450e589d015ee09","impliedFormat":1},{"version":"8b140b398a6afbd17cc97c38aea5274b2f7f39b1ae5b62952cfe65bf493e3e75","impliedFormat":1},{"version":"7663d2c19ce5ef8288c790edba3d45af54e58c84f1b37b1249f6d49d962f3d91","impliedFormat":1},{"version":"5cce3b975cdb72b57ae7de745b3c5de5790781ee88bcb41ba142f07c0fa02e97","impliedFormat":1},{"version":"00bd6ebe607246b45296aa2b805bd6a58c859acecda154bfa91f5334d7c175c6","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"0d28b974a7605c4eda20c943b3fa9ae16cb452c1666fc9b8c341b879992c7612","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"87ac2fb61e629e777f4d161dff534c2023ee15afd9cb3b1589b9b1f014e75c58","impliedFormat":1},{"version":"13c8b4348db91e2f7d694adc17e7438e6776bc506d5c8f5de9ad9989707fa3fe","impliedFormat":1},{"version":"3c1051617aa50b38e9efaabce25e10a5dd9b1f42e372ef0e8a674076a68742ed","impliedFormat":1},{"version":"07a3e20cdcb0f1182f452c0410606711fbea922ca76929a41aacb01104bc0d27","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"4cd4b6b1279e9d744a3825cbd7757bbefe7f0708f3f1069179ad535f19e8ed2c","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"b95a6f019095dd1d48fd04965b50dfd63e5743a6e75478343c46d2582a5132bf","impliedFormat":99},{"version":"c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","impliedFormat":99},{"version":"b97cb5616d2ab82a98ec9ada7b9e9cabb1f5da880ec50ea2b8dc5baa4cbf3c16","impliedFormat":99},{"version":"d23df9ff06ae8bf1dcb7cc933e97ae7da418ac77749fecee758bb43a8d69f840","affectsGlobalScope":true,"impliedFormat":1},{"version":"040c71dde2c406f869ad2f41e8d4ce579cc60c8dbe5aa0dd8962ac943b846572","affectsGlobalScope":true,"impliedFormat":1},{"version":"3586f5ea3cc27083a17bd5c9059ede9421d587286d5a47f4341a4c2d00e4fa91","impliedFormat":1},{"version":"a6df929821e62f4719551f7955b9f42c0cd53c1370aec2dd322e24196a7dfe33","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"9dd9d642cdb87d4d5b3173217e0c45429b3e47a6f5cf5fb0ead6c644ec5fed01",{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"370bde134aa8c2abc926d0e99d3a4d5d5dba65c6ee65459137e4f02670cbf841","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"00cf4001e0d9c6e5e036bc545b9d73e2b8b84cddb02e61ad05bab3752b1d4522","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08","impliedFormat":1},{"version":"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","impliedFormat":1},{"version":"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141","impliedFormat":1},{"version":"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213","impliedFormat":1},{"version":"704a2474645ec6c97171405bf8ea82ab7ba4637b910eea088676d2cbd6c7a37a","signature":"f2542ed28646ccec19a2b407da97ef71777f4a2722da6990c958c2c9612ae978"},{"version":"f60e3e3060207ac982da13363181fd7ee4beecc19a7c569f0d6bb034331066c2","impliedFormat":1},{"version":"17230b34bb564a3a2e36f9d3985372ccab4ad1722df2c43f7c5c2b553f68e5db","impliedFormat":1},{"version":"6e5c9272f6b3783be7bdddaf207cccdb8e033be3d14c5beacc03ae9d27d50929","impliedFormat":1},{"version":"21ac4cf3f8d8c6e1201cb31f600be708c9a37867fc5c73b7ccf80560fae591c8","impliedFormat":1},{"version":"0dfe35191a04e8f9dc7caeb9f52f2ee07402736563d12cbccd15fb5f31ac877f","impliedFormat":1},{"version":"798367363a3274220cbed839b883fe2f52ba7197b25e8cb2ac59c1e1fd8af6b7","impliedFormat":1},{"version":"2636a309ed87d6876728d9aca846a76b372cf2a21a4fdf9940a82a2dd86687d0","impliedFormat":1},{"version":"5aea76ab98173f2c230b1f78dc010da403da622c105c468ace9fe24e3b77883c","impliedFormat":99},{"version":"d2d6511a2de6041d13ce3bc51bd0a545e70de2b7361444afa48cbb5821bb3d2d","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"85b2dac6b0fcc6aa83fd480bc0f7d0fd09616752394a45808314a589e3d49f58","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"ba2116e52618555197af9fe44a4d63535d40cb240b4b23b39bcda91167eae850","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"7235cf43190bebb72aae4c5dfc5cd0a788aa83b02b89668f3b313c70eabbf947","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"e2fd090a5a2fca07144f7f6f2cafdd2a869b9d38868b219056692530d4ebd250","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"a780291453a5e167be611a1dbcdca44df0acfa1d081cd3dd7a28eeac3b60fe57","impliedFormat":1},{"version":"5f870e6f65023ee16e31f8f96b639a49cf6c7d6d25e69415aaac9a14900cab6d","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"b4ac79611bc3d0fd75a46cf487949f1b9be3faa6d7161aa74d47b9dfb19e8aa0","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"a3466702b4a004dae1587a0ca5afee1a3fb0b95cecdf73b4d31defbdc56b6fcd","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"bc0857da7efe1bdf8abf94cfbc370671d6739c25dc24fbb9aa7eadad035dbcf7","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"35919059d72603e3b32c760fc9df68879faeb6d77a4ddb66f7cf085b4f19cc47","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3c20daf12bb1c4ce30b0af655af51c998ff8685e9220653b468b14c925437d10","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"f2e6c262000c802eacc6c65ea418955722ac378f5bd727ed10f45361e4635340","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2ff5d9899941f2dd9953dd8d77be6d26f70257baac590ed9b765767cbbc3ada6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"42cfddfd5f29f5d3446ed4c7e78da2d525fec10b07cd3bbe26464ab2c3999621","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"0f76de4a5d18bd069d20b2e888e2c233e10f4b8b2b795a4cdb227ab02cfd1470","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"5b9ca08138b2e0d68e10d72a3cb378d8e00b1ce4b679518e7e88dbd6731511f9","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"305cc3b918e042e110ea875132c0afa939cd635a9e2769dd229510f298369b68","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"12be5bec6b71c761a4401aad3e1ea84762a66891bf6c1e5a2dccbedd2c5d51ac","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2ef910159dbfc55d7139a497f3e242a75da49f73a487f667c3dc13e63c30c344","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"46eff378a9377baba7972a2962c4892ad7bb959f8150ca3b736abc4707bc8c94","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"5a4672696aa1443da08cb11dd0321bf45871b711209f4efc3d7e2342deda6810","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"021cd44edf590071a9fa8d810f086765d9fddf2fbac3197d50ca6f8dd2137b52","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c571d567bbe7f821514eeeb521cc1d04b69640888df5e5baed961fe1576ffa8b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"299fa3d78beb51c6236d7636bac6782898b1a3ed7fbe16dd6d01923760510a40","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"404f6783dc4d4e4341d0d0456e3ce4a2185a3ed39b1461c790562cb1a89c47c3","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"832c250c8b95c69c0ddaff84664598cf482a1ba771343290dc591d8e2cf5bd0f","signature":"8957a524e141acb098de3aae8ff58278514d6af9f8cbb756cfca4daaeca07fd6"},{"version":"b8815527bc6c6feac569cfd301932145e8fb9a84ffb1c3360481d83357bd3670","signature":"21e0ea6616fbaf6290ea32e2daf791b309bb8889c8d899b361ff62bdfa5e98d4"},{"version":"8fbcee8017afc736e446210efab3ec46eb9fee66378d970916ba46952a56f93d","signature":"dc07b7c23550735514c2d99d3f9919b290b491f7e63dbbb3e7584b1e1e211590"},{"version":"d58a66ca1542fe7379bbe37cfcca1dc51f28c37fef1ddd52d4afb0330d992c28","signature":"4b72059dda2129998e9d353e7f4c1e65b0735cf5b000e057e59ed9629642a986"},{"version":"7508bfae993e3904adefe0dc0bd4197b0ce31528c387358f77b188a990575e12","signature":"d2f924049c4926c6820c1e2a22947f6e8d11616d83bfd7d2b8f021280a7c38f0","affectsGlobalScope":true},{"version":"800e908a38b01b897f6c97d51e6cc5ce96121657b8586b2097418c759ffdff01","signature":"b1572adbe777329e648715648b6fd66f3c47101a566c3d22bdd612b51e1d8cf6"},{"version":"bd5f26b3e91a1e78612ae47940e6bd1f7af6abc798bc0249d28951c2a776f3b2","signature":"bca87735954c3a6a2111cab6daa2505d7260130a5a49eb61d237a8182773ac91"},{"version":"281f1b8015f01742403e34c7d375b91cfd2261c00e52afd97534d31a9bf48a41","signature":"c64fb79a179b42e52bb72e68985c8545d9d4924981a8cea252f995eae7523973"},{"version":"49dfb21052b496c2b1a2841955d1eca794c50f08765b0b75f5bb680c606b3028","signature":"2f87d0b64ce07503900598ac181a2b48e13a0b1a99d1b6018f29163c35fab855"},{"version":"6a527eca426de8bda3d61e598638a920aca21bc03281291e119b96c5604d0101","signature":"033239ca0b547567742ebd9809279d3e42d275da502bf36c7c6e49ee271d3295"},{"version":"0605f6c5c0b1859660e66bd7f7bbf3880d30d8fe8540966e1af6eb9109e1a8cf","signature":"c936c71802d81f1d3d7f12bad7e7cc2b9eb5cf6e3ff9a8da763c3d53c285eda5"},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"08b2fae7b0f553ad9f79faec864b179fc58bc172e295a70943e8585dd85f600c","impliedFormat":1},{"version":"f12edf1672a94c578eca32216839604f1e1c16b40a1896198deabf99c882b340","impliedFormat":1},{"version":"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a","impliedFormat":1},{"version":"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"4fdb529707247a1a917a4626bfb6a293d52cd8ee57ccf03830ec91d39d606d6d","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"5780b706cece027f0d4444fbb4e1af62dc51e19da7c3d3719f67b22b033859b9","impliedFormat":1},{"version":"5386f553d8cfd857d73d6795ebbfbd9437331e2e8623bb137a9167919c1a8c18","signature":"3b65f528e9fcba61b2a1c4562746f0fda18175cd9d14aef434b0d52dfaa515a3"},{"version":"a44c92ef8f3307c8f09108106ce854bb97e096ce4884019babd0006d4491e4c0","signature":"412f36c9047f8b16e3fb4883733c0fc9edd701f0cb982354f5fb326f25ec4cf7"},{"version":"93c6b67911fbd1751c595a82414ac661a2adbb387fec3fed2a2d00a6f044ec36","signature":"ed4e026cb4d0ac3a7a2c7fd7078316cf0c1fb26d52584a668bc814ef3fe5edbb"},{"version":"1b0e0dee17af0ed7fed10399be01b2fb69c2a059f34429019dd5a64f0eff6e4d","signature":"f39d442968ac9213b4f919d14d87a92de7197c5da5b9447c7787938d851d7e14"},"52d832ee655b32e383f12e4c32decdcae3181062bf2282e532d2f0bcff115deb",{"version":"c17c1982fd991e105684a94ca476c633d720249361ad615b6457554d7e66f048","signature":"10fe15afb45da8f916a2d24776e1c40b42bfdb526f3b1c0757f1f7a388b23469"},{"version":"59ec877da8731ab466e3d0c32ba9e6fc36e9ea6e992644fca114396cb5499c0c","signature":"d6d48dd8c671645b61436bdc7f6c91ffeba09247feb471c3070ad8fcb02a9d71"},{"version":"55297fb03bde0e225f6bc60babe6e712a991a53949a291191c2cf12d96352ce3","signature":"6ae784b75bd20e3bde706fe8110d89d7a04fcc30f63d43a11e5bda6e8bc54919"},{"version":"f340a20b5dd28000fcc56ec847e3b2c63ca7fe8df79f859cfe4ad1e222ee92f8","signature":"9216d1cd17ede3b4045656deaf1f53ed3b2e89b02815f0b94a7d8bfa98b452ea"},{"version":"c1d72c35b2b23d1c8da98e97763e2893dc4b9133b9fe87ff5b54933a86dc6efe","signature":"ee1225de733497492c9f385f3a170c4388a704130b0f4c65c166fc9354b8574b"},{"version":"b4c171cff1cb7a5a7be354346b075028b58c360ec286c97f164f5393d9b904de","signature":"55c8494ac12e83bba7037cb08656ca9019c2259338ceaafe667a73522f13e614"},{"version":"bbcab911061e9270eae91717f056ec18958ccadf23dda3a6aaedf07d24361069","signature":"2ebc90be29c541cbe65fc76ab9642c7348e8f76f04a670930d705b67cc0df910"},{"version":"867ffaf4dfa681ba867017e94f08b6d2b855b57d6f273a315e4e3829429a005a","impliedFormat":99},{"version":"3b4cdb17fbfdd1a47a80afc0076e2476a4b513c95232570decdee7dca15b9ea4","impliedFormat":99},{"version":"7348c35ce10f8323a515ea6a6c237c0dc7c3fd5e491c4dacec2a7b93f0dfcd26","impliedFormat":1},{"version":"258e67b2638408b67fbf5fe6c953b8f2dd2a69f9171d31c9a976cd2329716e4c","impliedFormat":1},{"version":"4e7499d527db754a99ce03314c79fc05ab7718bc47a232977a2eab450c803eb4","signature":"7e11dbde16492c2709847c5ef2787e27eddc0916f00849077882ec971a4884c2"},{"version":"d30e67059f5c545c5f8f0cc328a36d2e03b8c4a091b4301bc1d6afb2b1491a3a","impliedFormat":1},{"version":"a356d9a0ba90d10ec6c0fa33386c0b0e2843fd6f0a49513c44f7809926ac25ff","impliedFormat":1},{"version":"f77db1be13db8dcf8c7a268c1f235c1ba1e4707e829175cdc237421b3c346f9d","impliedFormat":99},{"version":"05cb95655ecadfd1230547b84367d1c4d40a4bb6309545b8dc4d1638a3de1a50","impliedFormat":99},{"version":"e980a9cf8404a649ff3a2f0628d76e4469613c02b98bd3b922756d7d962476c9","impliedFormat":99},{"version":"f8adbcb59256526bc69d94fb5c826e812ebd1321b30ab35baa9997d74d45dd73","impliedFormat":99},{"version":"050a4570de5ad6e47cc9ac9fd9db7a26e57dbe1daadadbc19b20567941f8bf1a","impliedFormat":99},{"version":"5ed040255a4d5181f8ecb4ba90b8b38e0a6f1becf0ed860ca75b6e52c46db0bc","impliedFormat":99},{"version":"e22a49cd604cab3b62b1968a363d7b182edcb23d46793ed12cf5cfc6b1597f39","impliedFormat":99},{"version":"ff1b4730f5d49d37b73ee2db3443145daa0bfc7ff9c865134d871b08955e389b","impliedFormat":99},{"version":"8e64b72fa289b7f133b8cdb7d837f73e30ca7eb76ad88e1020d97c405c94fd7e","impliedFormat":99},{"version":"1f907507e41cc3df66b4521b80134bb8f7afada8d31c10f7100c93c90ab0f84e","impliedFormat":99},{"version":"6bb14070b70b4c9a897a4f5088af984e6e316b420d00d82fb962bad577896723","impliedFormat":99},{"version":"46e17953f7ffbf43d4328fcb5983e0ade2932fb56e84181e6929fcdcfa7c7aa6","impliedFormat":99},{"version":"113aef5576cd65f310927b17ae5f6ac8745c542a660bace5f019034d536fbd04","impliedFormat":99},{"version":"ddf0fdbb010c94978c1151441171f0aac236a23b6786e9f6332f745527d905e9","impliedFormat":99},{"version":"a2c1678ec68c42795e2ac068a7d026b61680357d2a881c9df211dd0f83d077fd","impliedFormat":99},{"version":"2fe207d2e8662abb709772fff1f3ec3116a4787b5caa4e862daa5dab2753edd7","impliedFormat":99},{"version":"a7af5f01007f450dc8cf2cdbbb11f4d4bf8bf3faa869d21267db5de74ebf665a","impliedFormat":99},{"version":"709cb4986cbe2b58ac3bbbad45dbfa24cda1b62c794c73b96e9ff1236dd0d5d1","impliedFormat":99},{"version":"afdc9b1fd1937d9b649bca2b377d1144cc9c48158403c17cfd21b6e1e8b25099","impliedFormat":99},{"version":"1d47324801b498d62f31ea179f58e1f3eaa1e607914504a7c92fb5465affb851","impliedFormat":99},{"version":"95fdf978302838125ac79d9d5e9485d8fa1ddd909664bf5cc3b45ec31f794fda","impliedFormat":99},{"version":"d92bf7d6d30c85e53b961236ceeb099e73a1a874849d038a348b51383087872f","impliedFormat":99},{"version":"e56e4a57ca5aa762d67fd3d16471c47592469944315fa5e92b3b09c83eabae91","impliedFormat":99},{"version":"f3d31927b7a3d0f2f119a05a102af2bdd1fc4f759fe43d508a64a80b3b341f6b","impliedFormat":99},{"version":"678700fba88589e28648a923e4b98ab60f3f7df4742412419e29f95966da4475","impliedFormat":99},{"version":"5a71b307074ef3d2794c4104248b7a3cad5f486df204da65862a7d24f698fc95","impliedFormat":99},{"version":"9a4496ad6d48bc801a122c11e94ee1e3f0710bda38b125573f67f5cb0add1733","impliedFormat":99},{"version":"afa5e16f2ad07d847701e3bde9e7ab36f87e0e3a5c0cb7998644791a1fa3c5b1","impliedFormat":99},{"version":"98cd9124b5d8438db4b4dbd247b2c68ac22b6366a43e6dc4945ae32972f157fc","impliedFormat":99},{"version":"dc21879e45f3a023b5fe459c3da5f2f3cf995f21a1ac533049d8950ce394c045","impliedFormat":99},{"version":"622d6ce66ac838d5d7e968daf4ae760cf49797e3fbfaa2b21d01e0fb5d625bc9","impliedFormat":99},{"version":"ecfa30418b2200ba6496b5f59b4c09a95cce9ea37c1daaf5a5db9bb306ee038f","impliedFormat":99},{"version":"3b56e30b1cbe1bfa7710e88e5e0b8fa6eddc7c2e67615f73bdf8637af68403e6","impliedFormat":99},{"version":"92a8de4f8f6595bf1eb24a19aebff7371c66ae8751f2e045edd9e25ca435e4a2","impliedFormat":99},{"version":"01810afb0ed31afdea0846cee91e85a474727d0966e5bb57c2a4a732854deab1","impliedFormat":99},{"version":"c874e98cd875727ea62fdcd978ac9e067ce07cf7493aa4b8b193fdc3b7318eea","impliedFormat":99},{"version":"455e843c1f8e0df452f101c9ec0b63ab8e749f296c947249f8bbc29bff58c83c","impliedFormat":99},{"version":"eadc4c556b494cc52676e084eadf0b60fb2cc6e2408d1411eeae5cb74068ca86","impliedFormat":99},{"version":"3b8689266e8fb628ca2068ff610ed0b842ff4e407c3a914358ef1895dabfcfcd","impliedFormat":99},{"version":"fc741907f6d8158b2c4722932d745b11dd41f9355a5b325c8cd3cdfbd966d76d","impliedFormat":99},{"version":"f02f6b8fbbdc89d49e1a9ee72637da79ef8eab3dfd9e6cb65ff8638ff1ec77d6","signature":"d599d9527fe728669a340a929e6906ac3278b0dfeba86f83e0d1305e86399953"},{"version":"ec7d496e3b75eba41e799f0b107bad386fee47b40ef6cc692fe761e4db6d2920","signature":"e3b56ef4324017ea361c5ca7a2a2be047a328f59fd468d130cafba6fdf85277e"},{"version":"d8ce914ac4220296d4caba6f5b21f64a76ef6338d18ba797ad0daa005c5e84ab","signature":"8dc6327752d27f23c40c92a9df6af9239a202420186bec3b0b43c781bd0ca72b"},{"version":"95bc1caf051f0108d82613d321fac207b7c90257ec47a17af02b1b5c041e476a","signature":"a787f74d922b0513dcc8d147a51d88680d18ffbbf5f3003a6f20d855d5e30ccf"},{"version":"2a8f701d2e0dd71e26c6bc977d41f0ee27998d854ed44de1bf96185444ffaf5a","signature":"942539020cddf81c84e7b509ddb926a4c7d9d0d165a3f66787bde03653de93c4"},{"version":"a9b182cfd5630aaa758967e554d053d860ca46b5354112a64de6cf6d3cc9cb1b","signature":"e0818a693313ecb1f8347f651f4c2421e29e254b4be78536a2b77b1f66422b0e"},{"version":"c6bc7d689983cb50ecd6b150a4cc981c749582495d61a377c1daf67bad0b1fdc","signature":"1ca69f9594e5be4fa3889bae939f1f56ff16d58ba2464d043a0bb05b811a6496"},{"version":"eeaffe11de59d3d953d67e4bad602225dc17d438a143c830941b381b0f31b92b","signature":"23f1e872ea12ad813b02e0a65850fe5e5a82ad94e4f845d7f4f5d52ed1e0b659"},{"version":"26887f3ab3a1eb328d11447084b4685db52479dcf14483c78de39cb468dad8f4","signature":"8760f213975576ac5d1f992e9ed7556dc1cbe98668c25c82c1333131a3426d97"},{"version":"89117734569e72bbaa763b47d044e9de0a22ac922d106e463ade5c05716c2667","signature":"201fc8aae0c45af346dfdfca74450da8c102941ecdc7e88024ed0f77829be2b5"},{"version":"29bad200a336e08e60eacc6916713f2a66f710d6d8856f4424d02a215f2441a5","signature":"d7c89d45d1a4a88d5e93b1340279640fc5a163448b7f88f891eceacb1e3fee73"},{"version":"29d0b210ed29897704eb30e3359d8d7945965bfaa0708b984af0de0bd134b383","signature":"fba21335cc80f941ce726de79be012a5433025205bd1a83f758ebd13509ba747"},"8e8a5977d319aee4e8818dd2a42e814da03241925788f882dc877b50a3d3c8fd",{"version":"20e4e3b0044a0d80fb832c15d0bf9a6527ce39bab932f7bd36aed98e1e8929a3","signature":"33cb435bbb963099599d932891bd52e2cdc36fb87fd5d1ec8d06408f3d439411"},{"version":"02421f946386db15eac224c9749b4555b0863e01f6b814ec39b9467d6b8ee143","signature":"9b06157564c72a8c906a51a19ffb145386073ec1077f455e965eaf3d0b0ae86d"},{"version":"129004d727abf8ea0a325b059733fa0386afcfd15fa82d22afb0ce7096427447","signature":"7a88a480dd27358afbfe59e35bbb7b29f48174bd1df10bcd727812f12d503d06"},{"version":"7cfb3608b819b5241712bcfbd725c14559a4ca38cb4a871f5233f4ebba8fa37a","signature":"c0dcd712576d3bc49ad21cd18f44ab1bdd715aadb88637a95918df87139aece5"},{"version":"51e29a33ca44d736c6779c74700e8a9e84e9ebc49bdabeea9e8ff4cbe39d8785","signature":"528b4ea3d5ab085935d10bcdf3f2ec329295b386fc65ee01254e78e829156736"},{"version":"0a98b71bc404dea34eb1ce91a3b1a3bee63b60a70a79a707b8d1bd6a49bd4e70","signature":"b6b35aed3f1fbd250d295fd4488636aa67a753f26002f65013d81ea014c9bb1d"},{"version":"0c938a37d2ff776eeb0ead9d9c2c88001458514c15fb51a937c2df5fb33c9dcc","signature":"d8786120809808cca09436e3d8333df65d0554a1c8a2de41724df4ddb6f0b40e"},{"version":"02deace99de94352d67163f772aca8ec437c4458abe9dcf27ea01036d1191e90","signature":"02190ac5b6561caaa077b8ae612e157bed35270a21a167a8e089bc800948bc46"},{"version":"322264e06a1e7cdd7d4a0f5cc67481a4586ba3366fa2552a05d2635c617161aa","signature":"6d325a034d923001e779611d5eeafb389d0ebab9bf3c235c0f7d5229e32ecfe6"},{"version":"d0246b0b4ce4335272e4b9f994c6bdc8c6d7b524596dcee9409e6646d950bef5","signature":"e8be897f2181c72fc43e68b4fdb0b5921bf8f109b51ffbdc425bf22e1552bd67"},{"version":"79eef0dfb2928fff7190b0a57f0c26bf65b51d5738aead64f1316ba02677b22f","signature":"49d7babcfa5400f763daca36b56c8600bcffe0068733996161399c3cd63087b8"},{"version":"4acb9b22e71eedaadd2a476eccd1b2765cefa8299af4eafe3c681a1709202de5","signature":"c5272d6f5f6548eb361d26d7d270d3c42b970ff09b41e98d384bbc377c83d7da"},{"version":"ceb953d1d59badaeb16dc95cbfbc7a933b8bc0bfe7c9a35f66d62bb147e95a04","signature":"87dba6f4d3e6f91fcee310efe847fc5bb8cbd74cdb61ff2431538cfb109351bc"},{"version":"5b712377341a58aef517e08ab8d22e1979063edb661faff89fcc012eeb026593","signature":"5a1d32f4a4bc0e1a6004c304bafc21005e398bbdd9073c09e6a78be04eed617c"},"c4633b2b9b96a2537bc2d50258d5a3fdf9fe2cb58cf7b5c500575b430ae35e6e",{"version":"0d743949af0ead4e05395ad20eddd2d8d4bc008490664e6422faea1ddc0184a8","signature":"3465eb5e2915bc4da3954db4508a5b1ec723610d39a1e7e8bca96ce0e8eb5a50"},{"version":"b4e2ea8800ce3495ed92b29926754559ebd6214bd6a52b60e6c48bfcff54841d","signature":"94b36666994ce3b351e7fdd8e9d06834101f9d962330d7c3b3fb61458aa94b24"},{"version":"08268019a80c41d45a93421cf0cec230745a5d521c9711c36c7d5b2716d6b21f","signature":"f198b71543c2d6ca21b5b30f1ff2ed2df5fb51aca238ded35cec059605a9017f"},{"version":"01bdf32f8e861750260220a481473feedf1b277ecc90592640e5339821000ee5","signature":"bdbac09a2009d84f452e9a6f739c1a5bfc19b8d314c2080ea9ac923965727482"},{"version":"bc12ebcdd075f050708d6f2a3e72af62fcdc7db36a00315856d05d1529d029d7","signature":"e118c59f4273eed41c42a4f3dcefc8993471d066881f70fedfd0a2f326064d28"},{"version":"5d38ac9b5601be78775b3ee33ca29cdabde0a1f44fbf50288e6b16819e8f6ff6","signature":"168b5e664817649ec794d1b81961d200a6e2d74172307b7535f8002d2e6ced5e"},"fa0cc5a8459f5894cb84e726f4f2f905f575deb7edba12d4b03bcc87b2777b25",{"version":"b65affd17c63b8df0cd88df50c676630856cb9419506d6e8ad6b9c472218b3fd","signature":"bb6d78bb20e9ff51e0323c7f720ad2ceb00722f75b0cbd5c6924cbe753fc6098"},{"version":"0dbcce69f53475a863292775541b9daf02b2117b00a134bc87a16325186fd74b","signature":"326d61020a72de88e1a43e087d8794fa9e1a8b153a48c17c8c211cd6f2441199"},{"version":"c47195851d99c28d7c7de2f177855e88632a70d427839f9f0e76eb4b43381ebf","signature":"453347f0549e2596d8830f060a1d9762ef3655f59e8ce1810db6e1f1a6539e16"},{"version":"699330737a897e0b5e9198cf57063427e9015a4d192f1776fd271c946c831b35","signature":"33cb435bbb963099599d932891bd52e2cdc36fb87fd5d1ec8d06408f3d439411"},"5b04c445e4c6fbc443390c034d504b5b19e03c36405129abbcff53402d5092ca",{"version":"5214eeff610784f968b3b2f6e585fbe9afd9b682518094715379df7ddcfa38c6","signature":"71f397c7ee37e9585c00f86cedd67652a4a9dd75ec8ae014749c43179046c957"},{"version":"d0fe58adffd63f57dc249731f9117441bf03151cd9db56139f649e28267ceb41","signature":"e6c83d44fa6963e66f3f32a8a4326caa27fdbcae36660b9aab858f404224ce9a"},{"version":"633084d1e8d67746cbea7e714be12bce431a22af1634ead9e9e4b9d892412a2a","signature":"d4604139da5a646d3064fc1af517b53d8a7e0f56d601068e1cb1e10ac08a7c7b"},{"version":"6d3d489bb63e439076dc9fae2b4472f0ab5af14475c0bf3bc3a3fb3fe4ba6897","signature":"c68ca2cd04e166875af59a95c177e394c160a837b381e75ffa723d538a26af59"},{"version":"ba0b6f58dffe50aedd786558b5d211b3ac4115a3b10715792493976ee2bf6a6a","signature":"cf5c00cd069e8de4629d263bb778af154ae65d9cfefb6a2ad890d172226638ee"},{"version":"2aa0a71ce2039eebf56a9a8bcc628c36e4fbe6e4a5f16c9b642e3764d58db5d9","signature":"14769dd9783aab66846fc2cba4b2f98f6c01e8f550984e69e6deb20f87d72bfc"},{"version":"322d3de79a877a5afe0ad157b25387eb5dfddc6b27deabefc640f3673cf11b81","signature":"5c6189899922cdf9fc28896281e48e377b20302c425f79358034b932a3cdd135"},{"version":"31b6d48fa9137016f6ba40b5d77ef523adfbe2c06759587cb3248223f34aca04","signature":"91850f31f1ef37fc84d2ca1196972ad1a2374b9bbc69fe4851c45a16b14e05c1"},{"version":"7d60898192cc30e9485fe7c10b0bd999d9b25877c033ed9a3c3b8df59b561ced","signature":"49d33d2535316773b5e298d95f1746af38d28c9634f8a1c7ad2b9dbabccc134a"},{"version":"ff1f2f5f6959f17a010707e6a34b5f69b74aa01bc6ac8a19959277d979eb2d19","signature":"5f4d8f19e9c9bd7466b0fc8647f1258a34d7190072f1028b4ed45162c3ed65de"},{"version":"b24406d22057b60f699077f33fd9a56d77be167d1459c01792d3e2be356e7bd5","signature":"23308a832675e13759bb7fb6f5076eefb14ec973fe81f7f5a9ca2f5473a38c2a"},{"version":"aca1ebad62dc5cfe2fa78dbd9feadccf3b2b4116f81f4bfef60799440a05189b","signature":"93ec11aec11e86ec672bd3e1f505c8935f726981649a15a55d1c42b0d32cf450"},{"version":"e78a8c1a4782b7762e8fef35a0dc6e1bd828d7d09250beb884b4447b94124403","signature":"cf1e99d874b134fd0352d3c27a758dc587952c0789bb32518700b3ab5d82702f"},{"version":"a8864dce614d296a70cf9ce92871fb83af32dad7206951c3aa2a7bb19b92d05b","signature":"899d39de253c2093b1b353332b73a346cb9dd611c02e191ee7cd75b5248c9b23"},{"version":"a0719513cef0a1b870e1b89207f9e8ee151f4a652e62d2773271260df46f25b3","signature":"09c2ffcba11523e17e1f1b5202d1ae4cafe8829fa012cf76c918760ec8d2820c"},"fc86b52b4817d9537001e3713b87c9e48fb605d463b67202395145a0bb4f6eda",{"version":"6bcb6ca231b634db6ee373853de473fb48e66d02d3aa715c72b9954f5cb95444","signature":"e8dd5865e393b353cb702032fb1b4833213826b567693bd80e0b1bfe29f838e3"},{"version":"dbed7fa8a8911582a28ce812c27f01a46e538026807a8e6f05459071178fc419","signature":"f51ef369237cf4998a2daeb0514308199108dd58439a1adc4a556bc43ef774b6"},{"version":"87c1e86775e70f450379902223fe76a14310085d87e7d174ea63c47c016eb528","signature":"8069acc4f4a0e51b4ba4e2b97b4f9e5f08e0e688c47550022e4767783c677236"},{"version":"6a1eb6caafbf183cffc6861e12715c31196ca2dce6be0f472ed7317c07f6a72c","signature":"fd70f95d4f6d14b901e0990aeb233c171c964a32dca3dd2ce203150e9d988e2d"},{"version":"f85ac0f7afb5f7bd43b3aaac3519160c17e98142dc456702ec73051984428fe1","signature":"b8ffb487271cf922f23007a94fff2ef75d5aa4bba52e60b2359f4d717f39c6e6"},{"version":"1b11353e35bead11fbb0b28acf48e6837f75ad5101bda508cc1382f0d7eddfaf","signature":"63762cf7c5a4bc992fc4e1c92beb2a3c0804fceb4f26a6aaeee26b6fb3cd0ff6"},{"version":"d04dd4996c270997a1c001c6d0bea9cf573b1c0922a7b0c724c48393605ef4c0","signature":"7d54d69bd28258dcf401dcfabc79979e51be0c0acb07af00e6e5e0b75004584a"},{"version":"2c4c73d885472ba155ba4ed58a0cc032702faee5ac3efd2edcf9ea7df96e2571","signature":"edba6f71e1165dc5b906d32970a92e520c8b2f736732149ce518210d4e2f38cf"},{"version":"119af9d3785040ba2547949250d5ebe2eca3fd7a38947e7c721fef3bbda1f41e","signature":"91a607dcd863a5561f3469e9ad860c5c6fdc7f0bce10064975fd548ac77a50f0"},{"version":"538945c2b30a6f03f261cc56fb8c55fcf58962acbb3acb8e685c5ead0b673862","signature":"95e7a65b4f3ddfc309da0c7faf04e5415651c11fcea71e06ee51c45e465e0531"},{"version":"0429b03cad5d8a34e5b938dd64a42ac70b0ffd36bb6f8bc4a9a0db867db0ced8","signature":"f11eae824171ed229af1b3968022a15822b0d289aaf5a6e946f58a1f551164c8"},{"version":"b9d678379f5902f2dd7e387c5d31318fea876ca5698aa7e94faab89a4af5a741","signature":"fac4424979a581f8401d2ad663c26608f020d34f7eb7a4f1d621134475807707"},{"version":"10eedbf59e4d03631c4b16673b4ecff5740d12e71c70856ccf09d232c41655ce","signature":"094e86d221c7161cd827f74d09d3e0e8249b496579304b654ab4af86300a2ace"},{"version":"e631010e8454319bfaae18f2d79b57ebcc47f3538093cb33c2fa27eda4fc2aed","signature":"17473aec06661b772ea0188799389b35164eb6c89201c022aba1236d5873c1a2"},{"version":"c73ef3325a265eeac1337bd48d53f74a41c64431d870f3a305e72594cddbec87","signature":"5122b135b46cd68c8af61390cdd353cefeb94ab5947051f573cd2fe23a678114"},{"version":"a0de3831be31885600f78cf3792fb60253707e83d301f4cd9c1483924d2e77d3","signature":"a8d9b35f388f270c7e9cecfb998193c125239ce4e02873609d44abab37ea5bff"},{"version":"fa100623257bb4539418a67948200bd9ec6501d509e1e907a464b28cfa26c5bc","signature":"7ada08b5f22595664b83d1a7a4cf71cdc8faeb52607be9aee72f98e984e0b523"},{"version":"b299134195921f117a48b62b1f4f4032f3b58e3eb8696929efe82bd18ed184d6","signature":"3218c9afa277985d0eaf4cd2a740a827d3e12386c94d391d3c68bb3bb104e967"},{"version":"00c4e82c186815f5342903e73281083d68a6a719be28c59e3555614905d87ecd","signature":"4eeb6006b5691f72f855271e66abd6863cad219c16f371a681485256cf1dbb61"},"2e4f047d100df1f307f688253d3713d813a25014effb5e14c6184e5237b7968c","7dd579b8847f127d81c00a432513cb865aa334e08fcaaa2568698685e2dd4ffe",{"version":"37972d4b904d2cd304f9bf53d2d7ebff3601916a2913db3d8c4220f17496a35a","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"18ae7379f6c8d6e432d5e3ecfd64b8012debe5e0f71a8ea5c71e9935e56ce6d1","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"9cd05da82a256f180a52eb6c79c4848577642ce52b43a0d83227f98be2b7e77e","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"abff2da6c0f0d285bcffcd63ce0cc4781d40b5345a3c201a29c488eafd24c553","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"11ed1a4be020d725fcf72fbfbed7f5a6ec248457cc31cdd0060c3e1d47bb4062",{"version":"da57a133d7e363ad3a1ebc9c588165def07682533781661dac8a95914f6b268a","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"14fbe1efaacc1d48b297759861edb693e121c649013e1e00a676f7fbf2e7639a","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"d41cd59ba669cdce5037c392c03b6ec948e46dc0b17cf04c12f9bf9dd5906c5d"],"root":[409,434,[443,447],[449,479],[494,505],510,[553,637]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[630,1],[632,2],[631,3],[633,4],[628,5],[634,6],[629,7],[635,8],[636,9],[637,10],[409,11],[362,12],[515,13],[521,14],[523,15],[516,16],[524,17],[522,18],[525,12],[517,19],[518,17],[526,20],[527,13],[530,21],[519,22],[528,23],[529,24],[520,25],[511,12],[512,26],[142,27],[143,27],[144,28],[99,29],[145,30],[146,31],[147,32],[94,12],[97,33],[95,12],[96,12],[148,34],[149,35],[150,36],[151,37],[152,38],[153,39],[154,39],[155,40],[156,41],[157,42],[158,43],[100,12],[98,12],[159,44],[160,45],[161,46],[193,47],[162,48],[163,49],[164,50],[165,51],[166,52],[167,53],[168,54],[169,55],[170,56],[171,57],[172,57],[173,58],[174,12],[175,59],[177,60],[176,61],[178,62],[179,63],[180,64],[181,65],[182,66],[183,67],[184,68],[185,69],[186,70],[187,71],[188,72],[189,73],[190,74],[101,12],[102,12],[103,12],[141,75],[191,76],[192,77],[442,78],[441,79],[440,78],[86,12],[198,80],[199,81],[197,82],[195,83],[196,84],[84,12],[87,85],[286,82],[85,12],[93,86],[365,87],[369,88],[371,89],[219,90],[233,91],[336,92],[265,12],[339,93],[301,94],[309,95],[337,96],[220,97],[264,12],[266,98],[338,99],[240,100],[221,101],[245,100],[234,100],[204,100],[292,102],[293,103],[209,12],[289,104],[294,105],[380,106],[287,105],[381,107],[271,12],[290,108],[393,109],[392,110],[296,105],[391,12],[389,12],[390,111],[291,82],[278,112],[279,113],[288,114],[304,115],[305,116],[295,117],[273,118],[274,119],[384,120],[387,121],[252,122],[251,123],[250,124],[396,82],[249,125],[225,12],[399,12],[402,12],[506,126],[507,127],[401,82],[403,128],[200,12],[330,12],[232,129],[202,130],[353,12],[354,12],[356,12],[359,131],[355,12],[357,132],[358,132],[218,12],[231,12],[364,133],[372,134],[376,135],[214,136],[281,137],[280,12],[272,118],[300,138],[298,139],[297,12],[299,12],[303,140],[276,141],[213,142],[238,143],[327,144],[205,145],[212,146],[201,92],[341,147],[351,148],[340,12],[350,149],[239,12],[223,150],[318,151],[317,12],[324,152],[326,153],[319,154],[323,155],[325,152],[322,154],[321,152],[320,154],[261,156],[246,156],[312,157],[247,157],[207,158],[206,12],[316,159],[315,160],[314,161],[313,162],[208,163],[285,164],[302,165],[284,166],[308,167],[310,168],[307,166],[241,163],[194,12],[328,169],[267,170],[349,171],[270,172],[344,173],[211,12],[345,174],[347,175],[348,176],[331,12],[343,145],[243,177],[329,178],[352,179],[215,12],[217,12],[508,180],[222,181],[311,182],[210,183],[216,12],[269,184],[268,185],[224,186],[277,187],[275,188],[226,189],[228,190],[400,12],[227,191],[229,192],[367,12],[366,12],[368,12],[398,12],[230,193],[283,82],[92,12],[306,194],[253,12],[263,195],[242,12],[374,82],[383,196],[260,82],[378,105],[259,197],[361,198],[258,196],[203,12],[385,199],[256,82],[257,82],[248,12],[262,12],[255,200],[254,201],[244,202],[237,117],[346,12],[236,203],[235,12],[370,12],[282,82],[363,204],[83,12],[91,205],[88,82],[89,12],[90,12],[342,206],[335,207],[334,12],[333,208],[332,12],[373,209],[375,210],[377,211],[379,212],[382,213],[408,214],[386,214],[407,215],[388,216],[394,217],[509,218],[395,219],[397,220],[404,221],[406,12],[405,222],[360,223],[439,224],[436,222],[438,225],[437,12],[435,12],[426,226],[424,227],[425,228],[413,229],[414,227],[421,230],[412,231],[417,232],[427,12],[418,233],[423,234],[429,235],[428,236],[411,237],[419,238],[420,239],[415,240],[422,226],[416,241],[514,16],[531,242],[532,242],[534,243],[535,244],[513,13],[536,242],[552,245],[533,242],[537,16],[538,16],[539,242],[540,82],[541,242],[542,246],[543,242],[544,242],[545,16],[546,242],[547,242],[548,242],[549,242],[550,242],[551,16],[448,12],[410,12],[432,247],[431,12],[430,12],[433,248],[81,12],[82,12],[13,12],[14,12],[16,12],[15,12],[2,12],[17,12],[18,12],[19,12],[20,12],[21,12],[22,12],[23,12],[24,12],[3,12],[25,12],[26,12],[4,12],[27,12],[31,12],[28,12],[29,12],[30,12],[32,12],[33,12],[34,12],[5,12],[35,12],[36,12],[37,12],[38,12],[6,12],[42,12],[39,12],[40,12],[41,12],[43,12],[7,12],[44,12],[49,12],[50,12],[45,12],[46,12],[47,12],[48,12],[8,12],[54,12],[51,12],[52,12],[53,12],[55,12],[9,12],[56,12],[57,12],[58,12],[60,12],[59,12],[61,12],[62,12],[10,12],[63,12],[64,12],[65,12],[11,12],[66,12],[67,12],[68,12],[69,12],[70,12],[1,12],[71,12],[72,12],[12,12],[76,12],[74,12],[79,12],[78,12],[73,12],[77,12],[75,12],[80,12],[119,249],[129,250],[118,249],[139,251],[110,252],[109,253],[138,222],[132,254],[137,255],[112,256],[126,257],[111,258],[135,259],[107,260],[106,222],[136,261],[108,262],[113,263],[114,12],[117,263],[104,12],[140,264],[130,265],[121,266],[122,267],[124,268],[120,269],[123,270],[133,222],[115,271],[116,272],[125,273],[105,274],[128,265],[127,263],[131,12],[134,275],[493,276],[485,277],[492,278],[487,12],[488,12],[486,279],[489,280],[480,12],[481,12],[482,276],[484,281],[490,12],[491,282],[483,283],[443,284],[444,284],[445,284],[446,284],[447,284],[449,285],[450,284],[451,286],[452,284],[453,284],[454,284],[455,284],[456,284],[457,287],[458,285],[459,284],[460,284],[461,284],[462,288],[463,284],[464,284],[465,284],[466,284],[467,284],[468,289],[565,290],[566,291],[582,292],[585,293],[583,294],[584,293],[586,293],[475,295],[476,296],[478,297],[479,298],[494,299],[495,295],[496,295],[497,300],[587,301],[588,302],[589,303],[590,302],[591,291],[592,304],[594,305],[595,306],[597,307],[599,308],[504,309],[600,310],[601,311],[602,312],[603,313],[604,314],[505,315],[510,316],[562,317],[607,318],[608,301],[611,319],[610,82],[609,320],[614,321],[612,322],[472,323],[615,324],[474,325],[618,326],[617,327],[616,322],[619,322],[623,328],[621,329],[624,330],[498,331],[567,332],[581,333],[563,315],[572,334],[622,293],[570,12],[580,335],[574,288],[569,336],[558,337],[559,338],[503,12],[502,327],[560,339],[625,340],[626,340],[627,340],[553,341],[554,342],[578,12],[598,82],[555,343],[577,344],[613,12],[557,345],[606,346],[593,12],[571,347],[579,12],[556,12],[596,348],[605,315],[573,12],[561,335],[575,12],[576,82],[620,349],[564,12],[568,336],[501,350],[473,284],[471,12],[477,332],[499,332],[500,288],[470,351],[469,296],[434,352]],"semanticDiagnosticsPerFile":[[451,[{"start":2390,"length":1,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '(value: unknown) => void' is not assignable to parameter of type '() => void'.","category":1,"code":2345,"next":[{"messageText":"Target signature provides too few arguments. Expected 1 or more, but got 0.","category":1,"code":2849}]}}]],[457,[{"start":2451,"length":1,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '(value: unknown) => void' is not assignable to parameter of type '() => void'.","category":1,"code":2345,"next":[{"messageText":"Target signature provides too few arguments. Expected 1 or more, but got 0.","category":1,"code":2849}]}}]],[606,[{"start":63,"length":10,"messageText":"Module '\"@/lib/db\"' has no exported member 'RealPermit'.","category":1,"code":2305},{"start":75,"length":19,"messageText":"Module '\"@/lib/db\"' has no exported member 'CodeEnforcementCase'.","category":1,"code":2305},{"start":96,"length":18,"messageText":"Module '\"@/lib/db\"' has no exported member 'NewsAddressMention'.","category":1,"code":2305}]],[607,[{"start":359,"length":10,"messageText":"Module '\"@/lib/db\"' has no exported member 'RealPermit'.","category":1,"code":2305},{"start":371,"length":19,"messageText":"Module '\"@/lib/db\"' has no exported member 'CodeEnforcementCase'.","category":1,"code":2305}]],[625,[{"start":6606,"length":1,"messageText":"Parameter 'c' implicitly has an 'any' type.","category":1,"code":7006}]],[626,[{"start":4115,"length":1,"messageText":"Parameter 'h' implicitly has an 'any' type.","category":1,"code":7006},{"start":6023,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":6026,"length":1,"messageText":"Parameter 'i' implicitly has an 'any' type.","category":1,"code":7006}]]],"affectedFilesPendingEmit":[630,632,631,633,628,634,629,635,636,637,443,444,445,446,447,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,565,566,582,585,583,584,586,475,476,478,479,494,495,496,497,587,588,589,590,591,592,594,595,597,599,504,600,601,602,603,604,505,510,562,607,608,611,610,609,614,612,472,615,474,618,617,616,619,623,621,624,498,567,581,563,572,622,570,580,574,569,558,559,503,502,560,625,626,627,553,554,578,598,555,577,613,557,606,593,571,579,556,596,605,573,561,575,576,620,564,568,501,473,471,477,499,500,470,469,434],"version":"5.9.3"}
\ No newline at end of file
+{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/future/route-kind.d.ts","./node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/server/lib/revalidate.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/font-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-modules/route-module.d.ts","./node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage-instance.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/client/components/request-async-storage-instance.d.ts","./node_modules/next/dist/client/components/request-async-storage.external.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.compiled.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/router-reducer/create-initial-router-state.d.ts","./node_modules/next/dist/client/components/app-router.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/client/components/action-async-storage-instance.d.ts","./node_modules/next/dist/client/components/action-async-storage.external.d.ts","./node_modules/next/dist/client/components/client-page.d.ts","./node_modules/next/dist/client/components/search-params.d.ts","./node_modules/next/dist/client/components/not-found-boundary.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/future/normalizers/normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/future/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/prefix.d.ts","./node_modules/next/dist/server/future/normalizers/request/postponed.d.ts","./node_modules/next/dist/server/future/normalizers/request/action.d.ts","./node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/trace/types.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/webpack/plugins/define-env-plugin.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/types/index.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/next/config.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/client/components/draft-mode.d.ts","./node_modules/next/dist/client/components/headers.d.ts","./node_modules/next/headers.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/tailwindcss/types/generated/corepluginlist.d.ts","./node_modules/tailwindcss/types/generated/colors.d.ts","./node_modules/tailwindcss/types/config.d.ts","./node_modules/tailwindcss/types/index.d.ts","./tailwind.config.ts","./node_modules/pg-types/index.d.ts","./node_modules/pg-protocol/dist/messages.d.ts","./node_modules/pg-protocol/dist/serializer.d.ts","./node_modules/pg-protocol/dist/parser.d.ts","./node_modules/pg-protocol/dist/index.d.ts","./node_modules/@types/pg/lib/type-overrides.d.ts","./node_modules/@types/pg/index.d.ts","./node_modules/@types/pg/index.d.mts","./scripts/enrich-entities-wikidata.ts","./scripts/enrich-entities-wikipedia.ts","./scripts/enrich-productions-wikidata.ts","./scripts/extract-news-addresses.ts","./scripts/ingest-bh-permits-arcgis.ts","./node_modules/slugify/slugify.d.ts","./scripts/ingest-bh-permits.ts","./scripts/ingest-la-additional-permits.ts","./scripts/ingest-la-assessor-legacy.ts","./scripts/ingest-la-boe-permits.ts","./scripts/ingest-la-business-licenses.ts","./scripts/ingest-la-city-permits.ts","./scripts/ingest-la-code-enforcement.ts","./scripts/ingest-la-cofo.ts","./scripts/ingest-la-county-assessor.ts","./scripts/ingest-la-film-permits.ts","./scripts/ingest-la-historic-monuments.ts","./scripts/ingest-la-lahd.ts","./scripts/ingest-la-newspapers-metadata.ts","./scripts/ingest-la-price-series.ts","./scripts/ingest-loc-sanborn.ts","./scripts/ingest-pasadena-permits.ts","./scripts/ingest-santa-monica-permits.ts","./scripts/ingest-weho-film-permits.ts","./scripts/ingest-wikipedia-named-houses.ts","./scripts/pull-la-newspapers-ocr.ts","./src/middleware.ts","./src/lib/site.ts","./src/lib/flags.ts","./src/app/robots.ts","./src/lib/db.ts","./src/app/sitemap.ts","./src/app/api/events/route.ts","./src/app/api/health/route.ts","./src/lib/la-arcgis.ts","./src/app/api/la-records/lookup/route.ts","./src/app/api/pastdoor-health/route.ts","./node_modules/zod/v3/helpers/typealiases.d.cts","./node_modules/zod/v3/helpers/util.d.cts","./node_modules/zod/v3/index.d.cts","./node_modules/zod/v3/zoderror.d.cts","./node_modules/zod/v3/locales/en.d.cts","./node_modules/zod/v3/errors.d.cts","./node_modules/zod/v3/helpers/parseutil.d.cts","./node_modules/zod/v3/helpers/enumutil.d.cts","./node_modules/zod/v3/helpers/errorutil.d.cts","./node_modules/zod/v3/helpers/partialutil.d.cts","./node_modules/zod/v3/standard-schema.d.cts","./node_modules/zod/v3/types.d.cts","./node_modules/zod/v3/external.d.cts","./node_modules/zod/index.d.cts","./src/app/api/promote/route.ts","./src/app/api/search/route.ts","./src/app/api/stars/nearby/route.ts","./src/app/api/submit/route.ts","./src/app/timeline/rss.xml/route.ts","./src/lib/geo.ts","./src/lib/la-permits.ts","./src/lib/multiplier.ts","./src/lib/url-guards.ts","./src/components/wordmark.tsx","./src/components/headersearch.tsx","./src/components/guccistripe.tsx","./src/app/layout.tsx","./src/app/not-found.tsx","./node_modules/next/dist/compiled/@vercel/og/index.edge.d.ts","./node_modules/next/dist/compiled/@vercel/og/index.node.d.ts","./node_modules/next/dist/server/og/image-response.d.ts","./node_modules/next/og.d.ts","./src/app/opengraph-image.tsx","./node_modules/@types/geojson/index.d.ts","./node_modules/@types/leaflet/index.d.ts","./node_modules/react-leaflet/lib/hooks.d.ts","./node_modules/react-leaflet/lib/attributioncontrol.d.ts","./node_modules/@react-leaflet/core/lib/attribution.d.ts","./node_modules/@react-leaflet/core/lib/context.d.ts","./node_modules/@react-leaflet/core/lib/element.d.ts","./node_modules/@react-leaflet/core/lib/events.d.ts","./node_modules/@react-leaflet/core/lib/layer.d.ts","./node_modules/@react-leaflet/core/lib/path.d.ts","./node_modules/@react-leaflet/core/lib/circle.d.ts","./node_modules/@react-leaflet/core/lib/div-overlay.d.ts","./node_modules/@react-leaflet/core/lib/component.d.ts","./node_modules/@react-leaflet/core/lib/control.d.ts","./node_modules/@react-leaflet/core/lib/dom.d.ts","./node_modules/@react-leaflet/core/lib/generic.d.ts","./node_modules/@react-leaflet/core/lib/grid-layer.d.ts","./node_modules/@react-leaflet/core/lib/media-overlay.d.ts","./node_modules/@react-leaflet/core/lib/pane.d.ts","./node_modules/@react-leaflet/core/lib/index.d.ts","./node_modules/react-leaflet/lib/circle.d.ts","./node_modules/react-leaflet/lib/circlemarker.d.ts","./node_modules/react-leaflet/lib/layergroup.d.ts","./node_modules/react-leaflet/lib/featuregroup.d.ts","./node_modules/react-leaflet/lib/geojson.d.ts","./node_modules/react-leaflet/lib/imageoverlay.d.ts","./node_modules/react-leaflet/lib/layerscontrol.d.ts","./node_modules/react-leaflet/lib/mapcontainer.d.ts","./node_modules/react-leaflet/lib/marker.d.ts","./node_modules/react-leaflet/lib/pane.d.ts","./node_modules/react-leaflet/lib/polygon.d.ts","./node_modules/react-leaflet/lib/polyline.d.ts","./node_modules/react-leaflet/lib/popup.d.ts","./node_modules/react-leaflet/lib/rectangle.d.ts","./node_modules/react-leaflet/lib/scalecontrol.d.ts","./node_modules/react-leaflet/lib/svgoverlay.d.ts","./node_modules/react-leaflet/lib/tilelayer.d.ts","./node_modules/react-leaflet/lib/tooltip.d.ts","./node_modules/react-leaflet/lib/videooverlay.d.ts","./node_modules/react-leaflet/lib/wmstilelayer.d.ts","./node_modules/react-leaflet/lib/zoomcontrol.d.ts","./node_modules/react-leaflet/lib/index.d.ts","./src/components/interactivemap.tsx","./src/components/interactivemapmount.tsx","./src/components/maphero.tsx","./src/components/rail.tsx","./src/components/nodecard.tsx","./src/components/filmsgrid.tsx","./src/components/filmsgridserver.tsx","./src/components/herocollage.tsx","./src/components/starsctarow.tsx","./src/app/page.tsx","./src/components/breadcrumbarchive.tsx","./src/components/tierbadge.tsx","./src/app/about/page.tsx","./src/app/address/[slug]/opengraph-image.tsx","./src/components/addressmasthead.tsx","./src/components/timeline.tsx","./src/components/factrow.tsx","./src/components/confidencedot.tsx","./src/components/projection.tsx","./src/components/claimcta.tsx","./src/components/sponsored/sponsoredcard.tsx","./src/components/curvesparkline.tsx","./src/components/streetview.tsx","./src/components/streetviewhistory.tsx","./src/components/mediawall.tsx","./src/components/jsonld.tsx","./src/components/provenancefooter.tsx","./src/components/crosspromo.tsx","./src/components/addressnarrative.tsx","./src/app/address/[slug]/page.tsx","./src/app/admin/layout.tsx","./src/app/admin/page.tsx","./src/app/admin/data/page.tsx","./src/app/admin/sources/page.tsx","./src/app/architects/page.tsx","./src/app/browse/page.tsx","./src/app/claim/[slug]/page.tsx","./src/app/dashboard/page.tsx","./src/app/entity/[slug]/opengraph-image.tsx","./src/app/entity/[slug]/page.tsx","./src/components/posterplaceholder.tsx","./src/app/film/[slug]/page.tsx","./src/app/films/page.tsx","./src/components/retiredfeaturenotice.tsx","./src/app/hosts/page.tsx","./src/components/listinggrid.tsx","./src/app/houses/page.tsx","./src/app/locations-by-year/page.tsx","./src/app/map/mapwithlayers.tsx","./src/app/map/page.tsx","./src/app/neighborhood/[slug]/page.tsx","./src/app/neighborhoods/page.tsx","./src/components/sourcelink.tsx","./src/components/permittable.tsx","./src/app/parcel/[apn]/page.tsx","./src/app/people/page.tsx","./src/app/promote/page.tsx","./src/app/promote/[slug]/promoteformclient.tsx","./src/app/promote/[slug]/page.tsx","./src/app/restaurants/page.tsx","./src/components/minimap.tsx","./src/app/restaurants/[slug]/page.tsx","./src/app/search/page.tsx","./src/app/stars/page.tsx","./src/app/stars/nearby/starsnearbyclient.tsx","./src/app/stars/nearby/page.tsx","./src/app/stars/walk/page.tsx","./src/components/submitminimap.tsx","./src/app/submit/submitformclient.tsx","./src/components/claimexamples.tsx","./src/app/submit/page.tsx","./src/app/timeline/page.tsx","./src/components/home/claimhome.tsx","./src/components/home/communityhome.tsx","./src/components/home/flagshiphome.tsx","./.next/types/app/page.ts","./.next/types/app/about/page.ts","./.next/types/app/address/[slug]/page.ts","./.next/types/app/admin/page.ts","./.next/types/app/admin/data/page.ts","./.next/types/app/admin/sources/page.ts","./.next/types/app/api/events/route.ts","./.next/types/app/api/health/route.ts","./.next/types/app/api/la-records/lookup/route.ts","./.next/types/app/api/pastdoor-health/route.ts","./.next/types/app/api/promote/route.ts","./.next/types/app/api/search/route.ts","./.next/types/app/api/stars/nearby/route.ts","./.next/types/app/api/submit/route.ts","./.next/types/app/architects/page.ts","./.next/types/app/browse/page.ts","./.next/types/app/claim/[slug]/page.ts","./.next/types/app/dashboard/page.ts","./.next/types/app/entity/[slug]/page.ts","./.next/types/app/film/[slug]/page.ts","./.next/types/app/films/page.ts","./.next/types/app/hosts/page.ts","./.next/types/app/houses/page.ts","./.next/types/app/locations-by-year/page.ts","./.next/types/app/map/page.ts","./.next/types/app/neighborhood/[slug]/page.ts","./.next/types/app/neighborhoods/page.ts","./.next/types/app/parcel/[apn]/page.ts","./.next/types/app/people/page.ts","./.next/types/app/promote/page.ts","./.next/types/app/promote/[slug]/page.ts","./.next/types/app/restaurants/page.ts","./.next/types/app/restaurants/[slug]/page.ts","./.next/types/app/search/page.ts","./.next/types/app/stars/page.ts","./.next/types/app/stars/nearby/page.ts","./.next/types/app/stars/walk/page.ts","./.next/types/app/submit/page.ts","./.next/types/app/timeline/page.ts","./.next/types/app/timeline/rss.xml/route.ts"],"fileIdsList":[[99,145,359,567],[99,145,359,584],[99,145,359,587],[99,145,359,586],[99,145,359,588],[99,145,404,475],[99,145,404,476],[99,145,404,478],[99,145,404,479],[99,145,404,494],[99,145,404,495],[99,145,404,496],[99,145,404,497],[99,145,359,589],[99,145,359,590],[99,145,359,591],[99,145,359,592],[99,145,359,594],[99,145,359,596],[99,145,359,597],[99,145,359,599],[99,145,359,601],[99,145,359,602],[99,145,359,604],[99,145,359,605],[99,145,359,606],[99,145,359,564],[99,145,359,609],[99,145,359,610],[99,145,359,613],[99,145,359,611],[99,145,359,616],[99,145,359,614],[99,145,359,617],[99,145,359,620],[99,145,359,618],[99,145,359,621],[99,145,359,625],[99,145,359,626],[99,145,404,498],[99,145,407,408],[99,145],[99,145,514],[87,99,145,514,522],[87,99,145,519,524],[87,99,145,514],[99,145,514,519],[99,145,514,518,519,521],[87,99,145,518],[87,99,145,514,518,519,521,522,524,525],[99,145,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531],[99,145,514,518,519,520],[99,145,514,521],[99,145,514,518],[99,145,514,519,521],[99,145,513],[99,142,145],[99,144,145],[145],[99,145,150,178],[99,145,146,151,156,164,175,186],[99,145,146,147,156,164],[94,95,96,99,145],[99,145,148,187],[99,145,149,150,157,165],[99,145,150,175,183],[99,145,151,153,156,164],[99,144,145,152],[99,145,153,154],[99,145,155,156],[99,144,145,156],[99,145,156,157,158,175,186],[99,145,156,157,158,171,175,178],[99,145,153,156,159,164,175,186],[99,145,156,157,159,160,164,175,183,186],[99,145,159,161,175,183,186],[97,98,99,100,101,102,103,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[99,145,156,162],[99,145,163,186,191],[99,145,153,156,164,175],[99,145,165],[99,145,166],[99,144,145,167],[99,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[99,145,169],[99,145,170],[99,145,156,171,172],[99,145,171,173,187,189],[99,145,156,175,176,178],[99,145,177,178],[99,145,175,176],[99,145,178],[99,145,179],[99,142,145,175,180],[99,145,156,181,182],[99,145,181,182],[99,145,150,164,175,183],[99,145,184],[99,145,164,185],[99,145,159,170,186],[99,145,150,187],[99,145,175,188],[99,145,163,189],[99,145,190],[99,140,145],[99,140,145,156,158,167,175,178,186,189,191],[99,145,175,192],[99,145,441],[99,145,156,175,183,193,435,436,439,440,441],[87,99,145,197,198,199],[87,99,145,197,198],[87,99,145],[87,91,99,145,196,360,403],[87,91,99,145,195,360,403],[84,85,86,99,145],[92,99,145],[99,145,364],[99,145,366,367,368],[99,145,370],[99,145,202,212,218,220,360],[99,145,202,209,211,214,232],[99,145,212],[99,145,212,214,338],[99,145,267,285,300,406],[99,145,308],[99,145,202,212,219,253,263,335,336,406],[99,145,219,406],[99,145,212,263,264,265,406],[99,145,212,219,253,406],[99,145,406],[99,145,202,219,220,406],[99,145,293],[99,144,145,193,292],[87,99,145,286,287,288,305,306],[87,99,145,286],[99,145,276],[99,145,275,277,380],[87,99,145,286,287,303],[99,145,282,306,392],[99,145,390,391],[99,145,226,389],[99,145,279],[99,144,145,193,226,242,275,276,277,278],[87,99,145,303,305,306],[99,145,303,305],[99,145,303,304,306],[99,145,170,193],[99,145,274],[99,144,145,193,211,213,270,271,272,273],[87,99,145,203,383],[87,99,145,186,193],[87,99,145,219,251],[87,99,145,219],[99,145,249,254],[87,99,145,250,363],[87,99,145,403],[87,99,145,175,193,403,508],[87,91,99,145,159,193,195,196,360,401,402],[99,145,360],[99,145,201],[99,145,353,354,355,356,357,358],[99,145,355],[87,99,145,250,286,363],[87,99,145,286,361,363],[87,99,145,286,363],[99,145,159,193,213,363],[99,145,159,193,210,211,222,240,242,274,279,280,302,303],[99,145,271,274,279,287,289,290,291,293,294,295,296,297,298,299,406],[99,145,272],[87,99,145,170,193,211,212,240,242,243,245,270,302,306,360,406],[99,145,159,193,213,214,226,227,275],[99,145,159,193,212,214],[99,145,159,175,193,210,213,214],[99,145,159,170,186,193,210,211,212,213,214,219,222,223,233,234,236,239,240,242,243,244,245,269,270,303,311,313,316,318,321,323,324,325,326],[99,145,159,175,193],[99,145,202,203,204,210,211,360,363,406],[99,145,159,175,186,193,207,337,339,340,406],[99,145,170,186,193,207,210,213,230,234,236,237,238,243,270,316,327,329,335,349,350],[99,145,212,216,270],[99,145,210,212],[99,145,223,317],[99,145,319,320],[99,145,319],[99,145,317],[99,145,319,322],[99,145,206,207],[99,145,206,246],[99,145,206],[99,145,208,223,315],[99,145,314],[99,145,207,208],[99,145,208,312],[99,145,207],[99,145,302],[99,145,159,193,210,222,241,261,267,281,284,301,303],[99,145,255,256,257,258,259,260,282,283,306,361],[99,145,310],[99,145,159,193,210,222,241,247,307,309,311,360,363],[99,145,159,186,193,203,210,212,269],[99,145,266],[99,145,159,193,343,348],[99,145,233,242,269,363],[99,145,331,335,349,352],[99,145,159,216,335,343,344,352],[99,145,202,212,233,244,346],[99,145,159,193,212,219,244,330,331,341,342,345,347],[99,145,194,240,241,242,360,363],[99,145,159,170,186,193,208,210,211,213,216,221,222,230,233,234,236,237,238,239,243,245,269,270,313,327,328,363],[99,145,159,193,210,212,216,329,351],[99,145,509],[99,145,159,193,211,213],[87,99,145,159,170,193,201,203,210,211,214,222,239,240,242,243,245,310,360,363],[99,145,159,170,186,193,205,208,209,213],[99,145,206,268],[99,145,159,193,206,211,222],[99,145,159,193,212,223],[99,145,159,193],[99,145,226],[99,145,225],[99,145,227],[99,145,212,224,226,230],[99,145,212,224,226],[99,145,159,193,205,212,213,219,227,228,229],[87,99,145,303,304,305],[99,145,262],[87,99,145,203],[87,99,145,236],[87,99,145,194,239,242,245,360,363],[99,145,203,383,384],[87,99,145,254],[87,99,145,170,186,193,201,248,250,252,253,363],[99,145,213,219,236],[99,145,235],[87,99,145,157,159,170,193,201,254,263,360,361,362],[83,87,88,89,90,99,145,195,196,360,403],[99,145,150],[99,145,332,333,334],[99,145,332],[99,145,372],[99,145,374],[99,145,376],[99,145,378],[99,145,381],[99,145,385],[91,93,99,145,360,365,369,371,373,375,377,379,382,386,388,394,395,397,404,405,406],[99,145,387],[99,145,393],[99,145,510],[99,145,250],[99,145,396],[99,144,145,227,228,229,230,398,399,400,403],[99,145,193],[87,91,99,145,159,161,170,193,195,196,197,199,201,214,352,359,363,403],[99,145,193,436,437,438],[99,145,175,193,436],[99,145,425],[99,145,423,425],[99,145,414,422,423,424,426,428],[99,145,412],[99,145,415,420,425,428],[99,145,411,428],[99,145,415,416,419,420,421,428],[99,145,415,416,417,419,420,428],[99,145,412,413,414,415,416,420,421,422,424,425,426,428],[99,145,428],[99,145,410,412,413,414,415,416,417,419,420,421,422,423,424,425,426,427],[99,145,410,428],[99,145,415,417,418,420,421,428],[99,145,419,428],[99,145,420,421,425,428],[99,145,413,423],[87,99,145,514,532],[87,99,145,514,532,535],[87,99,145,513,514,532,535],[99,145,515,516,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553],[87,99,145,513,514,532],[99,145,430,431],[99,145,429,432],[99,112,116,145,186],[99,112,145,175,186],[99,107,145],[99,109,112,145,183,186],[99,145,164,183],[99,107,145,193],[99,109,112,145,164,186],[99,104,105,108,111,145,156,175,186],[99,112,119,145],[99,104,110,145],[99,112,133,134,145],[99,108,112,145,178,186,193],[99,133,145,193],[99,106,107,145,193],[99,112,145],[99,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,134,135,136,137,138,139,145],[99,112,127,145],[99,112,119,120,145],[99,110,112,120,121,145],[99,111,145],[99,104,107,112,145],[99,112,116,120,121,145],[99,116,145],[99,110,112,115,145,186],[99,104,109,112,119,145],[99,145,175],[99,107,112,133,145,191,193],[99,145,492],[99,145,483,484],[99,145,480,481,483,485,486,491],[99,145,481,483],[99,145,491],[99,145,483],[99,145,480,481,483,486,487,488,489,490],[99,145,480,481,482],[99,145,442],[99,145,157,166,442,448],[99,145,146,157,158,171,442],[99,145,146,157,158,166,171,175,176,442],[99,145,157,166],[99,145,146,158,166,442],[99,145,388,470,565,566],[99,145,382,470,473,511],[99,145,388,394,407,470,473,477,500,501,556,559,561,565,569,570,571,573,574,575,576,577,578,579,580,581,582,583],[99,145,388,473],[99,145,382,388,407],[99,145,388,442,473],[99,145,404,473],[99,145,404],[99,145,404,477],[99,145,382,404,470,473],[99,145,404,471,473,493],[99,145,404,473,493],[99,145,388,407,470,473,565,582],[99,145,388,407,473,559,565],[99,145,394,407,473,565],[99,145,388,394,407,470,473,556,565,566,580],[99,145,388,394,407,470,473,556,561,565,566,580,582,595],[99,145,388,407,473,561,565,595],[99,145,388,470,471,565,598],[99,145,388,407,473,565,600],[99,145,382,388,407,470,471,503,504,505],[99,145,388,407,473,565],[87,99,145,556],[99,145,407,473,556,565,603],[87,99,145,394,407,473,559,565],[99,145,388,407,470,473,556,561,562,563,565,582],[99,145,388],[99,145,382,470,511],[99,145,470,473,557,558,559,561,562,563],[99,145,388,394,407,473,565,607,608],[99,145,394,407,471,473,565,575,598,612],[99,145,388,407,471,473,559,565,598],[87,99,145,388,394,407,473,565,615],[99,145,388,407,473,556,565],[99,145,382,407,470,471],[99,145,382,388,407,470,565],[99,145,382,407,470,471,473],[99,145,407,565,619],[99,145,407,470,561,562,563,565,623,624],[87,99,145,622],[99,145,388,407,473,565,566],[99,145,404,470,473],[99,145,473],[99,145,473,477,500],[99,145,388,471],[99,145,388,470],[99,145,566],[87,99,145,470,502],[99,145,470,473,560],[87,99,145,388],[99,145,470,473,502],[99,145,388,470,473],[87,99,145,388,514,554],[99,145,375,555],[99,145,556],[99,145,473,502,566],[99,145,386,388],[99,145,473,607],[99,145,572],[99,145,382,388,470,565],[99,145,388,502],[99,145,471,502],[99,145,375,554],[99,145,470],[99,145,382],[99,145,433]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","impliedFormat":1},{"version":"8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"641942a78f9063caa5d6b777c99304b7d1dc7328076038c6d94d8a0b81fc95c1","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e20d899c28ca26a2a7afc98beaa69e63ff7fba0a8bc47b4e3bf3ede5e09e424","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"085f552d005479e2e6a7311cdbbe5d8c55c497b4d19274285df161ee9684cd9c","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"007faacc9268357caa21d24169f3f3f2497af3e9241308df2d89f6e6d9bb3f2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7c5e2ea4a9749097c347454805e933844ed207b6eefec6b7cfd418b5f5f7b28","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1},{"version":"8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","impliedFormat":1},{"version":"f9fd93190acb1ffe0bc0fb395df979452f8d625071e9ffc8636e4dfb86ab2508","impliedFormat":1},{"version":"5f41fd8732a89e940c58ce22206e3df85745feb8983e2b4c6257fb8cbb118493","impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"1cfa8647d7d71cb03847d616bd79320abfc01ddea082a49569fda71ac5ece66b","impliedFormat":1},{"version":"bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"cfe4ef4710c3786b6e23dae7c086c70b4f4835a2e4d77b75d39f9046106e83d3","impliedFormat":1},{"version":"cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","impliedFormat":1},{"version":"3989ccb24f2526f7e82cf54268e23ce9e1df5b9982f8acd099ddd4853c26babd","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"2dad084c67e649f0f354739ec7df7c7df0779a28a4f55c97c6b6883ae850d1ce","impliedFormat":1},{"version":"fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","impliedFormat":1},{"version":"196c960b12253fde69b204aa4fbf69470b26daf7a430855d7f94107a16495ab0","impliedFormat":1},{"version":"ee15ea5dd7a9fc9f5013832e5843031817a880bf0f24f37a29fd8337981aae07","impliedFormat":1},{"version":"bf24f6d35f7318e246010ffe9924395893c4e96d34324cde77151a73f078b9ad","impliedFormat":1},{"version":"805c5db07d4b131bede36cc2dbded64cc3c8e49594e53119f4442af183f97935","impliedFormat":1},{"version":"10595c7ff5094dd5b6a959ccb1c00e6a06441b4e10a87bc09c15f23755d34439","impliedFormat":1},{"version":"9620c1ff645afb4a9ab4044c85c26676f0a93e8c0e4b593aea03a89ccb47b6d0","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"a9af0e608929aaf9ce96bd7a7b99c9360636c31d73670e4af09a09950df97841","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"08ed0b3f0166787f84a6606f80aa3b1388c7518d78912571b203817406e471da","impliedFormat":1},{"version":"47e5af2a841356a961f815e7c55d72554db0c11b4cba4d0caab91f8717846a94","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"f5f541902bf7ae0512a177295de9b6bcd6809ea38307a2c0a18bfca72212f368","impliedFormat":1},{"version":"b0decf4b6da3ebc52ea0c96095bdfaa8503acc4ac8e9081c5f2b0824835dd3bd","impliedFormat":1},{"version":"ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","impliedFormat":1},{"version":"fc3e1c87b39e5ba1142f27ec089d1966da168c04a859a4f6aab64dceae162c2b","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"61888522cec948102eba94d831c873200aa97d00d8989fdfd2a3e0ee75ec65a2","impliedFormat":1},{"version":"4e10622f89fea7b05dd9b52fb65e1e2b5cbd96d4cca3d9e1a60bb7f8a9cb86a1","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"59bf32919de37809e101acffc120596a9e45fdbab1a99de5087f31fdc36e2f11","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"b3aa6ede7dda2ee53ee78f257d5d6188f6ba75ac0a34a4b88be4ca93b869da07","impliedFormat":1},{"version":"c40c848daad198266370c1c72a7a8c3d18d2f50727c7859fcfefd3ff69a7f288","impliedFormat":1},{"version":"ac60bbee0d4235643cc52b57768b22de8c257c12bd8c2039860540cab1fa1d82","impliedFormat":1},{"version":"6428e6edd944ce6789afdf43f9376c1f2e4957eea34166177625aaff4c0da1a0","impliedFormat":1},{"version":"ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","impliedFormat":1},{"version":"6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","impliedFormat":1},{"version":"8dba67056cbb27628e9b9a1cba8e57036d359dceded0725c72a3abe4b6c79cd4","impliedFormat":1},{"version":"70f3814c457f54a7efe2d9ce9d2686de9250bb42eb7f4c539bd2280a42e52d33","impliedFormat":1},{"version":"154dd2e22e1e94d5bc4ff7726706bc0483760bae40506bdce780734f11f7ec47","impliedFormat":1},{"version":"ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"15e3409b8397457d761d8d6f8c524795845c3aeb5dd0d4291ca0c54fec670b72","impliedFormat":1},{"version":"f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"8b8f00491431fe82f060dfe8c7f2180a9fb239f3d851527db909b83230e75882","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"903e299a28282fa7b714586e28409ed73c3b63f5365519776bf78e8cf173db36","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"dd3900b24a6a8745efeb7ad27629c0f8a626470ac229c1d73f1fe29d67e44dca","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","impliedFormat":1},{"version":"aeab39e8e0b1a3b250434c3b2bb8f4d17bbec2a9dbce5f77e8a83569d3d2cbc2","impliedFormat":1},{"version":"ec6cba1c02c675e4dd173251b156792e8d3b0c816af6d6ad93f1a55d674591aa","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"d729408dfde75b451530bcae944cf89ee8277e2a9df04d1f62f2abfd8b03c1e1","impliedFormat":1},{"version":"e15d3c84d5077bb4a3adee4c791022967b764dc41cb8fa3cfa44d4379b2c95f5","impliedFormat":1},{"version":"5f58e28cd22e8fc1ac1b3bc6b431869f1e7d0b39e2c21fbf79b9fa5195a85980","impliedFormat":1},{"version":"e1fc1a1045db5aa09366be2b330e4ce391550041fc3e925f60998ca0b647aa97","impliedFormat":1},{"version":"63533978dcda286422670f6e184ac516805a365fb37a086eeff4309e812f1402","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"31fb49ef3aa3d76f0beb644984e01eab0ea222372ea9b49bb6533be5722d756c","impliedFormat":1},{"version":"33cd131e1461157e3e06b06916b5176e7a8ec3fce15a5cfe145e56de744e07d2","impliedFormat":1},{"version":"889ef863f90f4917221703781d9723278db4122d75596b01c429f7c363562b86","impliedFormat":1},{"version":"3556cfbab7b43da96d15a442ddbb970e1f2fc97876d055b6555d86d7ac57dae5","impliedFormat":1},{"version":"437751e0352c6e924ddf30e90849f1d9eb00ca78c94d58d6a37202ec84eb8393","impliedFormat":1},{"version":"48e8af7fdb2677a44522fd185d8c87deff4d36ee701ea003c6c780b1407a1397","impliedFormat":1},{"version":"d11308de5a36c7015bb73adb5ad1c1bdaac2baede4cc831a05cf85efa3cc7f2f","impliedFormat":1},{"version":"38e4684c22ed9319beda6765bab332c724103d3a966c2e5e1c5a49cf7007845f","impliedFormat":1},{"version":"f9812cfc220ecf7557183379531fa409acd249b9e5b9a145d0d52b76c20862de","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a403c4aeeb153bc0c1f11458d005f8e5a0af3535c4c93eedc6f7865a3593f8e","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"680793958f6a70a44c8d9ae7d46b7a385361c69ac29dcab3ed761edce1c14ab8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"913ddbba170240070bd5921b8f33ea780021bdf42fbdfcd4fcb2691b1884ddde","impliedFormat":1},{"version":"b4e6d416466999ff40d3fe5ceb95f7a8bfb7ac2262580287ac1a8391e5362431","impliedFormat":1},{"version":"5fe23bd829e6be57d41929ac374ee9551ccc3c44cee893167b7b5b77be708014","impliedFormat":1},{"version":"0a626484617019fcfbfc3c1bc1f9e84e2913f1adb73692aa9075817404fb41a1","impliedFormat":1},{"version":"438c7513b1df91dcef49b13cd7a1c4720f91a36e88c1df731661608b7c055f10","impliedFormat":1},{"version":"cf185cc4a9a6d397f416dd28cca95c227b29f0f27b160060a95c0e5e36cda865","impliedFormat":1},{"version":"0086f3e4ad898fd7ca56bb223098acfacf3fa065595182aaf0f6c4a6a95e6fbd","impliedFormat":1},{"version":"efaa078e392f9abda3ee8ade3f3762ab77f9c50b184e6883063a911742a4c96a","impliedFormat":1},{"version":"54a8bb487e1dc04591a280e7a673cdfb272c83f61e28d8a64cf1ac2e63c35c51","impliedFormat":1},{"version":"021a9498000497497fd693dd315325484c58a71b5929e2bbb91f419b04b24cea","impliedFormat":1},{"version":"9385cdc09850950bc9b59cca445a3ceb6fcca32b54e7b626e746912e489e535e","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"84124384abae2f6f66b7fbfc03862d0c2c0b71b826f7dbf42c8085d31f1d3f95","impliedFormat":1},{"version":"63a8e96f65a22604eae82737e409d1536e69a467bb738bec505f4f97cce9d878","impliedFormat":1},{"version":"3fd78152a7031315478f159c6a5872c712ece6f01212c78ea82aef21cb0726e2","impliedFormat":1},{"version":"250f9a1f11580b6b8a0a86835946f048eb605b3a596196741bfe72dc8f6c69cc","impliedFormat":1},{"version":"512fc15cca3a35b8dbbf6e23fe9d07e6f87ad03c895acffd3087ce09f352aad0","impliedFormat":1},{"version":"9a0946d15a005832e432ea0cd4da71b57797efb25b755cc07f32274296d62355","impliedFormat":1},{"version":"a52ff6c0a149e9f370372fc3c715d7f2beee1f3bab7980e271a7ab7d313ec677","impliedFormat":1},{"version":"fd933f824347f9edd919618a76cdb6a0c0085c538115d9a287fa0c7f59957ab3","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"6a1aa3e55bdc50503956c5cd09ae4cd72e3072692d742816f65c66ca14f4dfdd","impliedFormat":1},{"version":"ab75cfd9c4f93ffd601f7ca1753d6a9d953bbedfbd7a5b3f0436ac8a1de60dfa","impliedFormat":1},{"version":"f95180f03d827525ca4f990f49e17ec67198c316dd000afbe564655141f725cd","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"950fb67a59be4c2dbe69a5786292e60a5cb0e8612e0e223537784c731af55db1","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"07ca44e8d8288e69afdec7a31fa408ce6ab90d4f3d620006701d5544646da6aa","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"4e4475fba4ed93a72f167b061cd94a2e171b82695c56de9899275e880e06ba41","impliedFormat":1},{"version":"97c5f5d580ab2e4decd0a3135204050f9b97cd7908c5a8fbc041eadede79b2fa","impliedFormat":1},{"version":"c99a3a5f2215d5b9d735aa04cec6e61ed079d8c0263248e298ffe4604d4d0624","impliedFormat":1},{"version":"49b2375c586882c3ac7f57eba86680ff9742a8d8cb2fe25fe54d1b9673690d41","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"9ff1e8df66450af44161c1bfe34bc92c43074cfeec7a0a75f721830e9aabe379","impliedFormat":1},{"version":"3ecfccf916fea7c6c34394413b55eb70e817a73e39b4417d6573e523784e3f8e","impliedFormat":1},{"version":"1630192eac4188881201c64522cd3ef08209d9c4db0f9b5f0889b703dc6d936a","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"14e5cdec6f8ae82dfd0694e64903a0a54abdfe37e1d966de3d4128362acbf35f","impliedFormat":1},{"version":"bbc183d2d69f4b59fd4dd8799ffdf4eb91173d1c4ad71cce91a3811c021bf80c","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"8dbc4134a4b3623fc476be5f36de35c40f2768e2e3d9ed437e0d5f1c4cd850f6","impliedFormat":1},{"version":"4e06330a84dec7287f7ebdd64978f41a9f70a668d3b5edc69d5d4a50b9b376bb","impliedFormat":1},{"version":"65bfa72967fbe9fc33353e1ac03f0480aa2e2ea346d61ff3ea997dfd850f641a","impliedFormat":1},{"version":"c06f0bb92d1a1a5a6c6e4b5389a5664d96d09c31673296cb7da5fe945d54d786","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"872caaa31423f4345983d643e4649fb30f548e9883a334d6d1c5fff68ede22d4","impliedFormat":1},{"version":"94404c4a878fe291e7578a2a80264c6f18e9f1933fbb57e48f0eb368672e389c","impliedFormat":1},{"version":"5c1b7f03aa88be854bc15810bfd5bd5a1943c5a7620e1c53eddd2a013996343e","impliedFormat":1},{"version":"09dfc64fcd6a2785867f2368419859a6cc5a8d4e73cbe2538f205b1642eb0f51","impliedFormat":1},{"version":"bcf6f0a323653e72199105a9316d91463ad4744c546d1271310818b8cef7c608","impliedFormat":1},{"version":"01aa917531e116485beca44a14970834687b857757159769c16b228eb1e49c5f","impliedFormat":1},{"version":"351475f9c874c62f9b45b1f0dc7e2704e80dfd5f1af83a3a9f841f9dfe5b2912","impliedFormat":1},{"version":"ac457ad39e531b7649e7b40ee5847606eac64e236efd76c5d12db95bf4eacd17","impliedFormat":1},{"version":"187a6fdbdecb972510b7555f3caacb44b58415da8d5825d03a583c4b73fde4cf","impliedFormat":1},{"version":"d4c3250105a612202289b3a266bb7e323db144f6b9414f9dea85c531c098b811","impliedFormat":1},{"version":"95b444b8c311f2084f0fb51c616163f950fb2e35f4eaa07878f313a2d36c98a4","impliedFormat":1},{"version":"741067675daa6d4334a2dc80a4452ca3850e89d5852e330db7cb2b5f867173b1","impliedFormat":1},{"version":"f8acecec1114f11690956e007d920044799aefeb3cece9e7f4b1f8a1d542b2c9","impliedFormat":1},{"version":"178071ccd043967a58c5d1a032db0ddf9bd139e7920766b537d9783e88eb615e","impliedFormat":1},{"version":"3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","impliedFormat":1},{"version":"32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","impliedFormat":1},{"version":"0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","impliedFormat":1},{"version":"e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","impliedFormat":1},{"version":"5cad4158616d7793296dd41e22e1257440910ea8d01c7b75045d4dfb20c5a41a","impliedFormat":1},{"version":"04d3aad777b6af5bd000bfc409907a159fe77e190b9d368da4ba649cdc28d39e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74efc1d6523bd57eb159c18d805db4ead810626bc5bc7002a2c7f483044b2e0f","impliedFormat":1},{"version":"19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","impliedFormat":1},{"version":"bc11f3ac00ac060462597add171220aed628c393f2782ac75dd29ff1e0db871c","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"3b0b1d352b8d2e47f1c4df4fb0678702aee071155b12ef0185fce9eb4fa4af1e","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"a344403e7a7384e0e7093942533d309194ad0a53eca2a3100c0b0ab4d3932773","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"bb18bf4a61a17b4a6199eb3938ecfa4a59eb7c40843ad4a82b975ab6f7e3d925","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"e9b6fc05f536dfddcdc65dbcf04e09391b1c968ab967382e48924f5cb90d88e1","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"2b664c3cc544d0e35276e1fb2d4989f7d4b4027ffc64da34ec83a6ccf2e5c528","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"3cd8f0464e0939b47bfccbb9bb474a6d87d57210e304029cd8eb59c63a81935d","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"3026abd48e5e312f2328629ede6e0f770d21c3cd32cee705c450e589d015ee09","impliedFormat":1},{"version":"8b140b398a6afbd17cc97c38aea5274b2f7f39b1ae5b62952cfe65bf493e3e75","impliedFormat":1},{"version":"7663d2c19ce5ef8288c790edba3d45af54e58c84f1b37b1249f6d49d962f3d91","impliedFormat":1},{"version":"5cce3b975cdb72b57ae7de745b3c5de5790781ee88bcb41ba142f07c0fa02e97","impliedFormat":1},{"version":"00bd6ebe607246b45296aa2b805bd6a58c859acecda154bfa91f5334d7c175c6","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"0d28b974a7605c4eda20c943b3fa9ae16cb452c1666fc9b8c341b879992c7612","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"87ac2fb61e629e777f4d161dff534c2023ee15afd9cb3b1589b9b1f014e75c58","impliedFormat":1},{"version":"13c8b4348db91e2f7d694adc17e7438e6776bc506d5c8f5de9ad9989707fa3fe","impliedFormat":1},{"version":"3c1051617aa50b38e9efaabce25e10a5dd9b1f42e372ef0e8a674076a68742ed","impliedFormat":1},{"version":"07a3e20cdcb0f1182f452c0410606711fbea922ca76929a41aacb01104bc0d27","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"4cd4b6b1279e9d744a3825cbd7757bbefe7f0708f3f1069179ad535f19e8ed2c","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"b95a6f019095dd1d48fd04965b50dfd63e5743a6e75478343c46d2582a5132bf","impliedFormat":99},{"version":"c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","impliedFormat":99},{"version":"b97cb5616d2ab82a98ec9ada7b9e9cabb1f5da880ec50ea2b8dc5baa4cbf3c16","impliedFormat":99},{"version":"d23df9ff06ae8bf1dcb7cc933e97ae7da418ac77749fecee758bb43a8d69f840","affectsGlobalScope":true,"impliedFormat":1},{"version":"040c71dde2c406f869ad2f41e8d4ce579cc60c8dbe5aa0dd8962ac943b846572","affectsGlobalScope":true,"impliedFormat":1},{"version":"3586f5ea3cc27083a17bd5c9059ede9421d587286d5a47f4341a4c2d00e4fa91","impliedFormat":1},{"version":"a6df929821e62f4719551f7955b9f42c0cd53c1370aec2dd322e24196a7dfe33","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"9dd9d642cdb87d4d5b3173217e0c45429b3e47a6f5cf5fb0ead6c644ec5fed01",{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"370bde134aa8c2abc926d0e99d3a4d5d5dba65c6ee65459137e4f02670cbf841","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"00cf4001e0d9c6e5e036bc545b9d73e2b8b84cddb02e61ad05bab3752b1d4522","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08","impliedFormat":1},{"version":"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","impliedFormat":1},{"version":"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141","impliedFormat":1},{"version":"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213","impliedFormat":1},{"version":"704a2474645ec6c97171405bf8ea82ab7ba4637b910eea088676d2cbd6c7a37a","signature":"f2542ed28646ccec19a2b407da97ef71777f4a2722da6990c958c2c9612ae978"},{"version":"f60e3e3060207ac982da13363181fd7ee4beecc19a7c569f0d6bb034331066c2","impliedFormat":1},{"version":"17230b34bb564a3a2e36f9d3985372ccab4ad1722df2c43f7c5c2b553f68e5db","impliedFormat":1},{"version":"6e5c9272f6b3783be7bdddaf207cccdb8e033be3d14c5beacc03ae9d27d50929","impliedFormat":1},{"version":"21ac4cf3f8d8c6e1201cb31f600be708c9a37867fc5c73b7ccf80560fae591c8","impliedFormat":1},{"version":"0dfe35191a04e8f9dc7caeb9f52f2ee07402736563d12cbccd15fb5f31ac877f","impliedFormat":1},{"version":"798367363a3274220cbed839b883fe2f52ba7197b25e8cb2ac59c1e1fd8af6b7","impliedFormat":1},{"version":"2636a309ed87d6876728d9aca846a76b372cf2a21a4fdf9940a82a2dd86687d0","impliedFormat":1},{"version":"5aea76ab98173f2c230b1f78dc010da403da622c105c468ace9fe24e3b77883c","impliedFormat":99},{"version":"d2d6511a2de6041d13ce3bc51bd0a545e70de2b7361444afa48cbb5821bb3d2d","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"85b2dac6b0fcc6aa83fd480bc0f7d0fd09616752394a45808314a589e3d49f58","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"ba2116e52618555197af9fe44a4d63535d40cb240b4b23b39bcda91167eae850","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"7235cf43190bebb72aae4c5dfc5cd0a788aa83b02b89668f3b313c70eabbf947","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"e2fd090a5a2fca07144f7f6f2cafdd2a869b9d38868b219056692530d4ebd250","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"a780291453a5e167be611a1dbcdca44df0acfa1d081cd3dd7a28eeac3b60fe57","impliedFormat":1},{"version":"5f870e6f65023ee16e31f8f96b639a49cf6c7d6d25e69415aaac9a14900cab6d","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"b4ac79611bc3d0fd75a46cf487949f1b9be3faa6d7161aa74d47b9dfb19e8aa0","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"136da9e51a4bc5130b0f6ed4a3198867ae3f7c587f82346e8ba15a6ddf6c6e74","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"bc0857da7efe1bdf8abf94cfbc370671d6739c25dc24fbb9aa7eadad035dbcf7","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"35919059d72603e3b32c760fc9df68879faeb6d77a4ddb66f7cf085b4f19cc47","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3c20daf12bb1c4ce30b0af655af51c998ff8685e9220653b468b14c925437d10","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"f2e6c262000c802eacc6c65ea418955722ac378f5bd727ed10f45361e4635340","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2ff5d9899941f2dd9953dd8d77be6d26f70257baac590ed9b765767cbbc3ada6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3726b2b880080f6f1ae870877ab9928130a3ac428dd3373436f48c290fa4a8d6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"0f76de4a5d18bd069d20b2e888e2c233e10f4b8b2b795a4cdb227ab02cfd1470","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"5b9ca08138b2e0d68e10d72a3cb378d8e00b1ce4b679518e7e88dbd6731511f9","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"305cc3b918e042e110ea875132c0afa939cd635a9e2769dd229510f298369b68","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"12be5bec6b71c761a4401aad3e1ea84762a66891bf6c1e5a2dccbedd2c5d51ac","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2ef910159dbfc55d7139a497f3e242a75da49f73a487f667c3dc13e63c30c344","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"46eff378a9377baba7972a2962c4892ad7bb959f8150ca3b736abc4707bc8c94","signature":"8f7e35a5685c1660e4ca5cab566119a9ceec053e34429ce6384bfbc2ac66a960"},{"version":"5a4672696aa1443da08cb11dd0321bf45871b711209f4efc3d7e2342deda6810","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"021cd44edf590071a9fa8d810f086765d9fddf2fbac3197d50ca6f8dd2137b52","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c571d567bbe7f821514eeeb521cc1d04b69640888df5e5baed961fe1576ffa8b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"299fa3d78beb51c6236d7636bac6782898b1a3ed7fbe16dd6d01923760510a40","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"404f6783dc4d4e4341d0d0456e3ce4a2185a3ed39b1461c790562cb1a89c47c3","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"516a1a1d879a3339409fb5fc35a963aca30791fcf6774bf5db981570c84eb975","signature":"8957a524e141acb098de3aae8ff58278514d6af9f8cbb756cfca4daaeca07fd6"},{"version":"ab90a3fb2baf28b60382aba4a6d9d63699257af916624722d10384846489b763","signature":"2349ea5055c19f4c5b974add0f73e8e4c8ddf62a1e4390fbab9df226669edf11"},{"version":"8fbcee8017afc736e446210efab3ec46eb9fee66378d970916ba46952a56f93d","signature":"dc07b7c23550735514c2d99d3f9919b290b491f7e63dbbb3e7584b1e1e211590"},{"version":"9e348c1c1fcf05e172217957cecf6366e4fc6f8234ffe65b7006311bc51ba9cf","signature":"21e3d9e7a5994bd6bcb19219cee9796490eff4d83a99ccef00ca12d97ee3a0d7"},{"version":"b665aa8473fd1c944b5e35b3145a6a0e3533a7e4ae04136efaad91282764a999","signature":"b2a7b3bd523b5ddd4dccf608905d19390baaf24996ee61db24690102755226c6","affectsGlobalScope":true},{"version":"09395d1d34245450f877b22513c3d39d33376456f18af85336ca6978c6a1c904","signature":"c54dacd843f6f08dad98c20b1d2fb4087e0f0d9a948272425ba5c59d5d87cd18"},{"version":"c5550a7674baae03e4f1ce7026c78edcdc641429d058dbd6f0f4a9aae2de9f7e","signature":"79f55569189e02a1d0279289e64bacc39a2d86f973ca3206ff252c9c95c44b7f"},{"version":"281f1b8015f01742403e34c7d375b91cfd2261c00e52afd97534d31a9bf48a41","signature":"c64fb79a179b42e52bb72e68985c8545d9d4924981a8cea252f995eae7523973"},{"version":"aa11b5be258c0b588cbecae3edec47c0686cd9edfca982b30ed9e7b67b39cc9c","signature":"2f87d0b64ce07503900598ac181a2b48e13a0b1a99d1b6018f29163c35fab855"},{"version":"9747768b9de683a3c4e4cef0185b516cd1d32c9bfb2068c65d28e4af135d1b4e","signature":"58abab66476cf0a07ce88a748f27ec128a6765206c48c3381468cacd388dcc47"},{"version":"26e5a54bf755031f372e156581df0fbe95e359d3b47a62a5247d81a16f6690e1","signature":"990c01e3c68e2486aa1f6e4e7fe84c8cee5cfe7fb78d5d507e0bdfbb1278e7cd"},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"08b2fae7b0f553ad9f79faec864b179fc58bc172e295a70943e8585dd85f600c","impliedFormat":1},{"version":"f12edf1672a94c578eca32216839604f1e1c16b40a1896198deabf99c882b340","impliedFormat":1},{"version":"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a","impliedFormat":1},{"version":"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"4fdb529707247a1a917a4626bfb6a293d52cd8ee57ccf03830ec91d39d606d6d","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"5780b706cece027f0d4444fbb4e1af62dc51e19da7c3d3719f67b22b033859b9","impliedFormat":1},{"version":"4b358541becf64c47ef6d521cf556501196e170be82bb2ccf4fc7c740a4875ad","signature":"7c00cce51c97f75e3d97027018f3b01a0eb791f00f9339800d151a46cf8296d2"},{"version":"c44b7124ed28850aa45f0ee4bd1b4271585fc905edf8692895eb5e30ec3aa61a","signature":"412f36c9047f8b16e3fb4883733c0fc9edd701f0cb982354f5fb326f25ec4cf7"},{"version":"0c862f52da8d930cd9c87544a0b8e94230251fcad96ab24291973cc1a719391d","signature":"b927c4fa919b2d572727c4e10f6ae38cc42c63dd340f2e962b0598dcb373b39e"},{"version":"216e4e5c7512e5c53feebe7eaaeb6e36df962f263e7cc7ebdb8c62fe0fffaf97","signature":"6448d7c61a789f4ce9f00638e0d189fdd18e423a19e1d87d906d0e50e018347f"},{"version":"3c086ec89b6abe081c33a554e553f7ecb30292d55afe7f6d91b03eccc7c34229","signature":"dbff828dcb02c92679831f40f45e69263a928d7aeccb6fef8e759b65c87279a0"},{"version":"e7c714b3e862caadcb5d87b1dae4ea8ef3b93ddf1bc6d6018bcb8e52a6f1cae9","signature":"b4b5b73248e7252ed0a6cf5aeac899f7f75b0002658c9d13b1a33763598923c8"},{"version":"b1dfc29c34a0299b7d0ca2ab0e6d6a80b0ed79158937fcfb6d062d831c436f18","signature":"10fe15afb45da8f916a2d24776e1c40b42bfdb526f3b1c0757f1f7a388b23469"},{"version":"59ec877da8731ab466e3d0c32ba9e6fc36e9ea6e992644fca114396cb5499c0c","signature":"d6d48dd8c671645b61436bdc7f6c91ffeba09247feb471c3070ad8fcb02a9d71"},{"version":"974224bd8b70ab44d217013d52de717cafd5d59ef4b3f18d0d43a0ca1c1c7808","signature":"1039219f44611da8d210ad3a34b9f251e4d6afde7b5bb70ecfcdf0274a1baba4"},{"version":"55297fb03bde0e225f6bc60babe6e712a991a53949a291191c2cf12d96352ce3","signature":"6ae784b75bd20e3bde706fe8110d89d7a04fcc30f63d43a11e5bda6e8bc54919"},{"version":"35c72dafb90e6d5dc609825f7adb9c5e313bd04c2a4720b1296e6a0ef95fd7c4","signature":"9216d1cd17ede3b4045656deaf1f53ed3b2e89b02815f0b94a7d8bfa98b452ea"},{"version":"c1d72c35b2b23d1c8da98e97763e2893dc4b9133b9fe87ff5b54933a86dc6efe","signature":"ee1225de733497492c9f385f3a170c4388a704130b0f4c65c166fc9354b8574b"},{"version":"5c882cc71552040eb06d97ac602b2e3608937da6d41fc731aa4bf45b3414c14b","signature":"55c8494ac12e83bba7037cb08656ca9019c2259338ceaafe667a73522f13e614"},{"version":"bbcab911061e9270eae91717f056ec18958ccadf23dda3a6aaedf07d24361069","signature":"2ebc90be29c541cbe65fc76ab9642c7348e8f76f04a670930d705b67cc0df910"},{"version":"867ffaf4dfa681ba867017e94f08b6d2b855b57d6f273a315e4e3829429a005a","impliedFormat":99},{"version":"3b4cdb17fbfdd1a47a80afc0076e2476a4b513c95232570decdee7dca15b9ea4","impliedFormat":99},{"version":"7348c35ce10f8323a515ea6a6c237c0dc7c3fd5e491c4dacec2a7b93f0dfcd26","impliedFormat":1},{"version":"258e67b2638408b67fbf5fe6c953b8f2dd2a69f9171d31c9a976cd2329716e4c","impliedFormat":1},{"version":"4e7499d527db754a99ce03314c79fc05ab7718bc47a232977a2eab450c803eb4","signature":"7e11dbde16492c2709847c5ef2787e27eddc0916f00849077882ec971a4884c2"},{"version":"d30e67059f5c545c5f8f0cc328a36d2e03b8c4a091b4301bc1d6afb2b1491a3a","impliedFormat":1},{"version":"a356d9a0ba90d10ec6c0fa33386c0b0e2843fd6f0a49513c44f7809926ac25ff","impliedFormat":1},{"version":"f77db1be13db8dcf8c7a268c1f235c1ba1e4707e829175cdc237421b3c346f9d","impliedFormat":99},{"version":"05cb95655ecadfd1230547b84367d1c4d40a4bb6309545b8dc4d1638a3de1a50","impliedFormat":99},{"version":"e980a9cf8404a649ff3a2f0628d76e4469613c02b98bd3b922756d7d962476c9","impliedFormat":99},{"version":"f8adbcb59256526bc69d94fb5c826e812ebd1321b30ab35baa9997d74d45dd73","impliedFormat":99},{"version":"050a4570de5ad6e47cc9ac9fd9db7a26e57dbe1daadadbc19b20567941f8bf1a","impliedFormat":99},{"version":"5ed040255a4d5181f8ecb4ba90b8b38e0a6f1becf0ed860ca75b6e52c46db0bc","impliedFormat":99},{"version":"e22a49cd604cab3b62b1968a363d7b182edcb23d46793ed12cf5cfc6b1597f39","impliedFormat":99},{"version":"ff1b4730f5d49d37b73ee2db3443145daa0bfc7ff9c865134d871b08955e389b","impliedFormat":99},{"version":"8e64b72fa289b7f133b8cdb7d837f73e30ca7eb76ad88e1020d97c405c94fd7e","impliedFormat":99},{"version":"1f907507e41cc3df66b4521b80134bb8f7afada8d31c10f7100c93c90ab0f84e","impliedFormat":99},{"version":"6bb14070b70b4c9a897a4f5088af984e6e316b420d00d82fb962bad577896723","impliedFormat":99},{"version":"46e17953f7ffbf43d4328fcb5983e0ade2932fb56e84181e6929fcdcfa7c7aa6","impliedFormat":99},{"version":"113aef5576cd65f310927b17ae5f6ac8745c542a660bace5f019034d536fbd04","impliedFormat":99},{"version":"ddf0fdbb010c94978c1151441171f0aac236a23b6786e9f6332f745527d905e9","impliedFormat":99},{"version":"a2c1678ec68c42795e2ac068a7d026b61680357d2a881c9df211dd0f83d077fd","impliedFormat":99},{"version":"2fe207d2e8662abb709772fff1f3ec3116a4787b5caa4e862daa5dab2753edd7","impliedFormat":99},{"version":"a7af5f01007f450dc8cf2cdbbb11f4d4bf8bf3faa869d21267db5de74ebf665a","impliedFormat":99},{"version":"709cb4986cbe2b58ac3bbbad45dbfa24cda1b62c794c73b96e9ff1236dd0d5d1","impliedFormat":99},{"version":"afdc9b1fd1937d9b649bca2b377d1144cc9c48158403c17cfd21b6e1e8b25099","impliedFormat":99},{"version":"1d47324801b498d62f31ea179f58e1f3eaa1e607914504a7c92fb5465affb851","impliedFormat":99},{"version":"95fdf978302838125ac79d9d5e9485d8fa1ddd909664bf5cc3b45ec31f794fda","impliedFormat":99},{"version":"d92bf7d6d30c85e53b961236ceeb099e73a1a874849d038a348b51383087872f","impliedFormat":99},{"version":"e56e4a57ca5aa762d67fd3d16471c47592469944315fa5e92b3b09c83eabae91","impliedFormat":99},{"version":"f3d31927b7a3d0f2f119a05a102af2bdd1fc4f759fe43d508a64a80b3b341f6b","impliedFormat":99},{"version":"678700fba88589e28648a923e4b98ab60f3f7df4742412419e29f95966da4475","impliedFormat":99},{"version":"5a71b307074ef3d2794c4104248b7a3cad5f486df204da65862a7d24f698fc95","impliedFormat":99},{"version":"9a4496ad6d48bc801a122c11e94ee1e3f0710bda38b125573f67f5cb0add1733","impliedFormat":99},{"version":"afa5e16f2ad07d847701e3bde9e7ab36f87e0e3a5c0cb7998644791a1fa3c5b1","impliedFormat":99},{"version":"98cd9124b5d8438db4b4dbd247b2c68ac22b6366a43e6dc4945ae32972f157fc","impliedFormat":99},{"version":"dc21879e45f3a023b5fe459c3da5f2f3cf995f21a1ac533049d8950ce394c045","impliedFormat":99},{"version":"622d6ce66ac838d5d7e968daf4ae760cf49797e3fbfaa2b21d01e0fb5d625bc9","impliedFormat":99},{"version":"ecfa30418b2200ba6496b5f59b4c09a95cce9ea37c1daaf5a5db9bb306ee038f","impliedFormat":99},{"version":"3b56e30b1cbe1bfa7710e88e5e0b8fa6eddc7c2e67615f73bdf8637af68403e6","impliedFormat":99},{"version":"92a8de4f8f6595bf1eb24a19aebff7371c66ae8751f2e045edd9e25ca435e4a2","impliedFormat":99},{"version":"01810afb0ed31afdea0846cee91e85a474727d0966e5bb57c2a4a732854deab1","impliedFormat":99},{"version":"c874e98cd875727ea62fdcd978ac9e067ce07cf7493aa4b8b193fdc3b7318eea","impliedFormat":99},{"version":"455e843c1f8e0df452f101c9ec0b63ab8e749f296c947249f8bbc29bff58c83c","impliedFormat":99},{"version":"eadc4c556b494cc52676e084eadf0b60fb2cc6e2408d1411eeae5cb74068ca86","impliedFormat":99},{"version":"3b8689266e8fb628ca2068ff610ed0b842ff4e407c3a914358ef1895dabfcfcd","impliedFormat":99},{"version":"fc741907f6d8158b2c4722932d745b11dd41f9355a5b325c8cd3cdfbd966d76d","impliedFormat":99},{"version":"f425027bf82dc13c693e45934406669bd86575c82d57d3e11335b6bda09b3e83","signature":"d599d9527fe728669a340a929e6906ac3278b0dfeba86f83e0d1305e86399953"},{"version":"ec7d496e3b75eba41e799f0b107bad386fee47b40ef6cc692fe761e4db6d2920","signature":"e3b56ef4324017ea361c5ca7a2a2be047a328f59fd468d130cafba6fdf85277e"},{"version":"d8ce914ac4220296d4caba6f5b21f64a76ef6338d18ba797ad0daa005c5e84ab","signature":"8dc6327752d27f23c40c92a9df6af9239a202420186bec3b0b43c781bd0ca72b"},{"version":"95bc1caf051f0108d82613d321fac207b7c90257ec47a17af02b1b5c041e476a","signature":"a787f74d922b0513dcc8d147a51d88680d18ffbbf5f3003a6f20d855d5e30ccf"},{"version":"2a8f701d2e0dd71e26c6bc977d41f0ee27998d854ed44de1bf96185444ffaf5a","signature":"942539020cddf81c84e7b509ddb926a4c7d9d0d165a3f66787bde03653de93c4"},{"version":"a8d674ffd1fab085d31680d6b42f6ce2500097048589254a894081881b9e6947","signature":"e0818a693313ecb1f8347f651f4c2421e29e254b4be78536a2b77b1f66422b0e"},"c6bc7d689983cb50ecd6b150a4cc981c749582495d61a377c1daf67bad0b1fdc",{"version":"84c68f787290afa9c9aba6f0f953a27602e3cd86605127e0d1487f765aba8334","signature":"23f1e872ea12ad813b02e0a65850fe5e5a82ad94e4f845d7f4f5d52ed1e0b659"},{"version":"26887f3ab3a1eb328d11447084b4685db52479dcf14483c78de39cb468dad8f4","signature":"8760f213975576ac5d1f992e9ed7556dc1cbe98668c25c82c1333131a3426d97"},"52329f7e593c105a22f2feb742c00540a5eb25f83a65272bf9ab2e33e2d186c0",{"version":"29bad200a336e08e60eacc6916713f2a66f710d6d8856f4424d02a215f2441a5","signature":"d7c89d45d1a4a88d5e93b1340279640fc5a163448b7f88f891eceacb1e3fee73"},{"version":"29d0b210ed29897704eb30e3359d8d7945965bfaa0708b984af0de0bd134b383","signature":"fba21335cc80f941ce726de79be012a5433025205bd1a83f758ebd13509ba747"},{"version":"8e8a5977d319aee4e8818dd2a42e814da03241925788f882dc877b50a3d3c8fd","signature":"68dfc22d24a462e2344abc4d521b2b7191d8e1a719f72b5d92fe3eee76d18d20"},{"version":"20e4e3b0044a0d80fb832c15d0bf9a6527ce39bab932f7bd36aed98e1e8929a3","signature":"33cb435bbb963099599d932891bd52e2cdc36fb87fd5d1ec8d06408f3d439411"},{"version":"71e83860b0b91e3591bef007bc616a89ab594ab15e85fe79295d5442f8c4a5b8","signature":"9b06157564c72a8c906a51a19ffb145386073ec1077f455e965eaf3d0b0ae86d"},{"version":"129004d727abf8ea0a325b059733fa0386afcfd15fa82d22afb0ce7096427447","signature":"7a88a480dd27358afbfe59e35bbb7b29f48174bd1df10bcd727812f12d503d06"},{"version":"541e27a1923b0813bf0e33ca5b52d1073201785050709c997a720290426b5cb9","signature":"c0dcd712576d3bc49ad21cd18f44ab1bdd715aadb88637a95918df87139aece5"},{"version":"51e29a33ca44d736c6779c74700e8a9e84e9ebc49bdabeea9e8ff4cbe39d8785","signature":"528b4ea3d5ab085935d10bcdf3f2ec329295b386fc65ee01254e78e829156736"},{"version":"0a98b71bc404dea34eb1ce91a3b1a3bee63b60a70a79a707b8d1bd6a49bd4e70","signature":"b6b35aed3f1fbd250d295fd4488636aa67a753f26002f65013d81ea014c9bb1d"},{"version":"1d313333895e7d9891d46d00fad75fd765891ad597d9c49d5de0004695d9fd8a","signature":"d8786120809808cca09436e3d8333df65d0554a1c8a2de41724df4ddb6f0b40e"},{"version":"cea6e91ba97e2b2a75ce6b9568ef2220b98f010b361023ad8d2403585a9943af","signature":"02190ac5b6561caaa077b8ae612e157bed35270a21a167a8e089bc800948bc46"},{"version":"322264e06a1e7cdd7d4a0f5cc67481a4586ba3366fa2552a05d2635c617161aa","signature":"6d325a034d923001e779611d5eeafb389d0ebab9bf3c235c0f7d5229e32ecfe6"},{"version":"d0246b0b4ce4335272e4b9f994c6bdc8c6d7b524596dcee9409e6646d950bef5","signature":"e8be897f2181c72fc43e68b4fdb0b5921bf8f109b51ffbdc425bf22e1552bd67"},{"version":"79eef0dfb2928fff7190b0a57f0c26bf65b51d5738aead64f1316ba02677b22f","signature":"49d7babcfa5400f763daca36b56c8600bcffe0068733996161399c3cd63087b8"},{"version":"63b8996141b817d48a890871948996196921eec49642e859b6dc4050967bd805","signature":"c5272d6f5f6548eb361d26d7d270d3c42b970ff09b41e98d384bbc377c83d7da"},{"version":"2e080e0076d2387f97fae3f6fad22e9d03b6ae2470130677cf99d85216d7fe53","signature":"87dba6f4d3e6f91fcee310efe847fc5bb8cbd74cdb61ff2431538cfb109351bc"},{"version":"5b712377341a58aef517e08ab8d22e1979063edb661faff89fcc012eeb026593","signature":"5a1d32f4a4bc0e1a6004c304bafc21005e398bbdd9073c09e6a78be04eed617c"},{"version":"c4633b2b9b96a2537bc2d50258d5a3fdf9fe2cb58cf7b5c500575b430ae35e6e","signature":"4286d9ee0887b483b9b14eb7aab295784ca254a15abb8682682b37733797d756"},{"version":"0d743949af0ead4e05395ad20eddd2d8d4bc008490664e6422faea1ddc0184a8","signature":"3465eb5e2915bc4da3954db4508a5b1ec723610d39a1e7e8bca96ce0e8eb5a50"},"52bb7ce99e5e50c09e9da2d432d039ecfbeb83f43b29592619c58b64ce001346",{"version":"04f7b5a1ea90a66af86c26ddc6e92439acb8236bcf93aa53c5dc3862802cdee2","signature":"d63abdbebf429c71bbca018b279a59ee5bc0ef97e7df6425c6a32bfd216b3f1d"},{"version":"91c79f09707bce969b1a60932a4482b9f810a9900204b9c0e3f458321898cb83","signature":"f3cbc7dffe514a1dff198eaee07ecdd71492bd6e952b5217e6871784a77eae22"},{"version":"5e40125717a4a4fbfe67b3cf78270ea42d59b9a633c02f5d6b75b7e8a97f4a66","signature":"e118c59f4273eed41c42a4f3dcefc8993471d066881f70fedfd0a2f326064d28"},{"version":"799a4372083f63bf8cccc345c00262a062549997d735d1a2539d58b57561f9cf","signature":"168b5e664817649ec794d1b81961d200a6e2d74172307b7535f8002d2e6ced5e"},{"version":"3439c74a0c5ba0c0821421532b4bd1ba710c02bf4f6d6101812d8f30136d6eb2","signature":"c262e7f2e6c175458416437030051c8e104d4645232a128a0946e8849a0cd214"},{"version":"2533873a9d20a2bffb7f2909966d11087b66f01cfbc11cc2f326e03ba454fcfa","signature":"41765d3955bb46ad7904800ad42d9eaf0581f415317bb9f68c38dfc7df886e2a"},{"version":"415478e3a78a2c02f0a8f03be93ec72363d1349704ba6d70cf1bc8ab7dae238d","signature":"326d61020a72de88e1a43e087d8794fa9e1a8b153a48c17c8c211cd6f2441199"},{"version":"1c88c026bbfcd62672b5835fcc30be4299e2e69e4b98ae7fd4cd159161723ab9","signature":"c8b535f638fa8e087f8f6d242667a8d5c4bdce2dce1d6a87b1269e5aabf5ee81"},{"version":"699330737a897e0b5e9198cf57063427e9015a4d192f1776fd271c946c831b35","signature":"33cb435bbb963099599d932891bd52e2cdc36fb87fd5d1ec8d06408f3d439411"},{"version":"f94d9d57bc91a4c5c4809be3b08f1a5935df31014d73a0bfeb4084bd64776f92","signature":"1a9c31684905d6bed1cf572381928028427696f2a7771aae147aec00066aa5aa"},{"version":"5214eeff610784f968b3b2f6e585fbe9afd9b682518094715379df7ddcfa38c6","signature":"71f397c7ee37e9585c00f86cedd67652a4a9dd75ec8ae014749c43179046c957"},"dc53c8de90b48d0a4fee5f125c43f7dbad5bd98d3cdb6f3be78a5263c6d9c7f6","e061ffbe4f00f871b074ff33ded0a25199a4ef2c56518dd8582c5d11348b90f8",{"version":"6d3d489bb63e439076dc9fae2b4472f0ab5af14475c0bf3bc3a3fb3fe4ba6897","signature":"c68ca2cd04e166875af59a95c177e394c160a837b381e75ffa723d538a26af59"},{"version":"ba0b6f58dffe50aedd786558b5d211b3ac4115a3b10715792493976ee2bf6a6a","signature":"cf5c00cd069e8de4629d263bb778af154ae65d9cfefb6a2ad890d172226638ee"},{"version":"2aa0a71ce2039eebf56a9a8bcc628c36e4fbe6e4a5f16c9b642e3764d58db5d9","signature":"14769dd9783aab66846fc2cba4b2f98f6c01e8f550984e69e6deb20f87d72bfc"},{"version":"0412d328e92ae0e7ff86fe9283ac3b85e06ec0a9bf990544e47c67ab22c22245","signature":"891d420ecd71e8576a3fd1fb891b4ebe0ea6937164a1f1c1addd048a29310d3c"},{"version":"aeedb74c916544727895e2ba957ac07790f4e5e85f50b64bda3b29174b75f652","signature":"91850f31f1ef37fc84d2ca1196972ad1a2374b9bbc69fe4851c45a16b14e05c1"},{"version":"30c59bc246941cfc640a842dd5720562c7b4b3c2fbe139cf28fff61b13d0532d","signature":"49d33d2535316773b5e298d95f1746af38d28c9634f8a1c7ad2b9dbabccc134a"},{"version":"27fce954efb205191f9e6f36d6f306d83f50dee34b63ce33f24aecec1b0d2480","signature":"3d6bf02c8f255c410e697ad844ef9d05d9e3a6dac91a46866ade5ad45cb05e9d"},{"version":"70d8554669b5111b2fa62160a78d46fa533a41d6dae7f9f94e617ae0b684076d","signature":"2fd0fbec1feb93cd7cda8bc413b0ceca4250590dc84a251ac494f5a75a926101"},"bc88dfa755b0d409be965d335604699eec0b05692600d6bc5f12d548ec5f09c2",{"version":"f3cb632639ad5a2df67a18d5d65a35ca88ce201c493cab80b11a33377b2882f3","signature":"cf1e99d874b134fd0352d3c27a758dc587952c0789bb32518700b3ab5d82702f"},"4ab131efb25fce5a9b6c165d7320b19fcc78658986bef34edb142d09f98a4ee3","b9cf3e0e5e2282bbdcab6e1079c4107662379edd996e06df99e971eb676c1193",{"version":"4c48682f813ad8d3a9b9c3233094c360208200139be4fd0f105b7753f8876bb2","signature":"eead142aee91b09c01f67896716c56e9a823d2fb470ee30db7d0d95bab2c2701"},{"version":"2db72f01ca911cec279d389a7785a7e0caaa75cc0bac242c8f6854a668c9e930","signature":"f5b2b08072a228227603be5081c4661e3159b9e6430130d1a50c284fa200490d"},{"version":"9de5e1cce96e38f0724cce8988c102ecb6ee82715b945a1147193879ef2b8e0e","signature":"f51ef369237cf4998a2daeb0514308199108dd58439a1adc4a556bc43ef774b6"},{"version":"c38d9f0c3fc97719656b4e2271caa7eb2f7f4ea13571348e92f1ce8e64ee2fed","signature":"c6796a4d6ca306c4e3c6a80d4b9942eee48836211b0a5c1131ca03260b7a747c"},{"version":"697a7b886cc6e3d78e761d96857dd8f0c49831807c27bccc5db9b500b2adf543","signature":"fd70f95d4f6d14b901e0990aeb233c171c964a32dca3dd2ce203150e9d988e2d"},{"version":"f85ac0f7afb5f7bd43b3aaac3519160c17e98142dc456702ec73051984428fe1","signature":"b8ffb487271cf922f23007a94fff2ef75d5aa4bba52e60b2359f4d717f39c6e6"},{"version":"bd3d07d6eb6cd8d5820089c37b034428dce1ab7eb03d78d2f575e2b8772d1428","signature":"8c34b4d0870e87ab5a892d4f6c4b2d640a6858d1262369f34d90362910cb2dfe"},{"version":"46ef0501c809660c61c48b96ecd5366076a7b6afef80b32ef3878e738b593b72","signature":"7d54d69bd28258dcf401dcfabc79979e51be0c0acb07af00e6e5e0b75004584a"},{"version":"6c659a4e321001e8aeb2b1d0e27cb96ab2e3c2fc0e373f6b752197561e4b6614","signature":"edba6f71e1165dc5b906d32970a92e520c8b2f736732149ce518210d4e2f38cf"},{"version":"b0e9f91fbabb3f886f83ee894a9f01821cb2484923f29ac9fb60baf071e5d5a1","signature":"91a607dcd863a5561f3469e9ad860c5c6fdc7f0bce10064975fd548ac77a50f0"},{"version":"538945c2b30a6f03f261cc56fb8c55fcf58962acbb3acb8e685c5ead0b673862","signature":"95e7a65b4f3ddfc309da0c7faf04e5415651c11fcea71e06ee51c45e465e0531"},{"version":"0429b03cad5d8a34e5b938dd64a42ac70b0ffd36bb6f8bc4a9a0db867db0ced8","signature":"f11eae824171ed229af1b3968022a15822b0d289aaf5a6e946f58a1f551164c8"},{"version":"b9d678379f5902f2dd7e387c5d31318fea876ca5698aa7e94faab89a4af5a741","signature":"fac4424979a581f8401d2ad663c26608f020d34f7eb7a4f1d621134475807707"},{"version":"7888f887b46eee360b44c209bf9155d9b3cdec81e8063f8164aa9880d25565af","signature":"094e86d221c7161cd827f74d09d3e0e8249b496579304b654ab4af86300a2ace"},{"version":"338b30db9db7a677c60c08d8277f9caee88c7b7428b5e377ca603158560a9f47","signature":"17473aec06661b772ea0188799389b35164eb6c89201c022aba1236d5873c1a2"},"678bf01508d25e3b5b8e517d13c5da2a544d93fcfcdb20cddcbd52bc54d50e79",{"version":"278f26e5d87b2c1cd2afd3d2b787f3b91d2ce67534c91ce4d91f50ff7ef297e0","signature":"a8d9b35f388f270c7e9cecfb998193c125239ce4e02873609d44abab37ea5bff"},{"version":"01338e7f8b9d37cd7a0c24418ef2b5702982e70eb87a764170f7122f94fc71f2","signature":"7ada08b5f22595664b83d1a7a4cf71cdc8faeb52607be9aee72f98e984e0b523"},{"version":"d4b44d2750dc816c69532cd8a4bd7fb45b7c736f44f50bc9bc4d0a1024c81bec","signature":"3218c9afa277985d0eaf4cd2a740a827d3e12386c94d391d3c68bb3bb104e967"},{"version":"23f4d2eb09ee0e69ebc9b0bb99d9297c7ec17adc64fd0cc66952c0ef366a3f0b","signature":"4eeb6006b5691f72f855271e66abd6863cad219c16f371a681485256cf1dbb61"},"7dd579b8847f127d81c00a432513cb865aa334e08fcaaa2568698685e2dd4ffe",{"version":"21262b59356e44fe2b1d1f9e90b9e9a29f0f1d46559616a45bff9d79a3528776","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"37972d4b904d2cd304f9bf53d2d7ebff3601916a2913db3d8c4220f17496a35a","4e0b4a5d8464d4739a340c890333f329a741e884cabad8d7724c7fa1121cbb18",{"version":"9cd05da82a256f180a52eb6c79c4848577642ce52b43a0d83227f98be2b7e77e","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"2fac48ddbbdee56f86cd60656a27e90ca886aac3bda7bd49e4648b4d6f3e1996","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"5656c49b0a3ddabdd3b63f55f350abd6cbe8c2d67f7ae37aeae8d6b5e29d95eb","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"9fdc749269b9f0604e279f75392b56b2f78dd72088e3f25245f8d7abca778dae","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"7567e5d100a07ae7604ec5c402e0eaf5c51f6fa5485bff051206a73763060ba4","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"4012bf15d14b5d9ae88aa94467a712334bb8f6c73f799819a3602b61a2d8d9eb","35332a17d4212cc06a22f2f82d6b286a0e43d5a3b7f0832fc03aa174047f2ece",{"version":"d38b27e21635c8dbf5692f5d76b6bd2cdcf52874548bbbd9014e9338de840b9a","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"da62eb8e8758e6484b0e04d4cbdcf5faa4888f579b8a9eae8d8a22ff062093af",{"version":"dccec03ca06594f19cced96d3a660200d70872f75b34b0bde2855fecbfc2988b","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"d610e328a46a8a3a1820a2297b691c8ebc568f8d4a922ca84b4498d49968ec45","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"e9ec059e74a3b8340df8d302a9f261fc631a71766801c4534707d11d22a3712a",{"version":"9e7b0ae9d0642be755ca4717f75dfb2eb0116fda839e5c71e22d1c6052651737","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"2adb2916779fee7ffcfcc6714435529f12a9c20226574b07a95cbf060b94696f",{"version":"1b8d8da61afbbd30c0aa7cfe3a3ed210162b36dfa0dde4681cc0ac774c22b70a","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"ef6cd736e3dda00eef6f15fc0e04c50f6a8e10d6df2f13ab3a4326c842aa4360","992691e521e49b7ae577ea005adf9b807a5456aac75c28b104a3ca531b940544",{"version":"95418ef05d690fae1fee854ce75eb9b4cf230c13cc06397aa6b189d6bd7ce08a","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"abff2da6c0f0d285bcffcd63ce0cc4781d40b5345a3c201a29c488eafd24c553",{"version":"5bfdfc54703e977695ba679403ececd9731d67c2eb8dda625c4e204c04884fe5","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"b43c406c0e80f2ad54f652610fd78b66d893b06e98954e5d6e9420ff90ab4c79","b0c62c07be0e338d824667a771baefc464979ba1d57ca93ca0250c85fa6d9c95","11ed1a4be020d725fcf72fbfbed7f5a6ec248457cc31cdd0060c3e1d47bb4062","da57a133d7e363ad3a1ebc9c588165def07682533781661dac8a95914f6b268a",{"version":"732b8d60a693f94f5ef15e65bef55f4fcd038fb8b35771ca62f04ec42d0e29cd","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"0d4d76b99874a9e76d07ed6afbf4ee0cc27eae1bd92eb9b931a531d630c79334","0c401db8d088ba09fefb0edf6a7622f43e629cba266826bebbe937e00b7dc432",{"version":"adeee5c8096e2a4e99c39237b127889b0dc67a57c3091b850d1f22efcee82668","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"f25086a43e82a283dc936ca63df3499f2fe122322dfc13680d40e312c77e7633",{"version":"14fbe1efaacc1d48b297759861edb693e121c649013e1e00a676f7fbf2e7639a","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"e8e3345b17a000dee85265dabc8fe5f8389450355a53901f0e77a6d81eb333c6","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"dd845f29aa57ea8cbc5d959147ab9737157b764759cd2b663c2403cad97be4ee","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"34926790ac19b2cf64c1b8a192a4ef428ba9b97c4a7cf500365a01d11797fcbb","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},"d41cd59ba669cdce5037c392c03b6ec948e46dc0b17cf04c12f9bf9dd5906c5d",{"version":"0af7eb21e1dfd3e9a3a96595e9c1bbf239bae1ccae14a625ea817c7af9472930","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"},{"version":"5b713254bc318d97efb6964998b34458ae0a45362f94ad8abf14a67de0c6fe53","signature":"2cc743b624d6891f9275f11f76fedfe235af04641c806e7dc65e55740db4dd29"}],"root":[409,434,[443,447],[449,479],[494,507],512,[555,669]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[631,1],[632,2],[634,3],[633,4],[635,5],[636,6],[637,7],[638,8],[639,9],[640,10],[641,11],[642,12],[643,13],[644,14],[645,15],[646,16],[647,17],[648,18],[649,19],[650,20],[651,21],[652,22],[653,23],[654,24],[655,25],[656,26],[630,27],[657,28],[658,29],[660,30],[659,31],[662,32],[661,33],[663,34],[665,35],[664,36],[666,37],[667,38],[668,39],[669,40],[409,41],[362,42],[517,43],[523,44],[525,45],[518,46],[526,47],[524,48],[527,42],[519,49],[520,47],[528,50],[529,43],[532,51],[521,52],[530,53],[531,54],[522,55],[513,42],[514,56],[142,57],[143,57],[144,58],[99,59],[145,60],[146,61],[147,62],[94,42],[97,63],[95,42],[96,42],[148,64],[149,65],[150,66],[151,67],[152,68],[153,69],[154,69],[155,70],[156,71],[157,72],[158,73],[100,42],[98,42],[159,74],[160,75],[161,76],[193,77],[162,78],[163,79],[164,80],[165,81],[166,82],[167,83],[168,84],[169,85],[170,86],[171,87],[172,87],[173,88],[174,42],[175,89],[177,90],[176,91],[178,92],[179,93],[180,94],[181,95],[182,96],[183,97],[184,98],[185,99],[186,100],[187,101],[188,102],[189,103],[190,104],[101,42],[102,42],[103,42],[141,105],[191,106],[192,107],[442,108],[441,109],[440,108],[86,42],[198,110],[199,111],[197,112],[195,113],[196,114],[84,42],[87,115],[286,112],[85,42],[93,116],[365,117],[369,118],[371,119],[219,120],[233,121],[336,122],[265,42],[339,123],[301,124],[309,125],[337,126],[220,127],[264,42],[266,128],[338,129],[240,130],[221,131],[245,130],[234,130],[204,130],[292,132],[293,133],[209,42],[289,134],[294,135],[380,136],[287,135],[381,137],[271,42],[290,138],[393,139],[392,140],[296,135],[391,42],[389,42],[390,141],[291,112],[278,142],[279,143],[288,144],[304,145],[305,146],[295,147],[273,148],[274,149],[384,150],[387,151],[252,152],[251,153],[250,154],[396,112],[249,155],[225,42],[399,42],[402,42],[508,156],[509,157],[401,112],[403,158],[200,42],[330,42],[232,159],[202,160],[353,42],[354,42],[356,42],[359,161],[355,42],[357,162],[358,162],[218,42],[231,42],[364,163],[372,164],[376,165],[214,166],[281,167],[280,42],[272,148],[300,168],[298,169],[297,42],[299,42],[303,170],[276,171],[213,172],[238,173],[327,174],[205,175],[212,176],[201,122],[341,177],[351,178],[340,42],[350,179],[239,42],[223,180],[318,181],[317,42],[324,182],[326,183],[319,184],[323,185],[325,182],[322,184],[321,182],[320,184],[261,186],[246,186],[312,187],[247,187],[207,188],[206,42],[316,189],[315,190],[314,191],[313,192],[208,193],[285,194],[302,195],[284,196],[308,197],[310,198],[307,196],[241,193],[194,42],[328,199],[267,200],[349,201],[270,202],[344,203],[211,42],[345,204],[347,205],[348,206],[331,42],[343,175],[243,207],[329,208],[352,209],[215,42],[217,42],[510,210],[222,211],[311,212],[210,213],[216,42],[269,214],[268,215],[224,216],[277,217],[275,218],[226,219],[228,220],[400,42],[227,221],[229,222],[367,42],[366,42],[368,42],[398,42],[230,223],[283,112],[92,42],[306,224],[253,42],[263,225],[242,42],[374,112],[383,226],[260,112],[378,135],[259,227],[361,228],[258,226],[203,42],[385,229],[256,112],[257,112],[248,42],[262,42],[255,230],[254,231],[244,232],[237,147],[346,42],[236,233],[235,42],[370,42],[282,112],[363,234],[83,42],[91,235],[88,112],[89,42],[90,42],[342,236],[335,237],[334,42],[333,238],[332,42],[373,239],[375,240],[377,241],[379,242],[382,243],[408,244],[386,244],[407,245],[388,246],[394,247],[511,248],[395,249],[397,250],[404,251],[406,42],[405,252],[360,253],[439,254],[436,252],[438,255],[437,42],[435,42],[426,256],[424,257],[425,258],[413,259],[414,257],[421,260],[412,261],[417,262],[427,42],[418,263],[423,264],[429,265],[428,266],[411,267],[419,268],[420,269],[415,270],[422,256],[416,271],[516,46],[533,272],[534,272],[536,273],[537,274],[515,43],[538,272],[554,275],[535,272],[539,46],[540,46],[541,272],[542,112],[543,272],[544,276],[545,272],[546,272],[547,46],[548,272],[549,272],[550,272],[551,272],[552,272],[553,46],[448,42],[410,42],[432,277],[431,42],[430,42],[433,278],[81,42],[82,42],[13,42],[14,42],[16,42],[15,42],[2,42],[17,42],[18,42],[19,42],[20,42],[21,42],[22,42],[23,42],[24,42],[3,42],[25,42],[26,42],[4,42],[27,42],[31,42],[28,42],[29,42],[30,42],[32,42],[33,42],[34,42],[5,42],[35,42],[36,42],[37,42],[38,42],[6,42],[42,42],[39,42],[40,42],[41,42],[43,42],[7,42],[44,42],[49,42],[50,42],[45,42],[46,42],[47,42],[48,42],[8,42],[54,42],[51,42],[52,42],[53,42],[55,42],[9,42],[56,42],[57,42],[58,42],[60,42],[59,42],[61,42],[62,42],[10,42],[63,42],[64,42],[65,42],[11,42],[66,42],[67,42],[68,42],[69,42],[70,42],[1,42],[71,42],[72,42],[12,42],[76,42],[74,42],[79,42],[78,42],[73,42],[77,42],[75,42],[80,42],[119,279],[129,280],[118,279],[139,281],[110,282],[109,283],[138,252],[132,284],[137,285],[112,286],[126,287],[111,288],[135,289],[107,290],[106,252],[136,291],[108,292],[113,293],[114,42],[117,293],[104,42],[140,294],[130,295],[121,296],[122,297],[124,298],[120,299],[123,300],[133,252],[115,301],[116,302],[125,303],[105,304],[128,295],[127,293],[131,42],[134,305],[493,306],[485,307],[492,308],[487,42],[488,42],[486,309],[489,310],[480,42],[481,42],[482,306],[484,311],[490,42],[491,312],[483,313],[443,314],[444,314],[445,314],[446,314],[447,314],[449,315],[450,314],[451,316],[452,314],[453,314],[454,314],[455,314],[456,314],[457,317],[458,315],[459,314],[460,314],[461,314],[462,318],[463,314],[464,314],[465,314],[466,314],[467,314],[468,319],[567,320],[568,321],[584,322],[587,323],[585,324],[586,325],[588,323],[475,326],[476,327],[478,328],[479,329],[494,330],[495,326],[496,326],[497,331],[589,332],[590,333],[591,334],[592,333],[593,321],[594,335],[596,336],[597,337],[599,338],[601,339],[506,340],[602,341],[603,342],[604,343],[605,344],[606,345],[507,346],[512,347],[564,348],[609,349],[610,332],[613,350],[612,112],[611,351],[616,352],[614,353],[472,354],[617,355],[474,356],[620,357],[619,112],[618,353],[621,353],[625,358],[623,359],[626,360],[498,361],[569,362],[583,363],[565,346],[574,364],[624,323],[572,42],[582,365],[576,318],[571,366],[560,367],[561,368],[505,42],[504,369],[562,370],[627,371],[628,371],[629,371],[555,372],[556,373],[580,42],[600,112],[557,374],[579,375],[615,42],[559,376],[608,377],[595,42],[573,378],[581,42],[558,42],[598,379],[607,380],[575,381],[563,365],[577,42],[578,112],[622,382],[566,42],[570,366],[503,383],[473,314],[471,42],[499,42],[477,362],[500,362],[501,318],[470,384],[502,42],[469,327],[434,385]],"affectedFilesPendingEmit":[631,632,634,633,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,630,657,658,660,659,662,661,663,665,664,666,667,668,669,443,444,445,446,447,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,567,568,584,587,585,586,588,475,476,478,479,494,495,496,497,589,590,591,592,593,594,596,597,599,601,506,602,603,604,605,606,507,512,564,609,610,613,612,611,616,614,472,617,474,620,619,618,621,625,623,626,498,569,583,565,574,624,572,582,576,571,560,561,505,504,562,627,628,629,555,556,580,600,557,579,615,559,608,595,573,581,558,598,607,575,563,577,578,622,566,570,503,473,471,499,477,500,501,470,502,469,434],"version":"5.9.3"}
\ No newline at end of file

← e6cf6eb tighten .gitignore: add missing standing-rule patterns (tmp/  ·  back to Stayclaim  ·  Add per-site favicon via app/icon.svg (kills /favicon.ico 40 a975604 →