diff --git a/core/tests/test_entrypoints.py b/core/tests/test_entrypoints.py
index d2f14049..52560ed5 100644
--- a/core/tests/test_entrypoints.py
+++ b/core/tests/test_entrypoints.py
@@ -51,6 +51,10 @@ def test_celery_app_schedules_source_quality_before_authority_recompute():
beat_schedule["run-all-source-quality-recomputations-nightly"]["task"]
== "core.tasks.run_all_source_quality_recomputations"
)
+ assert (
+ beat_schedule["run-all-scheduled-newsletter-drafts-every-minute"]["task"]
+ == "core.tasks.run_all_scheduled_newsletter_drafts"
+ )
assert (
beat_schedule["run-all-authority-recomputations-nightly"]["task"]
== "core.tasks.run_all_authority_recomputations"
diff --git a/entities/api.py b/entities/api.py
index 5de47b5e..1c30277f 100644
--- a/entities/api.py
+++ b/entities/api.py
@@ -180,7 +180,7 @@ class EntityCandidateViewSet(ProjectOwnedQuerysetMixin, viewsets.ReadOnlyModelVi
serializer_class = EntityCandidateSerializer
queryset = EntityCandidate.objects.select_related(
"project", "first_seen_in", "merged_into"
- )
+ ).prefetch_related("evidence")
def get_permissions(self):
"""Allow all members to read candidates and contributors to resolve them."""
diff --git a/entities/migrations/0003_entitycandidate_auto_promotion_blocked_reason_and_more.py b/entities/migrations/0003_entitycandidate_auto_promotion_blocked_reason_and_more.py
index 23709aee..7bc30aec 100644
--- a/entities/migrations/0003_entitycandidate_auto_promotion_blocked_reason_and_more.py
+++ b/entities/migrations/0003_entitycandidate_auto_promotion_blocked_reason_and_more.py
@@ -89,11 +89,11 @@ class Migration(migrations.Migration):
"indexes": [
models.Index(
fields=["candidate", "source_plugin"],
- name="core_entitycand_candidate_source_idx",
+ name="core_entcand_candsrc_idx",
),
models.Index(
fields=["project", "created_at"],
- name="core_entitycand_project_created_idx",
+ name="core_entcand_projtime_idx",
),
],
"constraints": [
diff --git a/entities/models.py b/entities/models.py
index 9e4cf87a..86d8385f 100644
--- a/entities/models.py
+++ b/entities/models.py
@@ -290,11 +290,11 @@ class Meta:
indexes = [
models.Index(
fields=["candidate", "source_plugin"],
- name="core_entitycand_candidate_source_idx",
+ name="core_entcand_candsrc_idx",
),
models.Index(
fields=["project", "created_at"],
- name="core_entitycand_project_created_idx",
+ name="core_entcand_projtime_idx",
),
]
diff --git a/entities/serializers.py b/entities/serializers.py
index a461617f..96a7226a 100644
--- a/entities/serializers.py
+++ b/entities/serializers.py
@@ -120,6 +120,10 @@ class EntityCandidateSerializer(
source="first_seen_in.title", read_only=True
)
merged_into_name = serializers.CharField(source="merged_into.name", read_only=True)
+ evidence_count = serializers.SerializerMethodField()
+ source_plugin_count = serializers.SerializerMethodField()
+ source_plugins = serializers.SerializerMethodField()
+ identity_surfaces = serializers.SerializerMethodField()
class Meta:
model = EntityCandidate
@@ -133,6 +137,10 @@ class Meta:
"occurrence_count",
"cluster_key",
"auto_promotion_blocked_reason",
+ "evidence_count",
+ "source_plugin_count",
+ "source_plugins",
+ "identity_surfaces",
"status",
"merged_into",
"merged_into_name",
@@ -141,6 +149,46 @@ class Meta:
]
read_only_fields = fields
+ def _candidate_evidence(self, obj):
+ """Return prefetched evidence rows when available."""
+
+ evidence = getattr(obj, "prefetched_evidence", None)
+ if evidence is None:
+ evidence = obj.evidence.all()
+ return evidence
+
+ def get_evidence_count(self, obj) -> int:
+ """Return the number of evidence rows attached to the candidate."""
+
+ return len(self._candidate_evidence(obj))
+
+ def get_source_plugin_count(self, obj) -> int:
+ """Return the number of unique source plugins backing the candidate."""
+
+ return len(self.get_source_plugins(obj))
+
+ def get_source_plugins(self, obj) -> list[str]:
+ """Return the unique source plugins seen in candidate evidence."""
+
+ return sorted(
+ {
+ evidence.source_plugin
+ for evidence in self._candidate_evidence(obj)
+ if evidence.source_plugin
+ }
+ )
+
+ def get_identity_surfaces(self, obj) -> list[str]:
+ """Return the unique identity surfaces hinted by candidate evidence."""
+
+ return sorted(
+ {
+ evidence.identity_surface
+ for evidence in self._candidate_evidence(obj)
+ if evidence.identity_surface
+ }
+ )
+
class EntityCandidateMergeSerializer(
ProjectScopedSerializerMixin, serializers.Serializer
diff --git a/entities/tests/test_api.py b/entities/tests/test_api.py
index 1a83f90b..e18ecbe9 100644
--- a/entities/tests/test_api.py
+++ b/entities/tests/test_api.py
@@ -12,6 +12,7 @@
Entity,
EntityAuthoritySnapshot,
EntityCandidate,
+ EntityCandidateEvidence,
EntityCandidateStatus,
EntityIdentityClaim,
EntityMention,
@@ -333,6 +334,15 @@ def test_entity_candidate_list_is_scoped_to_request_user_project(self):
cluster_key="owner-candidate-abcd1234",
auto_promotion_blocked_reason="needs_more_occurrences",
)
+ EntityCandidateEvidence.objects.create(
+ candidate=owner_candidate,
+ project=self.owner_project,
+ content=self.owner_content,
+ source_plugin="linkedin",
+ context_excerpt="Owner Candidate was cited in the article.",
+ identity_surface="linkedin",
+ claim_url="https://www.linkedin.com/company/owner-candidate",
+ )
EntityCandidate.objects.create(
project=self.other_project,
name="Other Candidate",
@@ -355,6 +365,10 @@ def test_entity_candidate_list_is_scoped_to_request_user_project(self):
response.json()[0]["auto_promotion_blocked_reason"],
owner_candidate.auto_promotion_blocked_reason,
)
+ self.assertEqual(response.json()[0]["evidence_count"], 1)
+ self.assertEqual(response.json()[0]["source_plugin_count"], 1)
+ self.assertEqual(response.json()[0]["source_plugins"], ["linkedin"])
+ self.assertEqual(response.json()[0]["identity_surfaces"], ["linkedin"])
def test_entity_candidate_accept_action_returns_updated_candidate(self):
with patch("entities.extraction.queue_entity_identity_enrichment"):
diff --git a/frontend/src/app/admin/sources/page.test.tsx b/frontend/src/app/admin/sources/page.test.tsx
index 90506709..2a28af37 100644
--- a/frontend/src/app/admin/sources/page.test.tsx
+++ b/frontend/src/app/admin/sources/page.test.tsx
@@ -280,6 +280,43 @@ describe("filterNewsletterIntakes", () => {
})
})
+describe("SourcesPage", () => {
+ beforeEach(() => {
+ const defaultProject = createProject()
+
+ getProjectsMock.mockReset()
+ getProjectSourceConfigsMock.mockReset()
+ getProjectIngestionRunsMock.mockReset()
+ getProjectIntakeAllowlistMock.mockReset()
+ getProjectNewsletterIntakesMock.mockReset()
+ getProjectBlueskyCredentialsMock.mockReset()
+ getProjectLinkedInCredentialsMock.mockReset()
+ getProjectMastodonCredentialsMock.mockReset()
+ selectProjectMock.mockReset()
+
+ getProjectsMock.mockResolvedValue([defaultProject])
+ getProjectSourceConfigsMock.mockResolvedValue([createSourceConfig()])
+ getProjectIngestionRunsMock.mockResolvedValue([createIngestionRun()])
+ getProjectIntakeAllowlistMock.mockResolvedValue([createAllowlistEntry()])
+ getProjectNewsletterIntakesMock.mockResolvedValue([createNewsletterIntake()])
+ getProjectBlueskyCredentialsMock.mockResolvedValue([createBlueskyCredentials()])
+ getProjectLinkedInCredentialsMock.mockResolvedValue([
+ createLinkedInCredentials({ expires_at: "2026-05-30T10:00:00Z" }),
+ ])
+ getProjectMastodonCredentialsMock.mockResolvedValue([createMastodonCredentials()])
+ selectProjectMock.mockImplementation((projects: Project[]) => projects[0] ?? null)
+ })
+
+ it("renders the LinkedIn quick-add form alongside the OAuth panel", async () => {
+ await renderSourcesPage({ project: "1" })
+
+ expect(screen.getByText("OAuth authorization")).toBeInTheDocument()
+ expect(screen.getByRole("button", { name: "Add LinkedIn source" })).toBeInTheDocument()
+ expect(screen.getByText("Surface type")).toBeInTheDocument()
+ expect(screen.getByText("Quick config shapes")).toBeInTheDocument()
+ })
+})
+
describe("SourcesPage", () => {
beforeEach(() => {
const defaultProject = createProject()
diff --git a/frontend/src/app/admin/sources/page.tsx b/frontend/src/app/admin/sources/page.tsx
index f19570e8..c1c03b8f 100644
--- a/frontend/src/app/admin/sources/page.tsx
+++ b/frontend/src/app/admin/sources/page.tsx
@@ -830,6 +830,87 @@ export default async function SourcesPage({ searchParams }: SourcesPageProps) {
Verify LinkedIn credentials
+
+
+
+
+
+
+ Quick config shapes
+
+
+ Organization and newsletter sources use max_posts_per_fetch . Person sources use include_reshares .
+
+
+ The generic source editor below still works for advanced payloads, but most projects should be able to onboard LinkedIn surfaces from this form alone.
+
+
+
diff --git a/frontend/src/app/api/entity-candidates/[id]/route.test.ts b/frontend/src/app/api/entity-candidates/[id]/route.test.ts
index 5a4e4ab7..cfeb0078 100644
--- a/frontend/src/app/api/entity-candidates/[id]/route.test.ts
+++ b/frontend/src/app/api/entity-candidates/[id]/route.test.ts
@@ -35,6 +35,12 @@ function createCandidate(overrides: Partial = {}): EntityCandid
first_seen_in: 21,
first_seen_title: "River Labs launches hosted platform",
occurrence_count: 2,
+ cluster_key: "cluster-9",
+ auto_promotion_blocked_reason: "needs_more_occurrences",
+ evidence_count: 2,
+ source_plugin_count: 2,
+ source_plugins: ["linkedin", "rss"],
+ identity_surfaces: ["linkedin"],
status: "pending",
merged_into: null,
merged_into_name: "",
diff --git a/frontend/src/app/api/projects/[id]/authority-settings/route.test.ts b/frontend/src/app/api/projects/[id]/authority-settings/route.test.ts
new file mode 100644
index 00000000..7255fdcc
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/authority-settings/route.test.ts
@@ -0,0 +1,97 @@
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import {
+ createProjectConfig,
+ recomputeProjectConfigAuthority,
+ updateProjectConfig,
+} from "@/lib/api"
+
+import { POST } from "./route"
+
+vi.mock("@/lib/api", () => ({
+ createProjectConfig: vi.fn(),
+ recomputeProjectConfigAuthority: vi.fn(),
+ updateProjectConfig: vi.fn(),
+}))
+
+describe("POST /api/projects/[id]/authority-settings", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ function buildFormData() {
+ const formData = new FormData()
+ formData.set("draft_schedule_cron", "")
+ formData.set("authority_weight_mention", "0.2")
+ formData.set("authority_weight_engagement", "0.15")
+ formData.set("authority_weight_recency", "0.15")
+ formData.set("authority_weight_source_quality", "0.15")
+ formData.set("authority_weight_cross_newsletter", "0.2")
+ formData.set("authority_weight_feedback", "0.1")
+ formData.set("authority_weight_duplicate", "0.05")
+ formData.set("upvote_authority_weight", "0.05")
+ formData.set("downvote_authority_weight", "-0.05")
+ formData.set("authority_decay_rate", "0.9")
+ return formData
+ }
+
+ it("creates a config and returns JSON for a save request", async () => {
+ vi.mocked(createProjectConfig).mockResolvedValue({ id: 7 } as never)
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/authority-settings?mode=json", {
+ method: "POST",
+ body: buildFormData(),
+ }),
+ {
+ params: Promise.resolve({ id: "4" }),
+ },
+ )
+
+ expect(createProjectConfig).toHaveBeenCalledWith(
+ 4,
+ expect.objectContaining({ authority_weight_engagement: 0.15 }),
+ )
+ expect(updateProjectConfig).not.toHaveBeenCalled()
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({
+ configId: 7,
+ message: "Authority weights saved.",
+ })
+ })
+
+ it("updates and recomputes when requested", async () => {
+ vi.mocked(updateProjectConfig).mockResolvedValue({ id: 9 } as never)
+ vi.mocked(recomputeProjectConfigAuthority).mockResolvedValue({
+ status: "completed",
+ project_id: 4,
+ config_id: 9,
+ })
+
+ const formData = buildFormData()
+ formData.set("configId", "9")
+ formData.set("intent", "save_and_recompute")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/authority-settings?mode=json", {
+ method: "POST",
+ body: formData,
+ }),
+ {
+ params: Promise.resolve({ id: "4" }),
+ },
+ )
+
+ expect(updateProjectConfig).toHaveBeenCalledWith(
+ 4,
+ 9,
+ expect.objectContaining({ authority_weight_source_quality: 0.15 }),
+ )
+ expect(recomputeProjectConfigAuthority).toHaveBeenCalledWith(4, 9)
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({
+ configId: 9,
+ message: "Authority weights saved and recomputed.",
+ })
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/authority-settings/route.ts b/frontend/src/app/api/projects/[id]/authority-settings/route.ts
new file mode 100644
index 00000000..2b872ae3
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/authority-settings/route.ts
@@ -0,0 +1,109 @@
+import { NextResponse } from "next/server"
+
+import {
+ createProjectConfig,
+ recomputeProjectConfigAuthority,
+ updateProjectConfig,
+} from "@/lib/api"
+
+type AuthorityWeightsPayload = {
+ draft_schedule_cron: string
+ authority_weight_mention: number
+ authority_weight_engagement: number
+ authority_weight_recency: number
+ authority_weight_source_quality: number
+ authority_weight_cross_newsletter: number
+ authority_weight_feedback: number
+ authority_weight_duplicate: number
+ upvote_authority_weight: number
+ downvote_authority_weight: number
+ authority_decay_rate: number
+}
+
+function buildRedirectUrl(
+ request: Request,
+ redirectTo: string,
+ params: Record,
+) {
+ const url = new URL(redirectTo || "/", request.url)
+ for (const [key, value] of Object.entries(params)) {
+ url.searchParams.set(key, value)
+ }
+ return url
+}
+
+function parseNumericField(formData: FormData, fieldName: keyof AuthorityWeightsPayload) {
+ return Number.parseFloat(String(formData.get(fieldName) || "0"))
+}
+
+function extractPayload(formData: FormData): AuthorityWeightsPayload {
+ return {
+ draft_schedule_cron: String(formData.get("draft_schedule_cron") || ""),
+ authority_weight_mention: parseNumericField(formData, "authority_weight_mention"),
+ authority_weight_engagement: parseNumericField(formData, "authority_weight_engagement"),
+ authority_weight_recency: parseNumericField(formData, "authority_weight_recency"),
+ authority_weight_source_quality: parseNumericField(formData, "authority_weight_source_quality"),
+ authority_weight_cross_newsletter: parseNumericField(formData, "authority_weight_cross_newsletter"),
+ authority_weight_feedback: parseNumericField(formData, "authority_weight_feedback"),
+ authority_weight_duplicate: parseNumericField(formData, "authority_weight_duplicate"),
+ upvote_authority_weight: parseNumericField(formData, "upvote_authority_weight"),
+ downvote_authority_weight: parseNumericField(formData, "downvote_authority_weight"),
+ authority_decay_rate: parseNumericField(formData, "authority_decay_rate"),
+ }
+}
+
+/**
+ * Handle authority-weight save and recompute requests for one project.
+ */
+export async function POST(
+ request: Request,
+ context: { params: Promise<{ id: string }> },
+) {
+ const { id } = await context.params
+ const responseMode = new URL(request.url).searchParams.get("mode")
+ const formData = await request.formData()
+ const redirectTo = String(formData.get("redirectTo") || `/entities?project=${id}`)
+
+ try {
+ const projectId = Number.parseInt(id, 10)
+ const configId = Number.parseInt(String(formData.get("configId") || "0"), 10)
+ const intent = String(formData.get("intent") || "save")
+ const payload = extractPayload(formData)
+
+ const config =
+ configId > 0
+ ? await updateProjectConfig(projectId, configId, payload)
+ : await createProjectConfig(projectId, payload)
+
+ let message = "Authority weights saved."
+
+ if (intent === "save_and_recompute") {
+ const recompute = await recomputeProjectConfigAuthority(projectId, config.id)
+ message =
+ recompute.status === "completed"
+ ? "Authority weights saved and recomputed."
+ : "Authority weights saved and recompute queued."
+ }
+
+ if (responseMode === "json") {
+ return NextResponse.json({ configId: config.id, message })
+ }
+
+ return NextResponse.redirect(
+ buildRedirectUrl(request, redirectTo, { message }),
+ )
+ } catch (error) {
+ const message =
+ error instanceof Error
+ ? error.message
+ : "Unable to save authority settings."
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message }, { status: 400 })
+ }
+
+ return NextResponse.redirect(
+ buildRedirectUrl(request, redirectTo, { error: message }),
+ )
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/draft-action-helpers.ts b/frontend/src/app/api/projects/[id]/draft-action-helpers.ts
new file mode 100644
index 00000000..7d6469d4
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/draft-action-helpers.ts
@@ -0,0 +1,22 @@
+/**
+ * Build a redirect target for project-scoped draft workflow handlers.
+ *
+ * Relative redirects are resolved against the incoming request URL so route handlers can
+ * safely accept short page paths like `/drafts?project=4` from form submissions.
+ *
+ * @param request - Incoming request used as the base URL for relative redirects.
+ * @param redirectTo - Caller-provided redirect target, or a fallback page path.
+ * @param params - Query params to append to the redirect target.
+ * @returns A redirect URL with the requested flash-message params appended.
+ */
+export function buildDraftRedirectUrl(
+ request: Request,
+ redirectTo: string,
+ params: Record,
+) {
+ const url = new URL(redirectTo, request.url)
+ for (const [key, value] of Object.entries(params)) {
+ url.searchParams.set(key, value)
+ }
+ return url
+}
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/draft-items/[itemId]/route.test.ts b/frontend/src/app/api/projects/[id]/draft-items/[itemId]/route.test.ts
new file mode 100644
index 00000000..1d185f87
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/draft-items/[itemId]/route.test.ts
@@ -0,0 +1,98 @@
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import {
+ deleteProjectNewsletterDraftItem,
+ updateProjectNewsletterDraftItem,
+} from "@/lib/api"
+
+import { POST } from "./route"
+
+vi.mock("@/lib/api", () => ({
+ deleteProjectNewsletterDraftItem: vi.fn(),
+ updateProjectNewsletterDraftItem: vi.fn(),
+}))
+
+describe("POST /api/projects/[id]/draft-items/[itemId]", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ it("returns JSON for draft-item updates", async () => {
+ vi.mocked(updateProjectNewsletterDraftItem).mockResolvedValue(undefined as never)
+
+ const formData = new FormData()
+ formData.set("summary_used", "Updated summary")
+ formData.set("why_it_matters", "Updated why")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/draft-items/44?mode=json", {
+ method: "POST",
+ body: formData,
+ }),
+ {
+ params: Promise.resolve({ id: "4", itemId: "44" }),
+ },
+ )
+
+ expect(updateProjectNewsletterDraftItem).toHaveBeenCalledWith(44, 4, {
+ summary_used: "Updated summary",
+ why_it_matters: "Updated why",
+ })
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({ message: "Draft item updated." })
+ })
+
+ it("swaps item order when moving an item", async () => {
+ vi.mocked(updateProjectNewsletterDraftItem).mockResolvedValue(undefined as never)
+
+ const formData = new FormData()
+ formData.set("intent", "move_down")
+ formData.set("currentOrder", "0")
+ formData.set("targetOrder", "1")
+ formData.set("swapWithId", "45")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/draft-items/44?mode=json", {
+ method: "POST",
+ body: formData,
+ }),
+ {
+ params: Promise.resolve({ id: "4", itemId: "44" }),
+ },
+ )
+
+ expect(updateProjectNewsletterDraftItem).toHaveBeenNthCalledWith(1, 44, 4, {
+ order: -1,
+ })
+ expect(updateProjectNewsletterDraftItem).toHaveBeenNthCalledWith(2, 45, 4, {
+ order: 0,
+ })
+ expect(updateProjectNewsletterDraftItem).toHaveBeenNthCalledWith(3, 44, 4, {
+ order: 1,
+ })
+ await expect(response.json()).resolves.toEqual({
+ message: "Draft item moved down.",
+ })
+ })
+
+ it("deletes a draft item when requested", async () => {
+ vi.mocked(deleteProjectNewsletterDraftItem).mockResolvedValue(undefined)
+
+ const formData = new FormData()
+ formData.set("intent", "delete")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/draft-items/44?mode=json", {
+ method: "POST",
+ body: formData,
+ }),
+ {
+ params: Promise.resolve({ id: "4", itemId: "44" }),
+ },
+ )
+
+ expect(deleteProjectNewsletterDraftItem).toHaveBeenCalledWith(44, 4)
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({ message: "Draft item removed." })
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/draft-items/[itemId]/route.ts b/frontend/src/app/api/projects/[id]/draft-items/[itemId]/route.ts
new file mode 100644
index 00000000..70d42b45
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/draft-items/[itemId]/route.ts
@@ -0,0 +1,95 @@
+import { NextResponse } from "next/server"
+
+import {
+ deleteProjectNewsletterDraftItem,
+ updateProjectNewsletterDraftItem,
+} from "@/lib/api"
+
+import { buildDraftRedirectUrl } from "../../draft-action-helpers"
+
+async function swapItemOrder(
+ projectId: number,
+ itemId: number,
+ currentOrder: number,
+ targetOrder: number,
+ swapWithId: number,
+) {
+ await updateProjectNewsletterDraftItem(itemId, projectId, { order: -1 })
+ await updateProjectNewsletterDraftItem(swapWithId, projectId, {
+ order: currentOrder,
+ })
+ await updateProjectNewsletterDraftItem(itemId, projectId, {
+ order: targetOrder,
+ })
+}
+
+/**
+ * Handle inline draft-item updates, deletes, and reordering actions.
+ */
+export async function POST(
+ request: Request,
+ context: { params: Promise<{ id: string; itemId: string }> },
+) {
+ const { id, itemId } = await context.params
+ const responseMode = new URL(request.url).searchParams.get("mode")
+ const formData = await request.formData()
+ const redirectTo = String(formData.get("redirectTo") || `/drafts?project=${id}`)
+
+ try {
+ const projectId = Number.parseInt(id, 10)
+ const resolvedItemId = Number.parseInt(itemId, 10)
+ const intent = String(formData.get("intent") || "update")
+ let message = "Draft item updated."
+
+ if (intent === "delete") {
+ await deleteProjectNewsletterDraftItem(resolvedItemId, projectId)
+ message = "Draft item removed."
+ } else if (intent === "move_up" || intent === "move_down") {
+ const currentOrder = Number.parseInt(
+ String(formData.get("currentOrder") || "0"),
+ 10,
+ )
+ const targetOrder = Number.parseInt(
+ String(formData.get("targetOrder") || String(currentOrder)),
+ 10,
+ )
+ const swapWithId = Number.parseInt(
+ String(formData.get("swapWithId") || "0"),
+ 10,
+ )
+
+ await swapItemOrder(
+ projectId,
+ resolvedItemId,
+ currentOrder,
+ targetOrder,
+ swapWithId,
+ )
+ message = intent === "move_up" ? "Draft item moved up." : "Draft item moved down."
+ } else {
+ await updateProjectNewsletterDraftItem(resolvedItemId, projectId, {
+ summary_used: String(formData.get("summary_used") || ""),
+ why_it_matters: String(formData.get("why_it_matters") || ""),
+ })
+ }
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { message }),
+ )
+ } catch (error) {
+ const message =
+ error instanceof Error ? error.message : "Unable to save draft item."
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message }, { status: 400 })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { error: message }),
+ )
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/draft-original-pieces/[pieceId]/route.test.ts b/frontend/src/app/api/projects/[id]/draft-original-pieces/[pieceId]/route.test.ts
new file mode 100644
index 00000000..dc6a416c
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/draft-original-pieces/[pieceId]/route.test.ts
@@ -0,0 +1,113 @@
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import {
+ deleteProjectNewsletterDraftOriginalPiece,
+ updateProjectNewsletterDraftOriginalPiece,
+} from "@/lib/api"
+
+import { POST } from "./route"
+
+vi.mock("@/lib/api", () => ({
+ deleteProjectNewsletterDraftOriginalPiece: vi.fn(),
+ updateProjectNewsletterDraftOriginalPiece: vi.fn(),
+}))
+
+describe("POST /api/projects/[id]/draft-original-pieces/[pieceId]", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ it("returns JSON for original-piece updates", async () => {
+ vi.mocked(updateProjectNewsletterDraftOriginalPiece).mockResolvedValue(undefined as never)
+
+ const formData = new FormData()
+ formData.set("title", "Updated original piece")
+ formData.set("pitch", "Updated pitch")
+ formData.set("suggested_outline", "1. Updated outline")
+
+ const response = await POST(
+ new Request(
+ "http://localhost/api/projects/4/draft-original-pieces/31?mode=json",
+ {
+ method: "POST",
+ body: formData,
+ },
+ ),
+ {
+ params: Promise.resolve({ id: "4", pieceId: "31" }),
+ },
+ )
+
+ expect(updateProjectNewsletterDraftOriginalPiece).toHaveBeenCalledWith(31, 4, {
+ title: "Updated original piece",
+ pitch: "Updated pitch",
+ suggested_outline: "1. Updated outline",
+ })
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({
+ message: "Original piece updated.",
+ })
+ })
+
+ it("swaps original-piece order when moving a piece", async () => {
+ vi.mocked(updateProjectNewsletterDraftOriginalPiece).mockResolvedValue(undefined as never)
+
+ const formData = new FormData()
+ formData.set("intent", "move_down")
+ formData.set("currentOrder", "0")
+ formData.set("targetOrder", "1")
+ formData.set("swapWithId", "32")
+
+ const response = await POST(
+ new Request(
+ "http://localhost/api/projects/4/draft-original-pieces/31?mode=json",
+ {
+ method: "POST",
+ body: formData,
+ },
+ ),
+ {
+ params: Promise.resolve({ id: "4", pieceId: "31" }),
+ },
+ )
+
+ expect(updateProjectNewsletterDraftOriginalPiece).toHaveBeenNthCalledWith(1, 31, 4, {
+ order: -1,
+ })
+ expect(updateProjectNewsletterDraftOriginalPiece).toHaveBeenNthCalledWith(2, 32, 4, {
+ order: 0,
+ })
+ expect(updateProjectNewsletterDraftOriginalPiece).toHaveBeenNthCalledWith(3, 31, 4, {
+ order: 1,
+ })
+ await expect(response.json()).resolves.toEqual({
+ message: "Original piece moved down.",
+ })
+ })
+
+ it("deletes an original piece when requested", async () => {
+ vi.mocked(deleteProjectNewsletterDraftOriginalPiece).mockResolvedValue(undefined)
+
+ const formData = new FormData()
+ formData.set("intent", "delete")
+
+ const response = await POST(
+ new Request(
+ "http://localhost/api/projects/4/draft-original-pieces/31?mode=json",
+ {
+ method: "POST",
+ body: formData,
+ },
+ ),
+ {
+ params: Promise.resolve({ id: "4", pieceId: "31" }),
+ },
+ )
+
+ expect(deleteProjectNewsletterDraftOriginalPiece).toHaveBeenCalledWith(31, 4)
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({
+ message: "Original piece removed.",
+ })
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/draft-original-pieces/[pieceId]/route.ts b/frontend/src/app/api/projects/[id]/draft-original-pieces/[pieceId]/route.ts
new file mode 100644
index 00000000..2186046e
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/draft-original-pieces/[pieceId]/route.ts
@@ -0,0 +1,98 @@
+import { NextResponse } from "next/server"
+
+import {
+ deleteProjectNewsletterDraftOriginalPiece,
+ updateProjectNewsletterDraftOriginalPiece,
+} from "@/lib/api"
+
+import { buildDraftRedirectUrl } from "../../draft-action-helpers"
+
+async function swapOriginalPieceOrder(
+ projectId: number,
+ pieceId: number,
+ currentOrder: number,
+ targetOrder: number,
+ swapWithId: number,
+) {
+ await updateProjectNewsletterDraftOriginalPiece(pieceId, projectId, {
+ order: -1,
+ })
+ await updateProjectNewsletterDraftOriginalPiece(swapWithId, projectId, {
+ order: currentOrder,
+ })
+ await updateProjectNewsletterDraftOriginalPiece(pieceId, projectId, {
+ order: targetOrder,
+ })
+}
+
+/**
+ * Handle inline original-piece updates, deletes, and reordering actions.
+ */
+export async function POST(
+ request: Request,
+ context: { params: Promise<{ id: string; pieceId: string }> },
+) {
+ const { id, pieceId } = await context.params
+ const responseMode = new URL(request.url).searchParams.get("mode")
+ const formData = await request.formData()
+ const redirectTo = String(formData.get("redirectTo") || `/drafts?project=${id}`)
+
+ try {
+ const projectId = Number.parseInt(id, 10)
+ const resolvedPieceId = Number.parseInt(pieceId, 10)
+ const intent = String(formData.get("intent") || "update")
+ let message = "Original piece updated."
+
+ if (intent === "delete") {
+ await deleteProjectNewsletterDraftOriginalPiece(resolvedPieceId, projectId)
+ message = "Original piece removed."
+ } else if (intent === "move_up" || intent === "move_down") {
+ const currentOrder = Number.parseInt(
+ String(formData.get("currentOrder") || "0"),
+ 10,
+ )
+ const targetOrder = Number.parseInt(
+ String(formData.get("targetOrder") || String(currentOrder)),
+ 10,
+ )
+ const swapWithId = Number.parseInt(
+ String(formData.get("swapWithId") || "0"),
+ 10,
+ )
+
+ await swapOriginalPieceOrder(
+ projectId,
+ resolvedPieceId,
+ currentOrder,
+ targetOrder,
+ swapWithId,
+ )
+ message = intent === "move_up" ? "Original piece moved up." : "Original piece moved down."
+ } else {
+ await updateProjectNewsletterDraftOriginalPiece(resolvedPieceId, projectId, {
+ title: String(formData.get("title") || ""),
+ pitch: String(formData.get("pitch") || ""),
+ suggested_outline: String(formData.get("suggested_outline") || ""),
+ })
+ }
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { message }),
+ )
+ } catch (error) {
+ const message =
+ error instanceof Error ? error.message : "Unable to save original piece."
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message }, { status: 400 })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { error: message }),
+ )
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/draft-sections/[sectionId]/route.test.ts b/frontend/src/app/api/projects/[id]/draft-sections/[sectionId]/route.test.ts
new file mode 100644
index 00000000..364b56cf
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/draft-sections/[sectionId]/route.test.ts
@@ -0,0 +1,97 @@
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import {
+ deleteProjectNewsletterDraftSection,
+ updateProjectNewsletterDraftSection,
+} from "@/lib/api"
+
+import { POST } from "./route"
+
+vi.mock("@/lib/api", () => ({
+ deleteProjectNewsletterDraftSection: vi.fn(),
+ updateProjectNewsletterDraftSection: vi.fn(),
+}))
+
+describe("POST /api/projects/[id]/draft-sections/[sectionId]", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ it("returns JSON for section updates", async () => {
+ vi.mocked(updateProjectNewsletterDraftSection).mockResolvedValue(undefined as never)
+
+ const formData = new FormData()
+ formData.set("title", "Updated title")
+ formData.set("lede", "Updated lede")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/draft-sections/12?mode=json", {
+ method: "POST",
+ body: formData,
+ }),
+ {
+ params: Promise.resolve({ id: "4", sectionId: "12" }),
+ },
+ )
+
+ expect(updateProjectNewsletterDraftSection).toHaveBeenCalledWith(12, 4, {
+ title: "Updated title",
+ lede: "Updated lede",
+ })
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({ message: "Section updated." })
+ })
+
+ it("swaps section order when moving a section", async () => {
+ vi.mocked(updateProjectNewsletterDraftSection).mockResolvedValue(undefined as never)
+
+ const formData = new FormData()
+ formData.set("intent", "move_up")
+ formData.set("currentOrder", "2")
+ formData.set("targetOrder", "1")
+ formData.set("swapWithId", "11")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/draft-sections/12?mode=json", {
+ method: "POST",
+ body: formData,
+ }),
+ {
+ params: Promise.resolve({ id: "4", sectionId: "12" }),
+ },
+ )
+
+ expect(updateProjectNewsletterDraftSection).toHaveBeenNthCalledWith(1, 12, 4, {
+ order: -1,
+ })
+ expect(updateProjectNewsletterDraftSection).toHaveBeenNthCalledWith(2, 11, 4, {
+ order: 2,
+ })
+ expect(updateProjectNewsletterDraftSection).toHaveBeenNthCalledWith(3, 12, 4, {
+ order: 1,
+ })
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({ message: "Section moved up." })
+ })
+
+ it("deletes a section when requested", async () => {
+ vi.mocked(deleteProjectNewsletterDraftSection).mockResolvedValue(undefined)
+
+ const formData = new FormData()
+ formData.set("intent", "delete")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/draft-sections/12?mode=json", {
+ method: "POST",
+ body: formData,
+ }),
+ {
+ params: Promise.resolve({ id: "4", sectionId: "12" }),
+ },
+ )
+
+ expect(deleteProjectNewsletterDraftSection).toHaveBeenCalledWith(12, 4)
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({ message: "Section removed." })
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/draft-sections/[sectionId]/route.ts b/frontend/src/app/api/projects/[id]/draft-sections/[sectionId]/route.ts
new file mode 100644
index 00000000..652674fd
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/draft-sections/[sectionId]/route.ts
@@ -0,0 +1,95 @@
+import { NextResponse } from "next/server"
+
+import {
+ deleteProjectNewsletterDraftSection,
+ updateProjectNewsletterDraftSection,
+} from "@/lib/api"
+
+import { buildDraftRedirectUrl } from "../../draft-action-helpers"
+
+async function swapSectionOrder(
+ projectId: number,
+ sectionId: number,
+ currentOrder: number,
+ targetOrder: number,
+ swapWithId: number,
+) {
+ await updateProjectNewsletterDraftSection(sectionId, projectId, { order: -1 })
+ await updateProjectNewsletterDraftSection(swapWithId, projectId, {
+ order: currentOrder,
+ })
+ await updateProjectNewsletterDraftSection(sectionId, projectId, {
+ order: targetOrder,
+ })
+}
+
+/**
+ * Handle inline draft-section updates, deletes, and reordering actions.
+ */
+export async function POST(
+ request: Request,
+ context: { params: Promise<{ id: string; sectionId: string }> },
+) {
+ const { id, sectionId } = await context.params
+ const responseMode = new URL(request.url).searchParams.get("mode")
+ const formData = await request.formData()
+ const redirectTo = String(formData.get("redirectTo") || `/drafts?project=${id}`)
+
+ try {
+ const projectId = Number.parseInt(id, 10)
+ const resolvedSectionId = Number.parseInt(sectionId, 10)
+ const intent = String(formData.get("intent") || "update")
+ let message = "Section updated."
+
+ if (intent === "delete") {
+ await deleteProjectNewsletterDraftSection(resolvedSectionId, projectId)
+ message = "Section removed."
+ } else if (intent === "move_up" || intent === "move_down") {
+ const currentOrder = Number.parseInt(
+ String(formData.get("currentOrder") || "0"),
+ 10,
+ )
+ const targetOrder = Number.parseInt(
+ String(formData.get("targetOrder") || String(currentOrder)),
+ 10,
+ )
+ const swapWithId = Number.parseInt(
+ String(formData.get("swapWithId") || "0"),
+ 10,
+ )
+
+ await swapSectionOrder(
+ projectId,
+ resolvedSectionId,
+ currentOrder,
+ targetOrder,
+ swapWithId,
+ )
+ message = intent === "move_up" ? "Section moved up." : "Section moved down."
+ } else {
+ await updateProjectNewsletterDraftSection(resolvedSectionId, projectId, {
+ title: String(formData.get("title") || ""),
+ lede: String(formData.get("lede") || ""),
+ })
+ }
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { message }),
+ )
+ } catch (error) {
+ const message =
+ error instanceof Error ? error.message : "Unable to save draft section."
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message }, { status: 400 })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { error: message }),
+ )
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/drafts/[draftId]/regenerate-section/route.test.ts b/frontend/src/app/api/projects/[id]/drafts/[draftId]/regenerate-section/route.test.ts
new file mode 100644
index 00000000..a39bb14e
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/drafts/[draftId]/regenerate-section/route.test.ts
@@ -0,0 +1,111 @@
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import { regenerateProjectNewsletterDraftSection } from "@/lib/api"
+
+import { POST } from "./route"
+
+vi.mock("@/lib/api", () => ({
+ regenerateProjectNewsletterDraftSection: vi.fn(),
+}))
+
+function buildRequest(formData: FormData) {
+ return new Request("http://localhost/api/projects/4/drafts/9/regenerate-section", {
+ method: "POST",
+ body: formData,
+ })
+}
+
+async function getLocation(response: Response) {
+ return response.headers.get("location")
+}
+
+describe("POST /api/projects/[id]/drafts/[draftId]/regenerate-section", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ it("redirects with a success message when regeneration completes immediately", async () => {
+ vi.mocked(regenerateProjectNewsletterDraftSection).mockResolvedValue({
+ id: 9,
+ project: 4,
+ title: "Updated draft",
+ intro: "Intro",
+ outro: "Outro",
+ target_publish_date: null,
+ status: "edited",
+ generated_at: "2026-05-03T09:00:00Z",
+ last_edited_at: "2026-05-03T10:00:00Z",
+ generation_metadata: {
+ source_theme_ids: [1, 2],
+ source_idea_ids: [4],
+ },
+ sections: [],
+ original_pieces: [],
+ rendered_markdown: "# Draft",
+ rendered_html: "Draft ",
+ })
+
+ const formData = new FormData()
+ formData.set("redirectTo", "/drafts/9?project=4")
+ formData.set("sectionId", "12")
+
+ const response = await POST(buildRequest(formData), {
+ params: Promise.resolve({ id: "4", draftId: "9" }),
+ })
+
+ expect(regenerateProjectNewsletterDraftSection).toHaveBeenCalledWith(4, 9, 12)
+ expect(response.status).toBe(307)
+ await expect(getLocation(response)).resolves.toBe(
+ "http://localhost/drafts/9?project=4&message=Draft+section+regenerated.",
+ )
+ })
+
+ it("redirects with a queued message when regeneration is deferred", async () => {
+ vi.mocked(regenerateProjectNewsletterDraftSection).mockResolvedValue({
+ status: "queued",
+ draft_id: 9,
+ section_id: 12,
+ })
+
+ const formData = new FormData()
+ formData.set("sectionId", "12")
+
+ const response = await POST(buildRequest(formData), {
+ params: Promise.resolve({ id: "4", draftId: "9" }),
+ })
+
+ expect(response.status).toBe(307)
+ await expect(getLocation(response)).resolves.toBe(
+ "http://localhost/drafts/9?project=4&message=Draft+section+regeneration+queued.",
+ )
+ })
+
+ it("returns JSON mode responses for inline regeneration", async () => {
+ vi.mocked(regenerateProjectNewsletterDraftSection).mockResolvedValue({
+ status: "queued",
+ draft_id: 9,
+ section_id: 12,
+ })
+
+ const formData = new FormData()
+ formData.set("sectionId", "12")
+
+ const response = await POST(
+ new Request(
+ "http://localhost/api/projects/4/drafts/9/regenerate-section?mode=json",
+ {
+ method: "POST",
+ body: formData,
+ },
+ ),
+ {
+ params: Promise.resolve({ id: "4", draftId: "9" }),
+ },
+ )
+
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({
+ message: "Draft section regeneration queued.",
+ })
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/drafts/[draftId]/regenerate-section/route.ts b/frontend/src/app/api/projects/[id]/drafts/[draftId]/regenerate-section/route.ts
new file mode 100644
index 00000000..d0feb76c
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/drafts/[draftId]/regenerate-section/route.ts
@@ -0,0 +1,48 @@
+import { NextResponse } from "next/server"
+
+import { regenerateProjectNewsletterDraftSection } from "@/lib/api"
+
+import { buildDraftRedirectUrl } from "../../../draft-action-helpers"
+
+/**
+ * Handle per-section newsletter draft regeneration requests.
+ */
+export async function POST(
+ request: Request,
+ context: { params: Promise<{ id: string; draftId: string }> },
+) {
+ const { id, draftId } = await context.params
+ const responseMode = new URL(request.url).searchParams.get("mode")
+ const formData = await request.formData()
+ const redirectTo = String(formData.get("redirectTo") || `/drafts/${draftId}?project=${id}`)
+
+ try {
+ const response = await regenerateProjectNewsletterDraftSection(
+ Number.parseInt(id, 10),
+ Number.parseInt(draftId, 10),
+ Number.parseInt(String(formData.get("sectionId") || "0"), 10),
+ )
+ const message = "section_id" in response
+ ? "Draft section regeneration queued."
+ : "Draft section regenerated."
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { message }),
+ )
+ } catch (error) {
+ const message =
+ error instanceof Error ? error.message : "Unable to regenerate draft section."
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message }, { status: 400 })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { error: message }),
+ )
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/drafts/[draftId]/route.test.ts b/frontend/src/app/api/projects/[id]/drafts/[draftId]/route.test.ts
new file mode 100644
index 00000000..480385df
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/drafts/[draftId]/route.test.ts
@@ -0,0 +1,96 @@
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import { updateProjectNewsletterDraft } from "@/lib/api"
+
+import { POST } from "./route"
+
+vi.mock("@/lib/api", () => ({
+ updateProjectNewsletterDraft: vi.fn(),
+}))
+
+function buildRequest(formData: FormData) {
+ return new Request("http://localhost/api/projects/4/drafts/9", {
+ method: "POST",
+ body: formData,
+ })
+}
+
+async function getLocation(response: Response) {
+ return response.headers.get("location")
+}
+
+describe("POST /api/projects/[id]/drafts/[draftId]", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ it("updates the draft and redirects with a success message", async () => {
+ vi.mocked(updateProjectNewsletterDraft).mockResolvedValue(undefined as never)
+
+ const formData = new FormData()
+ formData.set("redirectTo", "/drafts/9?project=4")
+ formData.set("title", "Updated draft")
+ formData.set("intro", "Updated intro")
+ formData.set("outro", "Updated outro")
+ formData.set("target_publish_date", "2026-05-10")
+
+ const response = await POST(buildRequest(formData), {
+ params: Promise.resolve({ id: "4", draftId: "9" }),
+ })
+
+ expect(updateProjectNewsletterDraft).toHaveBeenCalledWith(4, 9, {
+ title: "Updated draft",
+ intro: "Updated intro",
+ outro: "Updated outro",
+ target_publish_date: "2026-05-10",
+ })
+ expect(response.status).toBe(307)
+ await expect(getLocation(response)).resolves.toBe(
+ "http://localhost/drafts/9?project=4&message=Draft+updated.",
+ )
+ })
+
+ it("normalizes an empty publish date to null", async () => {
+ vi.mocked(updateProjectNewsletterDraft).mockResolvedValue(undefined as never)
+
+ const formData = new FormData()
+ formData.set("title", "Updated draft")
+ formData.set("intro", "")
+ formData.set("outro", "")
+ formData.set("target_publish_date", "")
+
+ await POST(buildRequest(formData), {
+ params: Promise.resolve({ id: "4", draftId: "9" }),
+ })
+
+ expect(updateProjectNewsletterDraft).toHaveBeenCalledWith(4, 9, {
+ title: "Updated draft",
+ intro: "",
+ outro: "",
+ target_publish_date: null,
+ })
+ })
+
+ it("returns JSON mode responses for client-side saves", async () => {
+ vi.mocked(updateProjectNewsletterDraft).mockResolvedValue(undefined as never)
+
+ const formData = new FormData()
+ formData.set("title", "Updated draft")
+ formData.set("intro", "Updated intro")
+ formData.set("outro", "Updated outro")
+ formData.set("target_publish_date", "2026-05-10")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/drafts/9?mode=json", {
+ method: "POST",
+ body: formData,
+ }),
+ {
+ params: Promise.resolve({ id: "4", draftId: "9" }),
+ },
+ )
+
+ expect(response.status).toBe(200)
+ await expect(response.json()).resolves.toEqual({ message: "Draft updated." })
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/drafts/[draftId]/route.ts b/frontend/src/app/api/projects/[id]/drafts/[draftId]/route.ts
new file mode 100644
index 00000000..d85ce638
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/drafts/[draftId]/route.ts
@@ -0,0 +1,46 @@
+import { NextResponse } from "next/server"
+
+import { updateProjectNewsletterDraft } from "@/lib/api"
+
+import { buildDraftRedirectUrl } from "../../draft-action-helpers"
+
+/**
+ * Handle top-level newsletter draft edits.
+ */
+export async function POST(
+ request: Request,
+ context: { params: Promise<{ id: string; draftId: string }> },
+) {
+ const { id, draftId } = await context.params
+ const responseMode = new URL(request.url).searchParams.get("mode")
+ const formData = await request.formData()
+ const redirectTo = String(formData.get("redirectTo") || `/drafts/${draftId}?project=${id}`)
+
+ try {
+ await updateProjectNewsletterDraft(Number.parseInt(id, 10), Number.parseInt(draftId, 10), {
+ title: String(formData.get("title") || ""),
+ intro: String(formData.get("intro") || ""),
+ outro: String(formData.get("outro") || ""),
+ target_publish_date: String(formData.get("target_publish_date") || "") || null,
+ })
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message: "Draft updated." })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { message: "Draft updated." }),
+ )
+ } catch (error) {
+ const message =
+ error instanceof Error ? error.message : "Unable to save newsletter draft."
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message }, { status: 400 })
+ }
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { error: message }),
+ )
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/drafts/generate/route.test.ts b/frontend/src/app/api/projects/[id]/drafts/generate/route.test.ts
new file mode 100644
index 00000000..b205cfec
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/drafts/generate/route.test.ts
@@ -0,0 +1,100 @@
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import {
+ generateProjectNewsletterDraft,
+ isCompletedNewsletterDraftGeneration,
+} from "@/lib/api"
+
+import { POST } from "./route"
+
+vi.mock("@/lib/api", () => ({
+ generateProjectNewsletterDraft: vi.fn(),
+ isCompletedNewsletterDraftGeneration: vi.fn(),
+}))
+
+function buildRequest(formData: FormData) {
+ return new Request("http://localhost/api/projects/4/drafts/generate", {
+ method: "POST",
+ body: formData,
+ })
+}
+
+async function getLocation(response: Response) {
+ return response.headers.get("location")
+}
+
+describe("POST /api/projects/[id]/drafts/generate", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ vi.mocked(isCompletedNewsletterDraftGeneration).mockImplementation(
+ (response) => response.status === "completed",
+ )
+ })
+
+ it("redirects with a success message when a draft is generated immediately", async () => {
+ vi.mocked(generateProjectNewsletterDraft).mockResolvedValue({
+ status: "completed",
+ project_id: 4,
+ result: {
+ project_id: 4,
+ draft_id: 9,
+ status: "ready",
+ sections_created: 2,
+ original_pieces_created: 1,
+ },
+ })
+
+ const formData = new FormData()
+ formData.set("redirectTo", "/drafts?project=4&status=ready")
+
+ const response = await POST(buildRequest(formData), {
+ params: Promise.resolve({ id: "4" }),
+ })
+
+ expect(generateProjectNewsletterDraft).toHaveBeenCalledWith(4)
+ expect(response.status).toBe(307)
+ await expect(getLocation(response)).resolves.toBe(
+ "http://localhost/drafts?project=4&status=ready&message=Newsletter+draft+generated.",
+ )
+ })
+
+ it("redirects with an informative no-op message when inputs are insufficient", async () => {
+ vi.mocked(generateProjectNewsletterDraft).mockResolvedValue({
+ status: "completed",
+ project_id: 4,
+ result: {
+ project_id: 4,
+ draft_id: null,
+ status: "skipped",
+ reason: "insufficient_inputs",
+ sections_created: 0,
+ original_pieces_created: 0,
+ },
+ })
+
+ const response = await POST(buildRequest(new FormData()), {
+ params: Promise.resolve({ id: "4" }),
+ })
+
+ expect(response.status).toBe(307)
+ await expect(getLocation(response)).resolves.toBe(
+ "http://localhost/drafts?project=4&message=No+newsletter+draft+was+created+because+the+project+needs+at+least+two+accepted+themes+and+one+accepted+original+idea.",
+ )
+ })
+
+ it("redirects with a queued message when generation is deferred", async () => {
+ vi.mocked(generateProjectNewsletterDraft).mockResolvedValue({
+ status: "queued",
+ project_id: 4,
+ })
+
+ const response = await POST(buildRequest(new FormData()), {
+ params: Promise.resolve({ id: "4" }),
+ })
+
+ expect(response.status).toBe(307)
+ await expect(getLocation(response)).resolves.toBe(
+ "http://localhost/drafts?project=4&message=Newsletter+draft+generation+queued.",
+ )
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/drafts/generate/route.ts b/frontend/src/app/api/projects/[id]/drafts/generate/route.ts
new file mode 100644
index 00000000..44477687
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/drafts/generate/route.ts
@@ -0,0 +1,42 @@
+import { NextResponse } from "next/server"
+
+import {
+ generateProjectNewsletterDraft,
+ isCompletedNewsletterDraftGeneration,
+} from "@/lib/api"
+
+import { buildDraftRedirectUrl } from "../../draft-action-helpers"
+
+/**
+ * Handle manual newsletter draft generation requests from the drafts queue.
+ */
+export async function POST(
+ request: Request,
+ context: { params: Promise<{ id: string }> },
+) {
+ const { id } = await context.params
+ const formData = await request.formData()
+ const redirectTo = String(formData.get("redirectTo") || `/drafts?project=${id}`)
+
+ try {
+ const projectId = Number.parseInt(id, 10)
+ const response = await generateProjectNewsletterDraft(projectId)
+ const message = isCompletedNewsletterDraftGeneration(response)
+ ? response.result.draft_id
+ ? "Newsletter draft generated."
+ : response.result.reason === "insufficient_inputs"
+ ? "No newsletter draft was created because the project needs at least two accepted themes and one accepted original idea."
+ : "No newsletter draft was created."
+ : "Newsletter draft generation queued."
+
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { message }),
+ )
+ } catch (error) {
+ const message =
+ error instanceof Error ? error.message : "Unable to generate newsletter draft."
+ return NextResponse.redirect(
+ buildDraftRedirectUrl(request, redirectTo, { error: message }),
+ )
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/entity-candidate-bulk/route.test.ts b/frontend/src/app/api/projects/[id]/entity-candidate-bulk/route.test.ts
new file mode 100644
index 00000000..9fa513ba
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/entity-candidate-bulk/route.test.ts
@@ -0,0 +1,106 @@
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import {
+ acceptEntityCandidate,
+ mergeEntityCandidate,
+ rejectEntityCandidate,
+} from "@/lib/api"
+
+import { POST } from "./route"
+
+vi.mock("@/lib/api", () => ({
+ acceptEntityCandidate: vi.fn(),
+ mergeEntityCandidate: vi.fn(),
+ rejectEntityCandidate: vi.fn(),
+}))
+
+describe("POST /api/projects/[id]/entity-candidate-bulk", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ it("accepts all candidates in the submitted cluster", async () => {
+ const formData = new FormData()
+ formData.append("candidateId", "14")
+ formData.append("candidateId", "15")
+ formData.set("redirectTo", "/entities/candidates?project=4")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/entity-candidate-bulk", {
+ method: "POST",
+ body: formData,
+ }),
+ { params: Promise.resolve({ id: "4" }) },
+ )
+
+ expect(acceptEntityCandidate).toHaveBeenNthCalledWith(1, 14, 4)
+ expect(acceptEntityCandidate).toHaveBeenNthCalledWith(2, 15, 4)
+ expect(response.status).toBe(307)
+ expect(response.headers.get("location")).toBe(
+ "http://localhost/entities/candidates?project=4&message=Accepted+2+candidates.",
+ )
+ })
+
+ it("rejects all candidates in the submitted cluster", async () => {
+ const formData = new FormData()
+ formData.append("candidateId", "14")
+ formData.set("intent", "reject")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/entity-candidate-bulk", {
+ method: "POST",
+ body: formData,
+ }),
+ { params: Promise.resolve({ id: "4" }) },
+ )
+
+ expect(rejectEntityCandidate).toHaveBeenCalledWith(14, 4)
+ expect(response.headers.get("location")).toBe(
+ "http://localhost/entities/candidates?project=4&message=Rejected+1+candidate.",
+ )
+ })
+
+ it("merges all candidates into the selected entity", async () => {
+ const formData = new FormData()
+ formData.append("candidateId", "14")
+ formData.append("candidateId", "15")
+ formData.set("intent", "merge")
+ formData.set("mergedInto", "9")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/entity-candidate-bulk", {
+ method: "POST",
+ body: formData,
+ }),
+ { params: Promise.resolve({ id: "4" }) },
+ )
+
+ expect(mergeEntityCandidate).toHaveBeenNthCalledWith(1, 14, 4, 9)
+ expect(mergeEntityCandidate).toHaveBeenNthCalledWith(2, 15, 4, 9)
+ expect(response.headers.get("location")).toBe(
+ "http://localhost/entities/candidates?project=4&message=Merged+2+candidates.",
+ )
+ })
+
+ it("returns a validation error when merge target is missing", async () => {
+ const formData = new FormData()
+ formData.append("candidateId", "14")
+ formData.set("intent", "merge")
+
+ const response = await POST(
+ new Request(
+ "http://localhost/api/projects/4/entity-candidate-bulk?mode=json",
+ {
+ method: "POST",
+ body: formData,
+ },
+ ),
+ { params: Promise.resolve({ id: "4" }) },
+ )
+
+ expect(response.status).toBe(400)
+ await expect(response.json()).resolves.toEqual({
+ message: "Select an entity to merge into.",
+ })
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/entity-candidate-bulk/route.ts b/frontend/src/app/api/projects/[id]/entity-candidate-bulk/route.ts
new file mode 100644
index 00000000..05c35010
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/entity-candidate-bulk/route.ts
@@ -0,0 +1,90 @@
+import { NextResponse } from "next/server"
+
+import {
+ acceptEntityCandidate,
+ mergeEntityCandidate,
+ rejectEntityCandidate,
+} from "@/lib/api"
+
+function buildRedirectUrl(
+ request: Request,
+ redirectTo: string,
+ params: Record,
+) {
+ const url = new URL(redirectTo || "/entities/candidates", request.url)
+ for (const [key, value] of Object.entries(params)) {
+ url.searchParams.set(key, value)
+ }
+ return url
+}
+
+/**
+ * Handle bulk candidate review actions for one clustered candidate group.
+ */
+export async function POST(
+ request: Request,
+ context: { params: Promise<{ id: string }> },
+) {
+ const { id } = await context.params
+ const responseMode = new URL(request.url).searchParams.get("mode")
+ const formData = await request.formData()
+ const redirectTo = String(
+ formData.get("redirectTo") || `/entities/candidates?project=${id}`,
+ )
+
+ try {
+ const projectId = Number.parseInt(id, 10)
+ const intent = String(formData.get("intent") || "accept")
+ const candidateIds = formData
+ .getAll("candidateId")
+ .map((value) => Number.parseInt(String(value), 10))
+ .filter((candidateId) => Number.isInteger(candidateId) && candidateId > 0)
+
+ if (candidateIds.length === 0) {
+ throw new Error("Select at least one entity candidate.")
+ }
+
+ let message = "Candidates accepted."
+
+ if (intent === "reject") {
+ for (const candidateId of candidateIds) {
+ await rejectEntityCandidate(candidateId, projectId)
+ }
+ message = `Rejected ${candidateIds.length} candidate${candidateIds.length === 1 ? "" : "s"}.`
+ } else if (intent === "merge") {
+ const mergedInto = Number.parseInt(
+ String(formData.get("mergedInto") || "0"),
+ 10,
+ )
+ if (!Number.isInteger(mergedInto) || mergedInto <= 0) {
+ throw new Error("Select an entity to merge into.")
+ }
+ for (const candidateId of candidateIds) {
+ await mergeEntityCandidate(candidateId, projectId, mergedInto)
+ }
+ message = `Merged ${candidateIds.length} candidate${candidateIds.length === 1 ? "" : "s"}.`
+ } else {
+ for (const candidateId of candidateIds) {
+ await acceptEntityCandidate(candidateId, projectId)
+ }
+ message = `Accepted ${candidateIds.length} candidate${candidateIds.length === 1 ? "" : "s"}.`
+ }
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message })
+ }
+
+ return NextResponse.redirect(buildRedirectUrl(request, redirectTo, { message }))
+ } catch (error) {
+ const message =
+ error instanceof Error
+ ? error.message
+ : "Unable to update entity candidates."
+
+ if (responseMode === "json") {
+ return NextResponse.json({ message }, { status: 400 })
+ }
+
+ return NextResponse.redirect(buildRedirectUrl(request, redirectTo, { error: message }))
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/linkedin-source-configs/route.test.ts b/frontend/src/app/api/projects/[id]/linkedin-source-configs/route.test.ts
new file mode 100644
index 00000000..bb422388
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/linkedin-source-configs/route.test.ts
@@ -0,0 +1,67 @@
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import { createSourceConfig } from "@/lib/api"
+
+import { POST } from "./route"
+
+vi.mock("@/lib/api", () => ({
+ createSourceConfig: vi.fn(),
+}))
+
+describe("POST /api/projects/[id]/linkedin-source-configs", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ it("creates an organization LinkedIn source", async () => {
+ const formData = new FormData()
+ formData.set("surface", "organization")
+ formData.set("urn", "urn:li:organization:1337")
+ formData.set("max_posts_per_fetch", "75")
+ formData.set("redirectTo", "/admin/sources?project=4")
+
+ const response = await POST(
+ new Request("http://localhost/api/projects/4/linkedin-source-configs", {
+ method: "POST",
+ body: formData,
+ }),
+ { params: Promise.resolve({ id: "4" }) },
+ )
+
+ expect(createSourceConfig).toHaveBeenCalledWith(4, {
+ plugin_name: "linkedin",
+ config: {
+ organization_urn: "urn:li:organization:1337",
+ max_posts_per_fetch: 75,
+ },
+ is_active: true,
+ })
+ expect(response.headers.get("location")).toBe(
+ "http://localhost/admin/sources?project=4&message=LinkedIn+source+created.",
+ )
+ })
+
+ it("creates a person LinkedIn source with reshare choice", async () => {
+ const formData = new FormData()
+ formData.set("surface", "person")
+ formData.set("urn", "urn:li:person:abc123")
+ formData.set("include_reshares", "true")
+
+ await POST(
+ new Request("http://localhost/api/projects/4/linkedin-source-configs", {
+ method: "POST",
+ body: formData,
+ }),
+ { params: Promise.resolve({ id: "4" }) },
+ )
+
+ expect(createSourceConfig).toHaveBeenCalledWith(4, {
+ plugin_name: "linkedin",
+ config: {
+ person_urn: "urn:li:person:abc123",
+ include_reshares: true,
+ },
+ is_active: true,
+ })
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/api/projects/[id]/linkedin-source-configs/route.ts b/frontend/src/app/api/projects/[id]/linkedin-source-configs/route.ts
new file mode 100644
index 00000000..e0591b0a
--- /dev/null
+++ b/frontend/src/app/api/projects/[id]/linkedin-source-configs/route.ts
@@ -0,0 +1,71 @@
+import { NextResponse } from "next/server"
+
+import { createSourceConfig } from "@/lib/api"
+
+function buildRedirectUrl(
+ request: Request,
+ redirectTo: string,
+ params: Record,
+) {
+ const url = new URL(redirectTo || "/admin/sources", request.url)
+ for (const [key, value] of Object.entries(params)) {
+ url.searchParams.set(key, value)
+ }
+ return url
+}
+
+/**
+ * Handle typed LinkedIn source-config creation requests.
+ */
+export async function POST(
+ request: Request,
+ context: { params: Promise<{ id: string }> },
+) {
+ const { id } = await context.params
+ const formData = await request.formData()
+ const redirectTo = String(formData.get("redirectTo") || "/admin/sources")
+
+ try {
+ const projectId = Number.parseInt(id, 10)
+ const surface = String(formData.get("surface") || "organization")
+ const urn = String(formData.get("urn") || "").trim()
+ if (!urn) {
+ throw new Error("Enter a LinkedIn URN.")
+ }
+
+ const config: Record = {}
+ if (surface === "person") {
+ config.person_urn = urn
+ config.include_reshares =
+ String(formData.get("include_reshares") || "false") === "true"
+ } else if (surface === "newsletter") {
+ config.newsletter_urn = urn
+ config.max_posts_per_fetch = Number.parseInt(
+ String(formData.get("max_posts_per_fetch") || "25"),
+ 10,
+ )
+ } else {
+ config.organization_urn = urn
+ config.max_posts_per_fetch = Number.parseInt(
+ String(formData.get("max_posts_per_fetch") || "50"),
+ 10,
+ )
+ }
+
+ await createSourceConfig(projectId, {
+ plugin_name: "linkedin",
+ config,
+ is_active: String(formData.get("is_active") || "true") === "true",
+ })
+
+ return NextResponse.redirect(
+ buildRedirectUrl(request, redirectTo, { message: "LinkedIn source created." }),
+ )
+ } catch (error) {
+ const message =
+ error instanceof Error
+ ? error.message
+ : "Unable to create LinkedIn source configuration."
+ return NextResponse.redirect(buildRedirectUrl(request, redirectTo, { error: message }))
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/drafts/[draftId]/_components/DraftEditor/index.test.tsx b/frontend/src/app/drafts/[draftId]/_components/DraftEditor/index.test.tsx
new file mode 100644
index 00000000..276537f1
--- /dev/null
+++ b/frontend/src/app/drafts/[draftId]/_components/DraftEditor/index.test.tsx
@@ -0,0 +1,230 @@
+import { fireEvent, render, screen, waitFor } from "@testing-library/react"
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import { DraftEditor } from "@/app/drafts/[draftId]/_components/DraftEditor"
+import type { NewsletterDraft } from "@/lib/types"
+
+const { refreshMock } = vi.hoisted(() => ({
+ refreshMock: vi.fn(),
+}))
+
+vi.mock("next/navigation", () => ({
+ useRouter: () => ({
+ push: vi.fn(),
+ replace: vi.fn(),
+ prefetch: vi.fn(),
+ back: vi.fn(),
+ refresh: refreshMock,
+ }),
+}))
+
+function createDraft(overrides: Partial = {}): NewsletterDraft {
+ return {
+ id: 8,
+ project: 1,
+ title: "AI Weekly: Delivery signals and more",
+ intro: "A quick editor-ready summary.",
+ outro: "Closing thought.",
+ target_publish_date: "2026-05-08",
+ status: "ready",
+ generated_at: "2026-05-03T09:00:00Z",
+ last_edited_at: null,
+ generation_metadata: {
+ source_theme_ids: [1, 2],
+ source_idea_ids: [4],
+ trigger_source: "manual",
+ models: { section_composer: "heuristic" },
+ coherence_suggestions: ["Tighten the intro transition."],
+ },
+ sections: [
+ {
+ id: 21,
+ draft: 8,
+ theme_suggestion: 3,
+ theme_suggestion_detail: {
+ id: 3,
+ title: "Delivery signals",
+ pitch: "Pitch",
+ why_it_matters: "Why it matters",
+ },
+ title: "Delivery signals",
+ lede: "Section lede.",
+ order: 0,
+ items: [
+ {
+ id: 44,
+ section: 21,
+ content: 55,
+ content_detail: {
+ id: 55,
+ url: "https://example.com/post",
+ title: "Useful article",
+ source_plugin: "rss",
+ published_date: "2026-05-02T10:00:00Z",
+ },
+ summary_used: "Item summary.",
+ why_it_matters: "Item why.",
+ order: 0,
+ },
+ {
+ id: 45,
+ section: 21,
+ content: 56,
+ content_detail: {
+ id: 56,
+ url: "https://example.com/post-2",
+ title: "Second article",
+ source_plugin: "reddit",
+ published_date: "2026-05-02T11:00:00Z",
+ },
+ summary_used: "Second summary.",
+ why_it_matters: "Second why.",
+ order: 1,
+ },
+ ],
+ },
+ {
+ id: 22,
+ draft: 8,
+ theme_suggestion: null,
+ theme_suggestion_detail: null,
+ title: "Second section",
+ lede: "Second lede.",
+ order: 1,
+ items: [],
+ },
+ ],
+ original_pieces: [
+ {
+ id: 31,
+ draft: 8,
+ idea: 9,
+ idea_detail: {
+ id: 9,
+ angle_title: "Original idea",
+ summary: "Summary",
+ suggested_outline: "1. Outline",
+ },
+ title: "Original idea",
+ pitch: "Pitch",
+ suggested_outline: "1. Outline",
+ order: 0,
+ },
+ {
+ id: 32,
+ draft: 8,
+ idea: 10,
+ idea_detail: {
+ id: 10,
+ angle_title: "Second idea",
+ summary: "Summary",
+ suggested_outline: "1. Outline",
+ },
+ title: "Second idea",
+ pitch: "Pitch",
+ suggested_outline: "1. Outline",
+ order: 1,
+ },
+ ],
+ rendered_markdown: "# Draft",
+ rendered_html: "Draft ",
+ ...overrides,
+ }
+}
+
+describe("DraftEditor", () => {
+ beforeEach(() => {
+ refreshMock.mockReset()
+ vi.restoreAllMocks()
+ })
+
+ it("saves top-level draft framing through the JSON route", async () => {
+ const fetchMock = vi.fn().mockResolvedValue({
+ ok: true,
+ json: async () => ({ message: "Draft updated." }),
+ })
+ vi.stubGlobal("fetch", fetchMock)
+
+ render(
+ ,
+ )
+
+ fireEvent.change(screen.getByLabelText("Title"), {
+ target: { value: "Updated draft title" },
+ })
+ fireEvent.click(screen.getByRole("button", { name: "Save draft framing" }))
+
+ await waitFor(() => {
+ expect(fetchMock).toHaveBeenCalledWith(
+ "http://localhost:3000/api/projects/1/drafts/8?mode=json",
+ expect.objectContaining({ method: "POST" }),
+ )
+ })
+
+ expect(await screen.findByRole("status")).toHaveTextContent("Draft updated.")
+ expect(refreshMock).toHaveBeenCalled()
+ })
+
+ it("removes a draft item through the JSON route", async () => {
+ const fetchMock = vi.fn().mockResolvedValue({
+ ok: true,
+ json: async () => ({ message: "Draft item removed." }),
+ })
+ vi.stubGlobal("fetch", fetchMock)
+
+ render(
+ ,
+ )
+
+ fireEvent.click(screen.getAllByRole("button", { name: "Remove item" })[0])
+
+ await waitFor(() => {
+ expect(fetchMock).toHaveBeenCalledWith(
+ "http://localhost:3000/api/projects/1/draft-items/44?mode=json",
+ expect.objectContaining({ method: "POST" }),
+ )
+ })
+
+ expect(await screen.findByRole("status")).toHaveTextContent(
+ "Draft item removed.",
+ )
+ expect(refreshMock).toHaveBeenCalled()
+ })
+
+ it("reorders sections through the JSON route", async () => {
+ const fetchMock = vi.fn().mockResolvedValue({
+ ok: true,
+ json: async () => ({ message: "Section moved down." }),
+ })
+ vi.stubGlobal("fetch", fetchMock)
+
+ render(
+ ,
+ )
+
+ fireEvent.click(screen.getAllByRole("button", { name: "Move down" })[0])
+
+ await waitFor(() => {
+ expect(fetchMock).toHaveBeenCalledWith(
+ "http://localhost:3000/api/projects/1/draft-sections/21?mode=json",
+ expect.objectContaining({ method: "POST" }),
+ )
+ })
+
+ expect(await screen.findByRole("status")).toHaveTextContent(
+ "Section moved down.",
+ )
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/drafts/[draftId]/_components/DraftEditor/index.tsx b/frontend/src/app/drafts/[draftId]/_components/DraftEditor/index.tsx
new file mode 100644
index 00000000..b4fad608
--- /dev/null
+++ b/frontend/src/app/drafts/[draftId]/_components/DraftEditor/index.tsx
@@ -0,0 +1,643 @@
+"use client"
+
+import Link from "next/link"
+import { useRouter } from "next/navigation"
+import type { FormEvent } from "react"
+import { useState } from "react"
+
+import type { NewsletterDraft } from "@/lib/types"
+
+type DraftEditorProps = {
+ /** Numeric project identifier used by the route handlers. */
+ projectId: number
+ /** Redirect target reused by the draft route handlers for non-JS fallbacks. */
+ currentPageHref: string
+ /** Fully expanded draft tree shown in the editor. */
+ draft: NewsletterDraft
+}
+
+type JsonDraftActionResponse = {
+ message?: string
+}
+
+function appendJsonMode(route: string) {
+ const url = new URL(route, window.location.href)
+ url.searchParams.set("mode", "json")
+ return url.toString()
+}
+
+/**
+ * Render the interactive newsletter draft editor.
+ *
+ * The editor saves through the local App Router route handlers in `mode=json`, so
+ * inline edits, deletions, and reorder actions complete with a lightweight refresh
+ * rather than a full-page navigation. The same form actions remain present in the
+ * markup for progressive enhancement when JavaScript is unavailable.
+ */
+export function DraftEditor({
+ projectId,
+ currentPageHref,
+ draft,
+}: DraftEditorProps) {
+ const router = useRouter()
+ const [pendingAction, setPendingAction] = useState(null)
+ const [statusMessage, setStatusMessage] = useState(null)
+ const [errorMessage, setErrorMessage] = useState(null)
+
+ async function submitJsonAction(
+ actionKey: string,
+ route: string,
+ formData: FormData,
+ fallbackError: string,
+ ) {
+ setPendingAction(actionKey)
+ setStatusMessage(null)
+ setErrorMessage(null)
+
+ try {
+ const response = await fetch(appendJsonMode(route), {
+ method: "POST",
+ body: formData,
+ })
+ const payload =
+ ((await response.json()) as JsonDraftActionResponse | null) ?? null
+
+ if (!response.ok || !payload?.message) {
+ throw new Error(payload?.message || fallbackError)
+ }
+
+ setStatusMessage(payload.message)
+ router.refresh()
+ } catch (error) {
+ setErrorMessage(error instanceof Error ? error.message : fallbackError)
+ } finally {
+ setPendingAction(null)
+ }
+ }
+
+ async function handleFormSubmit(
+ event: FormEvent,
+ actionKey: string,
+ route: string,
+ fallbackError: string,
+ ) {
+ event.preventDefault()
+ await submitJsonAction(
+ actionKey,
+ route,
+ new FormData(event.currentTarget),
+ fallbackError,
+ )
+ }
+
+ async function handleIntentAction(
+ actionKey: string,
+ route: string,
+ fields: Record,
+ fallbackError: string,
+ ) {
+ const formData = new FormData()
+ for (const [key, value] of Object.entries(fields)) {
+ formData.set(key, value)
+ }
+ await submitJsonAction(actionKey, route, formData, fallbackError)
+ }
+
+ function isPending(actionKey: string) {
+ return pendingAction === actionKey
+ }
+
+ const draftRoute = `/api/projects/${projectId}/drafts/${draft.id}`
+ const regenerateRoute = `${draftRoute}/regenerate-section`
+
+ return (
+
+
+ {statusMessage ? (
+
+ {statusMessage}
+
+ ) : null}
+ {errorMessage ? (
+
+ {errorMessage}
+
+ ) : null}
+
+
+
+
+
+ {draft.sections.map((section, sectionIndex) => {
+ const sectionRoute = `/api/projects/${projectId}/draft-sections/${section.id}`
+ const previousSection = draft.sections[sectionIndex - 1]
+ const nextSection = draft.sections[sectionIndex + 1]
+
+ return (
+
+ {
+ void handleFormSubmit(
+ event,
+ `section-save-${section.id}`,
+ sectionRoute,
+ "Unable to save draft section.",
+ )
+ }}
+ >
+
+
+
+
+
Section {section.order + 1}
+
Section title
+
+
+
+ Section lede
+
+
+
+
+ {
+ if (!previousSection) {
+ return
+ }
+ void handleIntentAction(
+ `section-up-${section.id}`,
+ sectionRoute,
+ {
+ redirectTo: currentPageHref,
+ intent: "move_up",
+ currentOrder: String(section.order),
+ targetOrder: String(previousSection.order),
+ swapWithId: String(previousSection.id),
+ },
+ "Unable to reorder draft section.",
+ )
+ }}
+ type="button"
+ >
+ Move up
+
+ {
+ if (!nextSection) {
+ return
+ }
+ void handleIntentAction(
+ `section-down-${section.id}`,
+ sectionRoute,
+ {
+ redirectTo: currentPageHref,
+ intent: "move_down",
+ currentOrder: String(section.order),
+ targetOrder: String(nextSection.order),
+ swapWithId: String(nextSection.id),
+ },
+ "Unable to reorder draft section.",
+ )
+ }}
+ type="button"
+ >
+ Move down
+
+
+ {isPending(`section-save-${section.id}`)
+ ? "Saving section..."
+ : "Save section"}
+
+ {
+ void handleIntentAction(
+ `section-regenerate-${section.id}`,
+ regenerateRoute,
+ {
+ redirectTo: currentPageHref,
+ sectionId: String(section.id),
+ },
+ "Unable to regenerate draft section.",
+ )
+ }}
+ type="button"
+ >
+ {isPending(`section-regenerate-${section.id}`)
+ ? "Regenerating..."
+ : "Regenerate section"}
+
+ {
+ void handleIntentAction(
+ `section-delete-${section.id}`,
+ sectionRoute,
+ {
+ redirectTo: currentPageHref,
+ intent: "delete",
+ },
+ "Unable to remove draft section.",
+ )
+ }}
+ type="button"
+ >
+ Remove section
+
+
+
+
+
+ {section.theme_suggestion_detail ? (
+
+
+ {section.theme_suggestion_detail.title}
+
+ {section.theme_suggestion_detail.why_it_matters}
+
+ ) : null}
+
+
+ {section.items.map((item, itemIndex) => {
+ const itemRoute = `/api/projects/${projectId}/draft-items/${item.id}`
+ const previousItem = section.items[itemIndex - 1]
+ const nextItem = section.items[itemIndex + 1]
+
+ return (
+
{
+ void handleFormSubmit(
+ event,
+ `item-save-${item.id}`,
+ itemRoute,
+ "Unable to save draft item.",
+ )
+ }}
+ >
+
+
+
+ {item.content_detail.title}
+
+ {item.content_detail.source_plugin}
+
+
+ Summary
+
+
+
+ Why it matters
+
+
+
+ {
+ if (!previousItem) {
+ return
+ }
+ void handleIntentAction(
+ `item-up-${item.id}`,
+ itemRoute,
+ {
+ redirectTo: currentPageHref,
+ intent: "move_up",
+ currentOrder: String(item.order),
+ targetOrder: String(previousItem.order),
+ swapWithId: String(previousItem.id),
+ },
+ "Unable to reorder draft item.",
+ )
+ }}
+ type="button"
+ >
+ Move up
+
+ {
+ if (!nextItem) {
+ return
+ }
+ void handleIntentAction(
+ `item-down-${item.id}`,
+ itemRoute,
+ {
+ redirectTo: currentPageHref,
+ intent: "move_down",
+ currentOrder: String(item.order),
+ targetOrder: String(nextItem.order),
+ swapWithId: String(nextItem.id),
+ },
+ "Unable to reorder draft item.",
+ )
+ }}
+ type="button"
+ >
+ Move down
+
+
+ {isPending(`item-save-${item.id}`)
+ ? "Saving item..."
+ : "Save item"}
+
+ {
+ void handleIntentAction(
+ `item-delete-${item.id}`,
+ itemRoute,
+ {
+ redirectTo: currentPageHref,
+ intent: "delete",
+ },
+ "Unable to remove draft item.",
+ )
+ }}
+ type="button"
+ >
+ Remove item
+
+
+
+ )
+ })}
+
+
+ )
+ })}
+
+
+
+
+ Original pieces
+
+ Use the move buttons with keyboard focus to reorder sections, items, and original pieces without leaving the page.
+
+
+ {draft.original_pieces.map((piece, pieceIndex) => {
+ const pieceRoute = `/api/projects/${projectId}/draft-original-pieces/${piece.id}`
+ const previousPiece = draft.original_pieces[pieceIndex - 1]
+ const nextPiece = draft.original_pieces[pieceIndex + 1]
+
+ return (
+
{
+ void handleFormSubmit(
+ event,
+ `piece-save-${piece.id}`,
+ pieceRoute,
+ "Unable to save original piece.",
+ )
+ }}
+ >
+
+
+ Original piece title
+
+
+
+ Pitch
+
+
+
+ Suggested outline
+
+
+
+ {
+ if (!previousPiece) {
+ return
+ }
+ void handleIntentAction(
+ `piece-up-${piece.id}`,
+ pieceRoute,
+ {
+ redirectTo: currentPageHref,
+ intent: "move_up",
+ currentOrder: String(piece.order),
+ targetOrder: String(previousPiece.order),
+ swapWithId: String(previousPiece.id),
+ },
+ "Unable to reorder original piece.",
+ )
+ }}
+ type="button"
+ >
+ Move up
+
+ {
+ if (!nextPiece) {
+ return
+ }
+ void handleIntentAction(
+ `piece-down-${piece.id}`,
+ pieceRoute,
+ {
+ redirectTo: currentPageHref,
+ intent: "move_down",
+ currentOrder: String(piece.order),
+ targetOrder: String(nextPiece.order),
+ swapWithId: String(nextPiece.id),
+ },
+ "Unable to reorder original piece.",
+ )
+ }}
+ type="button"
+ >
+ Move down
+
+
+ {isPending(`piece-save-${piece.id}`)
+ ? "Saving original piece..."
+ : "Save original piece"}
+
+ {
+ void handleIntentAction(
+ `piece-delete-${piece.id}`,
+ pieceRoute,
+ {
+ redirectTo: currentPageHref,
+ intent: "delete",
+ },
+ "Unable to remove original piece.",
+ )
+ }}
+ type="button"
+ >
+ Remove original piece
+
+
+
+ )
+ })}
+
+
+
+ {draft.generation_metadata.error ? (
+
+ Generation error
+ {draft.generation_metadata.error}
+
+ ) : null}
+
+ {draft.generation_metadata.models ? (
+
+ Models used
+
+ {Object.entries(draft.generation_metadata.models).map(([key, value]) => (
+
+ {key} : {value}
+
+ ))}
+
+
+ ) : null}
+
+
+ )
+}
\ No newline at end of file
diff --git a/frontend/src/app/drafts/[draftId]/page.test.tsx b/frontend/src/app/drafts/[draftId]/page.test.tsx
new file mode 100644
index 00000000..cc63b0b2
--- /dev/null
+++ b/frontend/src/app/drafts/[draftId]/page.test.tsx
@@ -0,0 +1,195 @@
+import { render, screen } from "@testing-library/react"
+import type { ReactNode } from "react"
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import type { NewsletterDraft, Project } from "@/lib/types"
+
+const {
+ getProjectNewsletterDraftMock,
+ getProjectsMock,
+ selectProjectMock,
+} = vi.hoisted(() => ({
+ getProjectNewsletterDraftMock: vi.fn(),
+ getProjectsMock: vi.fn(),
+ selectProjectMock: vi.fn(),
+}))
+
+vi.mock("@/components/layout/AppShell", () => ({
+ AppShell: ({
+ children,
+ description,
+ title,
+ }: {
+ children: ReactNode
+ description: string
+ title: string
+ }) => (
+
+
{title}
+
{description}
+ {children}
+
+ ),
+}))
+
+vi.mock("@/components/elements/StatusBadge", () => ({
+ StatusBadge: ({
+ children,
+ tone,
+ }: {
+ children: ReactNode
+ tone: string
+ }) => (
+
+ {children}
+
+ ),
+}))
+
+vi.mock("@/app/drafts/[draftId]/_components/DraftEditor", () => ({
+ DraftEditor: ({ projectId }: { projectId: number }) => (
+ Draft editor for project {projectId}
+ ),
+}))
+
+vi.mock("@/lib/api", () => ({
+ getProjectNewsletterDraft: getProjectNewsletterDraftMock,
+ getProjects: getProjectsMock,
+}))
+
+vi.mock("@/lib/view-helpers", async () => {
+ const actual = await vi.importActual(
+ "@/lib/view-helpers",
+ )
+
+ return {
+ ...actual,
+ selectProject: selectProjectMock,
+ }
+})
+
+function createProject(overrides: Partial = {}): Project {
+ return {
+ id: 1,
+ name: "AI Weekly",
+ topic_description: "AI news",
+ content_retention_days: 30,
+ user_role: "admin",
+ created_at: "2026-04-01T00:00:00Z",
+ ...overrides,
+ }
+}
+
+function createDraft(overrides: Partial = {}): NewsletterDraft {
+ return {
+ id: 8,
+ project: 1,
+ title: "AI Weekly: Delivery signals and more",
+ intro: "A quick editor-ready summary.",
+ outro: "Closing thought.",
+ target_publish_date: "2026-05-08",
+ status: "ready",
+ generated_at: "2026-05-03T09:00:00Z",
+ last_edited_at: null,
+ generation_metadata: {
+ source_theme_ids: [1, 2],
+ source_idea_ids: [4],
+ trigger_source: "manual",
+ models: { section_composer: "heuristic" },
+ coherence_suggestions: ["Tighten the intro transition."],
+ },
+ sections: [
+ {
+ id: 21,
+ draft: 8,
+ theme_suggestion: 3,
+ theme_suggestion_detail: {
+ id: 3,
+ title: "Delivery signals",
+ pitch: "Pitch",
+ why_it_matters: "Why it matters",
+ },
+ title: "Delivery signals",
+ lede: "Section lede.",
+ order: 0,
+ items: [
+ {
+ id: 44,
+ section: 21,
+ content: 55,
+ content_detail: {
+ id: 55,
+ url: "https://example.com/post",
+ title: "Useful article",
+ source_plugin: "rss",
+ published_date: "2026-05-02T10:00:00Z",
+ },
+ summary_used: "Item summary.",
+ why_it_matters: "Item why.",
+ order: 0,
+ },
+ ],
+ },
+ ],
+ original_pieces: [
+ {
+ id: 31,
+ draft: 8,
+ idea: 9,
+ idea_detail: {
+ id: 9,
+ angle_title: "Original idea",
+ summary: "Summary",
+ suggested_outline: "1. Outline",
+ },
+ title: "Original idea",
+ pitch: "Pitch",
+ suggested_outline: "1. Outline",
+ order: 0,
+ },
+ ],
+ rendered_markdown: "# Draft",
+ rendered_html: "Draft ",
+ ...overrides,
+ }
+}
+
+async function renderDraftDetailPage(searchParams: Record = { project: "1" }) {
+ const { default: DraftDetailPage } = await import("./page")
+
+ return render(
+ await DraftDetailPage({
+ params: Promise.resolve({ draftId: "8" }),
+ searchParams: Promise.resolve(searchParams),
+ }),
+ )
+}
+
+describe("DraftDetailPage", () => {
+ beforeEach(() => {
+ const project = createProject()
+ getProjectsMock.mockReset()
+ getProjectNewsletterDraftMock.mockReset()
+ selectProjectMock.mockReset()
+
+ getProjectsMock.mockResolvedValue([project])
+ getProjectNewsletterDraftMock.mockResolvedValue(createDraft())
+ selectProjectMock.mockReturnValue(project)
+ })
+
+ it("renders the editor view with top-level form and section regeneration", async () => {
+ await renderDraftDetailPage()
+
+ expect(screen.getByText("Draft detail")).toBeInTheDocument()
+ expect(screen.getByTestId("draft-editor")).toHaveTextContent(
+ "Draft editor for project 1",
+ )
+ })
+
+ it("renders the markdown export view when requested", async () => {
+ await renderDraftDetailPage({ project: "1", view: "markdown" })
+
+ expect(screen.getByText("Rendered markdown")).toBeInTheDocument()
+ expect(screen.getByText("# Draft")).toBeInTheDocument()
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/drafts/[draftId]/page.tsx b/frontend/src/app/drafts/[draftId]/page.tsx
new file mode 100644
index 00000000..3fe4e7cb
--- /dev/null
+++ b/frontend/src/app/drafts/[draftId]/page.tsx
@@ -0,0 +1,171 @@
+import Link from "next/link"
+
+import { DraftEditor } from "@/app/drafts/[draftId]/_components/DraftEditor"
+import { StatusBadge } from "@/components/elements/StatusBadge"
+import { AppShell } from "@/components/layout/AppShell"
+import { getProjectNewsletterDraft, getProjects } from "@/lib/api"
+import type { NewsletterDraftStatus } from "@/lib/types"
+import {
+ formatDate,
+ getErrorMessage,
+ getSuccessMessage,
+ selectProject,
+} from "@/lib/view-helpers"
+
+type DraftDetailPageProps = {
+ /** Route params promise containing the draft id. */
+ params: Promise<{ draftId: string }>
+ /** Search params promise containing the optional `project`, `view`, `error`, and `message` values. */
+ searchParams: Promise>
+}
+
+function draftTone(status: NewsletterDraftStatus) {
+ switch (status) {
+ case "ready":
+ case "published":
+ return "positive" as const
+ case "discarded":
+ return "negative" as const
+ default:
+ return "warning" as const
+ }
+}
+
+function buildDraftDetailHref(projectId: number, draftId: number, view: string) {
+ const params = new URLSearchParams({ project: String(projectId) })
+ if (view && view !== "editor") {
+ params.set("view", view)
+ }
+ return `/drafts/${draftId}?${params.toString()}`
+}
+
+/**
+ * Render one newsletter draft detail view for the selected project.
+ */
+export default async function DraftDetailPage({
+ params,
+ searchParams,
+}: DraftDetailPageProps) {
+ const [{ draftId }, resolvedSearchParams] = await Promise.all([params, searchParams])
+ const projects = await getProjects()
+ const selectedProject = selectProject(projects, resolvedSearchParams)
+
+ if (!selectedProject) {
+ return (
+
+
+ Create a project first in Django admin.
+
+
+ )
+ }
+
+ const resolvedDraftId = Number.parseInt(draftId, 10)
+ const draft = await getProjectNewsletterDraft(selectedProject.id, resolvedDraftId)
+ const view = String(resolvedSearchParams.view || "editor")
+ const errorMessage = getErrorMessage(resolvedSearchParams)
+ const successMessage = getSuccessMessage(resolvedSearchParams)
+ const currentPageHref = buildDraftDetailHref(selectedProject.id, draft.id, view)
+
+ return (
+
+ {errorMessage ? (
+ {errorMessage}
+ ) : null}
+ {successMessage ? (
+ {successMessage}
+ ) : null}
+
+
+
+ Status
+
+ {draft.status}
+
+ Generated {formatDate(draft.generated_at)}
+
+
+ Sections
+ {draft.sections.length}
+ Theme-backed sections in this edition.
+
+
+ Original pieces
+ {draft.original_pieces.length}
+ Accepted original ideas carried into the draft.
+
+
+ Target publish
+ {draft.target_publish_date || "Unscheduled"}
+
+ {draft.last_edited_at ? `Last edited ${formatDate(draft.last_edited_at)}` : "No manual edits yet."}
+
+
+
+
+
+
+ Editor view
+
+
+ Markdown export
+
+
+ HTML export
+
+
+ Back to drafts
+
+
+
+ {view === "markdown" ? (
+
+ Rendered markdown
+
+ {draft.rendered_markdown}
+
+
+ ) : null}
+
+ {view === "html" ? (
+
+ ) : null}
+
+ {view === "editor" ? (
+
+ ) : null}
+
+ )
+}
\ No newline at end of file
diff --git a/frontend/src/app/drafts/page.test.tsx b/frontend/src/app/drafts/page.test.tsx
new file mode 100644
index 00000000..baa1a606
--- /dev/null
+++ b/frontend/src/app/drafts/page.test.tsx
@@ -0,0 +1,136 @@
+import { render, screen } from "@testing-library/react"
+import type { ReactNode } from "react"
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import type { NewsletterDraft, Project } from "@/lib/types"
+
+const {
+ getProjectNewsletterDraftsMock,
+ getProjectsMock,
+ selectProjectMock,
+} = vi.hoisted(() => ({
+ getProjectNewsletterDraftsMock: vi.fn(),
+ getProjectsMock: vi.fn(),
+ selectProjectMock: vi.fn(),
+}))
+
+vi.mock("@/components/layout/AppShell", () => ({
+ AppShell: ({
+ children,
+ description,
+ title,
+ }: {
+ children: ReactNode
+ description: string
+ title: string
+ }) => (
+
+
{title}
+
{description}
+ {children}
+
+ ),
+}))
+
+vi.mock("@/components/elements/StatusBadge", () => ({
+ StatusBadge: ({
+ children,
+ tone,
+ }: {
+ children: ReactNode
+ tone: string
+ }) => (
+
+ {children}
+
+ ),
+}))
+
+vi.mock("@/lib/api", () => ({
+ getProjectNewsletterDrafts: getProjectNewsletterDraftsMock,
+ getProjects: getProjectsMock,
+}))
+
+vi.mock("@/lib/view-helpers", async () => {
+ const actual = await vi.importActual(
+ "@/lib/view-helpers",
+ )
+
+ return {
+ ...actual,
+ selectProject: selectProjectMock,
+ }
+})
+
+function createProject(overrides: Partial = {}): Project {
+ return {
+ id: 1,
+ name: "AI Weekly",
+ topic_description: "AI news",
+ content_retention_days: 30,
+ user_role: "admin",
+ created_at: "2026-04-01T00:00:00Z",
+ ...overrides,
+ }
+}
+
+function createDraft(overrides: Partial = {}): NewsletterDraft {
+ return {
+ id: 8,
+ project: 1,
+ title: "AI Weekly: Delivery signals and more",
+ intro: "A quick editor-ready summary.",
+ outro: "Closing thought.",
+ target_publish_date: "2026-05-08",
+ status: "ready",
+ generated_at: "2026-05-03T09:00:00Z",
+ last_edited_at: null,
+ generation_metadata: {
+ source_theme_ids: [1, 2],
+ source_idea_ids: [4],
+ trigger_source: "manual",
+ models: { section_composer: "heuristic" },
+ },
+ sections: [],
+ original_pieces: [],
+ rendered_markdown: "# Draft",
+ rendered_html: "Draft ",
+ ...overrides,
+ }
+}
+
+async function renderDraftsPage() {
+ const { default: DraftsPage } = await import("./page")
+
+ return render(
+ await DraftsPage({
+ searchParams: Promise.resolve({ project: "1" }),
+ }),
+ )
+}
+
+describe("DraftsPage", () => {
+ beforeEach(() => {
+ const project = createProject()
+ getProjectsMock.mockReset()
+ getProjectNewsletterDraftsMock.mockReset()
+ selectProjectMock.mockReset()
+
+ getProjectsMock.mockResolvedValue([project])
+ getProjectNewsletterDraftsMock.mockResolvedValue([createDraft()])
+ selectProjectMock.mockReturnValue(project)
+ })
+
+ it("renders draft cards and the generate action", async () => {
+ await renderDraftsPage()
+
+ expect(screen.getByText("Newsletter drafts")).toBeInTheDocument()
+ expect(screen.getByText("AI Weekly: Delivery signals and more")).toBeInTheDocument()
+ expect(screen.getByText(/Generated/)).toBeInTheDocument()
+ expect(screen.getByRole("button", { name: "Generate now" })).toBeInTheDocument()
+ expect(screen.getByRole("link", { name: "Open draft" })).toHaveAttribute(
+ "href",
+ "/drafts/8?project=1",
+ )
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/drafts/page.tsx b/frontend/src/app/drafts/page.tsx
new file mode 100644
index 00000000..3b8c138a
--- /dev/null
+++ b/frontend/src/app/drafts/page.tsx
@@ -0,0 +1,200 @@
+import Link from "next/link"
+
+import { StatusBadge } from "@/components/elements/StatusBadge"
+import { AppShell } from "@/components/layout/AppShell"
+import { getProjectNewsletterDrafts, getProjects } from "@/lib/api"
+import type { NewsletterDraft, NewsletterDraftStatus } from "@/lib/types"
+import {
+ formatDate,
+ getErrorMessage,
+ getSuccessMessage,
+ selectProject,
+} from "@/lib/view-helpers"
+
+type DraftsPageProps = {
+ /** Search params promise containing the optional `project` and `status` selectors. */
+ searchParams: Promise>
+}
+
+function buildDraftsPageHref(projectId: number, statusFilter: string) {
+ const params = new URLSearchParams({ project: String(projectId) })
+ if (statusFilter && statusFilter !== "all") {
+ params.set("status", statusFilter)
+ }
+ return `/drafts?${params.toString()}`
+}
+
+function draftTone(status: NewsletterDraftStatus) {
+ switch (status) {
+ case "ready":
+ case "published":
+ return "positive" as const
+ case "discarded":
+ return "negative" as const
+ default:
+ return "warning" as const
+ }
+}
+
+function countDraftsByStatus(drafts: NewsletterDraft[], status: NewsletterDraftStatus) {
+ return drafts.filter((draft) => draft.status === status).length
+}
+
+/**
+ * Render the newsletter drafts queue for the selected project.
+ */
+export default async function DraftsPage({ searchParams }: DraftsPageProps) {
+ const resolvedSearchParams = await searchParams
+ const projects = await getProjects()
+ const selectedProject = selectProject(projects, resolvedSearchParams)
+
+ if (!selectedProject) {
+ return (
+
+
+ Create a project first in Django admin.
+
+
+ )
+ }
+
+ const drafts = await getProjectNewsletterDrafts(selectedProject.id)
+ const statusFilter = String(resolvedSearchParams.status || "all")
+ const filteredDrafts =
+ !statusFilter || statusFilter === "all"
+ ? drafts
+ : drafts.filter((draft) => draft.status === statusFilter)
+ const errorMessage = getErrorMessage(resolvedSearchParams)
+ const successMessage = getSuccessMessage(resolvedSearchParams)
+ const currentPageHref = buildDraftsPageHref(selectedProject.id, statusFilter)
+
+ return (
+
+ {errorMessage ? (
+ {errorMessage}
+ ) : null}
+ {successMessage ? (
+ {successMessage}
+ ) : null}
+
+
+
+ Generating
+ {countDraftsByStatus(drafts, "generating")}
+ Drafts currently being composed.
+
+
+ Ready
+ {countDraftsByStatus(drafts, "ready")}
+ Drafts ready for editorial review.
+
+
+ Edited
+ {countDraftsByStatus(drafts, "edited")}
+ Drafts with local editorial changes.
+
+
+ Published
+ {countDraftsByStatus(drafts, "published")}
+ Drafts marked published in the backend.
+
+
+ Discarded
+ {countDraftsByStatus(drafts, "discarded")}
+ Drafts that ended in an error state.
+
+
+
+
+
+
+ Status
+
+
+ All drafts
+ Generating
+ Ready
+ Edited
+ Published
+ Discarded
+
+
+ Apply filter
+
+
+ Reset
+
+
+
+
+
+
+
+ Generate now
+
+
+
+
+
+ {filteredDrafts.length === 0 ? (
+
+ No newsletter drafts matched the current filter.
+
+ ) : null}
+
+ {filteredDrafts.map((draft) => (
+
+
+
+
Draft #{draft.id}
+
{draft.title}
+
{draft.intro || "No intro has been added yet."}
+
+
{draft.status}
+
+
+
+ Generated {formatDate(draft.generated_at)}
+ {draft.sections.length} section{draft.sections.length === 1 ? "" : "s"}
+ {draft.original_pieces.length} original piece{draft.original_pieces.length === 1 ? "" : "s"}
+ Target publish {draft.target_publish_date || "Unscheduled"}
+ {draft.last_edited_at ? Edited {formatDate(draft.last_edited_at)} : null}
+
+
+
+
+ Open draft
+
+ {draft.generation_metadata.models ? (
+
+ Composer {draft.generation_metadata.models.section_composer || "pending"}
+
+ ) : null}
+
+
+ ))}
+
+
+ )
+}
\ No newline at end of file
diff --git a/frontend/src/app/entities/[id]/_components/AuthorityWeightControls/index.test.tsx b/frontend/src/app/entities/[id]/_components/AuthorityWeightControls/index.test.tsx
new file mode 100644
index 00000000..f399afc2
--- /dev/null
+++ b/frontend/src/app/entities/[id]/_components/AuthorityWeightControls/index.test.tsx
@@ -0,0 +1,101 @@
+import { fireEvent, render, screen, waitFor } from "@testing-library/react"
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import { AuthorityWeightControls } from "@/app/entities/[id]/_components/AuthorityWeightControls"
+import type { ProjectConfig } from "@/lib/types"
+
+const { refreshMock } = vi.hoisted(() => ({
+ refreshMock: vi.fn(),
+}))
+
+vi.mock("next/navigation", () => ({
+ useRouter: () => ({
+ push: vi.fn(),
+ replace: vi.fn(),
+ prefetch: vi.fn(),
+ back: vi.fn(),
+ refresh: refreshMock,
+ }),
+}))
+
+function createProjectConfig(overrides: Partial = {}): ProjectConfig {
+ return {
+ id: 3,
+ project: 1,
+ draft_schedule_cron: "",
+ authority_weight_mention: 0.2,
+ authority_weight_engagement: 0.15,
+ authority_weight_recency: 0.15,
+ authority_weight_source_quality: 0.15,
+ authority_weight_cross_newsletter: 0.2,
+ authority_weight_feedback: 0.1,
+ authority_weight_duplicate: 0.05,
+ upvote_authority_weight: 0.05,
+ downvote_authority_weight: -0.05,
+ authority_decay_rate: 0.9,
+ ...overrides,
+ }
+}
+
+describe("AuthorityWeightControls", () => {
+ beforeEach(() => {
+ refreshMock.mockReset()
+ vi.restoreAllMocks()
+ })
+
+ it("saves weights through the JSON route", async () => {
+ const fetchMock = vi.fn().mockResolvedValue({
+ ok: true,
+ json: async () => ({ message: "Authority weights saved." }),
+ })
+ vi.stubGlobal("fetch", fetchMock)
+
+ render(
+ ,
+ )
+
+ fireEvent.change(screen.getByRole("slider", { name: "Engagement" }), {
+ target: { value: "0.33" },
+ })
+ fireEvent.click(screen.getByRole("button", { name: "Save weights" }))
+
+ await waitFor(() => {
+ expect(fetchMock).toHaveBeenCalledWith(
+ "/api/projects/1/authority-settings?mode=json",
+ expect.objectContaining({ method: "POST" }),
+ )
+ })
+
+ expect(await screen.findByRole("status")).toHaveTextContent(
+ "Authority weights saved.",
+ )
+ expect(refreshMock).toHaveBeenCalled()
+ })
+
+ it("saves and recomputes when requested", async () => {
+ const fetchMock = vi.fn().mockResolvedValue({
+ ok: true,
+ json: async () => ({ message: "Authority weights saved and recomputed." }),
+ })
+ vi.stubGlobal("fetch", fetchMock)
+
+ render(
+ ,
+ )
+
+ fireEvent.click(screen.getByRole("button", { name: "Save and recompute" }))
+
+ expect(await screen.findByRole("status")).toHaveTextContent(
+ "Authority weights saved and recomputed.",
+ )
+ expect(refreshMock).toHaveBeenCalled()
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/entities/[id]/_components/AuthorityWeightControls/index.tsx b/frontend/src/app/entities/[id]/_components/AuthorityWeightControls/index.tsx
new file mode 100644
index 00000000..43afeece
--- /dev/null
+++ b/frontend/src/app/entities/[id]/_components/AuthorityWeightControls/index.tsx
@@ -0,0 +1,239 @@
+"use client"
+
+import { useRouter } from "next/navigation"
+import { useState } from "react"
+
+import type { ProjectConfig } from "@/lib/types"
+
+type AuthorityWeightControlsProps = {
+ /** Numeric project identifier used by the API route. */
+ projectId: number
+ /** Existing project configuration row, if one has been created already. */
+ projectConfig: ProjectConfig | null
+ /** Redirect target for non-JS fallbacks. */
+ redirectTo: string
+}
+
+type AuthorityWeightField = {
+ key:
+ | "authority_weight_mention"
+ | "authority_weight_engagement"
+ | "authority_weight_recency"
+ | "authority_weight_source_quality"
+ | "authority_weight_cross_newsletter"
+ | "authority_weight_feedback"
+ | "authority_weight_duplicate"
+ label: string
+}
+
+const WEIGHT_FIELDS: AuthorityWeightField[] = [
+ { key: "authority_weight_mention", label: "Mention frequency" },
+ { key: "authority_weight_engagement", label: "Engagement" },
+ { key: "authority_weight_recency", label: "Recency" },
+ { key: "authority_weight_source_quality", label: "Source quality" },
+ { key: "authority_weight_cross_newsletter", label: "Cross-newsletter" },
+ { key: "authority_weight_feedback", label: "Feedback" },
+ { key: "authority_weight_duplicate", label: "Duplicate signal" },
+]
+
+const DEFAULT_CONFIG_VALUES = {
+ draft_schedule_cron: "",
+ authority_weight_mention: 0.2,
+ authority_weight_engagement: 0.15,
+ authority_weight_recency: 0.15,
+ authority_weight_source_quality: 0.15,
+ authority_weight_cross_newsletter: 0.2,
+ authority_weight_feedback: 0.1,
+ authority_weight_duplicate: 0.05,
+ upvote_authority_weight: 0.05,
+ downvote_authority_weight: -0.05,
+ authority_decay_rate: 0.9,
+} satisfies Omit
+
+/**
+ * Render admin-only sliders for project authority weights.
+ */
+export function AuthorityWeightControls({
+ projectId,
+ projectConfig,
+ redirectTo,
+}: AuthorityWeightControlsProps) {
+ const router = useRouter()
+ const initialValues = projectConfig ?? {
+ id: 0,
+ project: projectId,
+ ...DEFAULT_CONFIG_VALUES,
+ }
+ const [weights, setWeights] = useState(initialValues)
+ const [pendingAction, setPendingAction] = useState<"save" | "save_and_recompute" | null>(null)
+ const [statusMessage, setStatusMessage] = useState(null)
+ const [errorMessage, setErrorMessage] = useState(null)
+
+ const totalWeight = WEIGHT_FIELDS.reduce(
+ (sum, field) => sum + weights[field.key],
+ 0,
+ )
+
+ async function submit(intent: "save" | "save_and_recompute") {
+ setPendingAction(intent)
+ setStatusMessage(null)
+ setErrorMessage(null)
+
+ const formData = new FormData()
+ formData.set("redirectTo", redirectTo)
+ formData.set("intent", intent)
+ if (projectConfig?.id) {
+ formData.set("configId", String(projectConfig.id))
+ }
+ formData.set("draft_schedule_cron", weights.draft_schedule_cron)
+ formData.set("upvote_authority_weight", String(weights.upvote_authority_weight))
+ formData.set("downvote_authority_weight", String(weights.downvote_authority_weight))
+ formData.set("authority_decay_rate", String(weights.authority_decay_rate))
+ for (const field of WEIGHT_FIELDS) {
+ formData.set(field.key, String(weights[field.key]))
+ }
+
+ try {
+ const response = await fetch(
+ `/api/projects/${projectId}/authority-settings?mode=json`,
+ {
+ method: "POST",
+ body: formData,
+ },
+ )
+ const payload = (await response.json()) as { message?: string }
+
+ if (!response.ok || !payload.message) {
+ throw new Error(payload.message || "Unable to save authority settings.")
+ }
+
+ setStatusMessage(payload.message)
+ router.refresh()
+ } catch (error) {
+ setErrorMessage(
+ error instanceof Error
+ ? error.message
+ : "Unable to save authority settings.",
+ )
+ } finally {
+ setPendingAction(null)
+ }
+ }
+
+ return (
+
+
+
+
Admin controls
+
+ Authority weights
+
+
+
Configured total {Math.round(totalWeight * 100)}%
+
+
+
+ These sliders are normalized to 100% at recompute time, so you can emphasize one signal without manually balancing every field.
+
+
+
+ {WEIGHT_FIELDS.map((field) => (
+
+
+ {field.label}
+ {Math.round(weights[field.key] * 100)}%
+
+ {
+ const nextValue = Number.parseFloat(event.target.value)
+ setWeights((current) => ({
+ ...current,
+ [field.key]: Number.isFinite(nextValue) ? nextValue : 0,
+ }))
+ }}
+ step="0.01"
+ type="range"
+ value={weights[field.key]}
+ />
+
+ ))}
+
+
+
+
+ Authority decay rate
+ {
+ const nextValue = Number.parseFloat(event.target.value)
+ setWeights((current) => ({
+ ...current,
+ authority_decay_rate: Number.isFinite(nextValue) ? nextValue : 0,
+ }))
+ }}
+ step="0.01"
+ type="number"
+ value={weights.authority_decay_rate}
+ />
+
+
+ Draft schedule cron
+ {
+ setWeights((current) => ({
+ ...current,
+ draft_schedule_cron: event.target.value,
+ }))
+ }}
+ placeholder="0 9 * * *"
+ value={weights.draft_schedule_cron}
+ />
+
+
+
+
+ {
+ void submit("save")
+ }}
+ type="button"
+ >
+ {pendingAction === "save" ? "Saving..." : "Save weights"}
+
+ {
+ void submit("save_and_recompute")
+ }}
+ type="button"
+ >
+ {pendingAction === "save_and_recompute"
+ ? "Saving and recomputing..."
+ : "Save and recompute"}
+
+
+
+ {statusMessage ? (
+
+ {statusMessage}
+
+ ) : null}
+ {errorMessage ? (
+
+ {errorMessage}
+
+ ) : null}
+
+ )
+}
\ No newline at end of file
diff --git a/frontend/src/app/entities/[id]/page.test.tsx b/frontend/src/app/entities/[id]/page.test.tsx
index 98c0229b..486ce598 100644
--- a/frontend/src/app/entities/[id]/page.test.tsx
+++ b/frontend/src/app/entities/[id]/page.test.tsx
@@ -2,17 +2,21 @@ import { render, screen } from "@testing-library/react"
import type { ReactNode } from "react"
import { beforeEach, describe, expect, it, vi } from "vitest"
-import type { Entity, Project } from "@/lib/types"
+import type { Entity, Project, ProjectConfig } from "@/lib/types"
const {
+ getProjectEntityAuthorityComponentsMock,
getProjectEntityAuthorityHistoryMock,
+ getProjectConfigMock,
getProjectEntitiesMock,
getProjectEntityMentionsMock,
getProjectEntityMock,
getProjectsMock,
selectProjectMock,
} = vi.hoisted(() => ({
+ getProjectEntityAuthorityComponentsMock: vi.fn(),
getProjectEntityAuthorityHistoryMock: vi.fn(),
+ getProjectConfigMock: vi.fn(),
getProjectEntitiesMock: vi.fn(),
getProjectEntityMentionsMock: vi.fn(),
getProjectEntityMock: vi.fn(),
@@ -52,7 +56,17 @@ vi.mock("@/components/elements/StatusBadge", () => ({
),
}))
+vi.mock("@/app/entities/[id]/_components/AuthorityWeightControls", () => ({
+ AuthorityWeightControls: ({ projectId }: { projectId: number }) => (
+
+ Authority weight controls for project {projectId}
+
+ ),
+}))
+
vi.mock("@/lib/api", () => ({
+ getProjectConfig: getProjectConfigMock,
+ getProjectEntityAuthorityComponents: getProjectEntityAuthorityComponentsMock,
getProjectEntityAuthorityHistory: getProjectEntityAuthorityHistoryMock,
getProjectEntities: getProjectEntitiesMock,
getProjectEntity: getProjectEntityMock,
@@ -104,6 +118,25 @@ function createEntity(overrides: Partial = {}): Entity {
}
}
+function createProjectConfig(overrides: Partial = {}): ProjectConfig {
+ return {
+ id: 5,
+ project: 1,
+ draft_schedule_cron: "",
+ authority_weight_mention: 0.2,
+ authority_weight_engagement: 0.15,
+ authority_weight_recency: 0.15,
+ authority_weight_source_quality: 0.15,
+ authority_weight_cross_newsletter: 0.2,
+ authority_weight_feedback: 0.1,
+ authority_weight_duplicate: 0.05,
+ upvote_authority_weight: 0.05,
+ downvote_authority_weight: -0.05,
+ authority_decay_rate: 0.9,
+ ...overrides,
+ }
+}
+
async function loadEntityDetailPageModule() {
return import("./page")
}
@@ -132,14 +165,20 @@ describe("EntityDetailPage", () => {
getProjectsMock.mockReset()
getProjectEntityMock.mockReset()
getProjectEntityMentionsMock.mockReset()
+ getProjectEntityAuthorityComponentsMock.mockReset()
getProjectEntityAuthorityHistoryMock.mockReset()
+ getProjectConfigMock.mockReset()
getProjectEntitiesMock.mockReset()
selectProjectMock.mockReset()
getProjectsMock.mockResolvedValue([defaultProject])
getProjectEntityMock.mockResolvedValue(defaultEntity)
getProjectEntityMentionsMock.mockResolvedValue([])
+ getProjectEntityAuthorityComponentsMock.mockRejectedValue(
+ new Error("No authority components yet"),
+ )
getProjectEntityAuthorityHistoryMock.mockResolvedValue([])
+ getProjectConfigMock.mockResolvedValue(createProjectConfig())
getProjectEntitiesMock.mockResolvedValue([defaultEntity])
selectProjectMock.mockImplementation((projects: Project[]) => {
return projects[0] ?? null
@@ -158,7 +197,9 @@ describe("EntityDetailPage", () => {
).toBeInTheDocument()
expect(getProjectEntityMock).not.toHaveBeenCalled()
expect(getProjectEntityMentionsMock).not.toHaveBeenCalled()
+ expect(getProjectEntityAuthorityComponentsMock).not.toHaveBeenCalled()
expect(getProjectEntityAuthorityHistoryMock).not.toHaveBeenCalled()
+ expect(getProjectConfigMock).not.toHaveBeenCalled()
})
it("renders entity metadata, identity links, and mention history", async () => {
@@ -203,6 +244,30 @@ describe("EntityDetailPage", () => {
created_at: "2026-04-28T13:00:00Z",
},
])
+ getProjectEntityAuthorityComponentsMock.mockResolvedValue({
+ id: 51,
+ entity: 11,
+ project: 3,
+ computed_at: "2026-04-28T14:00:00Z",
+ mention_component: 0.8,
+ engagement_component: 0.65,
+ recency_component: 0.7,
+ source_quality_component: 0.6,
+ cross_newsletter_component: 0.55,
+ feedback_component: 0.7,
+ duplicate_component: 0.6,
+ decayed_prior: 0.53,
+ weights_at_compute: {
+ mention: 0.2,
+ engagement: 0.15,
+ recency: 0.15,
+ source_quality: 0.15,
+ cross_newsletter: 0.2,
+ feedback: 0.1,
+ duplicate: 0.05,
+ },
+ final_score: 0.91,
+ })
getProjectEntityAuthorityHistoryMock.mockResolvedValue([
{
id: 51,
@@ -210,9 +275,14 @@ describe("EntityDetailPage", () => {
project: 3,
computed_at: "2026-04-28T14:00:00Z",
mention_component: 0.8,
+ engagement_component: 0.65,
+ recency_component: 0.7,
+ source_quality_component: 0.6,
+ cross_newsletter_component: 0.55,
feedback_component: 0.7,
duplicate_component: 0.5,
decayed_prior: 0.6,
+ weights_at_compute: { mention: 0.2 },
final_score: 0.91,
},
{
@@ -221,9 +291,14 @@ describe("EntityDetailPage", () => {
project: 3,
computed_at: "2026-04-27T14:00:00Z",
mention_component: 0.7,
+ engagement_component: 0.55,
+ recency_component: 0.6,
+ source_quality_component: 0.5,
+ cross_newsletter_component: 0.45,
feedback_component: 0.6,
duplicate_component: 0.4,
decayed_prior: 0.5,
+ weights_at_compute: { mention: 0.2 },
final_score: 0.82,
},
])
@@ -241,16 +316,25 @@ describe("EntityDetailPage", () => {
expect(getProjectEntityMock).toHaveBeenCalledWith(3, 11)
expect(getProjectEntityMentionsMock).toHaveBeenCalledWith(3, 11)
+ expect(getProjectEntityAuthorityComponentsMock).toHaveBeenCalledWith(3, 11)
expect(getProjectEntityAuthorityHistoryMock).toHaveBeenCalledWith(3, 11)
+ expect(getProjectConfigMock).toHaveBeenCalledWith(3)
expect(screen.getByRole("heading", { name: "Anthropic" })).toBeInTheDocument()
expect(screen.getByText("2 mentions")).toBeInTheDocument()
expect(screen.getByText("Authority 91%")).toBeInTheDocument()
expect(screen.getByText("Safety-focused AI company")).toBeInTheDocument()
expect(screen.getByText("Current score and history")).toBeInTheDocument()
- expect(screen.getByText("Mention frequency")).toBeInTheDocument()
- expect(screen.getByText("Feedback")).toBeInTheDocument()
- expect(screen.getByText("Duplicate signal")).toBeInTheDocument()
- expect(screen.getByText("Carry-forward")).toBeInTheDocument()
+ expect(screen.getByText("Current component mix")).toBeInTheDocument()
+ expect(screen.getAllByText("Mention frequency").length).toBeGreaterThan(0)
+ expect(screen.getAllByText("Engagement").length).toBeGreaterThan(0)
+ expect(screen.getAllByText("Recency").length).toBeGreaterThan(0)
+ expect(screen.getAllByText("Source quality").length).toBeGreaterThan(0)
+ expect(screen.getAllByText("Cross-newsletter").length).toBeGreaterThan(0)
+ expect(screen.getAllByText("Feedback").length).toBeGreaterThan(0)
+ expect(screen.getAllByText("Duplicate signal").length).toBeGreaterThan(0)
+ expect(screen.getAllByText("Carry-forward").length).toBeGreaterThan(0)
+ expect(screen.getByText("Weights at compute")).toBeInTheDocument()
+ expect(screen.getByText("engagement 15%")).toBeInTheDocument()
expect(screen.getByText("Final 91%")).toBeInTheDocument()
expect(screen.getByText("Website")).toBeInTheDocument()
expect(screen.getByText("Twitter anthropicai")).toBeInTheDocument()
@@ -260,6 +344,10 @@ describe("EntityDetailPage", () => {
expect(screen.getByText("94% confidence")).toBeInTheDocument()
expect(screen.getByText("Back to entities")).toBeInTheDocument()
expect(screen.getByText("OpenAI")).toBeInTheDocument()
+ expect(screen.getByLabelText("Authority component mix")).toBeInTheDocument()
+ expect(screen.getByTestId("authority-weight-controls")).toHaveTextContent(
+ "Authority weight controls for project 3",
+ )
const badge = screen.getByTestId("status-badge")
expect(badge).toHaveAttribute("data-tone", "neutral")
@@ -276,4 +364,15 @@ describe("EntityDetailPage", () => {
screen.getByText("Authority history has not been recomputed for this entity yet."),
).toBeInTheDocument()
})
+
+ it("skips authority weight controls for non-admin viewers", async () => {
+ const memberProject = createProject({ id: 2, user_role: "member" })
+ getProjectsMock.mockResolvedValue([memberProject])
+ selectProjectMock.mockReturnValue(memberProject)
+
+ await renderEntityDetailPage({ project: "2" }, { id: "7" })
+
+ expect(getProjectConfigMock).not.toHaveBeenCalled()
+ expect(screen.queryByTestId("authority-weight-controls")).not.toBeInTheDocument()
+ })
})
diff --git a/frontend/src/app/entities/[id]/page.tsx b/frontend/src/app/entities/[id]/page.tsx
index a9f72072..15aa0c1f 100644
--- a/frontend/src/app/entities/[id]/page.tsx
+++ b/frontend/src/app/entities/[id]/page.tsx
@@ -1,14 +1,18 @@
import Link from "next/link"
+import { AuthorityWeightControls } from "@/app/entities/[id]/_components/AuthorityWeightControls"
import { StatusBadge } from "@/components/elements/StatusBadge"
import { AppShell } from "@/components/layout/AppShell"
import {
+ getProjectConfig,
getProjectEntities,
getProjectEntity,
+ getProjectEntityAuthorityComponents,
getProjectEntityAuthorityHistory,
getProjectEntityMentions,
getProjects,
} from "@/lib/api"
+import type { EntityAuthoritySnapshot } from "@/lib/types"
import {
formatDate,
formatPercentScore,
@@ -27,8 +31,9 @@ type EntityDetailPageProps = {
/**
* Render the detail view for one tracked entity in the selected project.
*
- * The page joins the entity record with its extracted mention history so editors can
- * inspect how the pipeline is linking content to the entity over time.
+ * The page joins the entity record with its current authority breakdown, historical
+ * snapshots, and extracted mention history so editors can inspect how the pipeline is
+ * linking content and weighting authority over time.
*/
export default async function EntityDetailPage({
params,
@@ -54,17 +59,32 @@ export default async function EntityDetailPage({
}
const entityId = Number.parseInt(id, 10)
- const [entity, mentions, authorityHistory, projectEntities] = await Promise.all([
+ const [
+ entity,
+ mentions,
+ authorityComponents,
+ authorityHistory,
+ projectEntities,
+ projectConfig,
+ ] = await Promise.all([
getProjectEntity(selectedProject.id, entityId),
getProjectEntityMentions(selectedProject.id, entityId),
+ getProjectEntityAuthorityComponents(selectedProject.id, entityId).catch(
+ () => null,
+ ),
getProjectEntityAuthorityHistory(selectedProject.id, entityId),
getProjectEntities(selectedProject.id),
+ selectedProject.user_role === "admin"
+ ? getProjectConfig(selectedProject.id)
+ : Promise.resolve(null),
])
const errorMessage = getErrorMessage(resolvedSearchParams)
const successMessage = getSuccessMessage(resolvedSearchParams)
const siblingEntities = projectEntities.filter((candidate) => candidate.id !== entity.id)
- const latestSnapshot = authorityHistory[0] ?? null
+ const latestSnapshot = authorityComponents ?? authorityHistory[0] ?? null
const trendPoints = buildAuthorityTrendPoints(authorityHistory)
+ const componentMix = latestSnapshot ? buildAuthorityComponentMix(latestSnapshot) : []
+ const carryForwardWeight = latestSnapshot ? Math.max(0, latestSnapshot.decayed_prior) : 0
return (
- This reflects the latest blend of mention frequency, editorial feedback, duplicate corroboration, and carry-forward history.
+ This reflects the latest blend of mention frequency, engagement, recency, source quality, cross-newsletter corroboration, editorial feedback, duplicate corroboration, and carry-forward history.
+ {latestSnapshot ? (
+
+
+ Current component mix
+ Carry-forward {formatPercentScore(carryForwardWeight)}
+
+
+
+ {componentMix.map((component) => (
+
+ {`${component.label} ${formatPercentScore(component.value)}`}
+
+ ))}
+
+
+
+ {componentMix.map((component) => (
+
+
+ {component.label}
+
+ ))}
+
+
+ ) : null}
{authorityHistory.length > 1 ? (
@@ -214,8 +272,12 @@ export default async function EntityDetailPage({
) : null}
{latestSnapshot ? (
-
+
+
+
+
+
@@ -225,6 +287,28 @@ export default async function EntityDetailPage({
Authority history has not been recomputed for this entity yet.
)}
+ {latestSnapshot?.weights_at_compute ? (
+
+
+ Weights at compute
+
+
+ {Object.entries(latestSnapshot.weights_at_compute).map(([key, value]) => (
+
+ {formatWeightLabel(key)} {formatPercentScore(value)}
+
+ ))}
+
+
+ ) : null}
+
+ {selectedProject.user_role === "admin" ? (
+
+ ) : null}
@@ -239,6 +323,10 @@ export default async function EntityDetailPage({
M {formatPercentScore(snapshot.mention_component)}
+
E {formatPercentScore(snapshot.engagement_component)}
+
R {formatPercentScore(snapshot.recency_component)}
+
SQ {formatPercentScore(snapshot.source_quality_component)}
+
CN {formatPercentScore(snapshot.cross_newsletter_component)}
F {formatPercentScore(snapshot.feedback_component)}
D {formatPercentScore(snapshot.duplicate_component)}
Carry {formatPercentScore(snapshot.decayed_prior)}
@@ -364,6 +452,64 @@ function buildAuthorityTrendPoints(
return points.join(" ")
}
+function buildAuthorityComponentMix(snapshot: EntityAuthoritySnapshot) {
+ const components = [
+ {
+ label: "Mention frequency",
+ value: Math.max(0, snapshot.mention_component),
+ className: "bg-primary",
+ },
+ {
+ label: "Engagement",
+ value: Math.max(0, snapshot.engagement_component),
+ className: "bg-emerald-500",
+ },
+ {
+ label: "Recency",
+ value: Math.max(0, snapshot.recency_component),
+ className: "bg-cyan-500",
+ },
+ {
+ label: "Source quality",
+ value: Math.max(0, snapshot.source_quality_component),
+ className: "bg-amber-500",
+ },
+ {
+ label: "Cross-newsletter",
+ value: Math.max(0, snapshot.cross_newsletter_component),
+ className: "bg-fuchsia-500",
+ },
+ {
+ label: "Feedback",
+ value: Math.max(0, snapshot.feedback_component),
+ className: "bg-sky-500",
+ },
+ {
+ label: "Duplicate signal",
+ value: Math.max(0, snapshot.duplicate_component),
+ className: "bg-rose-500",
+ },
+ ]
+ const total = components.reduce((sum, component) => sum + component.value, 0)
+ let offset = 0
+
+ return components.map((component) => {
+ const share = total > 0 ? component.value / total : 1 / components.length
+ const mappedComponent = {
+ ...component,
+ share,
+ offset,
+ width: share * 100,
+ }
+ offset += mappedComponent.width
+ return mappedComponent
+ })
+}
+
+function formatWeightLabel(label: string) {
+ return label.replaceAll("_", " ")
+}
+
function AuthorityComponentCard({
label,
value,
diff --git a/frontend/src/app/entities/candidates/page.test.tsx b/frontend/src/app/entities/candidates/page.test.tsx
new file mode 100644
index 00000000..a402fd27
--- /dev/null
+++ b/frontend/src/app/entities/candidates/page.test.tsx
@@ -0,0 +1,188 @@
+import { render, screen } from "@testing-library/react"
+import type { ReactNode } from "react"
+import { beforeEach, describe, expect, it, vi } from "vitest"
+
+import type { Entity, EntityCandidate, Project } from "@/lib/types"
+
+const {
+ getProjectEntitiesMock,
+ getProjectEntityCandidatesMock,
+ getProjectsMock,
+ selectProjectMock,
+} = vi.hoisted(() => ({
+ getProjectEntitiesMock: vi.fn(),
+ getProjectEntityCandidatesMock: vi.fn(),
+ getProjectsMock: vi.fn(),
+ selectProjectMock: vi.fn(),
+}))
+
+vi.mock("@/components/layout/AppShell", () => ({
+ AppShell: ({
+ children,
+ description,
+ title,
+ }: {
+ children: ReactNode
+ description: string
+ title: string
+ }) => (
+
+
{title}
+
{description}
+ {children}
+
+ ),
+}))
+
+vi.mock("@/components/elements/StatusBadge", () => ({
+ StatusBadge: ({
+ children,
+ tone,
+ }: {
+ children: ReactNode
+ tone: string
+ }) => (
+
+ {children}
+
+ ),
+}))
+
+vi.mock("@/lib/api", () => ({
+ getProjectEntities: getProjectEntitiesMock,
+ getProjectEntityCandidates: getProjectEntityCandidatesMock,
+ getProjects: getProjectsMock,
+}))
+
+vi.mock("@/lib/view-helpers", async () => {
+ const actual = await vi.importActual
(
+ "@/lib/view-helpers",
+ )
+
+ return {
+ ...actual,
+ selectProject: selectProjectMock,
+ }
+})
+
+function createProject(overrides: Partial = {}): Project {
+ return {
+ id: 1,
+ name: "AI Weekly",
+ topic_description: "AI news",
+ content_retention_days: 30,
+ user_role: "admin",
+ created_at: "2026-04-01T00:00:00Z",
+ ...overrides,
+ }
+}
+
+function createEntity(overrides: Partial = {}): Entity {
+ return {
+ id: 7,
+ project: 1,
+ name: "OpenAI",
+ type: "vendor",
+ description: "LLM provider",
+ authority_score: 0.82,
+ website_url: "",
+ github_url: "",
+ linkedin_url: "",
+ bluesky_handle: "",
+ mastodon_handle: "",
+ twitter_handle: "",
+ mention_count: 0,
+ latest_mentions: [],
+ created_at: "2026-04-28T10:00:00Z",
+ ...overrides,
+ }
+}
+
+function createEntityCandidate(overrides: Partial = {}): EntityCandidate {
+ return {
+ id: 14,
+ project: 1,
+ name: "River Labs",
+ suggested_type: "vendor",
+ first_seen_in: 21,
+ first_seen_title: "River Labs launches hosted platform",
+ occurrence_count: 3,
+ cluster_key: "cluster-1",
+ auto_promotion_blocked_reason: "needs_more_occurrences",
+ evidence_count: 3,
+ source_plugin_count: 2,
+ source_plugins: ["linkedin", "rss"],
+ identity_surfaces: ["linkedin"],
+ status: "pending",
+ merged_into: null,
+ merged_into_name: "",
+ created_at: "2026-04-28T10:00:00Z",
+ updated_at: "2026-04-28T11:00:00Z",
+ ...overrides,
+ }
+}
+
+async function renderCandidateQueuePage(
+ searchParams: Record = {
+ project: "1",
+ },
+) {
+ const { default: CandidateQueuePage } = await import("./page")
+
+ return render(
+ await CandidateQueuePage({
+ searchParams: Promise.resolve(searchParams),
+ }),
+ )
+}
+
+describe("CandidateQueuePage", () => {
+ beforeEach(() => {
+ const project = createProject()
+ getProjectsMock.mockReset()
+ getProjectEntitiesMock.mockReset()
+ getProjectEntityCandidatesMock.mockReset()
+ selectProjectMock.mockReset()
+
+ getProjectsMock.mockResolvedValue([project])
+ getProjectEntitiesMock.mockResolvedValue([createEntity()])
+ getProjectEntityCandidatesMock.mockResolvedValue([])
+ selectProjectMock.mockReturnValue(project)
+ })
+
+ it("renders grouped pending candidate clusters", async () => {
+ getProjectEntityCandidatesMock.mockResolvedValue([
+ createEntityCandidate(),
+ createEntityCandidate({
+ id: 15,
+ name: "River Labs AI",
+ occurrence_count: 4,
+ evidence_count: 4,
+ }),
+ ])
+
+ await renderCandidateQueuePage({ project: "1" })
+
+ expect(screen.getByText("Cluster of 2 candidates")).toBeInTheDocument()
+ expect(screen.getByText("7 total occurrences")).toBeInTheDocument()
+ expect(screen.getAllByText("linkedin").length).toBeGreaterThan(0)
+ expect(screen.getByText("Accept cluster")).toBeInTheDocument()
+ expect(screen.getByText("Merge cluster")).toBeInTheDocument()
+ })
+
+ it("renders the auto-promotion log tab", async () => {
+ getProjectEntityCandidatesMock.mockResolvedValue([
+ createEntityCandidate({
+ id: 18,
+ status: "accepted",
+ updated_at: "2026-05-02T12:00:00Z",
+ }),
+ ])
+
+ await renderCandidateQueuePage({ project: "1", tab: "auto-log" })
+
+ expect(screen.getByText(/Resolved May 2, 2026/)).toBeInTheDocument()
+ expect(screen.getByText("accepted")).toBeInTheDocument()
+ expect(screen.getByText("2 sources")).toBeInTheDocument()
+ })
+})
\ No newline at end of file
diff --git a/frontend/src/app/entities/candidates/page.tsx b/frontend/src/app/entities/candidates/page.tsx
new file mode 100644
index 00000000..d68cceb6
--- /dev/null
+++ b/frontend/src/app/entities/candidates/page.tsx
@@ -0,0 +1,307 @@
+import Link from "next/link"
+
+import { StatusBadge } from "@/components/elements/StatusBadge"
+import { AppShell } from "@/components/layout/AppShell"
+import {
+ getProjectEntities,
+ getProjectEntityCandidates,
+ getProjects,
+} from "@/lib/api"
+import type { EntityCandidate } from "@/lib/types"
+import {
+ formatDate,
+ getErrorMessage,
+ getSuccessMessage,
+ selectProject,
+} from "@/lib/view-helpers"
+
+type CandidateQueuePageProps = {
+ /** Search params promise containing the active project and optional tab/flash state. */
+ searchParams: Promise>
+}
+
+type CandidateCluster = {
+ clusterKey: string
+ members: EntityCandidate[]
+ totalOccurrences: number
+ sourcePlugins: string[]
+ identitySurfaces: string[]
+}
+
+function groupCandidateClusters(candidates: EntityCandidate[]): CandidateCluster[] {
+ const grouped = new Map()
+
+ for (const candidate of candidates) {
+ const clusterKey = candidate.cluster_key || `candidate-${candidate.id}`
+ const existing = grouped.get(clusterKey) ?? []
+ existing.push(candidate)
+ grouped.set(clusterKey, existing)
+ }
+
+ return Array.from(grouped.entries())
+ .map(([clusterKey, members]) => ({
+ clusterKey,
+ members: members.slice().sort((left, right) => right.occurrence_count - left.occurrence_count),
+ totalOccurrences: members.reduce(
+ (sum, candidate) => sum + candidate.occurrence_count,
+ 0,
+ ),
+ sourcePlugins: Array.from(
+ new Set(members.flatMap((candidate) => candidate.source_plugins)),
+ ).sort(),
+ identitySurfaces: Array.from(
+ new Set(members.flatMap((candidate) => candidate.identity_surfaces)),
+ ).sort(),
+ }))
+ .sort((left, right) => right.totalOccurrences - left.totalOccurrences)
+}
+
+/**
+ * Render the clustered entity-candidate review queue for one project.
+ */
+export default async function CandidateQueuePage({
+ searchParams,
+}: CandidateQueuePageProps) {
+ const resolvedSearchParams = await searchParams
+ const projects = await getProjects()
+ const selectedProject = selectProject(projects, resolvedSearchParams)
+
+ if (!selectedProject) {
+ return (
+
+
+ Create a project first in Django admin.
+
+
+ )
+ }
+
+ const [entities, candidates] = await Promise.all([
+ getProjectEntities(selectedProject.id),
+ getProjectEntityCandidates(selectedProject.id),
+ ])
+ const errorMessage = getErrorMessage(resolvedSearchParams)
+ const successMessage = getSuccessMessage(resolvedSearchParams)
+ const activeTab = String(resolvedSearchParams.tab || "review")
+ const pendingCandidates = candidates.filter((candidate) => candidate.status === "pending")
+ const resolvedCandidates = candidates
+ .filter((candidate) => candidate.status !== "pending")
+ .slice()
+ .sort((left, right) => right.updated_at.localeCompare(left.updated_at))
+ const candidateClusters = groupCandidateClusters(pendingCandidates)
+
+ return (
+
+ {errorMessage ? (
+ {errorMessage}
+ ) : null}
+ {successMessage ? (
+ {successMessage}
+ ) : null}
+
+
+
+ Clusters
+ {candidateClusters.length}
+ Grouped review cards for pending candidates.
+
+
+ Pending
+ {pendingCandidates.length}
+ Candidates still waiting for editorial action or auto-promotion.
+
+
+ Auto-promotion log
+ {resolvedCandidates.length}
+ Accepted, rejected, or merged candidates already resolved.
+
+
+
+
+
+ Review clusters
+
+
+ Auto-promotion log
+
+
+ Back to entities
+
+
+
+ {activeTab === "auto-log" ? (
+
+ {resolvedCandidates.length === 0 ? (
+
+ No auto-promotion or review history is available for this project yet.
+
+ ) : null}
+ {resolvedCandidates.map((candidate) => (
+
+
+
+
{candidate.name}
+
+ {candidate.occurrence_count} occurrences
+ {candidate.source_plugin_count} sources
+ Resolved {formatDate(candidate.updated_at)}
+ {candidate.merged_into_name ? Merged into {candidate.merged_into_name} : null}
+
+
+
+ {candidate.status}
+
+
+
+ {candidate.source_plugins.map((plugin) => (
+
+ {plugin}
+
+ ))}
+ {candidate.identity_surfaces.map((surface) => (
+
+ {surface} identity hint
+
+ ))}
+
+
+ ))}
+
+ ) : (
+
+ {candidateClusters.length === 0 ? (
+
+ No pending candidate clusters need review right now.
+
+ ) : null}
+
+ {candidateClusters.map((cluster) => (
+
+
+
+
Cluster review
+
+ Cluster of {cluster.members.length} candidate{cluster.members.length === 1 ? "" : "s"}
+
+
+ {cluster.totalOccurrences} total occurrences
+ {cluster.sourcePlugins.length} source families
+ {cluster.identitySurfaces.length > 0 ? (
+ {cluster.identitySurfaces.length} identity hints
+ ) : null}
+
+
+
+ {cluster.clusterKey}
+
+
+
+
+ {cluster.sourcePlugins.map((plugin) => (
+
+ {plugin}
+
+ ))}
+ {cluster.identitySurfaces.map((surface) => (
+
+ {surface} identity hint
+
+ ))}
+
+
+
+
+ {cluster.members.map((candidate) => (
+
+
+
+
{candidate.name}
+
+ {candidate.suggested_type}
+ {candidate.occurrence_count} occurrences
+ {candidate.evidence_count} evidence rows
+ {candidate.first_seen_title ? First seen in {candidate.first_seen_title} : null}
+
+
+
{candidate.status}
+
+ {candidate.auto_promotion_blocked_reason ? (
+
+ Auto-promotion blocked: {candidate.auto_promotion_blocked_reason.replaceAll("_", " ")}
+
+ ) : null}
+
+ ))}
+
+
+
+
Bulk cluster actions
+
+
+
+ {cluster.members.map((candidate) => (
+
+ ))}
+
+ Accept cluster
+
+
+
+
+
+
+ {cluster.members.map((candidate) => (
+
+ ))}
+
+ Reject cluster
+
+
+
+
+
+
+ {cluster.members.map((candidate) => (
+
+ ))}
+
+ Merge cluster into entity
+
+ Select entity
+ {entities.map((entity) => (
+ {entity.name}
+ ))}
+
+
+
+ Merge cluster
+
+
+
+
+
+ ))}
+
+ )}
+
+ )
+}
\ No newline at end of file
diff --git a/frontend/src/app/entities/page.test.tsx b/frontend/src/app/entities/page.test.tsx
index beca23cc..13baad21 100644
--- a/frontend/src/app/entities/page.test.tsx
+++ b/frontend/src/app/entities/page.test.tsx
@@ -109,6 +109,12 @@ function createEntityCandidate(
first_seen_in: 21,
first_seen_title: "River Labs launches hosted platform",
occurrence_count: 2,
+ cluster_key: "cluster-1",
+ auto_promotion_blocked_reason: "needs_more_occurrences",
+ evidence_count: 2,
+ source_plugin_count: 2,
+ source_plugins: ["rss", "linkedin"],
+ identity_surfaces: ["linkedin"],
status: "pending",
merged_into: null,
merged_into_name: "",
@@ -256,6 +262,9 @@ describe("EntitiesPage", () => {
expect(
screen.getByText("First seen in River Labs launches hosted platform"),
).toBeInTheDocument()
+ expect(
+ screen.getByRole("link", { name: "Open clustered queue" }),
+ ).toHaveAttribute("href", "/entities/candidates?project=3")
const badges = screen.getAllByTestId("status-badge")
expect(badges[0]).toHaveAttribute("data-tone", "warning")
diff --git a/frontend/src/app/entities/page.tsx b/frontend/src/app/entities/page.tsx
index b01f3b10..3b35b3e9 100644
--- a/frontend/src/app/entities/page.tsx
+++ b/frontend/src/app/entities/page.tsx
@@ -142,6 +142,15 @@ export default async function EntitiesPage({
Pending entity candidates
+
+ Need cluster-level review instead of one-off actions? Open the grouped queue.
+
+
+ Open clustered queue
+
{entityCandidates.length === 0 ? (
diff --git a/frontend/src/components/layout/AppShell/index.test.tsx b/frontend/src/components/layout/AppShell/index.test.tsx
index 40de035b..c32e8bf2 100644
--- a/frontend/src/components/layout/AppShell/index.test.tsx
+++ b/frontend/src/components/layout/AppShell/index.test.tsx
@@ -78,6 +78,10 @@ describe("AppShell", () => {
"href",
"/ideas?project=2",
)
+ expect(screen.getByRole("link", { name: "Drafts" })).toHaveAttribute(
+ "href",
+ "/drafts?project=2",
+ )
expect(screen.getByRole("link", { name: "Entities" })).toHaveAttribute(
"href",
"/entities?project=2",
diff --git a/frontend/src/components/layout/AppShell/index.tsx b/frontend/src/components/layout/AppShell/index.tsx
index 4a95d7c3..4bdf3b93 100644
--- a/frontend/src/components/layout/AppShell/index.tsx
+++ b/frontend/src/components/layout/AppShell/index.tsx
@@ -66,6 +66,12 @@ export function AppShell({
>
Ideas
+
+ Drafts
+
{
)
}
+/**
+ * Fetch project configuration rows for the selected project.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @returns Project configuration rows visible for the project.
+ */
+export async function getProjectConfigs(
+ projectId: number,
+): Promise
{
+ return apiFetch(`/api/v1/projects/${projectId}/project-configs/`)
+}
+
+/**
+ * Fetch the current project configuration, or `null` when none exists yet.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @returns The first configuration row for the project, if any.
+ */
+export async function getProjectConfig(
+ projectId: number,
+): Promise {
+ const configs = await getProjectConfigs(projectId)
+ return configs[0] ?? null
+}
+
+/**
+ * Create a project configuration row.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param payload - Configuration fields accepted by the backend serializer.
+ * @returns The created project configuration row.
+ */
+export async function createProjectConfig(
+ projectId: number,
+ payload: Omit,
+): Promise {
+ return apiFetch(`/api/v1/projects/${projectId}/project-configs/`, {
+ method: "POST",
+ body: JSON.stringify(payload),
+ })
+}
+
+/**
+ * Partially update one project configuration row.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param configId - Numeric project-config identifier.
+ * @param payload - Partial configuration fields accepted by the backend serializer.
+ * @returns The updated project configuration row.
+ */
+export async function updateProjectConfig(
+ projectId: number,
+ configId: number,
+ payload: Partial>,
+): Promise {
+ return apiFetch(
+ `/api/v1/projects/${projectId}/project-configs/${configId}/`,
+ {
+ method: "PATCH",
+ body: JSON.stringify(payload),
+ },
+ )
+}
+
+/**
+ * Trigger source-quality and authority recomputation for one project config.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param configId - Numeric project-config identifier.
+ * @returns A queued or completed recompute response.
+ */
+export async function recomputeProjectConfigAuthority(
+ projectId: number,
+ configId: number,
+): Promise {
+ return apiFetch(
+ `/api/v1/projects/${projectId}/project-configs/${configId}/recompute_authority/`,
+ {
+ method: "POST",
+ },
+ )
+}
+
/**
* Fetch a single tracked entity for a project.
*
@@ -842,6 +933,26 @@ export async function getProjectEntityAuthorityHistory(
)
}
+/**
+ * Fetch the latest persisted authority component breakdown for one tracked entity.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param entityId - Numeric entity identifier inside the project.
+ * @returns The current authority snapshot for the requested entity.
+ * @example
+ * ```ts
+ * const components = await getProjectEntityAuthorityComponents(4, 9)
+ * ```
+ */
+export async function getProjectEntityAuthorityComponents(
+ projectId: number,
+ entityId: number,
+): Promise {
+ return apiFetch(
+ `/api/v1/projects/${projectId}/entities/${entityId}/authority_components/`,
+ )
+}
+
/**
* Fetch entity candidates awaiting review for a project.
*
@@ -1216,6 +1327,240 @@ export async function markProjectOriginalContentIdeaWritten(
)
}
+/**
+ * Fetch newsletter drafts for a project.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @returns Draft rows visible to the current editor.
+ */
+export async function getProjectNewsletterDrafts(
+ projectId: number,
+): Promise {
+ return apiFetch(`/api/v1/projects/${projectId}/drafts/`)
+}
+
+/**
+ * Fetch one newsletter draft detail payload for a project.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param draftId - Numeric draft identifier.
+ * @returns The requested draft tree payload.
+ */
+export async function getProjectNewsletterDraft(
+ projectId: number,
+ draftId: number,
+): Promise {
+ return apiFetch(`/api/v1/projects/${projectId}/drafts/${draftId}/`)
+}
+
+/**
+ * Trigger newsletter draft generation for a project.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @returns Either a queued or completed generation response.
+ */
+export async function generateProjectNewsletterDraft(
+ projectId: number,
+): Promise {
+ return apiFetch(
+ `/api/v1/projects/${projectId}/drafts/generate/`,
+ {
+ method: "POST",
+ },
+ )
+}
+
+/**
+ * Narrow a newsletter draft generation response to the completed branch.
+ *
+ * @param response - Draft generation response returned by the backend.
+ * @returns `true` when the response includes an immediate generation result.
+ */
+export function isCompletedNewsletterDraftGeneration(
+ response: NewsletterDraftGenerationResponse,
+): response is Extract<
+ NewsletterDraftGenerationResponse,
+ { status: "completed" }
+> {
+ return response.status === "completed"
+}
+
+/**
+ * Partially update one newsletter draft.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param draftId - Numeric draft identifier.
+ * @param payload - Partial editable draft fields.
+ * @returns The updated draft payload.
+ */
+export async function updateProjectNewsletterDraft(
+ projectId: number,
+ draftId: number,
+ payload: {
+ title?: string
+ intro?: string
+ outro?: string
+ target_publish_date?: string | null
+ },
+): Promise {
+ return apiFetch(`/api/v1/projects/${projectId}/drafts/${draftId}/`, {
+ method: "PATCH",
+ body: JSON.stringify(payload),
+ })
+}
+
+/**
+ * Regenerate one draft section without rebuilding the whole draft.
+ *
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param draftId - Numeric draft identifier.
+ * @param sectionId - Numeric draft-section identifier.
+ * @returns Either the updated draft or a queued regeneration response.
+ */
+export async function regenerateProjectNewsletterDraftSection(
+ projectId: number,
+ draftId: number,
+ sectionId: number,
+): Promise {
+ return apiFetch(
+ `/api/v1/projects/${projectId}/drafts/${draftId}/regenerate_section/`,
+ {
+ method: "POST",
+ body: JSON.stringify({ section_id: sectionId }),
+ },
+ )
+}
+
+/**
+ * Partially update one newsletter draft section.
+ *
+ * @param sectionId - Numeric draft-section identifier.
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param payload - Partial editable section fields.
+ * @returns The updated section payload.
+ */
+export async function updateProjectNewsletterDraftSection(
+ sectionId: number,
+ projectId: number,
+ payload: {
+ title?: string
+ lede?: string
+ order?: number
+ },
+): Promise {
+ return apiFetch(
+ `/api/v1/projects/${projectId}/draft-sections/${sectionId}/`,
+ {
+ method: "PATCH",
+ body: JSON.stringify(payload),
+ },
+ )
+}
+
+/**
+ * Remove one newsletter draft section.
+ *
+ * @param sectionId - Numeric draft-section identifier.
+ * @param projectId - Numeric project identifier from the Django API.
+ * @returns `undefined` when the section is deleted successfully.
+ */
+export async function deleteProjectNewsletterDraftSection(
+ sectionId: number,
+ projectId: number,
+) {
+ return apiFetch(`/api/v1/projects/${projectId}/draft-sections/${sectionId}/`, {
+ method: "DELETE",
+ })
+}
+
+/**
+ * Partially update one newsletter draft item.
+ *
+ * @param itemId - Numeric draft-item identifier.
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param payload - Partial editable item fields.
+ * @returns The updated item payload.
+ */
+export async function updateProjectNewsletterDraftItem(
+ itemId: number,
+ projectId: number,
+ payload: {
+ summary_used?: string
+ why_it_matters?: string
+ order?: number
+ },
+): Promise {
+ return apiFetch(
+ `/api/v1/projects/${projectId}/draft-items/${itemId}/`,
+ {
+ method: "PATCH",
+ body: JSON.stringify(payload),
+ },
+ )
+}
+
+/**
+ * Remove one newsletter draft item.
+ *
+ * @param itemId - Numeric draft-item identifier.
+ * @param projectId - Numeric project identifier from the Django API.
+ * @returns `undefined` when the item is deleted successfully.
+ */
+export async function deleteProjectNewsletterDraftItem(
+ itemId: number,
+ projectId: number,
+) {
+ return apiFetch(`/api/v1/projects/${projectId}/draft-items/${itemId}/`, {
+ method: "DELETE",
+ })
+}
+
+/**
+ * Partially update one newsletter draft original piece.
+ *
+ * @param pieceId - Numeric draft original-piece identifier.
+ * @param projectId - Numeric project identifier from the Django API.
+ * @param payload - Partial editable original-piece fields.
+ * @returns The updated original-piece payload.
+ */
+export async function updateProjectNewsletterDraftOriginalPiece(
+ pieceId: number,
+ projectId: number,
+ payload: {
+ title?: string
+ pitch?: string
+ suggested_outline?: string
+ order?: number
+ },
+): Promise {
+ return apiFetch(
+ `/api/v1/projects/${projectId}/draft-original-pieces/${pieceId}/`,
+ {
+ method: "PATCH",
+ body: JSON.stringify(payload),
+ },
+ )
+}
+
+/**
+ * Remove one newsletter draft original piece.
+ *
+ * @param pieceId - Numeric draft original-piece identifier.
+ * @param projectId - Numeric project identifier from the Django API.
+ * @returns `undefined` when the original piece is deleted successfully.
+ */
+export async function deleteProjectNewsletterDraftOriginalPiece(
+ pieceId: number,
+ projectId: number,
+) {
+ return apiFetch(
+ `/api/v1/projects/${projectId}/draft-original-pieces/${pieceId}/`,
+ {
+ method: "DELETE",
+ },
+ )
+}
+
/**
* Fetch project-level source diversity observability metrics.
*
diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts
index 940d3d38..bd0d8fb8 100644
--- a/frontend/src/lib/types.ts
+++ b/frontend/src/lib/types.ts
@@ -16,6 +16,28 @@ export type Project = {
created_at: string
}
+export type ProjectConfig = {
+ id: number
+ project: number
+ draft_schedule_cron: string
+ authority_weight_mention: number
+ authority_weight_engagement: number
+ authority_weight_recency: number
+ authority_weight_source_quality: number
+ authority_weight_cross_newsletter: number
+ authority_weight_feedback: number
+ authority_weight_duplicate: number
+ upvote_authority_weight: number
+ downvote_authority_weight: number
+ authority_decay_rate: number
+}
+
+export type ProjectConfigAuthorityRecomputeResponse = {
+ status: "queued" | "completed"
+ project_id: number
+ config_id: number
+}
+
export type UserProfile = {
id: number
username: string
@@ -168,6 +190,129 @@ export type NewsletterIntake = {
error_message: string
}
+export type NewsletterDraftStatus =
+ | "generating"
+ | "ready"
+ | "edited"
+ | "published"
+ | "discarded"
+
+export type NewsletterDraftGenerationMetadata = {
+ source_theme_ids: number[]
+ source_idea_ids: number[]
+ trigger_source?: string
+ models?: Record
+ coherence_suggestions?: string[]
+ error?: string
+ last_regenerated_section_id?: number
+ last_regenerated_at?: string
+}
+
+export type NewsletterDraftItemContent = {
+ id: number
+ url: string
+ title: string
+ source_plugin: string
+ published_date: string
+}
+
+export type NewsletterDraftItem = {
+ id: number
+ section: number
+ content: number
+ content_detail: NewsletterDraftItemContent
+ summary_used: string
+ why_it_matters: string
+ order: number
+}
+
+export type NewsletterDraftThemeSuggestion = {
+ id: number
+ title: string
+ pitch: string
+ why_it_matters: string
+}
+
+export type NewsletterDraftSection = {
+ id: number
+ draft: number
+ theme_suggestion: number | null
+ theme_suggestion_detail: NewsletterDraftThemeSuggestion | null
+ title: string
+ lede: string
+ order: number
+ items: NewsletterDraftItem[]
+}
+
+export type NewsletterDraftOriginalPieceIdea = {
+ id: number
+ angle_title: string
+ summary: string
+ suggested_outline: string
+}
+
+export type NewsletterDraftOriginalPiece = {
+ id: number
+ draft: number
+ idea: number
+ idea_detail: NewsletterDraftOriginalPieceIdea
+ title: string
+ pitch: string
+ suggested_outline: string
+ order: number
+}
+
+export type NewsletterDraft = {
+ id: number
+ project: number
+ title: string
+ intro: string
+ outro: string
+ target_publish_date: string | null
+ status: NewsletterDraftStatus
+ generated_at: string
+ last_edited_at: string | null
+ generation_metadata: NewsletterDraftGenerationMetadata
+ sections: NewsletterDraftSection[]
+ original_pieces: NewsletterDraftOriginalPiece[]
+ rendered_markdown: string
+ rendered_html: string
+}
+
+export type NewsletterDraftGenerationResult = {
+ project_id: number
+ draft_id: number | null
+ status: NewsletterDraftStatus | "skipped"
+ reason?: string
+ sections_created: number
+ original_pieces_created: number
+}
+
+export type NewsletterDraftGenerationQueuedResponse = {
+ status: "queued"
+ project_id: number
+}
+
+export type NewsletterDraftGenerationCompletedResponse = {
+ status: "completed"
+ project_id: number
+ result: NewsletterDraftGenerationResult
+}
+
+export type NewsletterDraftGenerationResponse =
+ | NewsletterDraftGenerationQueuedResponse
+ | NewsletterDraftGenerationCompletedResponse
+
+export type NewsletterDraftSectionRegenerationQueuedResponse = {
+ status: "queued"
+ draft_id: number
+ section_id: number
+}
+
+export type NewsletterDraftSectionRegenerationResponse =
+ | NewsletterDraft
+ | NewsletterDraftSectionRegenerationQueuedResponse
+
export type Entity = {
id: number
project: number
@@ -192,9 +337,14 @@ export type EntityAuthoritySnapshot = {
project: number
computed_at: string
mention_component: number
+ engagement_component: number
+ recency_component: number
+ source_quality_component: number
+ cross_newsletter_component: number
feedback_component: number
duplicate_component: number
decayed_prior: number
+ weights_at_compute: Record
final_score: number
}
@@ -238,6 +388,12 @@ export type EntityCandidate = {
first_seen_in: number | null
first_seen_title: string
occurrence_count: number
+ cluster_key: string
+ auto_promotion_blocked_reason: string
+ evidence_count: number
+ source_plugin_count: number
+ source_plugins: string[]
+ identity_surfaces: string[]
status: "pending" | "accepted" | "rejected" | "merged"
merged_into: number | null
merged_into_name: string
diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo
index 3cbbcfa3..632df44e 100644
--- a/frontend/tsconfig.tsbuildinfo
+++ b/frontend/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.es2025.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.es2025.collection.d.ts","./node_modules/typescript/lib/lib.es2025.float16.d.ts","./node_modules/typescript/lib/lib.es2025.intl.d.ts","./node_modules/typescript/lib/lib.es2025.iterator.d.ts","./node_modules/typescript/lib/lib.es2025.promise.d.ts","./node_modules/typescript/lib/lib.es2025.regexp.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.date.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.esnext.temporal.d.ts","./node_modules/typescript/lib/lib.esnext.typedarrays.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/css.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/styled-jsx/types/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/node/compatibility/iterators.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/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.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-stats.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/round-robin-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.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/snapshot-agent.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/cache-interceptor.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/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/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.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.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.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/path/posix.d.ts","./node_modules/@types/node/path/win32.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/quic.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/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.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/test/reporters.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/util/types.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/@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/lib/fallback.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/entry-constants.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/lib/bundler.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/request/search-params.d.ts","./node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.d.ts","./node_modules/next/dist/server/app-render/vary-params.d.ts","./node_modules/next/dist/server/request/params.d.ts","./node_modules/next/dist/server/route-kind.d.ts","./node_modules/next/dist/server/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/lib/cache-control.d.ts","./node_modules/next/dist/shared/lib/app-router-types.d.ts","./node_modules/next/dist/server/lib/cache-handlers/types.d.ts","./node_modules/next/dist/server/use-cache/use-cache-wrapper.d.ts","./node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","./node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","./node_modules/next/dist/build/static-paths/types.d.ts","./node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/build/adapter/setup-node-env.external.d.ts","./node_modules/next/dist/server/instrumentation/types.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/worker.d.ts","./node_modules/next/dist/server/lib/experimental/ppr.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","./node_modules/next/dist/build/segment-config/pages/pages-segment-config.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/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/server/node-environment-baseline.d.ts","./node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-file.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-exit.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-dim.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/random.d.ts","./node_modules/next/dist/server/node-environment-extensions/date.d.ts","./node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","./node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","./node_modules/next/dist/server/lib/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/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/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/client/components/readonly-url-search-params.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/client/flight-data-helpers.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-key.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/segment-cache/types.d.ts","./node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","./node_modules/next/dist/client/components/segment-cache/scheduler.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-map.d.ts","./node_modules/next/dist/client/components/segment-cache/vary-path.d.ts","./node_modules/next/dist/client/components/segment-cache/cache.d.ts","./node_modules/next/dist/client/components/router-reducer/ppr-navigations.d.ts","./node_modules/next/dist/client/components/segment-cache/navigation.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/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/normalizers/normalizer.d.ts","./node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/after/builtin-request-context.d.ts","./node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","./node_modules/next/dist/server/route-modules/pages/builtin/_error.d.ts","./node_modules/next/dist/server/load-default-error-components.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/after/after.d.ts","./node_modules/next/dist/server/after/after-context.d.ts","./node_modules/next/dist/server/use-cache/cache-life.d.ts","./node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/lazy-result.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/shared/lib/action-revalidation-kind.d.ts","./node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","./node_modules/next/dist/server/async-storage/work-store.d.ts","./node_modules/next/dist/server/web/http.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect-error.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/server/app-render/cache-signal.d.ts","./node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-samples.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/implicit-tags.d.ts","./node_modules/next/dist/server/app-render/staged-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","./node_modules/next/dist/build/templates/app-route.d.ts","./node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","./node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","./node_modules/next/dist/build/segment-config/app/app-segments.d.ts","./node_modules/next/dist/build/get-supported-browsers.d.ts","./node_modules/next/dist/build/utils.d.ts","./node_modules/next/dist/build/rendering-mode.d.ts","./node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","./node_modules/next/dist/server/lib/cpu-profile.d.ts","./node_modules/next/dist/build/turborepo-access-trace/types.d.ts","./node_modules/next/dist/build/turborepo-access-trace/result.d.ts","./node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","./node_modules/next/dist/build/turborepo-access-trace/index.d.ts","./node_modules/next/dist/export/routes/types.d.ts","./node_modules/next/dist/export/types.d.ts","./node_modules/next/dist/export/worker.d.ts","./node_modules/next/dist/build/worker.d.ts","./node_modules/next/dist/build/index.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/env/dist/index.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/build/build-context.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/swc/generated-native.d.ts","./node_modules/next/dist/build/define-env.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/build/swc/types.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/next-devtools/shared/types.d.ts","./node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/cache-indicator.d.ts","./node_modules/next/dist/server/lib/parse-stack.d.ts","./node_modules/next/dist/next-devtools/server/shared.d.ts","./node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","./node_modules/next/dist/server/dev/debug-channel.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.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/build/segment-config/middleware/middleware-config.d.ts","./node_modules/next/dist/server/web/types.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/lib/async-callback-set.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/sharp/lib/index.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/lru-cache.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/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/router-utils/router-server-context.d.ts","./node_modules/next/dist/server/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/server/web/adapter.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/client/components/error-boundary.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/client-page.d.ts","./node_modules/next/dist/client/components/client-segment.d.ts","./node_modules/next/dist/client/components/http-access-fallback/error-boundary.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/dist/lib/metadata/types/resolvers.d.ts","./node_modules/next/dist/lib/metadata/types/icons.d.ts","./node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","./node_modules/next/dist/lib/metadata/metadata.d.ts","./node_modules/next/dist/lib/framework/boundary-components.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/collect-segment-data.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation.d.ts","./node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.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/route-modules/app-page/helpers/prerender-manifest-matcher.d.ts","./node_modules/@types/react/jsx-dev-runtime.d.ts","./node_modules/@types/react/compiler-runtime.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","./node_modules/@types/react-dom/client.d.ts","./node_modules/@types/react-dom/static.d.ts","./node_modules/@types/react-dom/server.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/request/fallback-params.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/server/web/spec-extension/url-pattern.d.ts","./node_modules/next/dist/server/after/index.d.ts","./node_modules/next/dist/server/request/connection.d.ts","./node_modules/next/dist/server/web/exports/index.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/cli/next-test.d.ts","./node_modules/next/dist/shared/lib/size-limit.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/build/adapter/build-complete.d.ts","./node_modules/next/dist/types.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.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/dist/server/use-cache/cache-tag.d.ts","./node_modules/next/cache.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/dist/client/components/catch-error.d.ts","./node_modules/next/dist/api/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/server/request/cookies.d.ts","./node_modules/next/dist/server/request/headers.d.ts","./node_modules/next/dist/server/request/draft-mode.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/unrecognized-action-error.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/forbidden.d.ts","./node_modules/next/dist/client/components/unauthorized.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.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/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/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/types.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./.next/types/routes.d.ts","./next-env.d.ts","./storybook.shims.d.ts","./node_modules/vite/types/hmrPayload.d.ts","./node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts","./node_modules/vite/types/customEvent.d.ts","./node_modules/rolldown/dist/shared/logging-C6h4g8dA.d.mts","./node_modules/@oxc-project/types/types.d.ts","./node_modules/rolldown/dist/shared/binding-zH1vcmbM.d.mts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/filter/composable-filters.d.ts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/filter/filter-vite-plugins.d.ts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/filter/simple-filters.d.ts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/filter/index.d.ts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/index.d.ts","./node_modules/rolldown/dist/shared/define-config-5HJ1b9vG.d.mts","./node_modules/rolldown/dist/index.d.mts","./node_modules/rolldown/dist/parse-ast-index.d.mts","./node_modules/vite/types/internal/rollupTypeCompat.d.ts","./node_modules/rolldown/dist/shared/constructors-D0W3rNfA.d.mts","./node_modules/rolldown/dist/plugins-index.d.mts","./node_modules/rolldown/dist/shared/transform-DgZ3paSD.d.mts","./node_modules/rolldown/dist/utils-index.d.mts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/esbuildOptions.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/types/internal/terserOptions.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/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssOptions.d.ts","./node_modules/vite/types/internal/cssPreprocessorOptions.d.ts","./node_modules/rolldown/dist/filter-index.d.mts","./node_modules/vite/types/importGlob.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/@vitest/utils/dist/display.d.ts","./node_modules/@vitest/utils/dist/types.d.ts","./node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/@vitest/utils/dist/timers.d.ts","./node_modules/@vitest/utils/dist/index.d.ts","./node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","./node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/@vitest/runner/dist/tasks.d-Bh0IjN67.d.ts","./node_modules/@vitest/runner/dist/index.d.ts","./node_modules/vitest/dist/chunks/traces.d.D2T_R8rx.d.ts","./node_modules/@vitest/snapshot/dist/environment.d-DOJxxZV9.d.ts","./node_modules/@vitest/snapshot/dist/rawSnapshot.d-D_X3-62x.d.ts","./node_modules/@vitest/snapshot/dist/index.d.ts","./node_modules/vitest/dist/chunks/config.d.A1h_Y6Jt.d.ts","./node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts","./node_modules/vitest/dist/chunks/rpc.d.B_8sPU0w.d.ts","./node_modules/vitest/dist/chunks/worker.d.ZpHpO4yb.d.ts","./node_modules/vitest/dist/chunks/browser.d.BcoexmFG.d.ts","./node_modules/@vitest/spy/optional-types.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/tinyrainbow/dist/index.d.ts","./node_modules/@standard-schema/spec/dist/index.d.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/vitest/optional-types.d.ts","./node_modules/@vitest/runner/dist/utils.d.ts","./node_modules/tinybench/dist/index.d.ts","./node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts","./node_modules/@vitest/mocker/dist/types.d-BjI5eAwu.d.ts","./node_modules/@vitest/mocker/dist/index.d-B41z0AuW.d.ts","./node_modules/@vitest/mocker/dist/index.d.ts","./node_modules/@vitest/utils/dist/source-map.d.ts","./node_modules/vitest/dist/chunks/global.d.DVsSRdQ5.d.ts","./node_modules/vitest/optional-runtime-types.d.ts","./node_modules/vitest/dist/chunks/suite.d.udJtyAgw.d.ts","./node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts","./node_modules/vitest/dist/runners.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./node_modules/vitest/dist/chunks/coverage.d.BZtK59WP.d.ts","./node_modules/@vitest/utils/dist/serialize.d.ts","./node_modules/@vitest/utils/dist/error.d.ts","./node_modules/vitest/dist/browser.d.ts","./node_modules/@vitest/browser/aria-role.d.ts","./node_modules/@vitest/browser/jest-dom.d.ts","./node_modules/@vitest/browser/matchers.d.ts","./node_modules/@vitest/browser/context.d.ts","./node_modules/@vitest/browser-playwright/context.d.ts","./node_modules/vitest/browser/context.d.ts","./node_modules/@vitest/snapshot/dist/manager.d.ts","./node_modules/vitest/dist/chunks/reporters.d.CEnv6XRv.d.ts","./node_modules/vitest/dist/chunks/plugin.d.BM2TCi12.d.ts","./node_modules/vitest/dist/coverage.d.ts","./node_modules/obug/dist/core.d.ts","./node_modules/obug/dist/node.d.ts","./node_modules/vitest/dist/node.d.ts","./node_modules/@vitest/browser/dist/index.d.ts","./node_modules/playwright-core/types/protocol.d.ts","./node_modules/playwright-core/types/structs.d.ts","./node_modules/zod/v4/core/json-schema.d.cts","./node_modules/zod/v4/core/standard-schema.d.cts","./node_modules/zod/v4/core/registries.d.cts","./node_modules/zod/v4/core/to-json-schema.d.cts","./node_modules/zod/v4/core/util.d.cts","./node_modules/zod/v4/core/versions.d.cts","./node_modules/zod/v4/core/schemas.d.cts","./node_modules/zod/v4/core/checks.d.cts","./node_modules/zod/v4/core/errors.d.cts","./node_modules/zod/v4/core/core.d.cts","./node_modules/zod/v4/core/parse.d.cts","./node_modules/zod/v4/core/regexes.d.cts","./node_modules/zod/v4/locales/ar.d.cts","./node_modules/zod/v4/locales/az.d.cts","./node_modules/zod/v4/locales/be.d.cts","./node_modules/zod/v4/locales/bg.d.cts","./node_modules/zod/v4/locales/ca.d.cts","./node_modules/zod/v4/locales/cs.d.cts","./node_modules/zod/v4/locales/da.d.cts","./node_modules/zod/v4/locales/de.d.cts","./node_modules/zod/v4/locales/en.d.cts","./node_modules/zod/v4/locales/eo.d.cts","./node_modules/zod/v4/locales/es.d.cts","./node_modules/zod/v4/locales/fa.d.cts","./node_modules/zod/v4/locales/fi.d.cts","./node_modules/zod/v4/locales/fr.d.cts","./node_modules/zod/v4/locales/fr-CA.d.cts","./node_modules/zod/v4/locales/he.d.cts","./node_modules/zod/v4/locales/hu.d.cts","./node_modules/zod/v4/locales/hy.d.cts","./node_modules/zod/v4/locales/id.d.cts","./node_modules/zod/v4/locales/is.d.cts","./node_modules/zod/v4/locales/it.d.cts","./node_modules/zod/v4/locales/ja.d.cts","./node_modules/zod/v4/locales/ka.d.cts","./node_modules/zod/v4/locales/kh.d.cts","./node_modules/zod/v4/locales/km.d.cts","./node_modules/zod/v4/locales/ko.d.cts","./node_modules/zod/v4/locales/lt.d.cts","./node_modules/zod/v4/locales/mk.d.cts","./node_modules/zod/v4/locales/ms.d.cts","./node_modules/zod/v4/locales/nl.d.cts","./node_modules/zod/v4/locales/no.d.cts","./node_modules/zod/v4/locales/ota.d.cts","./node_modules/zod/v4/locales/ps.d.cts","./node_modules/zod/v4/locales/pl.d.cts","./node_modules/zod/v4/locales/pt.d.cts","./node_modules/zod/v4/locales/ru.d.cts","./node_modules/zod/v4/locales/sl.d.cts","./node_modules/zod/v4/locales/sv.d.cts","./node_modules/zod/v4/locales/ta.d.cts","./node_modules/zod/v4/locales/th.d.cts","./node_modules/zod/v4/locales/tr.d.cts","./node_modules/zod/v4/locales/ua.d.cts","./node_modules/zod/v4/locales/uk.d.cts","./node_modules/zod/v4/locales/ur.d.cts","./node_modules/zod/v4/locales/uz.d.cts","./node_modules/zod/v4/locales/vi.d.cts","./node_modules/zod/v4/locales/zh-CN.d.cts","./node_modules/zod/v4/locales/zh-TW.d.cts","./node_modules/zod/v4/locales/yo.d.cts","./node_modules/zod/v4/locales/index.d.cts","./node_modules/zod/v4/core/doc.d.cts","./node_modules/zod/v4/core/api.d.cts","./node_modules/zod/v4/core/json-schema-processors.d.cts","./node_modules/zod/v4/core/json-schema-generator.d.cts","./node_modules/zod/v4/core/index.d.cts","./node_modules/zod/v4/classic/errors.d.cts","./node_modules/zod/v4/classic/parse.d.cts","./node_modules/zod/v4/classic/schemas.d.cts","./node_modules/zod/v4/classic/checks.d.cts","./node_modules/zod/v4/classic/compat.d.cts","./node_modules/zod/v4/classic/from-json-schema.d.cts","./node_modules/zod/v4/classic/iso.d.cts","./node_modules/zod/v4/classic/coerce.d.cts","./node_modules/zod/v4/classic/external.d.cts","./node_modules/zod/index.d.cts","./node_modules/zod/v3/helpers/typeAliases.d.cts","./node_modules/zod/v3/helpers/util.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/v3/index.d.cts","./node_modules/playwright-core/types/types.d.ts","./node_modules/playwright-core/index.d.ts","./node_modules/playwright/index.d.ts","./node_modules/@vitest/browser-playwright/dist/index.d.ts","./vitest.shims.d.ts","./next.config.ts","./node_modules/vitest/dist/config.d.ts","./node_modules/vitest/config.d.ts","./node_modules/@storybook/addon-vitest/dist/vitest-plugin/index.d.ts","./node_modules/@vitejs/plugin-react/types/optionalTypes.d.ts","./node_modules/@vitejs/plugin-react/dist/index.d.ts","./vitest.config.ts","./node_modules/@types/aria-query/index.d.ts","./node_modules/@testing-library/jest-dom/types/matchers.d.ts","./node_modules/@testing-library/jest-dom/types/jest.d.ts","./node_modules/@testing-library/jest-dom/types/index.d.ts","./node_modules/@testing-library/dom/types/matches.d.ts","./node_modules/@testing-library/dom/types/wait-for.d.ts","./node_modules/@testing-library/dom/types/query-helpers.d.ts","./node_modules/@testing-library/dom/types/queries.d.ts","./node_modules/@testing-library/dom/types/get-queries-for-element.d.ts","./node_modules/pretty-format/build/types.d.ts","./node_modules/pretty-format/build/index.d.ts","./node_modules/@testing-library/dom/types/screen.d.ts","./node_modules/@testing-library/dom/types/wait-for-element-to-be-removed.d.ts","./node_modules/@testing-library/dom/types/get-node-text.d.ts","./node_modules/@testing-library/dom/types/events.d.ts","./node_modules/@testing-library/dom/types/pretty-dom.d.ts","./node_modules/@testing-library/dom/types/role-helpers.d.ts","./node_modules/@testing-library/dom/types/config.d.ts","./node_modules/@testing-library/dom/types/suggestions.d.ts","./node_modules/@testing-library/dom/types/index.d.ts","./node_modules/@types/react-dom/test-utils/index.d.ts","./node_modules/@testing-library/react/types/index.d.ts","./vitest.setup.ts","./node_modules/next-auth/adapters.d.ts","./node_modules/jose/dist/types/types.d.ts","./node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/verify.d.ts","./node_modules/jose/dist/types/jws/flattened/verify.d.ts","./node_modules/jose/dist/types/jws/general/verify.d.ts","./node_modules/jose/dist/types/jwt/verify.d.ts","./node_modules/jose/dist/types/jwt/decrypt.d.ts","./node_modules/jose/dist/types/jwt/produce.d.ts","./node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/sign.d.ts","./node_modules/jose/dist/types/jws/flattened/sign.d.ts","./node_modules/jose/dist/types/jws/general/sign.d.ts","./node_modules/jose/dist/types/jwt/sign.d.ts","./node_modules/jose/dist/types/jwt/encrypt.d.ts","./node_modules/jose/dist/types/jwk/thumbprint.d.ts","./node_modules/jose/dist/types/jwk/embedded.d.ts","./node_modules/jose/dist/types/jwks/local.d.ts","./node_modules/jose/dist/types/jwks/remote.d.ts","./node_modules/jose/dist/types/jwt/unsecured.d.ts","./node_modules/jose/dist/types/key/export.d.ts","./node_modules/jose/dist/types/key/import.d.ts","./node_modules/jose/dist/types/util/decode_protected_header.d.ts","./node_modules/jose/dist/types/util/decode_jwt.d.ts","./node_modules/jose/dist/types/util/errors.d.ts","./node_modules/jose/dist/types/key/generate_key_pair.d.ts","./node_modules/jose/dist/types/key/generate_secret.d.ts","./node_modules/jose/dist/types/util/base64url.d.ts","./node_modules/jose/dist/types/util/runtime.d.ts","./node_modules/jose/dist/types/index.d.ts","./node_modules/openid-client/types/index.d.ts","./node_modules/next-auth/providers/oauth-types.d.ts","./node_modules/next-auth/providers/oauth.d.ts","./node_modules/next-auth/providers/email.d.ts","./node_modules/next-auth/core/lib/cookie.d.ts","./node_modules/next-auth/core/index.d.ts","./node_modules/next-auth/providers/credentials.d.ts","./node_modules/next-auth/providers/index.d.ts","./node_modules/next-auth/jwt/types.d.ts","./node_modules/next-auth/jwt/index.d.ts","./node_modules/next-auth/utils/logger.d.ts","./node_modules/next-auth/core/types.d.ts","./node_modules/next-auth/next/index.d.ts","./node_modules/next-auth/index.d.ts","./node_modules/next-auth/providers/github.d.ts","./node_modules/next-auth/providers/google.d.ts","./src/lib/auth.ts","./src/app/api/auth/[...nextauth]/route.ts","./src/app/api/auth/[...nextauth]/route.test.ts","./src/lib/types.ts","./src/lib/api.ts","./src/app/api/content-skills/route.ts","./src/app/api/content-skills/route.test.ts","./src/app/api/entities/route.ts","./src/app/api/entities/route.test.ts","./src/app/api/entities/[id]/route.ts","./src/app/api/entities/[id]/route.test.ts","./src/app/api/entity-candidates/[id]/route.ts","./src/app/api/entity-candidates/[id]/route.test.ts","./src/app/api/feedback/route.ts","./src/app/api/feedback/route.test.ts","./src/app/api/invitations/[token]/accept/route.ts","./src/app/api/invitations/[token]/accept/route.test.ts","./src/app/api/profile/route.ts","./src/app/api/profile/route.test.ts","./src/app/api/profile/avatar/route.ts","./src/app/api/profile/avatar/route.test.ts","./src/app/api/projects/route.ts","./src/app/api/projects/route.test.ts","./src/app/api/projects/[id]/trend-action-helpers.ts","./src/app/api/projects/[id]/bluesky-credentials/route.ts","./src/app/api/projects/[id]/bluesky-credentials/route.test.ts","./src/app/api/projects/[id]/ideas/generate/route.ts","./src/app/api/projects/[id]/ideas/route.test.ts","./src/app/api/projects/[id]/ideas/[ideaId]/accept/route.ts","./src/app/api/projects/[id]/ideas/[ideaId]/dismiss/route.ts","./src/app/api/projects/[id]/ideas/[ideaId]/mark-written/route.ts","./src/app/api/projects/[id]/ideas/[ideaId]/route.test.ts","./src/app/api/projects/[id]/intake/route.ts","./src/app/api/projects/[id]/intake/route.test.ts","./src/app/api/projects/[id]/intake-allowlist/route.ts","./src/app/api/projects/[id]/intake-allowlist/route.test.ts","./src/app/api/projects/[id]/intake-allowlist/[allowlistId]/route.ts","./src/app/api/projects/[id]/intake-allowlist/[allowlistId]/route.test.ts","./src/app/api/projects/[id]/invitations/route.ts","./src/app/api/projects/[id]/invitations/route.test.ts","./src/app/api/projects/[id]/invitations/[invitationId]/revoke/route.ts","./src/app/api/projects/[id]/invitations/[invitationId]/revoke/route.test.ts","./src/app/api/projects/[id]/linkedin-oauth/start/route.ts","./src/app/api/projects/[id]/linkedin-oauth/start/route.test.ts","./src/app/api/projects/[id]/mastodon-credentials/route.ts","./src/app/api/projects/[id]/mastodon-credentials/route.test.ts","./src/app/api/projects/[id]/members/[membershipId]/route.ts","./src/app/api/projects/[id]/members/[membershipId]/route.test.ts","./src/app/api/projects/[id]/rotate-intake-token/route.ts","./src/app/api/projects/[id]/rotate-intake-token/route.test.ts","./src/app/api/projects/[id]/themes/[themeId]/accept/route.ts","./src/app/api/projects/[id]/themes/[themeId]/dismiss/route.ts","./src/app/api/projects/[id]/themes/[themeId]/route.test.ts","./src/app/api/projects/[id]/verify-bluesky-credentials/route.ts","./src/app/api/projects/[id]/verify-bluesky-credentials/route.test.ts","./src/app/api/projects/[id]/verify-linkedin-credentials/route.ts","./src/app/api/projects/[id]/verify-linkedin-credentials/route.test.ts","./src/app/api/projects/[id]/verify-mastodon-credentials/route.ts","./src/app/api/projects/[id]/verify-mastodon-credentials/route.test.ts","./src/app/api/review/[id]/route.ts","./src/app/api/review/[id]/route.test.ts","./src/app/api/skills/[skillName]/route.ts","./src/app/api/skills/[skillName]/route.test.ts","./src/app/api/source-configs/route.ts","./src/app/api/source-configs/route.test.ts","./src/app/api/source-configs/[id]/route.ts","./src/app/api/source-configs/[id]/route.test.ts","./node_modules/@tanstack/query-core/build/modern/_tsup-dts-rollup.d.ts","./node_modules/@tanstack/query-core/build/modern/index.d.ts","./node_modules/@tanstack/react-query/build/modern/_tsup-dts-rollup.d.ts","./node_modules/@tanstack/react-query/build/modern/index.d.ts","./src/app/content/[id]/_components/SkillActionBar/SkillActionBar.tsx","./src/app/content/[id]/_components/SkillActionBar/index.ts","./node_modules/next-auth/client/_utils.d.ts","./node_modules/next-auth/react/types.d.ts","./node_modules/next-auth/react/index.d.ts","./src/app/login/_components/SocialAuthButtons/SocialAuthButtons.tsx","./src/app/login/_components/SocialAuthButtons/index.ts","./src/app/login/_components/LoginForm/LoginForm.tsx","./src/app/login/_components/LoginForm/index.ts","./node_modules/file-selector/dist/file.d.ts","./node_modules/file-selector/dist/file-selector.d.ts","./node_modules/file-selector/dist/index.d.ts","./node_modules/react-dropzone/typings/react-dropzone.d.ts","./src/app/profile/_components/AvatarDropzone/AvatarDropzone.tsx","./src/app/profile/_components/AvatarDropzone/index.ts","./src/app/profile/_components/AvatarPreview/AvatarPreview.tsx","./src/app/profile/_components/AvatarPreview/index.ts","./src/app/profile/_components/ProfileForm/ProfileForm.tsx","./src/app/profile/_components/ProfileForm/index.ts","./src/lib/profile.ts","./src/app/profile/_components/ProfileSettingsPanel/ProfileSettingsPanel.tsx","./src/app/profile/_components/ProfileSettingsPanel/index.ts","./src/lib/view-helpers.ts","./src/lib/dashboard-view.ts","./src/lib/storybook-fixtures.ts","./src/lib/useRole.ts","./node_modules/clsx/clsx.d.mts","./node_modules/tailwind-merge/dist/types.d.ts","./src/lib/utils.ts","./src/lib/__tests__/api.test.ts","./src/lib/__tests__/auth.test.ts","./src/lib/__tests__/dashboard-view.test.ts","./src/lib/__tests__/view-helpers.test.ts","./test-support/server-only.ts","./node_modules/next/dist/compiled/@next/font/dist/types.d.ts","./node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","./node_modules/next/font/google/index.d.ts","./src/providers/QueryProvider/index.tsx","./node_modules/next-themes/dist/index.d.ts","./src/providers/ThemeProvider/index.tsx","./src/app/layout.tsx","./src/components/elements/StatusBadge/index.tsx","./src/components/elements/ThemeToggle/index.tsx","./src/components/layout/UserMenu/index.tsx","./src/components/layout/AppShell/index.tsx","./src/app/page.tsx","./src/app/__tests__/page.test.tsx","./node_modules/storybook/dist/router/index.d.ts","./node_modules/storybook/dist/theming/index.d.ts","./node_modules/storybook/dist/channels/index.d.ts","./node_modules/storybook/dist/preview-api/index.d.ts","./node_modules/storybook/dist/core-events/index.d.ts","./node_modules/ast-types/lib/gen/namedTypes.d.ts","./node_modules/ast-types/lib/gen/kinds.d.ts","./node_modules/ast-types/lib/gen/builders.d.ts","./node_modules/ast-types/lib/types.d.ts","./node_modules/ast-types/lib/path.d.ts","./node_modules/ast-types/lib/scope.d.ts","./node_modules/ast-types/lib/node-path.d.ts","./node_modules/ast-types/lib/path-visitor.d.ts","./node_modules/ast-types/lib/gen/visitor.d.ts","./node_modules/ast-types/lib/main.d.ts","./node_modules/recast/lib/options.d.ts","./node_modules/recast/lib/parser.d.ts","./node_modules/recast/lib/printer.d.ts","./node_modules/recast/main.d.ts","./node_modules/storybook/dist/babel/index.d.ts","./node_modules/storybook/dist/csf-tools/index.d.ts","./node_modules/@webcontainer/env/dist/environment.d.ts","./node_modules/@webcontainer/env/dist/url.d.ts","./node_modules/@webcontainer/env/dist/index.d.ts","./node_modules/storybook/dist/common/index.d.ts","./node_modules/storybook/dist/telemetry/index.d.ts","./node_modules/storybook/dist/core-server/index.d.ts","./node_modules/storybook/dist/node-logger/index.d.ts","./node_modules/storybook/dist/types/index.d.ts","./node_modules/storybook/dist/csf/index.d.ts","./node_modules/@storybook/react/dist/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@rollup/pluginutils/types/index.d.ts","./node_modules/vite-plugin-storybook-nextjs/dist/index.d.ts","./node_modules/@storybook/builder-vite/dist/index.d.ts","./node_modules/typescript/lib/typescript.d.ts","./node_modules/react-docgen-typescript/lib/parser.d.ts","./node_modules/react-docgen-typescript/lib/index.d.ts","./node_modules/@joshwooding/vite-plugin-react-docgen-typescript/dist/index.d.ts","./node_modules/@storybook/react-vite/dist/index.d.ts","./node_modules/@storybook/nextjs-vite/dist/index.d.ts","./src/app/admin/health/_components/SourceDiversityPanel/index.tsx","./node_modules/storybook/dist/manager-api/index.d.ts","./node_modules/storybook/dist/components/index.d.ts","./node_modules/storybook/dist/docs-tools/index.d.ts","./node_modules/@storybook/addon-docs/dist/blocks.d.ts","./src/lib/storybook-docs.tsx","./src/app/admin/health/page.stories.tsx","./src/app/admin/health/page.tsx","./src/app/admin/health/page.test.tsx","./src/app/admin/health/_components/SourceDiversityPanel/index.stories.tsx","./src/app/admin/projects/new/page.tsx","./node_modules/lucide-react/dist/lucide-react.d.ts","./node_modules/@base-ui/react/esm/internals/reason-parts.d.ts","./node_modules/@base-ui/react/esm/internals/reasons.d.ts","./node_modules/@base-ui/react/esm/internals/createBaseUIEventDetails.d.ts","./node_modules/@base-ui/react/esm/types/index.d.ts","./node_modules/@base-ui/react/esm/internals/types.d.ts","./node_modules/@base-ui/react/esm/button/Button.d.ts","./node_modules/@base-ui/react/esm/button/index.d.ts","./node_modules/class-variance-authority/dist/types.d.ts","./node_modules/class-variance-authority/dist/index.d.ts","./src/components/ui/button.tsx","./src/components/elements/CopyButton/index.tsx","./src/app/admin/sources/page.tsx","./src/app/admin/sources/page.test.tsx","./src/app/content/[id]/page.tsx","./src/app/content/[id]/page.test.tsx","./src/app/content/[id]/_components/SkillActionBar/SkillActionBar.test.tsx","./src/app/entities/page.tsx","./src/app/entities/page.test.tsx","./src/app/entities/[id]/page.tsx","./src/app/entities/[id]/page.test.tsx","./src/app/ideas/_components/OriginalContentIdeaCard/index.tsx","./src/app/ideas/page.stories.tsx","./src/app/ideas/page.tsx","./src/app/ideas/page.test.tsx","./src/app/ideas/_components/OriginalContentIdeaCard/index.stories.tsx","./src/app/invite/[token]/page.tsx","./src/app/login/page.tsx","./src/app/login/page.test.tsx","./src/app/login/_components/LoginForm/LoginForm.test.tsx","./src/app/login/_components/SocialAuthButtons/SocialAuthButtons.test.tsx","./src/app/profile/page.tsx","./src/app/profile/_components/AvatarDropzone/AvatarDropzone.test.tsx","./src/app/projects/[id]/members/page.tsx","./src/app/projects/[id]/members/invite/page.tsx","./src/app/themes/_components/ThemeSuggestionCard/index.tsx","./src/app/themes/page.stories.tsx","./src/app/themes/page.tsx","./src/app/themes/page.test.tsx","./src/app/themes/_components/ThemeSuggestionCard/index.stories.tsx","./src/app/trends/_components/TopicClusterCard/index.tsx","./src/app/trends/page.stories.tsx","./src/app/trends/page.tsx","./src/app/trends/page.test.tsx","./src/app/trends/_components/TopicClusterCard/index.stories.tsx","./src/components/elements/CopyButton/index.stories.tsx","./src/components/elements/CopyButton/index.test.tsx","./src/components/elements/StatusBadge/index.stories.tsx","./src/components/elements/StatusBadge/index.test.tsx","./src/components/elements/ThemeToggle/index.stories.tsx","./src/components/layout/AppShell/index.stories.tsx","./src/components/layout/AppShell/index.test.tsx","./node_modules/@testing-library/jest-dom/types/matchers-standalone.d.ts","./node_modules/storybook/node_modules/@vitest/spy/dist/index.d.ts","./node_modules/storybook/node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/types.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/storybook/node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","./node_modules/storybook/node_modules/tinyrainbow/dist/node.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/index.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/storybook/node_modules/@vitest/expect/dist/index.d.ts","./node_modules/@testing-library/user-event/dist/types/event/eventMap.d.ts","./node_modules/@testing-library/user-event/dist/types/event/types.d.ts","./node_modules/@testing-library/user-event/dist/types/event/dispatchEvent.d.ts","./node_modules/@testing-library/user-event/dist/types/event/focus.d.ts","./node_modules/@testing-library/user-event/dist/types/event/input.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/click/isClickableInput.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/dataTransfer/Blob.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/dataTransfer/DataTransfer.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/dataTransfer/FileList.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/dataTransfer/Clipboard.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/timeValue.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/isContentEditable.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/isEditable.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/maxLength.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/setFiles.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/cursor.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/getActiveElement.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/getTabDestination.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/isFocusable.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/selection.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/selector.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/keyDef/readNextDescriptor.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/cloneEvent.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/findClosest.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/getDocumentFromNode.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/getTreeDiff.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/getWindow.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/isDescendantOrSelf.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/isElementType.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/isVisible.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/isDisabled.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/level.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/wait.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/pointer/cssPointerEvents.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/index.d.ts","./node_modules/@testing-library/user-event/dist/types/document/UI.d.ts","./node_modules/@testing-library/user-event/dist/types/document/getValueOrTextContent.d.ts","./node_modules/@testing-library/user-event/dist/types/document/copySelection.d.ts","./node_modules/@testing-library/user-event/dist/types/document/trackValue.d.ts","./node_modules/@testing-library/user-event/dist/types/document/index.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/getInputRange.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/modifySelection.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/moveSelection.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/setSelectionPerMouse.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/modifySelectionPerMouse.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/selectAll.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/setSelectionRange.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/setSelection.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/updateSelectionOnFocus.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/index.d.ts","./node_modules/@testing-library/user-event/dist/types/event/index.d.ts","./node_modules/@testing-library/user-event/dist/types/system/pointer/buttons.d.ts","./node_modules/@testing-library/user-event/dist/types/system/pointer/shared.d.ts","./node_modules/@testing-library/user-event/dist/types/system/pointer/index.d.ts","./node_modules/@testing-library/user-event/dist/types/system/index.d.ts","./node_modules/@testing-library/user-event/dist/types/system/keyboard.d.ts","./node_modules/@testing-library/user-event/dist/types/options.d.ts","./node_modules/@testing-library/user-event/dist/types/convenience/click.d.ts","./node_modules/@testing-library/user-event/dist/types/convenience/hover.d.ts","./node_modules/@testing-library/user-event/dist/types/convenience/tab.d.ts","./node_modules/@testing-library/user-event/dist/types/convenience/index.d.ts","./node_modules/@testing-library/user-event/dist/types/keyboard/index.d.ts","./node_modules/@testing-library/user-event/dist/types/clipboard/copy.d.ts","./node_modules/@testing-library/user-event/dist/types/clipboard/cut.d.ts","./node_modules/@testing-library/user-event/dist/types/clipboard/paste.d.ts","./node_modules/@testing-library/user-event/dist/types/clipboard/index.d.ts","./node_modules/@testing-library/user-event/dist/types/pointer/index.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/clear.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/selectOptions.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/type.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/upload.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/index.d.ts","./node_modules/@testing-library/user-event/dist/types/setup/api.d.ts","./node_modules/@testing-library/user-event/dist/types/setup/directApi.d.ts","./node_modules/@testing-library/user-event/dist/types/setup/setup.d.ts","./node_modules/@testing-library/user-event/dist/types/setup/index.d.ts","./node_modules/@testing-library/user-event/dist/types/index.d.ts","./node_modules/storybook/dist/test/index.d.ts","./src/components/layout/UserMenu/index.stories.tsx","./src/components/layout/UserMenu/index.test.tsx","./src/lib/__tests__/useRole.test.tsx","./src/providers/QueryProvider/index.test.tsx","./src/providers/ThemeProvider/index.test.tsx","./.next/types/cache-life.d.ts","./.next/types/validator.ts","./.next/dev/types/cache-life.d.ts","./.next/dev/types/routes.d.ts","./.next/dev/types/validator.ts","./node_modules/vitest/globals.d.ts"],"fileIdsList":[[101,164,172,176,179,181,182,183,195,512,513,514,515,554,561,1172],[101,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,255,553,554,556,561,857,861,863,865,867,869,871,873,875,877,880,882,884,885,886,888,890,892,894,896,898,900,902,904,906,907,909,911,913,915,917,919,921,967,972,1022,1025,1038,1040,1043,1045,1049,1052,1053,1057,1059,1060,1063,1068,1172,1174,1175],[101,164,172,176,179,181,182,183,195,512,513,514,515,554,561,1174],[101,164,172,176,179,181,182,183,195,255,553,554,556,559,561,857,861,863,865,867,869,871,873,875,877,880,882,884,885,886,888,890,892,894,896,898,900,902,904,906,907,909,911,913,915,917,919,921,967,972,1022,1025,1038,1040,1043,1045,1049,1052,1053,1057,1059,1060,1063,1068,1172,1174],[101,164,172,176,179,181,182,183,195,554,557,558,559,561,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,557,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,1031,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1032,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1028,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1027,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,1030,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,1029,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,614,777,1009,1011,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1005,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,975,976,977,1002,1003,1017,1018,1166,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,778,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,614,777,1002,1172,1174],[101,164,172,176,179,181,182,183,195,547,554,561,1002,1003,1004,1007,1008,1013,1166,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1002,1004,1008,1012,1172,1174],[92,101,164,172,176,179,181,182,183,195,225,488,554,561,1002,1003,1166,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,923,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,924,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,925,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,790,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,787,788,789,790,791,794,795,796,797,798,799,800,801,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,783,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,793,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,787,788,789,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,787,788,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,790,791,793,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,788,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,785,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,784,1172,1174],[92,101,164,172,176,179,181,182,183,195,225,488,554,561,802,803,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1164,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1151,1152,1153,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1146,1147,1148,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1124,1125,1126,1127,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1090,1164,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1090,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1090,1091,1092,1093,1138,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1128,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1123,1129,1130,1131,1132,1133,1134,1135,1136,1137,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1138,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1089,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1142,1144,1145,1163,1164,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1142,1144,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1139,1142,1164,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1149,1150,1154,1155,1160,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1143,1145,1155,1163,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1162,1163,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1139,1143,1145,1161,1162,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1143,1164,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1141,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1141,1143,1164,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1139,1140,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1156,1157,1158,1159,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1145,1164,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1100,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1094,1101,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1120,1164,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,638,639,1172,1174],[101,161,162,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,163,164,172,176,179,181,182,183,195,554,561,1172,1174],[164,172,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,203,554,561,1172,1174],[101,164,165,170,172,175,176,179,181,182,183,185,195,200,212,554,561,1172,1174],[101,164,165,166,172,175,176,179,181,182,183,195,554,561,1172,1174],[101,164,167,172,176,179,181,182,183,195,213,554,561,1172,1174],[101,164,168,169,172,176,179,181,182,183,186,195,554,561,1172,1174],[101,164,169,172,176,179,181,182,183,195,200,209,554,561,1172,1174],[101,164,170,172,175,176,179,181,182,183,185,195,554,561,1172,1174],[101,163,164,171,172,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,173,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,174,175,176,179,181,182,183,195,554,561,1172,1174],[101,163,164,172,175,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,175,176,177,179,181,182,183,195,200,212,554,561,1172,1174],[101,164,172,175,176,177,179,181,182,183,195,200,203,554,561,1172,1174],[101,151,164,172,175,176,178,179,181,182,183,185,195,200,212,554,561,1172,1174],[101,164,172,175,176,178,179,181,182,183,185,195,200,209,212,554,561,1172,1174],[101,164,172,176,178,179,180,181,182,183,195,200,209,212,554,561,1172,1174],[99,100,101,102,103,104,105,106,107,108,109,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,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,554,561,1172,1174],[101,164,172,175,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,176,179,181,183,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,184,195,212,554,561,1172,1174],[101,164,172,175,176,179,181,182,183,185,195,200,554,561,1172,1174],[101,164,172,176,179,181,182,183,186,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,187,195,554,561,1172,1174],[101,164,172,175,176,179,181,182,183,190,195,554,561,1172,1174],[101,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,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,554,561,1172,1174],[101,164,172,176,179,181,182,183,192,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,193,195,554,561,1172,1174],[101,164,169,172,176,179,181,182,183,185,195,203,554,561,1172,1174],[101,164,172,175,176,179,181,182,183,195,196,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,197,213,216,554,561,1172,1174],[101,164,172,175,176,179,181,182,183,195,200,202,203,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,201,203,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,203,213,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,204,554,561,1172,1174],[101,161,164,172,176,179,181,182,183,195,200,206,212,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,200,205,554,561,1172,1174],[101,164,172,175,176,179,181,182,183,195,207,208,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,207,208,554,561,1172,1174],[101,164,169,172,176,179,181,182,183,185,195,200,209,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,210,554,561,1172,1174],[101,164,172,176,179,181,182,183,185,195,211,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,193,195,212,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,213,214,554,561,1172,1174],[101,164,169,172,176,179,181,182,183,195,214,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,200,215,554,561,1172,1174],[101,164,172,176,179,181,182,183,184,195,216,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,217,554,561,1172,1174],[101,164,167,172,176,179,181,182,183,195,554,561,1172,1174],[101,164,169,172,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,213,554,561,1172,1174],[101,151,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,212,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,218,554,561,1172,1174],[101,164,172,176,179,181,182,183,190,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,208,554,561,1172,1174],[101,151,164,172,175,176,177,179,181,182,183,190,195,200,203,212,215,216,218,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,200,219,554,561,1172,1174],[92,96,101,164,172,176,179,181,182,183,195,221,222,223,225,507,552,554,561,1017,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,1172,1174],[92,96,101,164,172,176,179,181,182,183,195,221,222,223,224,488,507,552,554,561,1017,1172,1174],[92,96,101,164,172,176,179,181,182,183,195,221,222,224,225,507,552,554,561,1017,1172,1174],[92,101,164,172,176,179,181,182,183,195,225,488,489,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,225,488,554,561,1172,1174],[92,96,101,164,172,176,179,181,182,183,195,222,223,224,225,507,552,554,561,1017,1172,1174],[92,96,101,164,172,176,179,181,182,183,195,221,223,224,225,507,552,554,561,1017,1172,1174],[90,91,101,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,614,777,780,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,668,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,670,677,678,773,774,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,660,664,665,667,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,668,677,678,774,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,665,668,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,660,666,667,668,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,616,622,635,636,637,640,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,646,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,646,647,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,620,622,623,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,620,622,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,620,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,620,626,627,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,620,626,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,634,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,621,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,617,621,662,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,617,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,616,617,618,619,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,995,996,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,979,980,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,979,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,980,982,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,979,985,986,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,979,981,982,983,985,986,987,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,982,983,984,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,982,985,987,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,982,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,982,985,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,979,981,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,953,1034,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,953,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,655,656,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,655,656,657,658,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,655,657,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,655,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,936,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,936,937,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,807,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,807,817,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,607,608,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,853,1172,1174],[101,164,172,176,178,179,181,182,183,195,220,554,561,853,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,844,851,1172,1174],[101,164,172,176,179,181,182,183,195,553,554,557,561,851,853,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,806,840,847,849,850,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,845,851,852,1172,1174],[101,164,172,176,179,181,182,183,195,553,554,557,561,848,853,1172,1174],[101,164,172,176,179,181,182,183,195,220,554,561,853,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,845,847,853,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,847,851,853,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,847,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,842,843,846,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,839,840,841,847,853,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,847,853,929,930,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,847,853,1172,1174],[101,164,172,176,179,181,182,183,195,510,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,512,513,514,515,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,458,521,522,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,230,231,233,245,269,384,395,503,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,233,264,265,266,268,503,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,233,401,403,405,406,408,503,505,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,233,267,304,503,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,231,233,244,245,251,257,262,383,384,385,394,503,505,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,503,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,240,246,265,285,380,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,233,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,226,240,246,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,412,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,409,410,412,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,409,411,503,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,285,482,500,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,356,359,375,380,500,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,328,500,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,388,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,387,388,389,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,387,554,561,1172,1174],[98,101,164,172,176,178,179,181,182,183,195,226,233,245,251,257,263,265,269,270,283,284,351,381,382,395,503,507,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,230,233,267,304,401,402,407,503,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,195,267,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,195,230,284,453,503,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,195,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,195,233,267,268,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,195,404,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,195,270,383,386,393,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,458,554,561,1172,1174],[101,164,172,176,179,181,182,183,193,195,240,255,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,240,255,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,325,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,246,255,458,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,240,311,325,326,537,544,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,310,538,539,540,541,543,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,361,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,361,362,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,244,246,313,314,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,246,320,321,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,246,315,323,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,320,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,238,246,313,314,315,316,317,318,319,320,323,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,246,313,320,321,322,324,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,246,314,316,317,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,314,316,319,321,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,542,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,246,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,234,531,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,212,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,267,302,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,267,395,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,300,305,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,301,509,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,961,1172,1174],[92,96,101,164,172,176,178,179,181,182,183,195,221,222,223,224,225,507,551,554,561,1017,1172,1174],[101,164,172,176,178,179,181,182,183,195,246,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,245,250,331,348,390,391,395,450,452,503,504,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,283,392,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,507,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,232,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,237,240,455,471,473,554,561,1172,1174],[101,164,172,176,179,181,182,183,193,195,240,455,470,471,472,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,464,465,466,467,468,469,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,466,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,470,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,255,419,420,422,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,246,413,414,415,416,421,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,419,421,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,417,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,418,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,301,509,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,508,509,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,509,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,348,349,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,349,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,504,509,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,378,554,561,1172,1174],[101,163,164,172,176,179,181,182,183,195,377,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,240,246,252,254,356,369,373,375,452,455,492,493,500,504,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,246,295,317,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,356,367,370,375,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,237,240,356,359,375,378,412,459,460,461,462,463,474,475,476,477,478,479,480,481,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,195,237,240,265,356,363,364,365,368,369,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,200,246,265,367,374,455,456,500,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,371,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,193,195,234,246,250,260,292,293,296,348,351,416,450,451,492,503,504,505,507,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,195,237,238,240,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,356,554,561,1172,1174],[101,163,164,172,176,179,181,182,183,195,265,292,293,350,351,352,353,354,355,504,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,375,554,561,1172,1174],[101,163,164,172,176,179,181,182,183,195,239,240,250,254,290,356,363,364,365,366,367,370,371,372,373,374,493,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,290,291,363,504,505,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,265,293,348,351,356,452,504,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,503,505,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,200,500,504,505,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,193,195,226,240,245,252,254,257,260,267,287,292,293,294,295,296,331,332,334,337,339,342,343,344,345,347,395,450,452,500,503,504,505,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,200,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,233,234,235,263,500,501,502,507,509,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,195,230,231,503,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,424,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,200,212,242,408,412,413,414,415,416,422,423,554,555,561,1172,1174],[101,164,172,176,179,181,182,183,193,195,212,226,240,242,254,257,293,332,337,347,348,401,428,429,430,436,439,440,450,452,500,503,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,257,263,270,283,293,351,503,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,212,234,245,254,293,434,500,503,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,454,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,424,437,438,447,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,500,503,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,353,493,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,254,292,395,509,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,193,195,232,337,397,401,430,436,439,442,500,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,270,283,401,443,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,233,294,395,445,503,505,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,212,416,503,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,267,294,395,396,397,406,424,444,446,503,554,561,1172,1174],[98,101,164,172,176,178,179,181,182,183,195,292,449,507,509,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,346,450,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,193,195,240,243,245,246,252,254,260,269,270,283,293,296,332,334,344,347,348,395,428,429,430,431,433,435,450,452,500,509,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,200,270,436,441,447,500,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,273,274,275,276,277,278,279,280,281,282,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,287,338,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,340,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,338,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,340,341,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,244,245,246,250,251,504,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,193,195,232,234,252,256,292,295,296,330,450,500,505,507,509,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,193,195,212,236,243,244,254,256,293,448,493,499,504,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,363,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,364,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,246,257,492,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,365,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,239,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,241,253,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,241,245,252,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,248,253,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,249,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,241,242,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,241,297,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,241,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,243,287,336,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,335,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,240,242,243,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,243,333,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,240,242,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,292,395,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,492,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,212,252,254,258,292,395,449,452,455,456,457,483,484,487,491,493,500,504,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,306,309,311,312,325,326,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,223,225,255,485,486,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,223,225,255,485,486,490,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,379,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,265,286,291,292,356,357,358,359,360,362,375,376,378,381,449,452,503,505,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,325,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,330,500,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,330,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,252,298,327,329,331,449,500,507,509,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,306,307,308,309,311,312,325,326,508,554,561,1172,1174],[98,101,164,172,176,178,179,181,182,183,193,195,212,241,242,254,260,292,293,296,395,447,448,450,500,503,504,507,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,237,240,247,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,291,293,425,428,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,291,426,494,495,496,497,498,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,287,503,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,290,375,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,289,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,291,344,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,288,290,503,554,561,1172,1174],[101,164,172,176,178,179,181,182,183,195,236,291,425,426,427,500,503,504,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,240,246,324,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,238,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,228,229,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,234,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,240,310,554,561,1172,1174],[92,98,101,164,172,176,179,181,182,183,195,292,296,507,509,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,234,531,532,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,305,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,193,195,212,232,299,301,303,304,509,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,240,267,504,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,240,432,554,561,1172,1174],[92,101,164,172,176,178,179,181,182,183,193,195,230,232,305,403,507,508,554,561,1172,1174],[92,101,164,172,176,179,181,182,183,195,221,222,223,224,225,507,552,554,561,1017,1172,1174],[92,93,94,95,96,101,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,398,399,400,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,398,554,561,1172,1174],[92,96,101,164,172,176,178,179,180,181,182,183,193,195,220,221,222,223,224,225,226,232,260,265,442,470,505,506,509,552,554,561,1017,1172,1174],[101,164,172,176,179,181,182,183,195,517,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,519,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,523,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,962,1172,1174],[101,164,172,176,179,181,182,183,195,525,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,527,528,529,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,533,554,561,1172,1174],[97,101,164,172,176,179,181,182,183,195,511,516,518,520,524,526,530,534,536,546,547,549,553,554,555,556,561,1172,1174],[101,164,172,176,179,181,182,183,195,535,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,545,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,301,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,548,554,561,1172,1174],[101,163,164,172,176,179,181,182,183,195,291,425,426,428,494,495,497,498,550,552,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,220,561,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,675,1172,1174],[101,164,169,172,176,178,179,180,181,182,183,195,212,213,220,554,561,839,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,771,1172,1174],[101,164,165,172,176,179,181,182,183,195,200,554,561,679,680,757,770,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,772,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,602,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,600,602,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,591,599,600,601,603,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,589,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,592,597,602,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,588,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,592,593,596,597,598,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,592,593,594,596,597,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,589,590,591,592,593,597,598,599,601,602,603,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,587,589,590,591,592,593,594,596,597,598,599,600,601,602,603,604,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,587,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,592,594,595,597,598,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,596,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,597,598,602,605,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,590,600,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,792,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1010,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1009,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,938,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,989,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,988,989,990,991,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,573,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,565,567,573,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,566,567,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,567,573,577,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,566,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,567,573,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,565,566,567,572,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,565,567,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,566,567,579,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,568,569,570,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,571,1172,1174],[101,164,172,176,179,181,182,183,195,200,220,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,992,1172,1174],[101,164,165,172,176,179,181,182,183,186,195,200,203,554,561,993,994,997,1002,1172,1174],[92,96,101,164,172,176,179,181,182,183,195,221,222,223,224,225,507,552,554,561,975,1002,1003,1016,1166,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,977,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,976,978,998,999,1002,1003,1166,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,993,1002,1003,1166,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,1002,1003,1166,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1002,1003,1166,1172,1174],[92,101,164,172,176,179,181,182,183,195,554,561,974,975,976,978,1002,1003,1166,1172,1174],[101,164,165,172,175,176,179,181,182,183,186,195,200,203,220,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,976,978,1002,1003,1166,1172,1174],[101,164,169,172,176,179,181,182,183,195,554,561,1002,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1003,1078,1079,1088,1162,1163,1165,1172,1174],[92,101,164,172,176,178,179,181,182,183,185,195,554,561,974,975,976,978,994,998,1000,1001,1002,1003,1166,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1079,1084,1085,1087,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1080,1086,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1081,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1080,1081,1082,1084,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1080,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,1083,1172,1174],[101,116,119,122,123,164,172,176,179,181,182,183,195,212,554,561,1172,1174],[101,119,164,172,176,179,181,182,183,195,200,212,554,561,1172,1174],[101,119,123,164,172,176,179,181,182,183,195,212,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,200,554,561,1172,1174],[101,113,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,117,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,115,116,119,164,172,176,179,181,182,183,195,212,554,561,1172,1174],[101,164,172,176,179,181,182,183,185,195,209,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,220,554,561,1172,1174],[101,113,164,172,176,179,181,182,183,195,220,554,561,1172,1174],[101,115,119,164,172,176,179,181,182,183,185,195,212,554,561,1172,1174],[101,110,111,112,114,118,164,172,175,176,179,181,182,183,195,200,212,554,561,1172,1174],[101,119,128,136,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,111,117,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,119,145,146,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,111,114,119,164,172,176,179,181,182,183,195,203,212,220,554,561,1172,1174],[101,119,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,115,119,164,172,176,179,181,182,183,195,212,554,561,1172,1174],[101,110,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,113,114,115,117,118,119,120,121,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,146,147,148,149,150,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,119,138,141,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,119,128,129,130,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,117,119,129,131,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,118,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,111,113,119,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,119,123,129,131,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,123,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,117,119,122,164,172,176,179,181,182,183,195,212,554,561,1172,1174],[101,111,115,119,128,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,119,138,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,131,164,172,176,179,181,182,183,195,554,561,1172,1174],[101,113,119,145,164,172,176,179,181,182,183,195,203,218,220,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,614,777,1006,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,562,1172,1174],[101,164,172,175,176,178,179,180,181,182,183,185,195,200,209,212,219,220,554,561,562,563,564,574,575,576,578,580,582,584,585,586,606,610,611,612,613,614,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,562,563,564,581,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,564,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,583,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,609,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,574,585,614,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,574,614,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,664,669,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,641,650,777,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,616,618,619,620,622,624,625,628,629,635,649,650,661,663,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,624,643,644,650,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,624,625,632,650,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,622,624,625,628,650,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,582,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,624,625,628,641,645,650,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,614,672,777,1172,1174],[101,164,167,172,176,179,181,182,183,195,200,554,561,614,615,620,622,624,625,628,629,632,633,641,642,645,648,649,650,661,670,671,774,777,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,582,624,625,628,650,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,624,643,644,645,650,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,582,624,629,630,631,650,1172,1174],[101,164,167,172,176,179,181,182,183,195,200,554,561,582,614,615,620,622,624,625,628,629,630,631,632,633,641,642,643,644,645,648,649,650,661,670,671,672,673,774,777,1172,1174],[101,164,167,172,176,179,181,182,183,195,200,554,561,582,614,615,620,622,624,625,628,629,630,631,632,633,641,642,643,644,645,648,649,650,661,670,671,672,774,777,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,582,615,620,622,624,625,628,629,630,631,632,633,635,641,643,644,645,648,650,651,652,653,654,659,1172,1174],[101,164,167,172,176,178,179,181,182,183,195,200,554,561,582,614,615,620,622,624,625,628,629,630,631,632,633,641,642,643,644,645,648,649,650,661,670,671,672,673,674,676,774,777,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,615,622,624,625,628,629,643,644,645,650,652,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,660,667,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,756,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,758,759,770,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,760,761,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,758,759,760,762,763,768,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,759,760,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,768,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,769,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,760,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,758,759,760,763,764,765,766,767,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,747,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,747,750,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,742,745,747,748,749,750,751,752,753,754,755,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,681,683,750,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,747,748,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,682,747,749,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,683,685,687,688,689,690,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,685,687,689,690,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,685,687,689,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,682,685,687,688,690,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,681,683,684,685,686,687,688,689,690,691,692,742,743,744,745,746,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,681,683,684,687,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,683,684,687,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,687,690,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,681,682,684,685,686,688,689,690,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,681,682,683,687,747,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,687,688,689,690,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,689,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,949,972,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,951,1014,1015,1020,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,859,949,968,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,951,968,971,1014,1015,1020,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,949,1022,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,949,968,971,1015,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,860,949,971,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,949,1038,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,859,860,949,968,971,1037,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,857,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,856,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,860,861,1172,1174],[101,164,172,176,179,181,182,183,195,255,553,554,561,860,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,865,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,863,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,860,867,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,869,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,871,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,875,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,873,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,880,1172,1174],[101,164,172,176,179,181,182,183,195,255,553,554,561,860,879,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,884,885,886,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,882,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,892,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,890,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,888,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,896,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,894,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,898,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,900,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,902,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,904,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,906,907,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,909,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,911,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,913,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,877,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,915,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,860,917,1172,1174],[101,164,172,176,179,181,182,183,195,255,553,554,561,859,860,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,921,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,919,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,928,964,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,546,554,561,859,926,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,927,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,949,1040,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,928,949,968,971,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,949,1045,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,949,968,971,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,949,1043,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,951,1014,1020,1047,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,949,968,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,951,971,1014,1020,1047,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,949,1049,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,949,971,1047,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,853,856,860,949,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,557,561,955,963,964,966,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,935,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,536,546,554,561,931,933,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,934,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,933,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,931,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,932,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,1053,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,935,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,949,950,968,971,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,941,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,939,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,940,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,859,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,942,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,859,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,944,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,859,926,941,943,945,946,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,947,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,860,948,949,971,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,949,971,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,949,971,1037,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,951,1014,1020,1061,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,951,971,1014,1020,1061,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,949,1063,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,949,971,1061,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,951,1014,1020,1066,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,949,951,968,971,1014,1020,1066,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,949,1068,1172,1174],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,949,968,971,1066,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,1014,1020,1037,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,1037,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,1026,1036,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,968,1014,1020,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,968,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,969,1014,1020,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,965,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,951,971,1014,1020,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,971,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,536,554,561,859,969,970,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,859,926,946,970,1014,1020,1166,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,964,970,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,536,554,561,926,931,946,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,955,1033,1035,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,856,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,950,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,926,952,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,949,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,853,856,859,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,846,853,854,855,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,859,949,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,1019,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,859,926,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,953,954,1172,1174],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,926,964,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,926,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,966,1172,1174],[101,164,172,176,179,181,182,183,195,554,1172,1174],[101,164,172,176,179,181,182,183,187,195,212,255,554,561,774,778,779,781,1172,1174],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,1172,1174],[101,164,172,176,179,181,182,183,195,554,561,774,1172,1174]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"17f13ecb98cbc39243f2eee1f16d45cd8ec4706b03ee314f1915f1a8b42f6984","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"5fcab789c73a97cd43828ee3cc94a61264cf24d4c44472ce64ced0e0f148bdb2","affectsGlobalScope":true,"impliedFormat":1},{"version":"db59a81f070c1880ad645b2c0275022baa6a0c4f0acdc58d29d349c6efcf0903","affectsGlobalScope":true,"impliedFormat":1},{"version":"673294292640f5722b700e7d814e17aaf7d93f83a48a2c9b38f33cbc940ad8b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"d786b48f934cbca483b3c6d0a798cb43bbb4ada283e76fb22c28e53ae05b9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"142efd4ce210576f777dc34df121777be89eda476942d6d6663b03dcb53be3ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"379bc41580c2d774f82e828c70308f24a005b490c25ba34d679d84bcf05c3d9d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed484fb2aa8a1a23d0277056ec3336e0a0b52f9b8d6a961f338a642faf43235d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ffedae1d1c2d53fdbca1c96d3c7dda544281f7d262f99b6880634f8fd8d9820","affectsGlobalScope":true,"impliedFormat":1},{"version":"83a730b125d477dd264df8ba479afab27a3dae7152b005c214ab94dc7ee44fd3","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"21da358700a3893281ce0c517a7a30cbd46be020d9f0c3f2834d0a8ad1f5fc75","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc2110f7decca6bfb9392e30421cfa1436479e4a6756e8fec6cbc22625d4f881","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"4137ebf04166f3a325f056aa56101adc75e9dceb30404a1844eb8604d89770e2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2ae155afe8a01cc0ae612d99117cf8ef16692ba7c4366590156fdec1bcf2d8c","impliedFormat":1},{"version":"3f5e5d9be35913db9fea42a63f3df0b7e3c8703b97670a2125587b4dbbd56d7c","impliedFormat":1},{"version":"8caeb65fdc3bfe0d13f86f67324fcb2d858ed1c55f1f0cce892eb1acfb9f3239","impliedFormat":1},{"version":"57c23df0b5f7a8e26363a3849b0bc7763f6b241207157c8e40089d1df4116f35","affectsGlobalScope":true,"impliedFormat":1},{"version":"3b8bc0c17b54081b0878673989216229e575d67a10874e84566a21025a2461ee","impliedFormat":1},{"version":"5b0db5a58b73498792a29bfebc333438e61906fef75da898b410e24e52229e6f","impliedFormat":1},{"version":"dbe055b2b29a7bab2c1ca8f259436306adb43f469dca7e639a02cd3695d3f621","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"e3905f6902f0b69e5eefc230daa69fdd4ab707a973ec2d086d65af1b3ea47ef0","impliedFormat":1},{"version":"2ea729503db9793f2691162fec3dd1118cab62e96d025f8eeb376d43ec293395","impliedFormat":1},{"version":"9ec87fea42b92894b0f209931a880789d43c3397d09dd99c631ae40a2f7071d1","impliedFormat":1},{"version":"c68e88cdfadfb6c8ba5fc38e58a3a166b0beae77b1f05b7d921150a32a5ffb8d","impliedFormat":1},{"version":"2bc7aa4fba46df0bd495425a7c8201437a7d465f83854fac859df2d67f664df3","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"07e4e61e946a9c15045539ecd5f5d2d02e7aab6fa82567826857e09cf0f37c2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c4714ccc29149efb8777a1da0b04b8d2258f5d13ddbf4cd3c3d361fb531ac86","impliedFormat":1},{"version":"3ff275f84f89f8a7c0543da838f9da9614201abc4ce74c533029825adfb4433d","impliedFormat":1},{"version":"0eb5d0cbf09de5d34542b977fd6a933bb2e0817bffe8e1a541b2f1ad1b9af1ff","impliedFormat":1},{"version":"f9713757bcdfa4d58b48c0fb249e752c94a3eee8bf4532b906094246ac49ef88","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"c32c840c62d8bd7aeb3147aa6754cd2d922b990a6b6634530cb2ebdce5adc8e9","impliedFormat":1},{"version":"e1c1a0b4d1ead0de9eca52203aeb1f771f21e6238d6fcd15aa56ac2a02f1b7bf","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"6fe28249ac0c7bc19a79aa9264baf00efbd080e868dbe1d3052033ad1c64f206","affectsGlobalScope":true,"impliedFormat":1},{"version":"cbed824fec91efefc7bbdcb8b43d1a531fdbebd0e2ef19481501ff365a93cb70","impliedFormat":1},{"version":"d0716593b3f2b0451bcf0c24cfa86dec2235c325c89f201934248b7c742715fc","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"2991bca2cc0f0628a278df2a2ccdb8d6cbcb700f3761abbed62bba137d5b1790","impliedFormat":1},{"version":"ce8653341224f8b45ff46d2a06f2cacb96f841f768a886c9d8dd8ec0878b11bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"a74edb3bab7394a9dbde529d60632be590def2f5f01024dbd85441587fbfbbe0","impliedFormat":1},{"version":"0ea59f7d3e51440baa64f429253759b106cfcbaf51e474cae606e02265b37cf8","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"00049ccc87f3f37726db03c01ca68fe74fd9c0109b68c29eb9923ebec2c76b13","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"68d3f35108e2608b1f2f28b36d19d7055f31c4465cc5692cbd06c716a9fe7973","impliedFormat":1},{"version":"a6d543044570fbeed13a7f9925a868081cd2b14ef59cdd9da6ae76d41cab03d3","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"eab2f3179607acb3d44b2db2a76dd7d621c5039b145dc160a1ee733963f9d2f5","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"6f5383b3df1cdf4ff1aa7fb0850f77042b5786b5e65ec9a9b6be56ebfe4d9036","impliedFormat":1},{"version":"62fc21ed9ccbd83bd1166de277a4b5daaa8d15b5fa614c75610d20f3b73fba87","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"9d3821bc75c59577e52643324cec92fc2145642e8d17cf7ee07a3181f21d985d","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"201db9cf1687fab1adf5282fcba861f382b32303dc4f67c89d59655e78a25461","impliedFormat":1},{"version":"c77fb31bc17fd241d3922a9f88c59e3361cdf76d1328ba9412fc6bf7310b638d","impliedFormat":1},{"version":"0a20eaf2e4b1e3c1e1f87f7bccb0c936375b23b022baeea750519b7c9bc6ce83","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"a16b91b27bd6b706c687c88cbc8a7d4ee98e5ed6043026d6b84bda923c0aed67","impliedFormat":1},{"version":"694b812e0ed11285e8822cf8131e3ce7083a500b3b1d185fff9ed1089677bd0a","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"6eeded8c7e352be6e0efb83f4935ec752513c4d22043b52522b90849a49a3a11","impliedFormat":1},{"version":"6c1ad90050ffbb151cacc68e2d06ea1a26a945659391e32651f5d42b86fd7f2c","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"2beff543f6e9a9701df88daeee3cdd70a34b4a1c11cb4c734472195a5cb2af54","impliedFormat":1},{"version":"2e07abf27aa06353d46f4448c0bbac73431f6065eef7113128a5cd804d0c384d","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"42bc0e1a903408137c3df2b06dfd7e402cdab5bbfa5fcfb871b22ebfdb30bd0b","impliedFormat":1},{"version":"9894dafe342b976d251aac58e616ac6df8db91fb9d98934ff9dd103e9e82578f","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"446a50749b24d14deac6f8843e057a6355dd6437d1fac4f9e5ce4a5071f34bff","impliedFormat":1},{"version":"182e9fcbe08ac7c012e0a6e2b5798b4352470be29a64fdc114d23c2bab7d5106","impliedFormat":1},{"version":"2f4e6b4d39426a1b85ecf4bdeb9dddbf4d9b3397d95d8555d46f925c9519ec7d","impliedFormat":1},{"version":"78a2869ad0cbf3f9045dda08c0d4562b7e1b2bfe07b19e0db072f5c3c56e9584","impliedFormat":1},{"version":"89d5d28d4f57e000b836ac273079be1b75710e28ce14750d081fb420d37e2ca5","impliedFormat":1},{"version":"fd4e24ccff3966390600d7f5d6aa1fed5a512e92ada735ea5fbc933d313ad3d3","impliedFormat":1},{"version":"b7cddfe1aa6b86b5fad3c9ccb30d05b3ccb165aebbf112f48d2d8a5f69dd98b1","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"bd2c7ada3dee03653d3f601011d30072194bc3970cd93208f9588fbdc0c69347","impliedFormat":1},{"version":"e480da45d32313e7174b265674da504f075f59ef326852f0c5a5d863b438ae85","impliedFormat":1},{"version":"ad54850f61fcf5d014e11be80d2f46fea9265cfa7e77456da876f7833ef81769","impliedFormat":1},{"version":"6f7c9e8bd2b5b6a080b07080065f94900bd3c7e5ebbd3047bc33fcce2fab1dd8","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"da5950ee2a90721df6f3fba45f5d05308f7e4c35835392215dd2cd404505e2de","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"f42d5fed19610d485c646a0c430e768115567d078c7fc855c57b0c578b3d6cd3","impliedFormat":1},{"version":"ee8df1cb8d0faaca4013a1b442e99130769ce06f438d18d510fed95890067563","impliedFormat":1},{"version":"d5630f2ad9b4541e5ce891648121022f9412ecdca1820baa1f0104f70fd7eff7","impliedFormat":1},{"version":"4d15375ab13497104bc8fe56fdef2b5fd6853f29255737d23a33fa306ff7fd69","impliedFormat":1},{"version":"2cd3fc1d0d6a1e85baffd2d4f50f5efb192b5446eef567e97c94765402f0aad4","impliedFormat":1},{"version":"e4cbf2f1e89ecccaddd2c045e600ae41b732295953fb06247c7dcbc2d281ed30","impliedFormat":1},{"version":"6dcedaef57dff0d79a05ab0ab602cde74db803d1e765468bf91263786a383e1b","impliedFormat":1},{"version":"8c1697d90c394a6fd955b98eae01238eff628e129b987a68aea10f898a48e7da","impliedFormat":1},{"version":"7580e62139cb2b44a0270c8d01abcbfcba2819a02514a527342447fa69b34ef1","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"d10d63718e1646c2279e3b33831f82c60e31f622b2b7020f1196409ca4c09242","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"148679c6d0f449210a96e7d2e562d589e56fcde87f843a92808b3ff103f1a774","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"02436d7e9ead85e09a2f8e27d5f47d9464bced31738dec138ca735390815c9f0","impliedFormat":1},{"version":"f8d5ff8eafd37499f2b6a98659dd9b45a321de186b8db6b6142faed0fea3de77","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"a22dd55aa4d39906252000ab8e8a1b83b195eef7f4274eb51e457c1f11cf6580","impliedFormat":1},{"version":"540cc83ab772a2c6bc509fe1354f314825b5dba3669efdfbe4693ecd3048e34f","impliedFormat":1},{"version":"121b0696021ab885c570bbeb331be8ad82c6efe2f3b93a6e63874901bebc13e3","impliedFormat":1},{"version":"612d9da66bb046a9c1e2e8d026245ded881fc4b9f98cbfae714415d57ee0ae0b","impliedFormat":1},{"version":"32c2ad9494dad5d11b0564a619fee18f388db6c1e9e2cd3c360b3122549691eb","impliedFormat":1},{"version":"6c301d40aec56a74ec7bd7324e31a728dadf9bfba3e96def02938d3d973534ec","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"aa14cee20aa0db79f8df101fc027d929aec10feb5b8a8da3b9af3895d05b7ba2","impliedFormat":1},{"version":"493c700ac3bd317177b2eb913805c87fe60d4e8af4fb39c41f04ba81fae7e170","impliedFormat":1},{"version":"aeb554d876c6b8c818da2e118d8b11e1e559adbe6bf606cc9a611c1b6c09f670","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"25a5f6fd3a2243c859eddc99ab5fba11d970af2fe7a5df9c32b7668f76f97b01","impliedFormat":1},{"version":"8d207e1f9d2c30d6f77dfa693f3827c3fbf0d89240297e10bdfe1041d433df68","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"8c70ddc0c22d85e56011d49fddfaae3405eb53d47b59327b9dd589e82df672e7","impliedFormat":1},{"version":"2f9c89cbb29d362290531b48880a4024f258c6033aaeb7e59fbc62db26819650","impliedFormat":1},{"version":"a365c4d3bed3be4e4e20793c999c51f5cd7e6792322f14650949d827fbcd170f","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":"273782b8454e78f6a8b30d2cfbf6860499c930595095fcc1689637115f0eddda","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fbdd025f9d4d820414417eeb4107ffa0078d454a033b506e22d3a23bc3d9c41","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"9f9bb6755a8ce32d656ffa4763a8144aa4f274d6b69b59d7c32811031467216e","impliedFormat":1},{"version":"5c32bdfbd2d65e8fffbb9fbda04d7165e9181b08dad61154961852366deb7540","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"0c05e9842ec4f8b7bfebfd3ca61604bb8c914ba8da9b5337c4f25da427a005f2","impliedFormat":1},{"version":"faed7a5153215dbd6ebe76dfdcc0af0cfe760f7362bed43284be544308b114cf","impliedFormat":1},{"version":"7029e566b8df176f703fb59fd437a38670c7a0e02c58b2d66dfb5b2e2b2defdb","impliedFormat":1},{"version":"7f2aa4d4989a82530aaac3f72b3dceca90e9c25bee0b1a327e8a08a1262435ad","impliedFormat":1},{"version":"d96b39301d0ded3f1a27b47759676a33a02f6f5049bfcbde81e533fd10f50dcb","impliedFormat":1},{"version":"e9f147ecca73d9346a4c073432843c159ccbe50bdcb678a78f6da10eae2cecf4","impliedFormat":1},{"version":"de061f7d72bd65c06fc1419f841dfdcb29a8e22fe6fa527d1e6eb20b897d4de0","impliedFormat":1},{"version":"663beafc2446079574570cba86e9b15f986f908ddb1b01274509970126fee945","impliedFormat":1},{"version":"a3102887d5058bf4cb5b37fa6964c09e9527c42053b3b5c642b89878620748de","impliedFormat":1},{"version":"0aaaa1727edd29673d85c9b26d7ca4d54e5407a48586903c51b48b7f7d196f61","impliedFormat":1},{"version":"d35bca0b261bff02635758c48e8ab99c61c420d0dfabbcf467e847171d876b7d","impliedFormat":1},{"version":"3bc12c40d90c342ff88a3d876996c555ed5cbee5fe8c3308a240b321f401ee46","impliedFormat":1},{"version":"ba130768aae855a5477e9e148e5c879548e6e7ccbcc56fd1934c8a18ea5b7569","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"d38530db0601215d6d767f280e3a3c54b2a83b709e8d9001acb6f61c67e965fc","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"b499af2054a037a162b3b72cd886f48bbf32a3502c865c6e29fac7d2ab3ce0b5","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"48773ca557b0319c2ee62ae249cf52a81709e8be139920d6479a66274de7c4ed","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"4cceef18d7f088e797a463e90b7a9dad10c6bc667724b7686e3e740ae00122be","impliedFormat":1},{"version":"7ee86fbb3754388e004de0ef9e6505485ddfb3be7640783d6d015711c03d302d","impliedFormat":1},{"version":"cc1954b539604b1e562319119ac7e888172208b32ca873f9a357a92c826bd046","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"bb8f2dbc03533abca2066ce4655c119bff353dd4514375beb93c08590c03e023","impliedFormat":1},{"version":"706dd95827e7ebaabda91d5db2b755233e0952d98570e9c032b0f066a15c1177","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b103e9abfe82d14c0ad06a55d9f91d6747154ef7cacc73cf27ecad2bfb3afcf","impliedFormat":1},{"version":"990b8fad2327b77e6920cc792af320e8867e68f02ce849b12c0a6ab9a1aebb09","impliedFormat":1},{"version":"5eb8cd1cb0c9143d74a8190b577c522720878c31aef67d866fcd29973f83e955","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"a6805fcafed712aea7759f8bc731014f9d22738c1d6ef9d43b8091d1d48346d5","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"d88ea80a6447d7391f52352ec97e56b52ebec934a4a4af6e2464cfd8b39c3ba8","impliedFormat":1},{"version":"142617b3cdf902b69c6464c9fbd942b60ab3e733ca18c032b19e0f7e2adbefe8","impliedFormat":1},{"version":"0b603555f1881f87256ffd6344d3e3ed6d466c2e701eabf381f28be8c2125892","impliedFormat":1},{"version":"897e4f7662488e3ecc79e743bdd3b78f13bdb69a97851afa5b440c4211e32ea9","impliedFormat":1},{"version":"e2e1c6d3b2d93add5200bd7bc1a8cccb4e446836b2111ece45db8683a2c765de","impliedFormat":1},{"version":"251b03d5cd243854ce870d9a9a39f491faf69898c5d6b5eee28cc7649c57417b","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"2c4de79f406d137390608e8c0a44fba2ff8e00bacfcae7c9d1781fef10e9440d","impliedFormat":1},{"version":"07ba23a10465791be5d22deaf5ef7de7658774ddff53721e5ea17fedea1bc721","impliedFormat":1},{"version":"dca8c645c5afeb03b1ecedbf16323f33e7d0afaa6256c8e047e6e38087a97f53","impliedFormat":1},{"version":"775f181bd4a533d6f8b5e55ec1d9f1624559720ae8a70e9432258da26b38d27c","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"9109a1291dd4b9f1541bea81ee11c247a2ca9e1ea89f87f13aa1811c3c069616","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"622694a8522b46f6310c2a9b5d2530dde1e2854cb5829354e6d1ff8f371cf469","impliedFormat":1},{"version":"cd8ce8d68567f62dd580b3c3c37777ac3f5b81944c7417f5ea83030eab533385","impliedFormat":1},{"version":"e374d1eaa05b7dc38580062942ac8351ce79cbe11f6dbce4946a582a5680582d","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"a9e6c0ff3f8186fccd05752cf75fc94e147c02645087ac6de5cc16403323d870","impliedFormat":1},{"version":"49af4b52f0d4d2304c5f2c6fe5fab3e153e0acc38830d0202821b877c097dd02","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"e68b8e5a1df7c1be2bc105141456ecba70215806e1c28bfbc5c12bfce4be6e68","impliedFormat":1},{"version":"511c8f02329808d47d00b859c532ae9115590048b17325a946c74dac48428650","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"b5f9e66625783eefcbe3d2da074b2e7ba2066d61ce3fc6ef4f22805ad946cab4","impliedFormat":1},{"version":"e37115962d284b9f7a37c2bdd2add50f88365dde41f5e0ff591ffc48a8ec7575","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"f89488602bec98a142072fae7ea5ba99431a569ff580c64b7be39896474799d8","impliedFormat":1},{"version":"bbbc47961f39a57df103cf4ca3bb8f8732b4b6678a18225a0aa76d59c466956c","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"2ffb043dc5163458e473b7010859f86e01dc4edffcae0a93d885d028b426a546","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"05c7280d72f3ed26f346cbe7cbbbb002fb7f15739197cbbee6ab3fd1a6cb9347","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"04b7b2e0832dfd3c31e81df3975e8d8fda28e7ff999b0aa2932608a8f6661d5c","impliedFormat":1},{"version":"ca2d34c6ed5cbd3070b8b6f32f42ae54adcc6499c1e4b99f0a5798b3f27cc653","impliedFormat":1},{"version":"9ec68995e66dd6b9dac834bf5ae85fde802714ea2e82151a5d1d53ef01b463ef","impliedFormat":1},{"version":"5c4d626b4902f2ef8a1cc146d761d276cef988016dc674e3b98fbad70e64bc9f","impliedFormat":1},{"version":"fdfaa0aad899524962e2955287b5b991ffe3be50f64e02eb60c933ca44644a94","impliedFormat":1},{"version":"53c972a0f9bc3a4ec70fff7314123ea8cfcf75b3703046f767d2dc1eea87b2fb","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"d130c5f73768de51402351d5dc7d1b36eaec980ca697846e53156e4ea9911476","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"7303b45138d2511035056a5901a1490ebdcbf055cbb1276f8629c5121cbe733e","impliedFormat":1},{"version":"27f874cd5327507eeff699a74567f60c1215b94509f4308633a7b01922471ed2","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"2c6cf04bc525caf6546e859e8ef10bfb9573837ec0bc5ec7b53a7b1b8ca72781","impliedFormat":1},{"version":"8695dec09ad439b0ceef3776ea68a232e381135b516878f0901ed2ea114fd0fe","impliedFormat":1},{"version":"304b44b1e97dd4c94697c3313df89a578dca4930a104454c99863f1784a54357","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"87cc05fe13108f02e12da7e3efd8e360fef78d96a0c9e11408ea1b1b9fb3e03d","impliedFormat":1},{"version":"1abbf67c218d23c2ce76887caac2df6c7dab3d97ba2b65348432b876f510002a","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"c06ef3b2569b1c1ad99fcd7fe5fba8d466e2619da5375dfa940a94e0feea899b","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"8bd496cf710d4873d15e4891a5dbf945673e3321ca74cf75187e347fd5ed295e","impliedFormat":1},{"version":"a6dba407fc287f1e25454e75028c91bbc00675f2d1c4e8b3edcc36c08611a486","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"e91f7b1344577a02f051b9b471f33044fef8334a76dc9e1de003d17595a5219b","impliedFormat":1},{"version":"c0723195c85e19656d6b5b9fdb81d3f3403c1ae4679e722c6ea058c516b38d12","impliedFormat":1},{"version":"186eea74805194f04e41038fc5eca653788b9dedbab7c2d7d17e10139622dd92","impliedFormat":1},{"version":"71d9eb4c4e99456b78ae182fb20a5dfc20eb1667f091dbb9335b3c017dd1c783","impliedFormat":1},{"version":"cfa846a7b7847a1d973605fbb8c91f47f3a0f0643c18ac05c47077ebc72e71c7","impliedFormat":1},{"version":"1594da19968752a22b2ac48c2d0e60575700e745c577a8a4a676b841238ad5bb","impliedFormat":1},{"version":"e0cee12109e0a10a4c3d6769fcc7644b7c1ea7f52365bea51728f5af29f8a137","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"3536968defef8a75514f547ead5e2e9c1e984820290ec9b00c5fdfb6ef786535","impliedFormat":1},{"version":"d83773870080c30a230e322ce13a9c6f3398e8dacea4ea8a83e26370f3bac23e","impliedFormat":1},{"version":"dcfeaf98d66314fec29a9076c4290e45d0b196a65827becc19138e9c7b855f37","impliedFormat":1},{"version":"6849fe9210fe4946d5f085bfed36758f33dc6ae15a751338d178dd4daa017c46","impliedFormat":1},{"version":"888cda0fa66d7f74e985a3f7b1af1f64b8ff03eb3d5e80d051c3cbdeb7f32ab7","impliedFormat":1},{"version":"60681e13f3545be5e9477acb752b741eae6eaf4cc01658a25ec05bff8b82a2ef","impliedFormat":1},{"version":"ffae4e1e06aa848a1e4bcef162cd1c48e5909b26223515981310af9c036bdfc7","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"34e16eb7c31768a11a08aebcfb3d70d7b8f0b016197e98d8419e566ceae6d6c8","impliedFormat":1},{"version":"f94ec1f7e4b709d26960306c9082a7a1b728a6e13089346aa48ba57c74cbf47e","impliedFormat":1},{"version":"9a11cb4033405e96c247cd5aa29790212aaffdd127869e8a5219103f0b389fd5","impliedFormat":1},{"version":"01479d9d5a5dda16d529b91811375187f61a06e74be294a35ecce77e0b9e8d6c","impliedFormat":1},{"version":"aff5213585cb72e94054dfe17250ff315f3569b3919d1ef1ad235f37c4ee894e","impliedFormat":1},{"version":"fb2ea35e1be6388d722d7725e2b49c697d34d9c890c3b96758faaeb86d35cef8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"1a4dc28334a926d90ba6a2d811ba0ff6c22775fcc13679521f034c124269fd40","impliedFormat":1},{"version":"f05315ff85714f0b87cc0b54bcd3dde2716e5a6b99aedcc19cad02bf2403e08c","impliedFormat":1},{"version":"5fad3b31fc17a5bc58095118a8b160f5260964787c52e7eb51e3d4fcf5d4a6f0","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"456006a6975b26c0a1785feddae165f6d307e2d601ffde27e21fc4a790e448a4","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"1fe0d18b111e1145a7e7601855bccd4ca20f24e3b9a5aba6bb1fa9d1a7059170","impliedFormat":1},{"version":"5632c3c26d420c063eebe64c45b1248b9492a67bf44f1d0c57e9dc8f6cf449bb","impliedFormat":1},{"version":"0df5aa619ab12993a39ea6dae062ee46eadbb4d738916460e636ada52bced75b","impliedFormat":1},{"version":"8fca3039857709484e5893c05c1f9126ab7451fa6c29e19bb8c2411a2e937345","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"10ab7be91f87ebe8916b62cf28af2e45b5601fc7b0e311adf838f912c6b31dd8","impliedFormat":1},{"version":"bc636fbc08e0979ceb7eb0731a33000283d77a33b62e1f71ee65be50394e40ba","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"75bbd3be047d539988a0ff0b56384ef7a6a25f3b676ad96bee547d44c31622a7","impliedFormat":1},{"version":"42960001a776b089ade681ab5cfddc936e0afb0615133ec1841f3dee89d3e1bf","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"da47712b394d944328245482603bc6f416d3949b67c9392279caab595076b510","affectsGlobalScope":true,"impliedFormat":1},{"version":"37d0071d8f0a06dc55c2c5e0ec3391affd4fd107c53410bf358196ec0bf3923f","impliedFormat":1},{"version":"b213dad76ca37fd552274c9499056e1c0d9c1bd38a55bb7f68b22ba6b84c3ad7","impliedFormat":1},{"version":"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"19df3488557c2fc9b4d8f0bac0fd20fb59aa19dec67c81f93813951a81a867f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b25350193e103ae90423c5418ddb0ad1168dc9c393c9295ef34980b990030617","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"5a49adaef698b7ad7e6127949fa1b0bbd3d46b7cbd11c54e392a4dcdd51f5190","impliedFormat":1},{"version":"96171c03c2e7f314d66d38acd581f9667439845865b7f85da8df598ff9617476","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"2489bf04d77dc025ba67f49f1a56eb24b9db477d5ff88123d887e163ed1776aa","impliedFormat":1},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"0b77b819b5417775fccb20c678293cf614c054a5b1a65421a5b933a9124ba998","impliedFormat":1},{"version":"e1f6076688a95bd82deaac740fccbe3cdea0d8a22057cccc9c5bce4398bdd33b","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"b1f1d57fde8247599731b24a733395c880a6561ec0c882efaaf20d7df968c5af","impliedFormat":1},{"version":"6715dc4eb59c8ea9abe2b78c235ed331dc710a06fe56798868dbc4d40cd1b707","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"5a3ea721d03a361ccbdd7390ccd75f6e84cbca3a3f01f4b331ecc9af31890c49","impliedFormat":1},{"version":"e7dfaee4af38d45b1cab8a1ee0b3bc1f85ddcf64545ed391d675d78ae6526274","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8daa443eaf9a27fd382cc1f8ebe30330c0f4d89511cfb469166874806751d35","impliedFormat":1},{"version":"af48e58339188d5737b608d41411a9c054685413d8ae88b8c1d0d9bfabdf6e7e","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"1de8c302fd35220d8f29dea378a4ae45199dc8ff83ca9923aca1400f2b28848a","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"332248ee37cca52903572e66c11bef755ccc6e235835e63d3c3e60ddda3e9b93","impliedFormat":1},{"version":"94e8cc88ae2ef3d920bb3bdc369f48436db123aa2dc07f683309ad8c9968a1e1","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"07ed3ddab975995eea41b22f3010506fb9f5fb301d04820b07d7a1aee5477d7c","impliedFormat":1},{"version":"969d8b0965849f4bae7cab0ba90bd1e1220e95999c2c6f01117fa7500901c017","impliedFormat":1},{"version":"6ec840ee5e2bc103f557fe38b1d585ee250540468713d7634ee066de372bf332","impliedFormat":1},{"version":"b0309e1eda99a9e76f87c18992d9c3689b0938266242835dd4611f2b69efe456","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"6ceb10ca57943be87ff9debe978f4ab73593c0c85ee802c051a93fc96aaf7a20","impliedFormat":1},{"version":"1de3ffe0cc28a9fe2ac761ece075826836b5a02f340b412510a59ba1d41a505a","impliedFormat":1},{"version":"e46d6cc08d243d8d0d83986f609d830991f00450fb234f5b2f861648c42dc0d8","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"ff863d17c6c659440f7c5c536e4db7762d8c2565547b2608f36b798a743606ca","impliedFormat":1},{"version":"5412ad0043cd60d1f1406fc12cb4fb987e9a734decbdd4db6f6acf71791e36fe","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"e297c0a524edee7677939122f90027bfbe5f2698939d9a85728e5044b39c7124","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"b62381cae176db34f003cc6172ee8f3e0122014889d66391aa73698105cf4934","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"41eb514d9ce0a6e87957f08a4b7af70d93f87637f37dee706e2d92a6601c25a9","impliedFormat":1},{"version":"e7765aa8bcb74a38b3230d212b4547686eb9796621ffb4367a104451c3f9614f","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"7bd01f0f28cd3aeb2046274d85208e245965f6f2948edf4f7b2057bcf9f22ccc","impliedFormat":99},{"version":"d2f2cf2b8cc92bea913cda4a076e0f790b23a21e84f989d12f0116a7fe3906e0","impliedFormat":99},{"version":"6de125ea94866c736c6d58d68eb15272cf7d1020a5b459fea1c660027eca9a90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5b20bc288ee49989c95b20847fc93b96bf61cc0845598897a6a53a967dd7d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"d3b315763d91265d6b0e7e7fa93cfdb8a80ce7cdd2d9f55ba0f37a22db00bdb8","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},{"version":"462b986b7c699b7e7e52a571eb3776fdbdd6bdf38638c37e9c9781e155e9139c","affectsGlobalScope":true},"7b550dda9686c16f36a17bf9051d5dbf31e98555b30d114ac49fc49a1e712651","68937fe95088ffe97ac986edf4dcfb88cfe71df2e67db91ba03ee165779dedd7",{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"16fe60bb544cfedfd2b5bb2f7d0b3957be7978706d57d9f06edc9c0c8dbdba23","impliedFormat":99},{"version":"82179358c2d9d7347f1602dc9300039a2250e483137b38ebf31d4d2e5519c181","impliedFormat":99},{"version":"c73fdf42528325dd17940937ed787b15ae3445c6a2dae1a2b74bc4d87d337ca2","impliedFormat":99},{"version":"e8e17dfef3cfa9f0847ac93dd535a9896af7fb57c1a1b164484bb1b0ee4a25d8","impliedFormat":99},{"version":"51d2ffea2d1ee4a81c775938588c1e16620281adb60cbc26579a2fc6baa10bd2","impliedFormat":99},{"version":"148debd12783ded0a60d115daeacd8136f77757ae89a05c4e18de6dd77646fd2","impliedFormat":99},{"version":"0088b02dca63c47b273a140d0a3944bdc6dc2eb765fff0ca98e3c3a2786b3a5a","impliedFormat":99},{"version":"a651d06b780fa354231f19b040cbcde484bede3218885752b4f9e9a8f72d3b5f","impliedFormat":99},{"version":"06e26f75bed4c8389a8a63f0e6d6a9068038873dc95d8d1338e8c370a0ae8bc3","impliedFormat":99},{"version":"a2155e2675fd1af52b0b70779371c28611cdd1076b29d0f68bf93b983e5ddce0","impliedFormat":99},{"version":"a413e4b0b99280e1e58f5fe7b2b585e8a9be4996df8c58585399c9e2ca8a683e","impliedFormat":99},{"version":"609ab2c225766bc0851251c1db0fd5492673e190074045d21dc5dc7c3c46d785","impliedFormat":99},{"version":"c074e054c9db79055d37d7d70131e9a3234b8186773b3edb617c13f80bcf8774","impliedFormat":99},{"version":"7d3e062a778b8f5ea4f0cac7e925e31f88e6739812ebc5f827474324a4048f14","impliedFormat":99},{"version":"7f3857dc5cfe1e5e977edb14e931d9939a952e8e41997263a927f8f0299ea652","impliedFormat":99},{"version":"3559624d0102d10d7765c292c60ccbc229541534db32061e06df88bfe1064636","impliedFormat":99},{"version":"5a9834c603c65aee5cba0c1d6b3c7aee85cdc7862832a23165c6aa4139c165f2","impliedFormat":99},{"version":"a7d7b5fa83cd7b3b4c2aa73bc29e7cbd53d5690b74f6fb39a5558af0a94967ba","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"605450898939e8abce51e8085a41b60640278337a969c33cd6b169e7c4f9c3f2","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0864480ea083087d705f9405bd6bf59b795e8474c3447f0d6413b2bce535a09","impliedFormat":99},{"version":"e67cbea16f1994af89efd700542dbf3828a46a52b29e4d67e801bd7869dc103c","impliedFormat":99},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":99},{"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":"e3cf0611709328b449ec13f8c436712d62003620ce480139fae46ce001c2ee9f","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":99},{"version":"f093d4bd6a9267be5f8ecbfbca19f4f3359b3839883206150c5d833606569e84","impliedFormat":99},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":99},{"version":"4a13397dffad4475c45c70fde584c925fe8c9218b3c7ab94397b68fc434f63b6","impliedFormat":99},{"version":"3a582c6e8906f5b094ccf0de6cc6f4f8a54b05a34f52517aba5c9c7f704f6b28","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"72ce5b734c05da85c85a6f6dc05823b051d6aa41acaedeeb1d17c72f3b4efa72","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"9443967db823b66d1682be7fc66392be7c7924e10c3e54900f456341e94591a6","impliedFormat":99},{"version":"424f71d1fae96ac2e878af92345bb87bea1d29f757228fbc190133b305643f2c","impliedFormat":99},{"version":"61bb64660ee150f3ab618340e15cca0a81664801bede7c966ca0eca3a952fe63","impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"ec0c42bb0f465e4993f2bc68a6ce9df9a2dcbc7b83e21748f82f1b69561938e3","impliedFormat":99},{"version":"f50ff37a9cbbe74475f426474d9827083c7c2c138a954d28f1690df338f69291","impliedFormat":99},{"version":"61fd6c17235d530c40f543dd7c40afab091d91c1ef890baeed30db6d82b04b28","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"091767bc841f937654ed597d49e023ed59850355e746ae1a6f20ab31076ee1fb","impliedFormat":99},{"version":"19c6d6135af59693698d384050b45a8a049493500add442f58e4bd7c8a255ab6","impliedFormat":99},{"version":"6a0dba12d55314638a8c51108b20fe2f68f1364a619d098918bda91c22dec154","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"5c935b7fc4ddc1410ea1cd7cd4e35ed106a6e4920dd27a9480a40fd224359dc3","affectsGlobalScope":true,"impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"ed9bb55ddcbebd5cb3eee991f57ff21438546ee40ee1c310281bd12a6c7cf65b","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"437b7613a30a2fcde463f7b707c6d5567a8823fbc51de50b8641bf5b1d126fad","impliedFormat":99},{"version":"4ffba3c5848b4fe62ee59b754fd5f256ad9656a0db6d37b9a2a8cb40dfc7ac21","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"59e5e964b84fdb2378e9455e4e59405030e4ed2b4c6f891ce395f17796af3cbb","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"90ba95a763101bb61b8a799731a2ed60b5016b8135c1a2d5186862d4b534d4a1","impliedFormat":99},{"version":"63ea959e28c110923f495576e614fb8b36c09b6828b467b2c7cd7f03b03ccf9f","impliedFormat":99},{"version":"1601a95dbb33059fc3d12638ed2a9aecff899e339c5c0f3a0b28768866d385b4","impliedFormat":99},{"version":"56fc978580577d30f4c2cdb5b1eb9217b66ed66537dd27141256f426e4b8dd68","impliedFormat":99},{"version":"2c5413050a2580becf9d82dd7e3006b95623e96f145356bf73230cd635352f70","impliedFormat":99},{"version":"7cd92bc6808967f175063fce65f8d1d60a07d752b79ed20aa2eba9a2b8ed0820","impliedFormat":99},{"version":"59de9e07114b1da6421bf15359a951f1b762cb19c3a6abfc2e671a5ac2599dff","impliedFormat":99},{"version":"84e977ab810a75dc103b38cad1e019d3ab8f4ec9042b8f09f117b7d18c4076f0","impliedFormat":99},{"version":"9b98988fc27cbf7f08598871f275999540bcc267a8a47453866a198f93601959","impliedFormat":99},{"version":"2b1795d67cf9aa20167c72d795d4db6badea9cea646d9181869b5ca08c778479","impliedFormat":99},{"version":"860bedc71ead192ea4a0ea5ef4686e65724d14b391ebd1a6671a7044e6bd8e15","impliedFormat":99},{"version":"7c0a845bee4a084cbb8654709f48e5f13e2f6d45e5e2dde7c57cadf79fd9e3d5","impliedFormat":99},{"version":"07ad8a597ac75084e3dd9f9fadf5e8d7ccdcfe2f0c94ea0cf1cd8aa027a6c46e","impliedFormat":99},{"version":"94ddb4a2bb0c69e8efea22c58c2b6f84017eba469a4e433f5396ea8619d051cb","impliedFormat":99},{"version":"e903e44f2e300eea6d162c5481ef5cef28e18c3c7e165740090a65be6c80f437","impliedFormat":99},{"version":"632711a108accd4533a327ac3b60d0518fa536dfdc2d9e146222c16aa348506e","impliedFormat":99},{"version":"81b5530dfc39e1946dd771dd5526b84710e11d6a371812b1dc2e8eef9e12aa61","impliedFormat":99},{"version":"50230eca200a864bc52fd87a82c6085f1bcac19bf9865d98c3ec1d9b5672c118","impliedFormat":99},{"version":"cd71a7eb14e09b7962e8955c6b0376be99044d814e7d60d7d1e9d095716b89f3","impliedFormat":99},{"version":"e08660f21d0e8b367414e78706ae69a19b078fb67b0fe8c818ccaeeeedc00272","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"82919acbb38870fcf5786ec1292f0f5afe490f9b3060123e48675831bd947192","impliedFormat":1},{"version":"e222701788ec77bd57c28facbbd142eadf5c749a74d586bc2f317db7e33544b1","impliedFormat":1},{"version":"09154713fae0ed7befacdad783e5bd1970c06fc41a5f866f7f933b96312ce764","impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","impliedFormat":1},{"version":"a91c8d28d10fee7fe717ddf3743f287b68770c813c98f796b6e38d5d164bd459","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"f6f827cd43e92685f194002d6b52a9408309cda1cec46fb7ca8489a95cbd2fd4","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"a270a1a893d1aee5a3c1c8c276cd2778aa970a2741ee2ccf29cc3210d7da80f5","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8926594ee895917e90701d8cbb5fdf77fc238b266ac540f929c7253f8ad6233d","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"ed8763205f02fb65e84eff7432155258df7f93b7d938f01785cb447d043d53f3","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"d4a5b1d2ff02c37643e18db302488cd64c342b00e2786e65caac4e12bda9219b","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"36eb5babc665b890786550d4a8cb20ef7105673a6d5551fbdd7012877bb26942","impliedFormat":1},{"version":"fec412ded391a7239ef58f455278154b62939370309c1fed322293d98c8796a6","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":"93c3e73824ad57f98fd23b39335dbdae2db0bd98199b0dc0b9ccc60bf3c5134a","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"8324f3861a7a8db0f9d294f6a189182b2d231840cebb7f3ea5f4635773cdaf41","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},{"version":"72ef861333c7870a29fc0e248129c4afc0741c0716a74c3da409d05e41ff1322","impliedFormat":99},"49641a5eaa0ab31c12d312d53b724213afccbbbcc8e43a1119479d5e71858e61","168aa44771e55cda628eeb5fbb6f626f6f263d827967b119e8c06abd7f1362ec",{"version":"064499a671b662b25675beccdd04fb0bdebb6bd49bdb90d448e4b1ce3db20526","impliedFormat":99},{"version":"7bbff6783e96c691a41a7cf12dd5486b8166a01b0c57d071dbcfca55c9525ec4","impliedFormat":99},{"version":"54460343eae2288e42a041a096da60709dc8150684cb79679770b68a46a33601","impliedFormat":99},{"version":"2faebfa830ae4cfbfb58e48b0ec20a2a63882d776f0ca36ec7155d45cf1b7f2d","impliedFormat":99},{"version":"b478fad6cb2c66bfbfc027983240b416a7733013f878056ba92cf809020018a0","impliedFormat":99},{"version":"622f26fa1529ee0876a3b65d8771888bf0824f00f86784c2897e9448c396283a","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"},{"version":"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","impliedFormat":1},{"version":"f329dfad7970297cbf07ddc8fce2ad4a24e2a3855917c661922ef86eb24dd1f1","impliedFormat":1},{"version":"841784cfa9046a2b3e453d638ea5c3e53680eb8225a45db1c13813f6ea4095e5","affectsGlobalScope":true,"impliedFormat":1},{"version":"646ef1cff0ec3cf8e96adb1848357788f244b217345944c2be2942a62764b771","impliedFormat":1},{"version":"3cfb7c0c642b19fb75132154040bb7cd840f0002f9955b14154e69611b9b3f81","impliedFormat":1},{"version":"8387ec1601cf6b8948672537cf8d430431ba0d87b1f9537b4597c1ab8d3ade5b","impliedFormat":1},{"version":"d16f1c460b1ca9158e030fdf3641e1de11135e0c7169d3e8cf17cc4cc35d5e64","impliedFormat":1},{"version":"a934063af84f8117b8ce51851c1af2b76efe960aa4c7b48d0343a1b15c01aedf","impliedFormat":1},{"version":"e3c5ad476eb2fca8505aee5bdfdf9bf11760df5d0f9545db23f12a5c4d72a718","impliedFormat":1},{"version":"462bccdf75fcafc1ae8c30400c9425e1a4681db5d605d1a0edb4f990a54d8094","impliedFormat":1},{"version":"5923d8facbac6ecf7c84739a5c701a57af94a6f6648d6229a6c768cf28f0f8cb","impliedFormat":1},{"version":"d0570ce419fb38287e7b39c910b468becb5b2278cf33b1000a3d3e82a46ecae2","impliedFormat":1},{"version":"3aca7f4260dad9dcc0a0333654cb3cde6664d34a553ec06c953bce11151764d7","impliedFormat":1},{"version":"a0a6f0095f25f08a7129bc4d7cb8438039ec422dc341218d274e1e5131115988","impliedFormat":1},{"version":"b58f396fe4cfe5a0e4d594996bc8c1bfe25496fbc66cf169d41ac3c139418c77","impliedFormat":1},{"version":"45785e608b3d380c79e21957a6d1467e1206ac0281644e43e8ed6498808ace72","impliedFormat":1},{"version":"bece27602416508ba946868ad34d09997911016dbd6893fb884633017f74e2c5","impliedFormat":1},{"version":"2a90177ebaef25de89351de964c2c601ab54d6e3a157cba60d9cd3eaf5a5ee1a","impliedFormat":1},{"version":"82200e963d3c767976a5a9f41ecf8c65eca14a6b33dcbe00214fcbe959698c46","impliedFormat":1},{"version":"b4966c503c08bbd9e834037a8ab60e5f53c5fd1092e8873c4a1c344806acdab2","impliedFormat":1},{"version":"3d3208d0f061e4836dd5f144425781c172987c430f7eaee483fadaa3c5780f9f","impliedFormat":1},{"version":"34a8a5b4c21e7a6d07d3b6bce72371da300ec1aed58961067e13f1f4dc849712","impliedFormat":1},"ad763fa0c24ede2b818eb6598c12dd581451f94688fb9ed963beba20d513a7ec",{"version":"b7ca2f47522d4ea41e65ff92c4c6dd9c4c8260da7c456a7631a9c88dc056b4d0","impliedFormat":1},{"version":"4f01e4d0959f9125b89e5737eb1ca2bfa69fd6b7d6126eba22feb8b505b00cde","impliedFormat":1},{"version":"4363a1adb9c77f2ed1ca383a41fbab1afadd35d485c018b2f84e834edde6a2c7","impliedFormat":1},{"version":"1d6458533adb99938d041a93e73c51d6c00e65f84724e9585e3cc8940b25523f","impliedFormat":1},{"version":"b0878fbd194bdc4d49fc9c42bfeeb25650842fe1412c88e283dc80854b019768","impliedFormat":1},{"version":"a892ea0b88d9d19281e99d61baba3155200acced679b8af290f86f695b589b16","impliedFormat":1},{"version":"03b42e83b3bcdf5973d28641d72b81979e3ce200318e4b46feb8347a1828cd5d","impliedFormat":1},{"version":"8a3d57426cd8fb0d59f6ca86f62e05dde8bfd769de3ba45a1a4b2265d84bac5a","impliedFormat":1},{"version":"afc6e1f323b476fdf274e61dab70f26550a1be2353e061ab34e6eed180d349b6","impliedFormat":1},{"version":"7c14483430d839976481fe42e26207f5092f797e1a4190823086f02cd09c113c","impliedFormat":1},{"version":"828a3bea78921789cbd015e968b5b09b671f19b1c14c4bbf3490b58fbf7d6841","impliedFormat":1},{"version":"69759c42e48938a714ee2f002fe5679a7ab56f0b5f29d571e4c31a5398d038fe","impliedFormat":1},{"version":"6e5e666fa6adeb60774b576084eeff65181a40443166f0a46ae9ba0829300fcb","impliedFormat":1},{"version":"1a4d43bdc0f2e240395fd204e597349411c1141dd08f5114c37d6268c3c9d577","impliedFormat":1},{"version":"874e58f8d945c7ac25599128a40ec9615aa67546e91ca12cbf12f97f6baf54ff","impliedFormat":1},{"version":"da2627da8d01662eb137ccd84af7ffa8c94cf2b2547d4970f17802324e54defc","impliedFormat":1},{"version":"07af06b740c01ed0473ebdd3f2911c8e4f5ebf4094291d31db7c1ab24ff559aa","impliedFormat":1},{"version":"ba1450574b1962fcf595fc53362b4d684c76603da5f45b44bc4c7eeed5de045b","impliedFormat":1},{"version":"b7903668ee9558d758c64c15d66a89ed328fee5ac629b2077415f0b6ca2f41bc","impliedFormat":1},{"version":"c7628425ee3076c4530b4074f7d48f012577a59f5ddade39cea236d6405c36ba","impliedFormat":1},{"version":"28c8aff998cc623ab0864a26e2eb1a31da8eb04e59f31fa80f02ec78eb225bcd","impliedFormat":1},{"version":"78d542989bdf7b6ba5410d5a884c0ab5ec54aa9ce46916d34267f885fcf65270","impliedFormat":1},{"version":"4d95060af2775a3a86db5ab47ca7a0ed146d1f6f13e71d96f7ac3b321718a832","impliedFormat":1},{"version":"6708cd298541a89c2abf66cceffc6c661f8ee31c013f98ddb58d2ec4407d0876","impliedFormat":1},{"version":"2e90928c29c445563409d89a834662c2ba6a660204fb3d4dc181914e77f8e29d","impliedFormat":1},{"version":"84be1b8b8011c2aab613901b83309d017d57f6e1c2450dfda11f7b107953286a","impliedFormat":1},{"version":"d7af890ef486b4734d206a66b215ebc09f6743b7fb2f3c79f2fb8716d1912d27","impliedFormat":1},{"version":"7e82c1d070c866eaf448ac7f820403d4e1b86112de582901178906317efc35ad","impliedFormat":1},{"version":"c5c4f547338457f4e8e2bec09f661af14ee6e157c7dc711ccca321ab476dbc6d","impliedFormat":1},{"version":"223e233cb645b44fa058320425293e68c5c00744920fc31f55f7df37b32f11ad","impliedFormat":1},{"version":"1394fe4da1ab8ab3ea2f2b0fcbfd7ccbb8f65f5581f98d10b037c91194141b03","impliedFormat":1},{"version":"086d9e59a579981bdf4f3bfa6e8e893570e5005f7219292bf7d90c153066cdfc","impliedFormat":1},{"version":"1ea59d0d71022de8ea1c98a3f88d452ad5701c7f85e74ddaa0b3b9a34ed0e81c","impliedFormat":1},{"version":"cd66a32437a555f7eb63490509a038d1122467f77fe7a114986186d156363215","impliedFormat":1},{"version":"f53d243499acfacc46e882bbf0bf1ae93ecea350e6c22066a062520b94055e47","impliedFormat":1},{"version":"65522e30a02d2720811b11b658c976bff99b553436d99bafd80944acba5b33b4","impliedFormat":1},{"version":"76b3244ec0b2f5b09b4ebf0c7419260813820f128d2b592b07ea59622038e45c","impliedFormat":1},{"version":"66eb7e876b49beff61e33f746f87b6e586382b49f3de21d54d41313aadb27ee6","impliedFormat":1},{"version":"69e8dc4b276b4d431f5517cd6507f209669691c9fb2f97933e7dbd5619fd07b7","impliedFormat":1},{"version":"361a647c06cec2e7437fa5d7cdf07a0dcce3247d93fbf3b6de1dc75139ff5700","impliedFormat":1},{"version":"fe5726291be816d0c89213057cd0c411bb9e39e315ed7e1987adc873f0e26856","impliedFormat":1},{"version":"1b76990de23762eb038e8d80b3f9c810974a7ed2335caa97262c5b752760f11a","impliedFormat":1},{"version":"5e050e05fe99cd06f2d4ad70e73aa4a72961d0df99525e9cad4a78fa588f387b","impliedFormat":1},{"version":"4ff327e8b16da9d54347b548f85675e35a1dc1076f2c22b2858e276771010dd2","impliedFormat":1},{"version":"f767787945b5c51c0c488f50b3b3aeb2804dfd2ddafcb61125d8d8857c339f5a","impliedFormat":1},{"version":"14ab21a9aeff5710d1d1262459a6d49fb42bed835aa0f4cfc36b75aa36faddcd","impliedFormat":1},{"version":"ba3c4682491b477c63716864a035b2cfdd727e64ec3a61f2ca0c9af3c0116cfd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b222d32836d745e1e021bb10f6a0f4a562dd42206203060a8539a6b9f16523f0","impliedFormat":1},{"version":"a3f6d8995864820a0207b7ef4ce1ed6a8dd2fccc7e70d015da15034807c38e1c","impliedFormat":1},{"version":"651df11341eff0b769fb83af75b1872e6cedf406674c5eaa2650551aceb5a816","impliedFormat":1},"774a466295d26eddab911b9f567040364e7b7d0eb8003ad3bfc92b97eeecf066","1e9d4c3b066e0228765cef074a9bf49d0b8d3af461c97f2c511e8f7110b56235",{"version":"9e8f19cd697c9fdfeadb3559f0ca26514075f7054ae1ba17e8fbc8684d12eb5a","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"37d13fd4faef8890e1583640bbac962ae5ccf9d88a18db7585a443e07bc02b67","8017eaa5f4383c20af06c27da7986cf7d9fedd764a7594e16ee3d5ec06a94eb1","9dfe98d745dfc706198852e032c3c936092a4484951872c0d18639cf2ab698cf","44310bdd7b563dd9b2df0e1b0c45a789492e6620b4718778fca88e029f1765f5","030523c514236148e0f25975ef74b2490c391cb9596cd668728f7db5b0702e08","4109b1fb0cffaf1f2bcaaecb49378d7971b795502484bc2dbe0d4deae60c8057","ca52a606c31ddaae5f7c4055fccb3563cf7e85601c96dbf28b7d0795d2d21af0","edadad7db67a0db1a7d474ab075cc15b975d78780218a1860e14516208d7389c","78b3214dba4e86c41e4cdf5de5dcc853806ff74fad5df3dc1087cdbe19ad00e0","64dd7fe06542c482e1c4f812130c42a19351f934d0849c64eb603d92553778d6","45b82fd88270dd3d0aff39220b341eca789f77c82813dc6695b2058479d8dc28","15631c00468c358645d55b6267edf935ab0e94dea8748d619ae23a76f7388912","f212078a0ecefabbbbc627b89e28c871b559c1c57a4dcae32c8d7c2b6c4f0a00","ec4e1ceba158e76dce8afd51f6b13caa6b67fe8e9d0c0686448b77fb76586adf","cadbf01db107d2e9cceb5ecdd3f8f0084d996f07f2fca714409247deb26f0b85","a1d1b662c8d1e1d8a20612adb2c4cecd718f3b0e57d283cad95afbee8a61d132","ea7a4796f350344bbf39b19518d78169bd66a819f787b0a4d1a6ad642dbce7a2","1941ed0a7c9ff9106612c8fcc6ce92f24d656769a5d739599e4a6c34ad478df0","cc5bfa36a8f86eea23a84b78f27ba0f842426cefb5a13d4b53b80a331aaaa268","246ed9157ed5791bffc9037a1aa2a1b709a0fc75e67102d13e71d899dbbb5e0a","5c7afbe31fb1e68671c798cfc06221cbade2f174e243566cf5b8fd0763e4ed52","fcc8fb0967eda9256921f3cfc521d49f3d473232d4c754c09de1d50faa996e35","b28e8eddf4e5bc7659dd8369e31a71ee482d55ecfa6b84831fcc80228518b701","1008e6f116f8169e368d70feccb510f8400b9fb204a699cd25cfeee835c88cc6","4455c74ed4fddb9ae9ba8eb37188fa934b6cf7fcd005053ddfb7dae7e5a6f072","3eb6dafdd02c962b39b09be9e31c695603b58c794e141d4eed2f49318f0af433","9b44504aab0385b4934bf502c8c06a5540c50a0090a34f4c2fb50e43e03f5505","1f08dcb29ad688246447d04e3b7e2d5dcf65311c36c09db4bce1bca316f0201c","61cb83a110e7a89d2ad5a0a4bd91fadb619619a98a16437189a856b51e1e9e0d","a794572bfb0885ec1de20b701e498a415c0480e4fb6c20dbaa125b374ae691cb","1b5be2e53f79f1f20967a235c011841152b2ca9f79b3b0640468ba8a8cf5cd7c","016e4353e0414c98c2ed2eb75df1509a38b457ddf000e9ff98125f82ea42c335","f76cdd7b076354cf26a7414ce5ebcef0a2a3384fdb6e406d4976c522349b6c93","3ef6579bdd5883302539b5370c5670331f3584dff9e2ef14bab39991f00a29cb","325d7dc15c789cc6358327f36e7cf2a916e969017c2b78decf9475af91dc86c3","3b642738f6cd019494d207949a63b67b6ad9013bb3f1fb5f8fa36687879db5c4","492bb2bed9c43e010cd0a50263969a75a72c6279f67654a6bb7def1a9cf74571","35a644763f50424937b17109eb552ddc767270a5526a0a827810ab86585dc53a",{"version":"2e8ff3406c54b9e6ab83cde71a8e02eec9796f58626bfb39825d11e4e03d8bbb","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"eac3a35ef0fe0ab083e8cf36a29a821e014dce98f56d597ed2dd815ff4cace46","signature":"7a79bbeb7030ac58672abb37f4776cade6988cd7cf9a535cffd548658d85f1bc"},{"version":"628364563c513db63865187fbf6afd635d3dc6cdbb8472e639a2c60fc3c13b86","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"c81045d6db59c1c83c84797bc1f78422a691ced9ca9a3554e2f8ef9aacc7dcfa","0496434a31fc8cf9e490e135e87ec3202dd0298290fcffbfbe4d93b3c180756d","bce05280900b4eb3333d10064531569c9fcfce6aa7aeca1ca03b2120539892a5","13c1ff47b7b02fad7d84109dc37613ba445a7a084561485dc9aef335c4c94a84","f5a22523635ca6f47c20b386b010ca1258aa19af5f4299f8752809c599315bcf","4895c3e936eb6d99b94541c611983585d9b5d805ff5a83b8f710e27f52dbafed","4f8f48136b4a2c472edf03e168e658ac758173fb38773f7849009ee0b39a81e5","cb12e3fd9be59bf0e28d6f18ebecbb52f8bd90258cf6dd2af77f7b12545a45bf","1bbd283b943af0cce0c72cde1e843e55093235b7dd3fa7d22dbe957039c0ec76","4f69209ce0e934946c859c4cc6248ef4a2dc528f5baf9b4fcdea5cf3e08d9d38","b1a319734a490e072da3cdb0e53c3d90aa63250323e29ef7d7d554acf5a174d1",{"version":"8e79adf7f7c76bf3874257d3692b76744e5a6784c91cd27f93c30a8a5cc842eb","signature":"2c6835a2dd6319674e4b339215c071bf5896757157ae471324b1bd95868a5285"},{"version":"117c70fd7a19a5369ac35034f89ab731c6f6629d791e35334fb307b7042f89a7","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"ad15d915012090304670ff62dd5e48d7694c11787f4884f51cf80f873dd40aa4","38786de27bad4d667abb5f948b2357fce8de7448a52feb500965735a5f3a5a6e","fb5ce2f104fde415289b4febf27da970e40afefe42b87b15db28818ca9f94132","cb504109f1c6b549fde2eed46b44eaedb73ee7754b3f3a1c1c32bc5dd1693a8c","3613723853e81414c2e1220e3e0a696a997cc49e4390060b6ac7fd91aec150e4","d63995951dabffa413e3114fc0d39108a1c183939ef54616a8019d6061ad0651","082900437524e8bc6903f0d26479f590af1814cc5080fc502e07d38c951500be","1bbff9fec02470dc8837722310fbcb7de786f75d442f3e3116a291dba247caaf","34eb44fd7813a487540b6afa04da3175388b1841aa3612569e8aa07652363b69","fb371cac529d70b2eb453e41a785acab5429502dbc8655db1bd8ad27e0808825",{"version":"5a2cdf6adeec348bbc876221be4367e8adff0bb78a5680ebd7d71e5c3bad6cc0","impliedFormat":99},{"version":"e004826eac62081f867c66dabd92d3ef7d126d93a70430a2c88429228c3ecc50","impliedFormat":99},{"version":"38d6857b58d2ac42442e396311c542062d4f0dad40f2adb496dd5fd0756ee400","impliedFormat":99},{"version":"34b7d1e2d15845cf08bcf5e3c01adbb92cea1ec27564ee249ba486cdfb28526c","impliedFormat":99},"99fb0714ec56758692403802f60e7088c75072a65b3bb54eba67b1e805acee18",{"version":"9cf4f624ebba32c2bb7835548bf3bc5992501727db2ebdbc3a419d6be5350e3f","signature":"c6b01c939f81c7c31ebe026fe3ae7aa8cd98dffe063216a1a9b867c1b7bf25af"},{"version":"c3d577953f04c0188d8b9c63b2748b814efda6440336fa49557f0079f5cf748a","impliedFormat":1},{"version":"787fe950e18951b7970ec98cb05b3d0b11fcdfeb2091a7ea481ac9e52bf6c086","impliedFormat":1},{"version":"13ceda04874f09091da1994ba5f58bf1e9439af93336616257691863560b3f13","impliedFormat":1},"5dad918287439ecd3d345cde1f8a60a7f0676d3b3d8aba49eb14386b35ea6e21",{"version":"9dcddf4e523bdf8938e8490390a84f95fedd295f126b14fb5fb75aea82d8c1b8","signature":"02246963bc8da857256b5a7f5c87ca46af5e88d192fb8de6b14c843f8018a0e4"},"86ddf4ebceb8bce634456e3e156d58f7521f71c18d2003be32a4de31b5dd2942",{"version":"e8e2715cfbe0f1c3f6efaf1319e329f1919d8d5b47d1a713229416eeff2df002","signature":"68b7490a1bff3136af4fc97083af69c24024174ada390cd60c5d47c71fe4cad4"},{"version":"882b28abe64dae4932c83ebb71e4155da340929fe08a2055f3e573ef17f70fc3","impliedFormat":1},{"version":"4a3e425808751200a7709671667ad3d7e7cbfd0a06d469cab42adf06c2601f4a","impliedFormat":1},{"version":"401da46338f5b4f97c2a5f8a0faaace045c51aabd751d2dc704159f64feafe89","impliedFormat":1},{"version":"c705d4594093bcde53fc292c5526aedd3145170ceba73a9476ee97de6a915fe2","impliedFormat":1},"6d466c1275a10e343958cf4f62b7399bd8c580c74186621b9216866d31a3fee9",{"version":"01e869e2a849dc805147bb662e7ad3158eb7690684efff28fbe8d85b98a24d83","signature":"f7668a32206e3b649ac3fa9ac9fa8b52480ee54c932d1e043352e52348f931c0"},"8ba4077599dc474b3d418a730063b0057f7b79455dc6c098447b7c561fe8318b",{"version":"059c5c0d5d54c1f19ef78d852aba6fa014c08636058ac685aec0cbfced493334","signature":"0994e63efd310999cb9e8be445d036306abf77bed46a2844c183ce108fb7a6e6"},"4da386b4bb26e9232cab7ffc29b6dd13e170f9139d87a624eca6bebe550348cd",{"version":"ce9fa4e85d2c6d9a3be3d8d5fd1d16d1918313f99d31ad3f0560782674379646","signature":"d9021d6c806aa55b7c078c20ccd9b00db3a52c431e95bda5539cfa0a94fa64db"},"852c367110c2934ed35a33ad276111aa9b3016ec92b36b86a37b43642ad9458d","907f713ab1a997b4c4898e631516c5addcc4ede2c2fe6c00ed8009493523631f",{"version":"1f8f7fc968cd41df900a3ced1b3279273f442e9a8d9849313ad69867c07cb301","signature":"0645a3f89cb2701d59506dd9df1f714a3d747067e88f7423b96f2a08884003ab"},"0f55b5907842f16784dca83f2c82ac05e1e8740f2ec866c95289e05061384e4b","7c8545a7c4ec6978ebb4af07475d76007eb084c4f7f45aeba7ee817eeb4316e1",{"version":"c50555ef59962a30b77d29162f391e64d43ad58f0f653d9c255d51b4e9356c33","signature":"6bd3dff7a1ba064adde4329af08d28affa6cbfab7393279300bda1f519919168"},"0d0861810ff9d344ab37f055edbc4d14e68e2fa18e113ce8cc33aef9bb500b5f",{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},{"version":"8658354b90861a76abc7b3c04ece2124295c7da0cc4c4d31c2c78d8607188d03","impliedFormat":1},"f1b1170112db2e1a93ea317419a35652f0e9a87ca1612674f514e6f93791d4c2","992404964e9cefb3143cde9bc8e5eb5e7010c3a207f5bfa52df49287fce758be","968043e1fd7bb3c6b1c22d3341ede621d16a628b2bc4c35d1e43f0064ff7c1a6","6d261c7be483027c9d281ba71314350ad8ce66efabf46f7b6099f39fe3b8d218","c02d45c2a6bc50186c1972f44c31ff22e887b30205ce84607bb4661c0fdc9846","7fc06e1e53688bb32ccd86e730e08bacd38d9ad7ad006a234211b230825efb2d",{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"3255b97f3f24af29c79cc1aa88004efb13b6285ebdde0a567bf32e19bb65250d","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},"c2175e53ec5b411439a03c757c499d2bb30c48bef05e83f372b5095fc2f8fb3e",{"version":"6c05d0fcee91437571513c404e62396ee798ff37a2d8bef2104accdc79deb9c0","impliedFormat":1},"5990e5575acfc932889f3720cf5915b1f3514d66b9d0dbcb55d2b62130b2afd5","af2d260656b2b4283e88c167b658dbf279f2832b5c5b625dc451ea04cf3ab731","875a50ccdfb09cd488133676ab8d464dcc7fb4f0cf5ed07e78d4ca0c569a6d63","74bfdd5a9cf6b97dc433c172af096014fa934edbf788eda8b06547d23eb35f0a","9a8f5cbe686f9815d06e1e8dc41fb79c1ea76085ac993fd1c57a8f5ec578351c","c30b993676502929557bfbcb8d2f543422844769a7b711e280d0df736e8db6dd","6be6de9a5af0de2e1d1359b8055aa28967f90ff35afe8390ede427a6d376dd1a","2ab935a40ea1732892424652686f442a7212c8ed79b6dcfcff24616b63f261f1",{"version":"9da2b0eebf78cfa1a8bfda7ff79b81b488805c9b663cc313824413b402d0dc8b","affectsGlobalScope":true,"impliedFormat":99},{"version":"b51bca9749817b5ca6f945534921cff40d00fb1e44378011e8f0033ddb27a9cc","impliedFormat":99},{"version":"2e82d0ebe6ce039ec74ca4d1df4facdebda4efa23e60a6216b4176bc8f4a0aac","impliedFormat":99},{"version":"f92f4e4f821a787525611edfd46e7376c1bcb4565f70b20cc5f055b1164a8f17","affectsGlobalScope":true,"impliedFormat":99},{"version":"6cafea37fea0c60b8977c7e0d59634db0df134c7a51de02064594de3de805ec8","affectsGlobalScope":true,"impliedFormat":99},{"version":"0295c7a5d5d956391ab9bf0410e73a89e25fe26810f9a1d823cc794d682cdafc","impliedFormat":1},{"version":"19826a846db870c2261a3c4cf0695df889d9fe3eebe7775f3f5bc76fe7ad07a7","impliedFormat":1},{"version":"e04cafd03370139cdb0c846273cb19eb4264be0073c7baf78e9b2c16ffb74813","impliedFormat":1},{"version":"7c01c77fb7d8664daa64819245d785e106e0a3cb6e43da64346e4400d7fa9401","impliedFormat":1},{"version":"8c2ca98f4713d989d610fbd38a44316bc43c50aa26983e62dc31002f32ce63fa","impliedFormat":1},{"version":"ee931610d1cf7a6e666fad138187751392fc88bee931b94ac8c4571208dc7370","impliedFormat":1},{"version":"53543b3b64e624a81fc5876da6d72c94dd87655e7afc10988cf82ce7cbc74180","impliedFormat":1},{"version":"967e68e99b8a80551837321442a0e2f12ef50aa1ce567ec991ac6bf062a0c7cf","impliedFormat":1},{"version":"144ab2f3ef7404caf39c6acc88d248d7e55ab3dd1c4c0d89367ad12169aec113","impliedFormat":1},{"version":"759002d4454b851c51b3585e0837c77d159c59957fc519c876449ee5d80a6643","impliedFormat":1},{"version":"07c50b6db67b8b943aed3e410bfeebfb6d3ba1fd1e2819bc889e48f81e94ed2d","impliedFormat":1},{"version":"e3a5287471fb08f053c06fd998632792aa5f022e45278f1e6dd55fb2fa9e7362","impliedFormat":1},{"version":"28a6c8eeb48e165920067b9193555649fc43c2a28c450f23f622e5eb043d9463","impliedFormat":1},{"version":"1147c3efa5a256bcd6a3d2cfaf764185b7120bf985f8412d9bae596a0348f77b","impliedFormat":1},{"version":"490cb6f5e6c90c4eeab1d237242901fc418bd1f08345523beaccc7357122166e","impliedFormat":99},{"version":"cd4908c240506b0aa278c4c8d6bc1705acb41b03fc5b1d86a47f7a9f76f0b075","impliedFormat":99},{"version":"e663cd7abf76422500d57d6500a546fb51e79a095c23914efc33ef73a32f4f8f","impliedFormat":1},{"version":"1ac8996804c14b6ad107fa17f47cfba0f9a4e6f5bfc3ca8b6e6f6a4cfa636398","impliedFormat":1},{"version":"7a317ff3b65c289d4344ea7b6e0a9793168703a79bf1ee889b3ce379b58a54a3","impliedFormat":1},{"version":"543898906d542e8d0631f6861268286722ee148c5f847d33d01cf8bb8b56414d","affectsGlobalScope":true,"impliedFormat":99},{"version":"68ff3225eb855a861e887d0855235b5ac0dd4eacd64f4f4582e48dfde7a192ae","impliedFormat":99},{"version":"3252a756534812804c43800a431da5cae9b641d7849ced2251ac2e711920e38d","affectsGlobalScope":true,"impliedFormat":99},{"version":"06a54bbd0060db53427dd3bb3dd58e3f266a5896e84396ada2e8ff1d299a27ae","impliedFormat":99},{"version":"fabe432191f85afa382dfb08ce4519938c4365eb5c2bb2149405d88151583fc5","affectsGlobalScope":true,"impliedFormat":99},{"version":"29db2c1e2e934e0c8cdbaf8f7f5601e1b4dfdac35f0c839ebf585ab242f1476e","affectsGlobalScope":true,"impliedFormat":99},{"version":"8663fa4279da9eaddb386c1bc28de7f5b433dd2518763ebf185ed198b4b60aec","affectsGlobalScope":true,"impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"58eb22ce690f7941a952f307d51a210195798c9fbc381470fe7e0adb228d4c92","impliedFormat":1},{"version":"49a70606a1a2e65aa6daa491d863c7ff09336c69eccbfd88800bcfb487933fb8","impliedFormat":99},{"version":"3c1100ec1393484b2c486ccb4dd8c8988af1fc1c0e61c2f892e5c370e41b63ea","impliedFormat":99},{"version":"c967e03c8dbb4770f7e2f0b71b5d13593de679a41cc2b60266c4b69f1342a263","impliedFormat":1},{"version":"af5fd0c8cde550fc2c081a18517fb30954461a16daf2ed7969db3805e5a8d7d9","impliedFormat":1},{"version":"d4da3464d2c4b7d80d203ae64bb5c75a66221db5eee12a4ef2c4ce2c9d19a821","impliedFormat":1},{"version":"db820c42ed9b21f2d81ba48889aeb1317c710959346b042f07cee69a545f1326","impliedFormat":1},{"version":"695f2b1040663810ccac946cc87dea5236e3a74efb4bf5964def8961309634b1","impliedFormat":99},{"version":"8cf30ed8685586888fe2a1f781c7bf433c07422648a24c05aa4761253f8e8fec","impliedFormat":99},"0478631698204a3fb5a6162a948e616124159005c14c1416095248a5adfade33",{"version":"46e5b4c7bba4508d91d8d2b3867f4925720a5d160cf8c826a3c945826e93ec47","affectsGlobalScope":true,"impliedFormat":99},{"version":"5a636892ad5afa24b851beb4aafbe90145651d099f933ca906f1a760305e0f04","affectsGlobalScope":true,"impliedFormat":99},{"version":"a308162dc526963f9cd0b9867f65b6e89a68f87fd4db8f6c1740c39475c71386","impliedFormat":99},{"version":"d2e617c655ee5138871b3b84fb82d6b7cdd3fd4e87160e5213a7acc6b06e14f9","impliedFormat":99},{"version":"c8673badeb33eaf32b4a252830e9e99943d0e9bc8988067276b6600a838fbc32","signature":"4fd1381bd826c4fbb04cd0054ac7d2c53f1ff246d2212c263ce1a12b73eac01a"},"24b3d4a92665a6c0e7b76b45a6da52138195cc8f3a90f556586d74fcde64aa50","30ed2b7303d7126197103d88973b3a3da59148629f2435f1467670215d0022c2","8766930e75da3bc13a4560eef5b81acfb70d370616f77793b98a83f2e92aa2c2","67a4656148e1c74d57a43bb300ba8eeaf7435d364a0cb97abf326900d2bfce62","6b65f7a0c2f09243757a6c04dc03754940761536fd9581fbdcedbdca1ab31146",{"version":"c226530483794a0a83c1afb189213a2bfe109a1c0716331e5df9664471ca8d64","impliedFormat":1},{"version":"7459d85c80f2971be954b562724106b13d5a2a57e8bfde51723e94e838f6fcbf","impliedFormat":99},{"version":"c24ab9ac84d65b417a807ada25456697bb2adf1189fa80cb240625dfb3e61c42","impliedFormat":99},{"version":"03952163760a479246853f7ee56fd231d703e8d6f78deb353c7892efeef3db3e","impliedFormat":99},{"version":"0d121799b2cbac398e84a4708fcd82f980f33bf3ac7721a3cf9db9f28d9eb2b2","impliedFormat":99},{"version":"b45c2c7da9952665f78397fccb03f67535535939497b11308c9409c8505eb32a","impliedFormat":99},{"version":"9c3663fa36fb976609d8fc43372ae38dc2e066dab014a955f40ae6430733fb71","impliedFormat":99},{"version":"e38a172f8912eebc79671e07b81687a304a9d366a47933fde9f97ad79f8ac08a","impliedFormat":99},{"version":"2fbe402f0ee5aa8ab55367f88030f79d46211c0a0f342becaa9f648bf8534e9d","impliedFormat":1},{"version":"b94258ef37e67474ac5522e9c519489a55dcb3d4a8f645e335fc68ea2215fe88","impliedFormat":1},"f3aef38b4236eba6dc8305c57a73deef526acc480e86b502ef702a4a3faea496","936a2ca9806a50b4e9be526c26e35798afa2a54e33e7ac66e63729f507f780e1","c1dced320f9c35746b0e6de513750d64ddc3f674ed32276d3bdfc7361ac242e8","89b8f157ccf501c369e0edef7c66d982b632273254d87820079b24d9f58c12b2","22446881d2983a74363ae8793e0c5664350e0e45ab29a76bbcdc0f69187b78aa","4cb890ebe99942ea91de161ba57cced6f5d131daafc0125aea86f4aefd7fd6e0","610be97d1c2d516a9dc114dca6efa3c4fa2937ba7442cd75b4360ab4f0618d5b","47f4cc612825d88227e4a8528acdf21de84b29cb4559ee71b6f5b92c34fb703a","19b6b1cbeb95fc996166b0cdbab53e9619ad3e321e749482ae884b552ef4c3fe","104e2e4b02272e916b14ee21aed6b500734b3e100310b2bdbaa7048c89563433","6a58510492188262a3bab3d038289184e483731b6c43fc07c4708bfbd5c539af","50316b5512f6223033d18e0ca00614fca74cd90210c6965c57609f5a9b77ef5f","aef39133f2f053c0b3e6a9cc9ea1f16905d965c463deb8de5c24a9764d1a0501","7cb9093ea55b4f916703f613f706cd530fc9a08754a30bcbbe5cbe1058bdcfc0","48118f50e202556762f7c6f5d5611dfd9d1c869a683c52f98feec195ba43f8b7",{"version":"8bc45826c7d7e7f553304d8a4b37b072b5663a51f2d33a389dad7cf75ce03423","signature":"99600cf658928d5b404cc9e9f5503fa97d5ae21a0f3ace0247a29587e5de711d"},"ea372876f98383e413c9829d44fa82ffff2fa82d74f18741ca76e17ab5a14a7e","90f425b770bae7c83fbef9b35f16005211591e3ed59f209868ec24fc5cf31d67","7b59693c09bb678025b4d941c19e438b2e4d9ecf857935627c1ea0c52ce8a003","edaf68d097c0b1af14f479f354fcfa339a8b772db193c67c531228c2b20d16ac","6a3d6a86816c3b71308f607a824f13ec87eaa331017e59a4df22f2a1a488d2a9","7999dc74b57cc2dfa1640ac746bb755420a4375541732f4bff420751a375d7a3","f90bc7dcc3efa8443876129be564fb2bd82f639fc69dd8292562585683f456d3","c4cff5956e1790ef385e94052a505c253e56276772476ed930e2dc7b3cb71606","96388a05b31407b5db53506560bc978dc244f57aceb42e0b5b9f18dc817ce80b","8ae95ce05f95c7483dd19442b29619e27cf7b847003720afd1beeaa8a18a8571","54a207888b3d0227ec7930a85b6692d7e645b1ef0815730d65da7c08c3ffd6f6","dd264a2a3709072636d434694bf7b2ae91d6eb1a70a3958e915ace35dd6c54f0","280d5aa87638deca867b769c75f80618eee483fab0e49cc75187773956919c9d",{"version":"a21b16e26fefcf0fa3501377571130b6b1dfea4e4e39ae9ca49e5202d397d289","signature":"aaa54848750b2270de56f416a7217a37551ea2429fccb56c1c0f2aed40be3d18"},{"version":"2f7f9fe9ef33a1305b470d58eff97c8dde754c4fc92ba23611da405694a94ae9","signature":"ca2d5a2abb4eb48f173d4015b325550d8a0c2b2bdfb9c5b36f9a61531c06668f"},"8263affffa2648dd249f5ba84ab1230aa73db164ef3d4052875f0c40353587db","ca37fecd6e1c3e1332f6bc8dbdf38b78435ea2eed5ef81289f39679b650ebc4a","5f5d9430c6d0b4018fb92509e36b7351f60e3bb2dd7e7325906b84a0da1a06a5",{"version":"997c98da784db39942db1efa0d850088df1da2bc1a04c9c7fd90c9a2b21904bc","signature":"cafdaff0daa4a19103617159d10830f63604b098db8df5aef706d47c19e41bc3"},"39e348b373ece0f0621d887e6036e78b6eed048072b36e69d5cdd363d0aa502a",{"version":"1bdaaa929028e63260ee0b975c2287efd7f44c1696c9673be52e412d29882012","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c7eedaba2d3be113d184bdec0b7f642fbbf23cff2747f5c6bf7159b3ddd09567","signature":"e57ae54f0d26c736de41375267018101db10f7bf5f0087b622787fe11ad0a98c"},"6a7d404a4baeec830a75fc89a760f1d5ca5fe9a95ff8931f8996d65389350281",{"version":"9719826079648bc0d77028acb73cbd90c9721ad7d56de815742878f350cc9ce7","signature":"174f388ed9a5279a940fe654e34d517058f7105c72b6cdd16de70404e0e16745"},"495997152864d5ea9138ac650adb4e3e137c7554c48c415626690faba59d264c","e9139bbf95f49744dd73e6a3ff70895b1297f99bca4da410cd835a4db2bdc797",{"version":"8e5a1adaae977af48997dec89d6cc6075aee453b661faf7252b4b3a44c7f2bbb","impliedFormat":1},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","impliedFormat":99},{"version":"db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","impliedFormat":99},{"version":"ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","impliedFormat":99},{"version":"f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","impliedFormat":99},{"version":"fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","impliedFormat":99},{"version":"0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"da0f84fcd93700b4a5fbf9c6f166a6cc19fc798231bff56dd1e3875bfc6966eb","impliedFormat":1},{"version":"634ff08e0143bec98401c737de7bfc6883bfec09200bd3806d2a4cfc79c62aaa","impliedFormat":1},{"version":"90a86863e3a57143c50fec5129d844ec12cef8fe44d120e56650ed51a6ce9867","impliedFormat":1},{"version":"472c0a98c5de98b8f5206132c941b052f5cc1ae78860cb8712ac4f1ebf4550ca","impliedFormat":1},{"version":"538c4903ef9f8df7d84c6cf2e065d589a2532d152fa44105c7093a606393b814","impliedFormat":1},{"version":"cfcb6acbb793a78b20899e6537c010bfbbf939c77471abcdc2a41faf9682ca1a","impliedFormat":1},{"version":"a7798e86de8e76844f774f8e0e338149893789cdc08970381f0ae78c86e8667f","impliedFormat":1},{"version":"eebc21bb922816f92302a1f9dcefc938e74d4af8c0a111b2a52519d7e25d4868","impliedFormat":1},{"version":"6b359d3c3138a9f4d3a9c9a8fda24be6fd15bd789e692252b53e68ce99db8edc","impliedFormat":1},{"version":"9488b648a6a4146b26c0fd4e85984f617056293092a89861f5259a69be16ca5c","impliedFormat":1},{"version":"e156513655462b5811a8f980e32ccd204c19042f8c9756430fe4e8d6f7c1326e","impliedFormat":1},{"version":"5679b694d138b8c4b3d56c9b1210f903c6b0ca2b5e7f1682a2dd41a6c955f094","impliedFormat":1},{"version":"ca8da035b76fb0136d2c1390dda650b7979202dbe0f5dc7eaefcde1c76dee4f4","impliedFormat":1},{"version":"4b1022a607444684abeee6537e4cace97263d1ef047c31b012c41fdc15838a79","impliedFormat":1},{"version":"dd0271250f1e4314e52d7e0da9f3b25a708827f8a43ceff847a2a5e3fd3283e8","affectsGlobalScope":true,"impliedFormat":1},{"version":"47971d8a8639a2a2dd684091c6e7660ec5909fed540c4479ca24e22ac237194e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e1075312b07671ef1cbf46409a0fa2eb2b90bb59c6215c94f0e530113013eeda","impliedFormat":1},{"version":"1bfd63c3f3749c5dc925bb0c05f229f9a376b8d3f8173d0e01901c08202caf6f","impliedFormat":1},{"version":"da850b4fdbabdd528f8b9c2784c5ba3b3bedc4e2e1e34dcd08b6407f9ec61a25","impliedFormat":1},{"version":"e61c918bb5f4a39b795a06e22bc4d44befcefd22f6a5c8a732c9ed0b565a6128","impliedFormat":1},{"version":"ee56351989b0e6f31fd35c9048e222146ced0aac68c64ce2e034f7c881327d6d","impliedFormat":1},{"version":"f58b2f1c8f4bcf519377d39f9555631b6507977ad2f4d8b73ac04622716dc925","impliedFormat":1},{"version":"4c805d3d1228c73877e7550afd8b881d89d9bc0c6b73c88940cffcdd2931b1f6","impliedFormat":1},{"version":"4aa74b4bc57c535815ae004550c59a953c8f8c3c61418ac47a7dcfefba76d1ba","impliedFormat":1},{"version":"78b17ceb133d95df989a1e073891259b54c968f71f416cd76185308af4f9a185","impliedFormat":1},{"version":"d76e5d04d111581b97e0aa35de3063022d20d572f22f388d3846a73f6ce0b788","impliedFormat":1},{"version":"0a53bb48eba6e9f5a56e3b85529fbbe786d96e84871579d10593d4f3ae0f9dba","impliedFormat":1},{"version":"d34fb8b0a66f0a406c7ce63a36f16dda7ff4500b11b0bd30a491aa0d59336d1f","impliedFormat":1},{"version":"282b31893b18a06114e5173f775dd085597ca220d183b8bd474d21846c048334","impliedFormat":1},{"version":"ed27d5ce258f069acf0036471d1fbb56b4cb3c16d7401b52a51297eca651db62","impliedFormat":1},{"version":"ec203a515afd88589bf1d384535024f5b90ebe6b5c416fb3dcca0abd428a8ba4","impliedFormat":1},{"version":"32a2a1374b57f0744d284ca93b477bd97825922513a24dfe262cbf3497377d96","impliedFormat":1},{"version":"a8b60d24dc1eb26c0e987f9461c893744339a7f48e4496f8077f258a644cffab","impliedFormat":1},{"version":"3f9df27a77a23d69088e369b42af5f95bcb3e605e6b5c2395f0bfcd82045e051","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fd080a9458c6d6f3eb6d4e2b12a3ec498d7d219863e9dca0646bdee9acce875","impliedFormat":1},{"version":"e5d31928bee2ba0e72aeb858881891f8948326e4f91823028d0aea5c6f9e7564","affectsGlobalScope":true,"impliedFormat":1},{"version":"9a9ba9f6fd097bb2f57d68da8a39403bbe4dc818b8ccd155a780e4e23fa556f2","impliedFormat":1},{"version":"e50c4cd1f5cbce3e74c19a5bbf503c460e6ae86597e6d648a98c7f6c90b596dd","impliedFormat":1},{"version":"fa140f881e20591ce163039a7968b54c5e51c11228708b4f9147473d06471cf5","affectsGlobalScope":true,"impliedFormat":1},{"version":"295eca0c47be1191690fd2fe588195fff9d4dc43852aceb8b4cab2aa634579f0","impliedFormat":1},{"version":"59ee7346e19b0050508a592702871dc943083c6dcb69a47d52e888115d840781","impliedFormat":1},{"version":"067712491fb2094c212c733dd8e2d56e74c309a9ce9dac9e919286b7245a1eb4","impliedFormat":1},{"version":"a5eae58ac55bd30c42359e4b01fb2be5eddac336869d3f04ffb4daa54b58f009","impliedFormat":1},{"version":"d12d691ef8933e8db39f2ca81d6973940ff5e37bb421752f5b6e7bc15dea3abf","impliedFormat":1},{"version":"4c5f8bd9b3a1aae4e4fddfee41667e495a045f73ed603993038fa6a8ba92fa14","impliedFormat":1},{"version":"dfb274ab0f319cf18ce7152067c25f984c7fd1924fc72b3f66734588444c934a","impliedFormat":1},{"version":"108c8c05cbc3fbbbd4ff4fc0779c9bef55655c28528eb0f77829795dc9f0b484","impliedFormat":1},{"version":"a7e5444d24cdec45f113f4fb8a687e1c83a5d30c55d2da19a04be71108ad77bd","impliedFormat":1},{"version":"41ec17e218b7358fcff25c719bc419fec8ec98f13e561b9a33b07392d4fec24c","impliedFormat":1},{"version":"23c204326746e981e02d7f0a15ab6f8015f9035998cb3766c9ddbf8ea247aea2","impliedFormat":1},{"version":"25f994b5d76ce6a3186a3319555bbba79706dac2174019915c39ac6080e98c7e","impliedFormat":1},{"version":"dfa4e2c6a612d43851ccbc499598cb006a3a78bc8c7f972c52078f862fa84e47","impliedFormat":1},{"version":"02c1705fa902f172be6e9020d74bcd92ce5db8d2ef3e1b03aabc2ac8eb46c3db","impliedFormat":1},{"version":"99d2d8a0c7bb3dd77459552269a7b5865fa912cedab69db686d40d2586b551f7","impliedFormat":1},{"version":"b47abe58626d76d258472b1d5f76752dd29efe681545f32698db84e7f83517df","impliedFormat":1},{"version":"3a99bbbbbf42e45c3d203e7c74f1319b79f9821c5e5f3cdd03249184d3e003ce","impliedFormat":1},{"version":"aaacc0e12ab4de27bdf131f666e315d8e60abec26c7f87501e0a7806fc824ae6","impliedFormat":1},{"version":"3b4195afd41a9215afc7be0820f8083f6bd2e85e5e0b45bb0061fb041944711e","impliedFormat":1},{"version":"108df8095f5e25d7189dd0d1433ac2df75ec40c779d8faf7d2670f1485beb643","impliedFormat":1},{"version":"ddd3c1d3c9ff67140191a3cf49b09875e20f28f2fc5535ae5ea16e14293a989b","impliedFormat":1},{"version":"7b496e53d5f7e1737adcb5610516476ee055bf547918797348f245c68e7418fe","impliedFormat":1},{"version":"577f44389d7faedd7fc9c0330caf73140e5d0d5f6c968210bff78be569f398a7","impliedFormat":1},{"version":"3046c57724587a59bceefadd30040d418e9df81b9f3cfd680618a3511302ed7a","impliedFormat":1},{"version":"15ccc911ed15397e838471bfe6d476c28deffe976c05cb057e6b1ea7491242c2","impliedFormat":1},{"version":"64b5a5ebdaead77a9a564aa938f4fb7a45e27cda7441d3bee8c9de8a4df5a04f","impliedFormat":1},{"version":"a48037f7af5f80df8973db5e562e17566407541de284b8dadf1879ea3aed8a2f","impliedFormat":1},{"version":"dab97d96ce986857150db03f0d435b44c060d126b4a387c7807f4e9f6c92e531","impliedFormat":1},{"version":"85f39366ea7bc5e34b596fc97de18a7e377856755e789d8e931054f2191d9b8b","impliedFormat":1},{"version":"daf3ea3d49f6e8a2fa70b7ca1f21bd97f1b65021b31fbfccb73dd55f86abb792","impliedFormat":1},{"version":"b15bd260805f9dd06cd4b2b741057209994823942c5696fd835e8a04fb4aab6b","impliedFormat":1},{"version":"6635a824edf99ed52dbd3502d5bce35990c3ed5e2ec5cef88229df8ac0c52b06","impliedFormat":1},{"version":"d6577effa37aae713c34363b7cc4c84851cbabe399882c60e2b70bcbb02bfa01","impliedFormat":1},{"version":"8eaf80ad438890fe5880c39a7bbf2c998ce7d29d4c14dd56d82db63bd871eefb","impliedFormat":1},{"version":"9b3e7f776f312c76ac67e1060e5398d7ac2c69d6a3a928a9daaae2eb05b15f56","impliedFormat":1},{"version":"202042eccb4789b7dee51ba9ecab0b854834ea5c1d6a3946504bfc733d4468c3","impliedFormat":1},{"version":"2b2ef76a9f36094b07ee6f76a5ac6903f2f65c0a20283201814a8d1e752cb592","impliedFormat":1},{"version":"8882e4e087d0bc8cc713cb3d8090c45d33e373e6f5c83e0f8d00fe6a950ef875","impliedFormat":1},{"version":"0cf60f081761b337853493462a9d5626b11fe7b02a019d86c7b21628b5f928f5","impliedFormat":99},"874f98710d165b57706e68644ea48a666fc079883b95ae0159de057bfd74e2c5","9046da5fdd6a468646f77a346a7c35e72cd86f6ab306caf9193ccef492a1b4f2","ad42288f8c9ebfd4451e4256a2f091cfc26b958d29db3612c19efbbb476882a2","59b54146333f3ad62db9f636c988f09378b61c55c4bde0541602011d458a1ca9",{"version":"b7724c5f8c92bf25a109abae1de5f939f4b2f08421c288329bbc01bcc515a265","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7","33881782ee0e073f6cb8ec486a7c14d4f814473af2d8a7a9f46d5cc27d1862ea","d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7",{"version":"462b986b7c699b7e7e52a571eb3776fdbdd6bdf38638c37e9c9781e155e9139c","affectsGlobalScope":true},"335164436c58bce6304a80080b67ef2682d7b3d74548a219a524c98ff628fec8",{"version":"8d7cbeea0454e05a3cdf3370c5df267072c4f1dc6c48a45a9ad750d7890443d7","affectsGlobalScope":true,"impliedFormat":99}],"root":[[559,561],775,776,782,805,[856,922],927,928,[932,935],[940,952],[955,960],964,[966,973],1015,[1020,1025],[1036,1077],[1167,1176]],"options":{"allowJs":false,"esModuleInterop":true,"jsx":4,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[1174,1],[1175,2],[1176,3],[1172,4],[559,2],[1173,5],[560,6],[776,7],[1032,8],[1033,9],[1029,10],[1027,2],[1028,11],[1031,12],[1030,13],[1012,14],[403,2],[566,2],[1006,15],[637,2],[1019,16],[779,17],[1008,18],[1014,19],[1013,20],[1004,21],[923,2],[924,22],[925,23],[926,24],[800,2],[797,2],[796,2],[791,25],[802,26],[787,27],[798,28],[790,29],[789,30],[799,2],[794,31],[801,2],[795,32],[788,2],[786,33],[785,34],[1078,34],[784,27],[804,35],[1151,36],[1152,36],[1154,37],[1153,36],[1146,36],[1147,36],[1149,38],[1148,36],[1124,2],[1126,2],[1125,2],[1128,39],[1127,2],[1091,40],[1089,41],[1092,2],[1139,42],[1093,36],[1129,43],[1138,44],[1130,2],[1133,45],[1131,2],[1134,2],[1136,2],[1132,45],[1135,2],[1137,2],[1090,46],[1165,47],[1150,36],[1145,48],[1155,49],[1161,50],[1162,51],[1164,52],[1163,53],[1143,48],[1144,54],[1140,55],[1142,56],[1141,57],[1156,36],[1160,58],[1157,36],[1158,59],[1159,36],[1094,2],[1095,2],[1098,2],[1096,2],[1097,2],[1100,2],[1101,60],[1102,2],[1103,2],[1099,2],[1104,2],[1105,2],[1106,2],[1107,2],[1108,61],[1109,2],[1123,62],[1110,2],[1111,2],[1112,2],[1113,2],[1114,2],[1115,2],[1116,2],[1119,2],[1117,2],[1118,2],[1120,36],[1121,36],[1122,63],[783,2],[640,64],[638,2],[1005,2],[161,65],[162,65],[163,66],[101,67],[164,68],[165,69],[166,70],[99,2],[167,71],[168,72],[169,73],[170,74],[171,75],[172,76],[173,76],[174,77],[175,78],[176,79],[177,80],[102,2],[100,2],[178,81],[179,82],[180,83],[220,84],[181,85],[182,86],[183,85],[184,87],[185,88],[186,89],[187,90],[188,90],[189,90],[190,91],[191,92],[192,93],[193,94],[194,95],[195,96],[196,96],[197,97],[198,2],[199,2],[200,98],[201,99],[202,98],[203,100],[204,101],[205,102],[206,103],[207,104],[208,105],[209,106],[210,107],[211,108],[212,109],[213,110],[214,111],[215,112],[216,113],[217,114],[103,85],[104,2],[105,115],[106,116],[107,2],[108,117],[109,2],[152,118],[153,119],[154,120],[155,120],[156,121],[157,2],[158,68],[159,122],[160,119],[218,123],[219,124],[224,125],[488,126],[225,127],[223,128],[490,129],[489,130],[803,126],[221,131],[486,2],[222,132],[90,2],[92,133],[485,126],[255,126],[781,134],[780,2],[669,135],[774,136],[665,2],[668,137],[678,138],[666,139],[667,140],[641,141],[647,142],[648,143],[646,2],[615,2],[624,144],[623,145],[643,144],[626,146],[628,147],[671,147],[627,148],[635,149],[634,2],[622,150],[616,151],[663,152],[618,153],[620,154],[662,2],[649,153],[619,2],[621,151],[617,2],[995,2],[997,155],[996,2],[639,2],[981,156],[980,157],[979,158],[987,159],[988,160],[985,161],[986,162],[983,163],[984,164],[982,165],[1035,166],[1034,167],[953,2],[91,2],[583,2],[657,168],[659,169],[658,170],[656,171],[655,2],[937,172],[936,2],[938,173],[839,174],[808,175],[818,175],[809,175],[819,175],[810,175],[811,175],[826,175],[825,175],[827,175],[828,175],[820,175],[812,175],[821,175],[813,175],[822,175],[814,175],[816,175],[824,176],[817,175],[823,176],[829,176],[815,175],[830,175],[835,175],[836,175],[831,175],[807,2],[837,2],[833,175],[832,175],[834,175],[838,175],[607,2],[609,177],[608,2],[1026,126],[806,178],[929,179],[845,180],[844,181],[851,182],[853,183],[849,184],[848,185],[852,181],[846,186],[843,187],[854,188],[855,188],[847,189],[841,2],[842,190],[931,191],[930,192],[850,2],[965,126],[511,193],[516,194],[523,195],[506,196],[259,2],[267,197],[407,198],[410,199],[382,2],[395,200],[402,201],[284,2],[384,2],[265,2],[381,202],[427,203],[266,2],[257,204],[409,205],[411,206],[412,207],[483,208],[376,209],[329,210],[389,211],[390,212],[388,213],[387,2],[383,214],[408,215],[268,216],[453,2],[454,217],[295,218],[269,219],[296,218],[332,218],[235,218],[405,220],[404,2],[394,221],[501,2],[244,2],[522,222],[461,223],[462,224],[458,225],[540,2],[359,2],[463,226],[459,227],[545,228],[544,229],[539,2],[310,2],[362,230],[361,2],[538,231],[460,126],[315,232],[322,233],[324,234],[314,2],[319,235],[321,236],[323,237],[318,238],[316,2],[320,239],[541,2],[537,2],[543,240],[542,2],[313,241],[532,242],[535,243],[303,244],[302,245],[301,246],[548,126],[300,247],[289,2],[550,2],[962,248],[961,2],[551,126],[552,249],[227,2],[391,250],[392,251],[393,252],[231,2],[396,2],[251,253],[226,2],[475,126],[233,254],[474,255],[473,256],[464,2],[465,2],[472,2],[467,2],[470,257],[466,2],[468,258],[471,259],[469,258],[264,2],[261,2],[262,218],[416,2],[421,260],[422,261],[420,262],[418,263],[419,264],[414,2],[481,226],[256,226],[510,265],[517,266],[521,267],[350,268],[349,2],[344,2],[497,269],[505,270],[377,271],[378,272],[456,273],[366,2],[479,274],[354,126],[371,275],[482,276],[367,2],[370,277],[368,2],[480,278],[477,279],[476,2],[478,2],[374,2],[452,280],[239,281],[352,282],[356,283],[372,284],[375,285],[364,286],[357,287],[504,288],[430,289],[348,290],[236,291],[503,292],[232,293],[423,294],[415,2],[424,295],[441,296],[413,2],[440,297],[98,2],[435,298],[260,2],[455,299],[431,2],[245,2],[247,2],[386,2],[439,300],[263,2],[287,301],[373,302],[293,303],[353,2],[438,2],[417,2],[443,304],[444,305],[385,2],[446,306],[448,307],[447,308],[397,2],[437,291],[450,309],[347,310],[436,311],[442,312],[272,2],[276,2],[275,2],[274,2],[279,2],[273,2],[282,2],[281,2],[278,2],[277,2],[280,2],[283,313],[271,2],[339,314],[338,2],[343,315],[340,316],[342,317],[345,315],[341,316],[252,318],[331,319],[500,320],[498,2],[527,321],[529,322],[493,323],[528,324],[240,325],[237,325],[270,2],[254,326],[253,327],[249,328],[250,329],[258,330],[286,330],[297,330],[333,331],[298,331],[242,332],[241,2],[337,333],[336,334],[335,335],[334,336],[243,337],[484,338],[285,339],[492,340],[457,341],[487,342],[491,343],[380,344],[379,345],[360,346],[346,347],[328,348],[330,349],[327,350],[449,351],[351,2],[515,2],[248,352],[451,353],[499,354],[358,2],[288,355],[365,356],[363,357],[290,358],[425,359],[494,2],[291,360],[426,360],[513,2],[512,2],[514,2],[496,2],[495,2],[428,361],[355,2],[325,362],[246,363],[304,2],[230,364],[292,2],[519,126],[229,2],[531,365],[312,126],[525,226],[311,366],[508,367],[309,365],[234,2],[533,368],[307,126],[308,126],[299,2],[228,2],[306,369],[305,370],[294,371],[369,94],[429,94],[445,2],[433,372],[432,2],[317,241],[238,2],[326,126],[502,253],[509,373],[93,126],[96,374],[97,375],[94,126],[95,2],[406,116],[401,376],[400,2],[399,377],[398,2],[507,378],[518,379],[520,380],[524,381],[963,382],[526,383],[530,384],[558,385],[534,385],[557,386],[536,387],[546,388],[547,389],[549,390],[553,391],[556,253],[555,2],[554,392],[675,117],[676,393],[840,394],[772,395],[679,2],[680,395],[771,396],[773,397],[603,398],[601,399],[602,400],[590,401],[591,399],[598,402],[589,403],[594,404],[604,2],[595,405],[600,406],[606,407],[605,408],[588,409],[596,410],[597,411],[592,412],[599,398],[593,413],[793,414],[792,2],[1011,415],[1010,416],[939,417],[989,2],[990,418],[991,2],[992,419],[612,420],[574,421],[575,422],[578,423],[567,424],[577,425],[573,426],[565,2],[579,427],[580,428],[568,2],[569,2],[571,429],[570,2],[572,430],[434,431],[587,2],[993,432],[976,2],[998,433],[1017,434],[978,435],[1000,436],[994,437],[1003,438],[1018,439],[1016,440],[1001,441],[977,442],[974,126],[999,443],[1166,444],[975,126],[1002,445],[1088,446],[1080,2],[1079,2],[1087,447],[1082,448],[1085,449],[1086,450],[1081,2],[1083,2],[1084,451],[954,2],[644,2],[636,2],[88,2],[89,2],[14,2],[15,2],[17,2],[16,2],[2,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[25,2],[3,2],[26,2],[27,2],[4,2],[28,2],[32,2],[29,2],[30,2],[31,2],[33,2],[34,2],[35,2],[5,2],[36,2],[37,2],[38,2],[39,2],[6,2],[43,2],[40,2],[41,2],[42,2],[44,2],[7,2],[45,2],[50,2],[51,2],[46,2],[47,2],[48,2],[49,2],[8,2],[55,2],[52,2],[53,2],[54,2],[56,2],[9,2],[57,2],[58,2],[59,2],[61,2],[60,2],[62,2],[63,2],[10,2],[64,2],[65,2],[66,2],[11,2],[67,2],[68,2],[69,2],[70,2],[71,2],[72,2],[12,2],[73,2],[74,2],[75,2],[76,2],[77,2],[1,2],[78,2],[79,2],[13,2],[80,2],[81,2],[82,2],[83,2],[84,2],[85,2],[86,2],[87,2],[1009,2],[128,452],[140,453],[125,454],[141,455],[150,456],[116,457],[117,458],[115,459],[149,460],[144,461],[148,462],[119,463],[137,464],[118,465],[147,466],[113,467],[114,461],[120,468],[121,2],[127,469],[124,468],[111,470],[151,471],[142,472],[131,473],[130,468],[132,474],[135,475],[129,476],[133,477],[145,460],[122,478],[123,479],[136,480],[112,455],[139,481],[138,468],[126,479],[134,482],[143,2],[110,2],[146,483],[1007,484],[563,485],[614,486],[582,487],[564,485],[562,2],[581,488],[613,2],[611,2],[584,489],[610,490],[576,491],[586,2],[585,492],[670,493],[778,494],[664,495],[645,496],[633,497],[629,498],[661,2],[630,146],[653,499],[650,500],[673,501],[672,502],[631,503],[652,504],[625,2],[632,505],[777,506],[674,507],[660,508],[677,509],[654,510],[1177,511],[651,2],[642,2],[757,512],[760,513],[762,514],[769,515],[764,2],[765,2],[763,516],[766,517],[758,2],[759,2],[770,518],[761,519],[767,2],[768,520],[751,521],[755,522],[752,522],[748,521],[756,523],[753,524],[754,522],[749,525],[750,526],[744,527],[688,528],[690,529],[743,2],[689,530],[747,531],[746,532],[745,533],[681,2],[691,528],[692,2],[683,534],[687,535],[682,2],[684,536],[685,537],[686,2],[693,538],[694,538],[695,538],[696,538],[697,538],[698,538],[699,538],[700,538],[701,538],[702,538],[703,538],[704,538],[705,538],[707,538],[706,538],[708,538],[709,538],[710,538],[711,538],[742,539],[712,538],[713,538],[714,538],[715,538],[716,538],[717,538],[718,538],[719,538],[720,538],[721,538],[722,538],[723,538],[724,538],[726,538],[725,538],[727,538],[728,538],[729,538],[730,538],[731,538],[732,538],[733,538],[734,538],[735,538],[736,538],[737,538],[738,538],[741,538],[739,538],[740,538],[973,540],[1024,541],[1015,542],[1021,543],[1023,544],[1022,545],[1025,546],[1039,547],[1038,548],[858,549],[857,550],[862,551],[861,552],[866,553],[865,552],[864,554],[863,552],[868,555],[867,552],[870,556],[869,552],[872,557],[871,552],[876,558],[875,552],[874,559],[873,552],[881,560],[880,552],[884,561],[885,561],[886,561],[887,562],[882,561],[883,563],[893,564],[892,552],[891,565],[890,552],[889,566],[888,552],[897,567],[896,552],[895,568],[894,552],[899,569],[898,552],[901,570],[900,552],[903,571],[902,552],[905,572],[904,552],[906,561],[907,561],[908,573],[879,574],[910,575],[909,552],[912,576],[911,552],[914,577],[913,552],[878,578],[877,552],[916,579],[915,552],[918,580],[917,581],[922,582],[921,552],[920,583],[919,552],[1042,584],[927,585],[928,586],[1041,587],[1040,588],[1046,589],[1045,590],[1044,591],[1043,590],[1051,592],[1047,593],[1048,594],[1050,595],[1049,596],[1052,597],[967,598],[1055,599],[934,600],[935,601],[1056,602],[932,603],[933,604],[1054,605],[1053,606],[972,607],[1058,608],[940,609],[941,610],[942,611],[943,612],[944,613],[945,614],[947,615],[948,616],[1057,617],[1060,618],[1059,619],[1065,620],[1061,593],[1062,621],[1064,622],[1063,623],[1070,624],[1066,593],[1067,625],[1069,626],[1068,627],[1071,628],[1072,629],[1037,630],[1073,631],[1074,632],[968,226],[1075,633],[969,634],[1076,635],[1077,636],[971,637],[1167,638],[1168,639],[970,640],[1036,641],[956,642],[957,643],[958,644],[1169,645],[959,646],[860,647],[856,648],[950,649],[946,611],[1020,650],[951,611],[859,574],[952,651],[955,652],[949,611],[1170,653],[964,654],[1171,655],[966,634],[561,656],[960,574],[782,657],[805,658],[775,659]],"affectedFilesPendingEmit":[1176,1173,776,973,1024,1015,1021,1023,1022,1025,1039,1038,858,857,862,861,866,865,864,863,868,867,870,869,872,871,876,875,874,873,881,880,884,885,886,887,882,883,893,892,891,890,889,888,897,896,895,894,899,898,901,900,903,902,905,904,906,907,908,879,910,909,912,911,914,913,878,877,916,915,918,917,922,921,920,919,1042,927,928,1041,1040,1046,1045,1044,1043,1051,1047,1048,1050,1049,1052,967,1055,934,935,1056,932,933,1054,1053,972,1058,940,941,942,943,944,945,947,948,1057,1060,1059,1065,1061,1062,1064,1063,1070,1066,1067,1069,1068,1071,1072,1037,1073,1074,968,1075,969,1076,1077,971,1167,1168,970,1036,956,957,958,1169,959,860,856,950,946,1020,951,859,952,955,949,1170,964,1171,966,960,782,805],"version":"6.0.3"}
+{"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.es2025.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.es2025.collection.d.ts","./node_modules/typescript/lib/lib.es2025.float16.d.ts","./node_modules/typescript/lib/lib.es2025.intl.d.ts","./node_modules/typescript/lib/lib.es2025.iterator.d.ts","./node_modules/typescript/lib/lib.es2025.promise.d.ts","./node_modules/typescript/lib/lib.es2025.regexp.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.date.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.esnext.temporal.d.ts","./node_modules/typescript/lib/lib.esnext.typedarrays.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/css.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/styled-jsx/types/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/node/compatibility/iterators.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/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.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-stats.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/round-robin-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.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/snapshot-agent.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/cache-interceptor.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/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/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.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.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.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/path/posix.d.ts","./node_modules/@types/node/path/win32.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/quic.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/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.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/test/reporters.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/util/types.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/@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/lib/fallback.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/entry-constants.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/lib/bundler.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/request/search-params.d.ts","./node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.d.ts","./node_modules/next/dist/server/app-render/vary-params.d.ts","./node_modules/next/dist/server/request/params.d.ts","./node_modules/next/dist/server/route-kind.d.ts","./node_modules/next/dist/server/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/lib/cache-control.d.ts","./node_modules/next/dist/shared/lib/app-router-types.d.ts","./node_modules/next/dist/server/lib/cache-handlers/types.d.ts","./node_modules/next/dist/server/use-cache/use-cache-wrapper.d.ts","./node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","./node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","./node_modules/next/dist/build/static-paths/types.d.ts","./node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/build/adapter/setup-node-env.external.d.ts","./node_modules/next/dist/server/instrumentation/types.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/worker.d.ts","./node_modules/next/dist/server/lib/experimental/ppr.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","./node_modules/next/dist/build/segment-config/pages/pages-segment-config.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/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/server/node-environment-baseline.d.ts","./node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-file.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-exit.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-dim.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/random.d.ts","./node_modules/next/dist/server/node-environment-extensions/date.d.ts","./node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","./node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","./node_modules/next/dist/server/lib/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/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/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/client/components/readonly-url-search-params.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/client/flight-data-helpers.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-key.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/segment-cache/types.d.ts","./node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","./node_modules/next/dist/client/components/segment-cache/scheduler.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-map.d.ts","./node_modules/next/dist/client/components/segment-cache/vary-path.d.ts","./node_modules/next/dist/client/components/segment-cache/cache.d.ts","./node_modules/next/dist/client/components/router-reducer/ppr-navigations.d.ts","./node_modules/next/dist/client/components/segment-cache/navigation.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/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/normalizers/normalizer.d.ts","./node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/after/builtin-request-context.d.ts","./node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","./node_modules/next/dist/server/route-modules/pages/builtin/_error.d.ts","./node_modules/next/dist/server/load-default-error-components.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/after/after.d.ts","./node_modules/next/dist/server/after/after-context.d.ts","./node_modules/next/dist/server/use-cache/cache-life.d.ts","./node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/lazy-result.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/shared/lib/action-revalidation-kind.d.ts","./node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","./node_modules/next/dist/server/async-storage/work-store.d.ts","./node_modules/next/dist/server/web/http.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect-error.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/server/app-render/cache-signal.d.ts","./node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-samples.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/implicit-tags.d.ts","./node_modules/next/dist/server/app-render/staged-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","./node_modules/next/dist/build/templates/app-route.d.ts","./node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","./node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","./node_modules/next/dist/build/segment-config/app/app-segments.d.ts","./node_modules/next/dist/build/get-supported-browsers.d.ts","./node_modules/next/dist/build/utils.d.ts","./node_modules/next/dist/build/rendering-mode.d.ts","./node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","./node_modules/next/dist/server/lib/cpu-profile.d.ts","./node_modules/next/dist/build/turborepo-access-trace/types.d.ts","./node_modules/next/dist/build/turborepo-access-trace/result.d.ts","./node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","./node_modules/next/dist/build/turborepo-access-trace/index.d.ts","./node_modules/next/dist/export/routes/types.d.ts","./node_modules/next/dist/export/types.d.ts","./node_modules/next/dist/export/worker.d.ts","./node_modules/next/dist/build/worker.d.ts","./node_modules/next/dist/build/index.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/env/dist/index.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/build/build-context.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/swc/generated-native.d.ts","./node_modules/next/dist/build/define-env.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/build/swc/types.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/next-devtools/shared/types.d.ts","./node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/cache-indicator.d.ts","./node_modules/next/dist/server/lib/parse-stack.d.ts","./node_modules/next/dist/next-devtools/server/shared.d.ts","./node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","./node_modules/next/dist/server/dev/debug-channel.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.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/build/segment-config/middleware/middleware-config.d.ts","./node_modules/next/dist/server/web/types.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/lib/async-callback-set.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/sharp/lib/index.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/lru-cache.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/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/router-utils/router-server-context.d.ts","./node_modules/next/dist/server/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/server/web/adapter.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/client/components/error-boundary.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/client-page.d.ts","./node_modules/next/dist/client/components/client-segment.d.ts","./node_modules/next/dist/client/components/http-access-fallback/error-boundary.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/dist/lib/metadata/types/resolvers.d.ts","./node_modules/next/dist/lib/metadata/types/icons.d.ts","./node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","./node_modules/next/dist/lib/metadata/metadata.d.ts","./node_modules/next/dist/lib/framework/boundary-components.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/collect-segment-data.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation.d.ts","./node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.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/route-modules/app-page/helpers/prerender-manifest-matcher.d.ts","./node_modules/@types/react/jsx-dev-runtime.d.ts","./node_modules/@types/react/compiler-runtime.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","./node_modules/@types/react-dom/client.d.ts","./node_modules/@types/react-dom/static.d.ts","./node_modules/@types/react-dom/server.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/request/fallback-params.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/server/web/spec-extension/url-pattern.d.ts","./node_modules/next/dist/server/after/index.d.ts","./node_modules/next/dist/server/request/connection.d.ts","./node_modules/next/dist/server/web/exports/index.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/cli/next-test.d.ts","./node_modules/next/dist/shared/lib/size-limit.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/build/adapter/build-complete.d.ts","./node_modules/next/dist/types.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.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/dist/server/use-cache/cache-tag.d.ts","./node_modules/next/cache.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/dist/client/components/catch-error.d.ts","./node_modules/next/dist/api/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/server/request/cookies.d.ts","./node_modules/next/dist/server/request/headers.d.ts","./node_modules/next/dist/server/request/draft-mode.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/unrecognized-action-error.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/forbidden.d.ts","./node_modules/next/dist/client/components/unauthorized.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.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/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/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/types.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./.next/types/routes.d.ts","./next-env.d.ts","./storybook.shims.d.ts","./node_modules/vite/types/hmrPayload.d.ts","./node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts","./node_modules/vite/types/customEvent.d.ts","./node_modules/rolldown/dist/shared/logging-C6h4g8dA.d.mts","./node_modules/@oxc-project/types/types.d.ts","./node_modules/rolldown/dist/shared/binding-zH1vcmbM.d.mts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/filter/composable-filters.d.ts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/filter/filter-vite-plugins.d.ts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/filter/simple-filters.d.ts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/filter/index.d.ts","./node_modules/rolldown/node_modules/@rolldown/pluginutils/dist/index.d.ts","./node_modules/rolldown/dist/shared/define-config-5HJ1b9vG.d.mts","./node_modules/rolldown/dist/index.d.mts","./node_modules/rolldown/dist/parse-ast-index.d.mts","./node_modules/vite/types/internal/rollupTypeCompat.d.ts","./node_modules/rolldown/dist/shared/constructors-D0W3rNfA.d.mts","./node_modules/rolldown/dist/plugins-index.d.mts","./node_modules/rolldown/dist/shared/transform-DgZ3paSD.d.mts","./node_modules/rolldown/dist/utils-index.d.mts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/esbuildOptions.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/types/internal/terserOptions.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/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssOptions.d.ts","./node_modules/vite/types/internal/cssPreprocessorOptions.d.ts","./node_modules/rolldown/dist/filter-index.d.mts","./node_modules/vite/types/importGlob.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/@vitest/utils/dist/display.d.ts","./node_modules/@vitest/utils/dist/types.d.ts","./node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/@vitest/utils/dist/timers.d.ts","./node_modules/@vitest/utils/dist/index.d.ts","./node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","./node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/@vitest/runner/dist/tasks.d-Bh0IjN67.d.ts","./node_modules/@vitest/runner/dist/index.d.ts","./node_modules/vitest/dist/chunks/traces.d.D2T_R8rx.d.ts","./node_modules/@vitest/snapshot/dist/environment.d-DOJxxZV9.d.ts","./node_modules/@vitest/snapshot/dist/rawSnapshot.d-D_X3-62x.d.ts","./node_modules/@vitest/snapshot/dist/index.d.ts","./node_modules/vitest/dist/chunks/config.d.A1h_Y6Jt.d.ts","./node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts","./node_modules/vitest/dist/chunks/rpc.d.B_8sPU0w.d.ts","./node_modules/vitest/dist/chunks/worker.d.ZpHpO4yb.d.ts","./node_modules/vitest/dist/chunks/browser.d.BcoexmFG.d.ts","./node_modules/@vitest/spy/optional-types.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/tinyrainbow/dist/index.d.ts","./node_modules/@standard-schema/spec/dist/index.d.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/vitest/optional-types.d.ts","./node_modules/@vitest/runner/dist/utils.d.ts","./node_modules/tinybench/dist/index.d.ts","./node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts","./node_modules/@vitest/mocker/dist/types.d-BjI5eAwu.d.ts","./node_modules/@vitest/mocker/dist/index.d-B41z0AuW.d.ts","./node_modules/@vitest/mocker/dist/index.d.ts","./node_modules/@vitest/utils/dist/source-map.d.ts","./node_modules/vitest/dist/chunks/global.d.DVsSRdQ5.d.ts","./node_modules/vitest/optional-runtime-types.d.ts","./node_modules/vitest/dist/chunks/suite.d.udJtyAgw.d.ts","./node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts","./node_modules/vitest/dist/runners.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./node_modules/vitest/dist/chunks/coverage.d.BZtK59WP.d.ts","./node_modules/@vitest/utils/dist/serialize.d.ts","./node_modules/@vitest/utils/dist/error.d.ts","./node_modules/vitest/dist/browser.d.ts","./node_modules/@vitest/browser/aria-role.d.ts","./node_modules/@vitest/browser/jest-dom.d.ts","./node_modules/@vitest/browser/matchers.d.ts","./node_modules/@vitest/browser/context.d.ts","./node_modules/@vitest/browser-playwright/context.d.ts","./node_modules/vitest/browser/context.d.ts","./node_modules/@vitest/snapshot/dist/manager.d.ts","./node_modules/vitest/dist/chunks/reporters.d.CEnv6XRv.d.ts","./node_modules/vitest/dist/chunks/plugin.d.BM2TCi12.d.ts","./node_modules/vitest/dist/coverage.d.ts","./node_modules/obug/dist/core.d.ts","./node_modules/obug/dist/node.d.ts","./node_modules/vitest/dist/node.d.ts","./node_modules/@vitest/browser/dist/index.d.ts","./node_modules/playwright-core/types/protocol.d.ts","./node_modules/playwright-core/types/structs.d.ts","./node_modules/zod/v4/core/json-schema.d.cts","./node_modules/zod/v4/core/standard-schema.d.cts","./node_modules/zod/v4/core/registries.d.cts","./node_modules/zod/v4/core/to-json-schema.d.cts","./node_modules/zod/v4/core/util.d.cts","./node_modules/zod/v4/core/versions.d.cts","./node_modules/zod/v4/core/schemas.d.cts","./node_modules/zod/v4/core/checks.d.cts","./node_modules/zod/v4/core/errors.d.cts","./node_modules/zod/v4/core/core.d.cts","./node_modules/zod/v4/core/parse.d.cts","./node_modules/zod/v4/core/regexes.d.cts","./node_modules/zod/v4/locales/ar.d.cts","./node_modules/zod/v4/locales/az.d.cts","./node_modules/zod/v4/locales/be.d.cts","./node_modules/zod/v4/locales/bg.d.cts","./node_modules/zod/v4/locales/ca.d.cts","./node_modules/zod/v4/locales/cs.d.cts","./node_modules/zod/v4/locales/da.d.cts","./node_modules/zod/v4/locales/de.d.cts","./node_modules/zod/v4/locales/en.d.cts","./node_modules/zod/v4/locales/eo.d.cts","./node_modules/zod/v4/locales/es.d.cts","./node_modules/zod/v4/locales/fa.d.cts","./node_modules/zod/v4/locales/fi.d.cts","./node_modules/zod/v4/locales/fr.d.cts","./node_modules/zod/v4/locales/fr-CA.d.cts","./node_modules/zod/v4/locales/he.d.cts","./node_modules/zod/v4/locales/hu.d.cts","./node_modules/zod/v4/locales/hy.d.cts","./node_modules/zod/v4/locales/id.d.cts","./node_modules/zod/v4/locales/is.d.cts","./node_modules/zod/v4/locales/it.d.cts","./node_modules/zod/v4/locales/ja.d.cts","./node_modules/zod/v4/locales/ka.d.cts","./node_modules/zod/v4/locales/kh.d.cts","./node_modules/zod/v4/locales/km.d.cts","./node_modules/zod/v4/locales/ko.d.cts","./node_modules/zod/v4/locales/lt.d.cts","./node_modules/zod/v4/locales/mk.d.cts","./node_modules/zod/v4/locales/ms.d.cts","./node_modules/zod/v4/locales/nl.d.cts","./node_modules/zod/v4/locales/no.d.cts","./node_modules/zod/v4/locales/ota.d.cts","./node_modules/zod/v4/locales/ps.d.cts","./node_modules/zod/v4/locales/pl.d.cts","./node_modules/zod/v4/locales/pt.d.cts","./node_modules/zod/v4/locales/ru.d.cts","./node_modules/zod/v4/locales/sl.d.cts","./node_modules/zod/v4/locales/sv.d.cts","./node_modules/zod/v4/locales/ta.d.cts","./node_modules/zod/v4/locales/th.d.cts","./node_modules/zod/v4/locales/tr.d.cts","./node_modules/zod/v4/locales/ua.d.cts","./node_modules/zod/v4/locales/uk.d.cts","./node_modules/zod/v4/locales/ur.d.cts","./node_modules/zod/v4/locales/uz.d.cts","./node_modules/zod/v4/locales/vi.d.cts","./node_modules/zod/v4/locales/zh-CN.d.cts","./node_modules/zod/v4/locales/zh-TW.d.cts","./node_modules/zod/v4/locales/yo.d.cts","./node_modules/zod/v4/locales/index.d.cts","./node_modules/zod/v4/core/doc.d.cts","./node_modules/zod/v4/core/api.d.cts","./node_modules/zod/v4/core/json-schema-processors.d.cts","./node_modules/zod/v4/core/json-schema-generator.d.cts","./node_modules/zod/v4/core/index.d.cts","./node_modules/zod/v4/classic/errors.d.cts","./node_modules/zod/v4/classic/parse.d.cts","./node_modules/zod/v4/classic/schemas.d.cts","./node_modules/zod/v4/classic/checks.d.cts","./node_modules/zod/v4/classic/compat.d.cts","./node_modules/zod/v4/classic/from-json-schema.d.cts","./node_modules/zod/v4/classic/iso.d.cts","./node_modules/zod/v4/classic/coerce.d.cts","./node_modules/zod/v4/classic/external.d.cts","./node_modules/zod/index.d.cts","./node_modules/zod/v3/helpers/typeAliases.d.cts","./node_modules/zod/v3/helpers/util.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/v3/index.d.cts","./node_modules/playwright-core/types/types.d.ts","./node_modules/playwright-core/index.d.ts","./node_modules/playwright/index.d.ts","./node_modules/@vitest/browser-playwright/dist/index.d.ts","./vitest.shims.d.ts","./next.config.ts","./node_modules/vitest/dist/config.d.ts","./node_modules/vitest/config.d.ts","./node_modules/@storybook/addon-vitest/dist/vitest-plugin/index.d.ts","./node_modules/@vitejs/plugin-react/types/optionalTypes.d.ts","./node_modules/@vitejs/plugin-react/dist/index.d.ts","./vitest.config.ts","./node_modules/@types/aria-query/index.d.ts","./node_modules/@testing-library/jest-dom/types/matchers.d.ts","./node_modules/@testing-library/jest-dom/types/jest.d.ts","./node_modules/@testing-library/jest-dom/types/index.d.ts","./node_modules/@testing-library/dom/types/matches.d.ts","./node_modules/@testing-library/dom/types/wait-for.d.ts","./node_modules/@testing-library/dom/types/query-helpers.d.ts","./node_modules/@testing-library/dom/types/queries.d.ts","./node_modules/@testing-library/dom/types/get-queries-for-element.d.ts","./node_modules/pretty-format/build/types.d.ts","./node_modules/pretty-format/build/index.d.ts","./node_modules/@testing-library/dom/types/screen.d.ts","./node_modules/@testing-library/dom/types/wait-for-element-to-be-removed.d.ts","./node_modules/@testing-library/dom/types/get-node-text.d.ts","./node_modules/@testing-library/dom/types/events.d.ts","./node_modules/@testing-library/dom/types/pretty-dom.d.ts","./node_modules/@testing-library/dom/types/role-helpers.d.ts","./node_modules/@testing-library/dom/types/config.d.ts","./node_modules/@testing-library/dom/types/suggestions.d.ts","./node_modules/@testing-library/dom/types/index.d.ts","./node_modules/@types/react-dom/test-utils/index.d.ts","./node_modules/@testing-library/react/types/index.d.ts","./vitest.setup.ts","./node_modules/next-auth/adapters.d.ts","./node_modules/jose/dist/types/types.d.ts","./node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/verify.d.ts","./node_modules/jose/dist/types/jws/flattened/verify.d.ts","./node_modules/jose/dist/types/jws/general/verify.d.ts","./node_modules/jose/dist/types/jwt/verify.d.ts","./node_modules/jose/dist/types/jwt/decrypt.d.ts","./node_modules/jose/dist/types/jwt/produce.d.ts","./node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/sign.d.ts","./node_modules/jose/dist/types/jws/flattened/sign.d.ts","./node_modules/jose/dist/types/jws/general/sign.d.ts","./node_modules/jose/dist/types/jwt/sign.d.ts","./node_modules/jose/dist/types/jwt/encrypt.d.ts","./node_modules/jose/dist/types/jwk/thumbprint.d.ts","./node_modules/jose/dist/types/jwk/embedded.d.ts","./node_modules/jose/dist/types/jwks/local.d.ts","./node_modules/jose/dist/types/jwks/remote.d.ts","./node_modules/jose/dist/types/jwt/unsecured.d.ts","./node_modules/jose/dist/types/key/export.d.ts","./node_modules/jose/dist/types/key/import.d.ts","./node_modules/jose/dist/types/util/decode_protected_header.d.ts","./node_modules/jose/dist/types/util/decode_jwt.d.ts","./node_modules/jose/dist/types/util/errors.d.ts","./node_modules/jose/dist/types/key/generate_key_pair.d.ts","./node_modules/jose/dist/types/key/generate_secret.d.ts","./node_modules/jose/dist/types/util/base64url.d.ts","./node_modules/jose/dist/types/util/runtime.d.ts","./node_modules/jose/dist/types/index.d.ts","./node_modules/openid-client/types/index.d.ts","./node_modules/next-auth/providers/oauth-types.d.ts","./node_modules/next-auth/providers/oauth.d.ts","./node_modules/next-auth/providers/email.d.ts","./node_modules/next-auth/core/lib/cookie.d.ts","./node_modules/next-auth/core/index.d.ts","./node_modules/next-auth/providers/credentials.d.ts","./node_modules/next-auth/providers/index.d.ts","./node_modules/next-auth/jwt/types.d.ts","./node_modules/next-auth/jwt/index.d.ts","./node_modules/next-auth/utils/logger.d.ts","./node_modules/next-auth/core/types.d.ts","./node_modules/next-auth/next/index.d.ts","./node_modules/next-auth/index.d.ts","./node_modules/next-auth/providers/github.d.ts","./node_modules/next-auth/providers/google.d.ts","./src/lib/auth.ts","./src/app/api/auth/[...nextauth]/route.ts","./src/app/api/auth/[...nextauth]/route.test.ts","./src/lib/types.ts","./src/lib/api.ts","./src/app/api/content-skills/route.ts","./src/app/api/content-skills/route.test.ts","./src/app/api/entities/route.ts","./src/app/api/entities/route.test.ts","./src/app/api/entities/[id]/route.ts","./src/app/api/entities/[id]/route.test.ts","./src/app/api/entity-candidates/[id]/route.ts","./src/app/api/entity-candidates/[id]/route.test.ts","./src/app/api/feedback/route.ts","./src/app/api/feedback/route.test.ts","./src/app/api/invitations/[token]/accept/route.ts","./src/app/api/invitations/[token]/accept/route.test.ts","./src/app/api/profile/route.ts","./src/app/api/profile/route.test.ts","./src/app/api/profile/avatar/route.ts","./src/app/api/profile/avatar/route.test.ts","./src/app/api/projects/route.ts","./src/app/api/projects/route.test.ts","./src/app/api/projects/[id]/draft-action-helpers.ts","./src/app/api/projects/[id]/trend-action-helpers.ts","./src/app/api/projects/[id]/authority-settings/route.ts","./src/app/api/projects/[id]/authority-settings/route.test.ts","./src/app/api/projects/[id]/bluesky-credentials/route.ts","./src/app/api/projects/[id]/bluesky-credentials/route.test.ts","./src/app/api/projects/[id]/draft-items/[itemId]/route.ts","./src/app/api/projects/[id]/draft-items/[itemId]/route.test.ts","./src/app/api/projects/[id]/draft-original-pieces/[pieceId]/route.ts","./src/app/api/projects/[id]/draft-original-pieces/[pieceId]/route.test.ts","./src/app/api/projects/[id]/draft-sections/[sectionId]/route.ts","./src/app/api/projects/[id]/draft-sections/[sectionId]/route.test.ts","./src/app/api/projects/[id]/drafts/[draftId]/route.ts","./src/app/api/projects/[id]/drafts/[draftId]/route.test.ts","./src/app/api/projects/[id]/drafts/[draftId]/regenerate-section/route.ts","./src/app/api/projects/[id]/drafts/[draftId]/regenerate-section/route.test.ts","./src/app/api/projects/[id]/drafts/generate/route.ts","./src/app/api/projects/[id]/drafts/generate/route.test.ts","./src/app/api/projects/[id]/entity-candidate-bulk/route.ts","./src/app/api/projects/[id]/entity-candidate-bulk/route.test.ts","./src/app/api/projects/[id]/ideas/generate/route.ts","./src/app/api/projects/[id]/ideas/route.test.ts","./src/app/api/projects/[id]/ideas/[ideaId]/accept/route.ts","./src/app/api/projects/[id]/ideas/[ideaId]/dismiss/route.ts","./src/app/api/projects/[id]/ideas/[ideaId]/mark-written/route.ts","./src/app/api/projects/[id]/ideas/[ideaId]/route.test.ts","./src/app/api/projects/[id]/intake/route.ts","./src/app/api/projects/[id]/intake/route.test.ts","./src/app/api/projects/[id]/intake-allowlist/route.ts","./src/app/api/projects/[id]/intake-allowlist/route.test.ts","./src/app/api/projects/[id]/intake-allowlist/[allowlistId]/route.ts","./src/app/api/projects/[id]/intake-allowlist/[allowlistId]/route.test.ts","./src/app/api/projects/[id]/invitations/route.ts","./src/app/api/projects/[id]/invitations/route.test.ts","./src/app/api/projects/[id]/invitations/[invitationId]/revoke/route.ts","./src/app/api/projects/[id]/invitations/[invitationId]/revoke/route.test.ts","./src/app/api/projects/[id]/linkedin-oauth/start/route.ts","./src/app/api/projects/[id]/linkedin-oauth/start/route.test.ts","./src/app/api/projects/[id]/linkedin-source-configs/route.ts","./src/app/api/projects/[id]/linkedin-source-configs/route.test.ts","./src/app/api/projects/[id]/mastodon-credentials/route.ts","./src/app/api/projects/[id]/mastodon-credentials/route.test.ts","./src/app/api/projects/[id]/members/[membershipId]/route.ts","./src/app/api/projects/[id]/members/[membershipId]/route.test.ts","./src/app/api/projects/[id]/rotate-intake-token/route.ts","./src/app/api/projects/[id]/rotate-intake-token/route.test.ts","./src/app/api/projects/[id]/themes/[themeId]/accept/route.ts","./src/app/api/projects/[id]/themes/[themeId]/dismiss/route.ts","./src/app/api/projects/[id]/themes/[themeId]/route.test.ts","./src/app/api/projects/[id]/verify-bluesky-credentials/route.ts","./src/app/api/projects/[id]/verify-bluesky-credentials/route.test.ts","./src/app/api/projects/[id]/verify-linkedin-credentials/route.ts","./src/app/api/projects/[id]/verify-linkedin-credentials/route.test.ts","./src/app/api/projects/[id]/verify-mastodon-credentials/route.ts","./src/app/api/projects/[id]/verify-mastodon-credentials/route.test.ts","./src/app/api/review/[id]/route.ts","./src/app/api/review/[id]/route.test.ts","./src/app/api/skills/[skillName]/route.ts","./src/app/api/skills/[skillName]/route.test.ts","./src/app/api/source-configs/route.ts","./src/app/api/source-configs/route.test.ts","./src/app/api/source-configs/[id]/route.ts","./src/app/api/source-configs/[id]/route.test.ts","./node_modules/@tanstack/query-core/build/modern/_tsup-dts-rollup.d.ts","./node_modules/@tanstack/query-core/build/modern/index.d.ts","./node_modules/@tanstack/react-query/build/modern/_tsup-dts-rollup.d.ts","./node_modules/@tanstack/react-query/build/modern/index.d.ts","./src/app/content/[id]/_components/SkillActionBar/SkillActionBar.tsx","./src/app/content/[id]/_components/SkillActionBar/index.ts","./node_modules/next-auth/client/_utils.d.ts","./node_modules/next-auth/react/types.d.ts","./node_modules/next-auth/react/index.d.ts","./src/app/login/_components/SocialAuthButtons/SocialAuthButtons.tsx","./src/app/login/_components/SocialAuthButtons/index.ts","./src/app/login/_components/LoginForm/LoginForm.tsx","./src/app/login/_components/LoginForm/index.ts","./node_modules/file-selector/dist/file.d.ts","./node_modules/file-selector/dist/file-selector.d.ts","./node_modules/file-selector/dist/index.d.ts","./node_modules/react-dropzone/typings/react-dropzone.d.ts","./src/app/profile/_components/AvatarDropzone/AvatarDropzone.tsx","./src/app/profile/_components/AvatarDropzone/index.ts","./src/app/profile/_components/AvatarPreview/AvatarPreview.tsx","./src/app/profile/_components/AvatarPreview/index.ts","./src/app/profile/_components/ProfileForm/ProfileForm.tsx","./src/app/profile/_components/ProfileForm/index.ts","./src/lib/profile.ts","./src/app/profile/_components/ProfileSettingsPanel/ProfileSettingsPanel.tsx","./src/app/profile/_components/ProfileSettingsPanel/index.ts","./src/lib/view-helpers.ts","./src/lib/dashboard-view.ts","./src/lib/storybook-fixtures.ts","./src/lib/useRole.ts","./node_modules/clsx/clsx.d.mts","./node_modules/tailwind-merge/dist/types.d.ts","./src/lib/utils.ts","./src/lib/__tests__/api.test.ts","./src/lib/__tests__/auth.test.ts","./src/lib/__tests__/dashboard-view.test.ts","./src/lib/__tests__/view-helpers.test.ts","./test-support/server-only.ts","./node_modules/next/dist/compiled/@next/font/dist/types.d.ts","./node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","./node_modules/next/font/google/index.d.ts","./src/providers/QueryProvider/index.tsx","./node_modules/next-themes/dist/index.d.ts","./src/providers/ThemeProvider/index.tsx","./src/app/layout.tsx","./src/components/elements/StatusBadge/index.tsx","./src/components/elements/ThemeToggle/index.tsx","./src/components/layout/UserMenu/index.tsx","./src/components/layout/AppShell/index.tsx","./src/app/page.tsx","./src/app/__tests__/page.test.tsx","./node_modules/storybook/dist/router/index.d.ts","./node_modules/storybook/dist/theming/index.d.ts","./node_modules/storybook/dist/channels/index.d.ts","./node_modules/storybook/dist/preview-api/index.d.ts","./node_modules/storybook/dist/core-events/index.d.ts","./node_modules/ast-types/lib/gen/namedTypes.d.ts","./node_modules/ast-types/lib/gen/kinds.d.ts","./node_modules/ast-types/lib/gen/builders.d.ts","./node_modules/ast-types/lib/types.d.ts","./node_modules/ast-types/lib/path.d.ts","./node_modules/ast-types/lib/scope.d.ts","./node_modules/ast-types/lib/node-path.d.ts","./node_modules/ast-types/lib/path-visitor.d.ts","./node_modules/ast-types/lib/gen/visitor.d.ts","./node_modules/ast-types/lib/main.d.ts","./node_modules/recast/lib/options.d.ts","./node_modules/recast/lib/parser.d.ts","./node_modules/recast/lib/printer.d.ts","./node_modules/recast/main.d.ts","./node_modules/storybook/dist/babel/index.d.ts","./node_modules/storybook/dist/csf-tools/index.d.ts","./node_modules/@webcontainer/env/dist/environment.d.ts","./node_modules/@webcontainer/env/dist/url.d.ts","./node_modules/@webcontainer/env/dist/index.d.ts","./node_modules/storybook/dist/common/index.d.ts","./node_modules/storybook/dist/telemetry/index.d.ts","./node_modules/storybook/dist/core-server/index.d.ts","./node_modules/storybook/dist/node-logger/index.d.ts","./node_modules/storybook/dist/types/index.d.ts","./node_modules/storybook/dist/csf/index.d.ts","./node_modules/@storybook/react/dist/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@rollup/pluginutils/types/index.d.ts","./node_modules/vite-plugin-storybook-nextjs/dist/index.d.ts","./node_modules/@storybook/builder-vite/dist/index.d.ts","./node_modules/typescript/lib/typescript.d.ts","./node_modules/react-docgen-typescript/lib/parser.d.ts","./node_modules/react-docgen-typescript/lib/index.d.ts","./node_modules/@joshwooding/vite-plugin-react-docgen-typescript/dist/index.d.ts","./node_modules/@storybook/react-vite/dist/index.d.ts","./node_modules/@storybook/nextjs-vite/dist/index.d.ts","./src/app/admin/health/_components/SourceDiversityPanel/index.tsx","./node_modules/storybook/dist/manager-api/index.d.ts","./node_modules/storybook/dist/components/index.d.ts","./node_modules/storybook/dist/docs-tools/index.d.ts","./node_modules/@storybook/addon-docs/dist/blocks.d.ts","./src/lib/storybook-docs.tsx","./src/app/admin/health/page.stories.tsx","./src/app/admin/health/page.tsx","./src/app/admin/health/page.test.tsx","./src/app/admin/health/_components/SourceDiversityPanel/index.stories.tsx","./src/app/admin/projects/new/page.tsx","./node_modules/lucide-react/dist/lucide-react.d.ts","./node_modules/@base-ui/react/esm/internals/reason-parts.d.ts","./node_modules/@base-ui/react/esm/internals/reasons.d.ts","./node_modules/@base-ui/react/esm/internals/createBaseUIEventDetails.d.ts","./node_modules/@base-ui/react/esm/types/index.d.ts","./node_modules/@base-ui/react/esm/internals/types.d.ts","./node_modules/@base-ui/react/esm/button/Button.d.ts","./node_modules/@base-ui/react/esm/button/index.d.ts","./node_modules/class-variance-authority/dist/types.d.ts","./node_modules/class-variance-authority/dist/index.d.ts","./src/components/ui/button.tsx","./src/components/elements/CopyButton/index.tsx","./src/app/admin/sources/page.tsx","./src/app/admin/sources/page.test.tsx","./src/app/content/[id]/page.tsx","./src/app/content/[id]/page.test.tsx","./src/app/content/[id]/_components/SkillActionBar/SkillActionBar.test.tsx","./src/app/drafts/page.tsx","./src/app/drafts/page.test.tsx","./src/app/drafts/[draftId]/_components/DraftEditor/index.tsx","./src/app/drafts/[draftId]/page.tsx","./src/app/drafts/[draftId]/page.test.tsx","./src/app/drafts/[draftId]/_components/DraftEditor/index.test.tsx","./src/app/entities/page.tsx","./src/app/entities/page.test.tsx","./src/app/entities/[id]/_components/AuthorityWeightControls/index.tsx","./src/app/entities/[id]/page.tsx","./src/app/entities/[id]/page.test.tsx","./src/app/entities/[id]/_components/AuthorityWeightControls/index.test.tsx","./src/app/entities/candidates/page.tsx","./src/app/entities/candidates/page.test.tsx","./src/app/ideas/_components/OriginalContentIdeaCard/index.tsx","./src/app/ideas/page.stories.tsx","./src/app/ideas/page.tsx","./src/app/ideas/page.test.tsx","./src/app/ideas/_components/OriginalContentIdeaCard/index.stories.tsx","./src/app/invite/[token]/page.tsx","./src/app/login/page.tsx","./src/app/login/page.test.tsx","./src/app/login/_components/LoginForm/LoginForm.test.tsx","./src/app/login/_components/SocialAuthButtons/SocialAuthButtons.test.tsx","./src/app/profile/page.tsx","./src/app/profile/_components/AvatarDropzone/AvatarDropzone.test.tsx","./src/app/projects/[id]/members/page.tsx","./src/app/projects/[id]/members/invite/page.tsx","./src/app/themes/_components/ThemeSuggestionCard/index.tsx","./src/app/themes/page.stories.tsx","./src/app/themes/page.tsx","./src/app/themes/page.test.tsx","./src/app/themes/_components/ThemeSuggestionCard/index.stories.tsx","./src/app/trends/_components/TopicClusterCard/index.tsx","./src/app/trends/page.stories.tsx","./src/app/trends/page.tsx","./src/app/trends/page.test.tsx","./src/app/trends/_components/TopicClusterCard/index.stories.tsx","./src/components/elements/CopyButton/index.stories.tsx","./src/components/elements/CopyButton/index.test.tsx","./src/components/elements/StatusBadge/index.stories.tsx","./src/components/elements/StatusBadge/index.test.tsx","./src/components/elements/ThemeToggle/index.stories.tsx","./src/components/layout/AppShell/index.stories.tsx","./src/components/layout/AppShell/index.test.tsx","./node_modules/@testing-library/jest-dom/types/matchers-standalone.d.ts","./node_modules/storybook/node_modules/@vitest/spy/dist/index.d.ts","./node_modules/storybook/node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/types.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/storybook/node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","./node_modules/storybook/node_modules/tinyrainbow/dist/node.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/index.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","./node_modules/storybook/node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/storybook/node_modules/@vitest/expect/dist/index.d.ts","./node_modules/@testing-library/user-event/dist/types/event/eventMap.d.ts","./node_modules/@testing-library/user-event/dist/types/event/types.d.ts","./node_modules/@testing-library/user-event/dist/types/event/dispatchEvent.d.ts","./node_modules/@testing-library/user-event/dist/types/event/focus.d.ts","./node_modules/@testing-library/user-event/dist/types/event/input.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/click/isClickableInput.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/dataTransfer/Blob.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/dataTransfer/DataTransfer.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/dataTransfer/FileList.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/dataTransfer/Clipboard.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/timeValue.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/isContentEditable.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/isEditable.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/maxLength.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/edit/setFiles.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/cursor.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/getActiveElement.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/getTabDestination.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/isFocusable.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/selection.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/focus/selector.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/keyDef/readNextDescriptor.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/cloneEvent.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/findClosest.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/getDocumentFromNode.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/getTreeDiff.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/getWindow.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/isDescendantOrSelf.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/isElementType.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/isVisible.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/isDisabled.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/level.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/misc/wait.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/pointer/cssPointerEvents.d.ts","./node_modules/@testing-library/user-event/dist/types/utils/index.d.ts","./node_modules/@testing-library/user-event/dist/types/document/UI.d.ts","./node_modules/@testing-library/user-event/dist/types/document/getValueOrTextContent.d.ts","./node_modules/@testing-library/user-event/dist/types/document/copySelection.d.ts","./node_modules/@testing-library/user-event/dist/types/document/trackValue.d.ts","./node_modules/@testing-library/user-event/dist/types/document/index.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/getInputRange.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/modifySelection.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/moveSelection.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/setSelectionPerMouse.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/modifySelectionPerMouse.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/selectAll.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/setSelectionRange.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/setSelection.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/updateSelectionOnFocus.d.ts","./node_modules/@testing-library/user-event/dist/types/event/selection/index.d.ts","./node_modules/@testing-library/user-event/dist/types/event/index.d.ts","./node_modules/@testing-library/user-event/dist/types/system/pointer/buttons.d.ts","./node_modules/@testing-library/user-event/dist/types/system/pointer/shared.d.ts","./node_modules/@testing-library/user-event/dist/types/system/pointer/index.d.ts","./node_modules/@testing-library/user-event/dist/types/system/index.d.ts","./node_modules/@testing-library/user-event/dist/types/system/keyboard.d.ts","./node_modules/@testing-library/user-event/dist/types/options.d.ts","./node_modules/@testing-library/user-event/dist/types/convenience/click.d.ts","./node_modules/@testing-library/user-event/dist/types/convenience/hover.d.ts","./node_modules/@testing-library/user-event/dist/types/convenience/tab.d.ts","./node_modules/@testing-library/user-event/dist/types/convenience/index.d.ts","./node_modules/@testing-library/user-event/dist/types/keyboard/index.d.ts","./node_modules/@testing-library/user-event/dist/types/clipboard/copy.d.ts","./node_modules/@testing-library/user-event/dist/types/clipboard/cut.d.ts","./node_modules/@testing-library/user-event/dist/types/clipboard/paste.d.ts","./node_modules/@testing-library/user-event/dist/types/clipboard/index.d.ts","./node_modules/@testing-library/user-event/dist/types/pointer/index.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/clear.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/selectOptions.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/type.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/upload.d.ts","./node_modules/@testing-library/user-event/dist/types/utility/index.d.ts","./node_modules/@testing-library/user-event/dist/types/setup/api.d.ts","./node_modules/@testing-library/user-event/dist/types/setup/directApi.d.ts","./node_modules/@testing-library/user-event/dist/types/setup/setup.d.ts","./node_modules/@testing-library/user-event/dist/types/setup/index.d.ts","./node_modules/@testing-library/user-event/dist/types/index.d.ts","./node_modules/storybook/dist/test/index.d.ts","./src/components/layout/UserMenu/index.stories.tsx","./src/components/layout/UserMenu/index.test.tsx","./src/lib/__tests__/useRole.test.tsx","./src/providers/QueryProvider/index.test.tsx","./src/providers/ThemeProvider/index.test.tsx","./.next/types/cache-life.d.ts","./.next/types/validator.ts","./.next/dev/types/cache-life.d.ts","./.next/dev/types/routes.d.ts","./.next/dev/types/validator.ts","./node_modules/vitest/globals.d.ts"],"fileIdsList":[[101,164,172,176,179,181,182,183,195,512,513,514,515,554,561,1201],[101,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,255,553,554,556,561,857,861,863,865,867,869,871,873,875,877,881,883,885,887,889,891,893,895,897,899,901,902,903,905,907,909,911,913,915,917,919,921,923,925,926,928,930,932,934,936,938,940,986,991,1041,1044,1057,1059,1062,1065,1068,1071,1074,1078,1081,1082,1086,1088,1089,1092,1097,1201,1203,1204],[101,164,172,176,179,181,182,183,195,512,513,514,515,554,561,1203],[101,164,172,176,179,181,182,183,195,255,553,554,556,559,561,857,861,863,865,867,869,871,873,875,877,883,899,901,902,903,905,907,909,911,913,915,919,921,923,925,926,928,930,932,934,936,938,940,986,991,1041,1044,1057,1059,1068,1071,1078,1081,1082,1086,1088,1089,1092,1097,1201,1203],[101,164,172,176,179,181,182,183,195,554,557,558,559,561,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,557,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,1050,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1051,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1047,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1046,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,1049,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,1048,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,614,777,1028,1030,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1024,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,994,995,996,1021,1022,1036,1037,1195,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,778,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,614,777,1021,1201,1203],[101,164,172,176,179,181,182,183,195,547,554,561,1021,1022,1023,1026,1027,1032,1195,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1021,1023,1027,1031,1201,1203],[92,101,164,172,176,179,181,182,183,195,225,488,554,561,1021,1022,1195,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,942,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,943,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,944,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,790,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,787,788,789,790,791,794,795,796,797,798,799,800,801,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,783,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,793,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,787,788,789,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,787,788,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,790,791,793,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,788,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,785,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,784,1201,1203],[92,101,164,172,176,179,181,182,183,195,225,488,554,561,802,803,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1193,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1180,1181,1182,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1175,1176,1177,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1153,1154,1155,1156,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1119,1193,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1119,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1119,1120,1121,1122,1167,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1157,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1152,1158,1159,1160,1161,1162,1163,1164,1165,1166,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1167,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1118,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1171,1173,1174,1192,1193,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1171,1173,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1168,1171,1193,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1178,1179,1183,1184,1189,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1172,1174,1184,1192,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1191,1192,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1168,1172,1174,1190,1191,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1172,1193,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1170,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1170,1172,1193,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1168,1169,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1185,1186,1187,1188,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1174,1193,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1129,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1123,1130,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1149,1193,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,638,639,1201,1203],[101,161,162,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,163,164,172,176,179,181,182,183,195,554,561,1201,1203],[164,172,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,203,554,561,1201,1203],[101,164,165,170,172,175,176,179,181,182,183,185,195,200,212,554,561,1201,1203],[101,164,165,166,172,175,176,179,181,182,183,195,554,561,1201,1203],[101,164,167,172,176,179,181,182,183,195,213,554,561,1201,1203],[101,164,168,169,172,176,179,181,182,183,186,195,554,561,1201,1203],[101,164,169,172,176,179,181,182,183,195,200,209,554,561,1201,1203],[101,164,170,172,175,176,179,181,182,183,185,195,554,561,1201,1203],[101,163,164,171,172,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,173,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,174,175,176,179,181,182,183,195,554,561,1201,1203],[101,163,164,172,175,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,175,176,177,179,181,182,183,195,200,212,554,561,1201,1203],[101,164,172,175,176,177,179,181,182,183,195,200,203,554,561,1201,1203],[101,151,164,172,175,176,178,179,181,182,183,185,195,200,212,554,561,1201,1203],[101,164,172,175,176,178,179,181,182,183,185,195,200,209,212,554,561,1201,1203],[101,164,172,176,178,179,180,181,182,183,195,200,209,212,554,561,1201,1203],[99,100,101,102,103,104,105,106,107,108,109,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,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,554,561,1201,1203],[101,164,172,175,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,176,179,181,183,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,184,195,212,554,561,1201,1203],[101,164,172,175,176,179,181,182,183,185,195,200,554,561,1201,1203],[101,164,172,176,179,181,182,183,186,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,187,195,554,561,1201,1203],[101,164,172,175,176,179,181,182,183,190,195,554,561,1201,1203],[101,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,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,554,561,1201,1203],[101,164,172,176,179,181,182,183,192,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,193,195,554,561,1201,1203],[101,164,169,172,176,179,181,182,183,185,195,203,554,561,1201,1203],[101,164,172,175,176,179,181,182,183,195,196,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,197,213,216,554,561,1201,1203],[101,164,172,175,176,179,181,182,183,195,200,202,203,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,201,203,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,203,213,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,204,554,561,1201,1203],[101,161,164,172,176,179,181,182,183,195,200,206,212,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,200,205,554,561,1201,1203],[101,164,172,175,176,179,181,182,183,195,207,208,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,207,208,554,561,1201,1203],[101,164,169,172,176,179,181,182,183,185,195,200,209,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,210,554,561,1201,1203],[101,164,172,176,179,181,182,183,185,195,211,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,193,195,212,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,213,214,554,561,1201,1203],[101,164,169,172,176,179,181,182,183,195,214,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,200,215,554,561,1201,1203],[101,164,172,176,179,181,182,183,184,195,216,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,217,554,561,1201,1203],[101,164,167,172,176,179,181,182,183,195,554,561,1201,1203],[101,164,169,172,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,213,554,561,1201,1203],[101,151,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,212,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,218,554,561,1201,1203],[101,164,172,176,179,181,182,183,190,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,208,554,561,1201,1203],[101,151,164,172,175,176,177,179,181,182,183,190,195,200,203,212,215,216,218,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,200,219,554,561,1201,1203],[92,96,101,164,172,176,179,181,182,183,195,221,222,223,225,507,552,554,561,1036,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,1201,1203],[92,96,101,164,172,176,179,181,182,183,195,221,222,223,224,488,507,552,554,561,1036,1201,1203],[92,96,101,164,172,176,179,181,182,183,195,221,222,224,225,507,552,554,561,1036,1201,1203],[92,101,164,172,176,179,181,182,183,195,225,488,489,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,225,488,554,561,1201,1203],[92,96,101,164,172,176,179,181,182,183,195,222,223,224,225,507,552,554,561,1036,1201,1203],[92,96,101,164,172,176,179,181,182,183,195,221,223,224,225,507,552,554,561,1036,1201,1203],[90,91,101,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,614,777,780,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,668,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,670,677,678,773,774,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,660,664,665,667,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,668,677,678,774,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,665,668,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,660,666,667,668,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,616,622,635,636,637,640,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,646,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,646,647,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,620,622,623,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,620,622,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,620,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,620,626,627,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,620,626,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,634,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,621,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,617,621,662,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,617,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,616,617,618,619,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1014,1015,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,998,999,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,998,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,999,1001,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,998,1004,1005,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,998,1000,1001,1002,1004,1005,1006,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1001,1002,1003,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1001,1004,1006,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1001,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1001,1004,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,998,1000,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,972,1053,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,972,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,655,656,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,655,656,657,658,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,655,657,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,655,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,955,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,955,956,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,807,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,807,817,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,607,608,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,853,1201,1203],[101,164,172,176,178,179,181,182,183,195,220,554,561,853,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,844,851,1201,1203],[101,164,172,176,179,181,182,183,195,553,554,557,561,851,853,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,806,840,847,849,850,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,845,851,852,1201,1203],[101,164,172,176,179,181,182,183,195,553,554,557,561,848,853,1201,1203],[101,164,172,176,179,181,182,183,195,220,554,561,853,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,845,847,853,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,847,851,853,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,847,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,842,843,846,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,839,840,841,847,853,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,847,853,948,949,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,847,853,1201,1203],[101,164,172,176,179,181,182,183,195,510,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,512,513,514,515,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,458,521,522,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,230,231,233,245,269,384,395,503,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,233,264,265,266,268,503,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,233,401,403,405,406,408,503,505,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,233,267,304,503,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,231,233,244,245,251,257,262,383,384,385,394,503,505,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,503,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,240,246,265,285,380,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,233,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,226,240,246,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,412,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,409,410,412,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,409,411,503,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,285,482,500,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,356,359,375,380,500,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,328,500,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,388,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,387,388,389,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,387,554,561,1201,1203],[98,101,164,172,176,178,179,181,182,183,195,226,233,245,251,257,263,265,269,270,283,284,351,381,382,395,503,507,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,230,233,267,304,401,402,407,503,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,195,267,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,195,230,284,453,503,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,195,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,195,233,267,268,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,195,404,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,195,270,383,386,393,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,458,554,561,1201,1203],[101,164,172,176,179,181,182,183,193,195,240,255,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,240,255,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,325,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,246,255,458,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,240,311,325,326,537,544,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,310,538,539,540,541,543,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,361,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,361,362,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,244,246,313,314,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,246,320,321,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,246,315,323,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,320,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,238,246,313,314,315,316,317,318,319,320,323,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,246,313,320,321,322,324,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,246,314,316,317,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,314,316,319,321,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,542,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,246,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,234,531,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,212,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,267,302,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,267,395,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,300,305,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,301,509,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,980,1201,1203],[92,96,101,164,172,176,178,179,181,182,183,195,221,222,223,224,225,507,551,554,561,1036,1201,1203],[101,164,172,176,178,179,181,182,183,195,246,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,245,250,331,348,390,391,395,450,452,503,504,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,283,392,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,507,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,232,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,237,240,455,471,473,554,561,1201,1203],[101,164,172,176,179,181,182,183,193,195,240,455,470,471,472,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,464,465,466,467,468,469,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,466,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,470,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,255,419,420,422,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,246,413,414,415,416,421,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,419,421,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,417,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,418,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,301,509,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,508,509,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,509,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,348,349,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,349,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,504,509,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,378,554,561,1201,1203],[101,163,164,172,176,179,181,182,183,195,377,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,240,246,252,254,356,369,373,375,452,455,492,493,500,504,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,246,295,317,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,356,367,370,375,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,237,240,356,359,375,378,412,459,460,461,462,463,474,475,476,477,478,479,480,481,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,195,237,240,265,356,363,364,365,368,369,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,200,246,265,367,374,455,456,500,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,371,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,193,195,234,246,250,260,292,293,296,348,351,416,450,451,492,503,504,505,507,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,195,237,238,240,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,356,554,561,1201,1203],[101,163,164,172,176,179,181,182,183,195,265,292,293,350,351,352,353,354,355,504,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,375,554,561,1201,1203],[101,163,164,172,176,179,181,182,183,195,239,240,250,254,290,356,363,364,365,366,367,370,371,372,373,374,493,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,290,291,363,504,505,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,265,293,348,351,356,452,504,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,503,505,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,200,500,504,505,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,193,195,226,240,245,252,254,257,260,267,287,292,293,294,295,296,331,332,334,337,339,342,343,344,345,347,395,450,452,500,503,504,505,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,200,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,233,234,235,263,500,501,502,507,509,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,195,230,231,503,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,424,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,200,212,242,408,412,413,414,415,416,422,423,554,555,561,1201,1203],[101,164,172,176,179,181,182,183,193,195,212,226,240,242,254,257,293,332,337,347,348,401,428,429,430,436,439,440,450,452,500,503,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,257,263,270,283,293,351,503,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,212,234,245,254,293,434,500,503,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,454,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,424,437,438,447,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,500,503,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,353,493,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,254,292,395,509,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,193,195,232,337,397,401,430,436,439,442,500,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,270,283,401,443,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,233,294,395,445,503,505,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,212,416,503,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,267,294,395,396,397,406,424,444,446,503,554,561,1201,1203],[98,101,164,172,176,178,179,181,182,183,195,292,449,507,509,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,346,450,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,193,195,240,243,245,246,252,254,260,269,270,283,293,296,332,334,344,347,348,395,428,429,430,431,433,435,450,452,500,509,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,200,270,436,441,447,500,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,273,274,275,276,277,278,279,280,281,282,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,287,338,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,340,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,338,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,340,341,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,244,245,246,250,251,504,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,193,195,232,234,252,256,292,295,296,330,450,500,505,507,509,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,193,195,212,236,243,244,254,256,293,448,493,499,504,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,363,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,364,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,246,257,492,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,365,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,239,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,241,253,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,241,245,252,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,248,253,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,249,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,241,242,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,241,297,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,241,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,243,287,336,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,335,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,240,242,243,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,243,333,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,240,242,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,292,395,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,492,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,212,252,254,258,292,395,449,452,455,456,457,483,484,487,491,493,500,504,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,306,309,311,312,325,326,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,223,225,255,485,486,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,223,225,255,485,486,490,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,379,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,265,286,291,292,356,357,358,359,360,362,375,376,378,381,449,452,503,505,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,325,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,330,500,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,330,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,252,298,327,329,331,449,500,507,509,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,306,307,308,309,311,312,325,326,508,554,561,1201,1203],[98,101,164,172,176,178,179,181,182,183,193,195,212,241,242,254,260,292,293,296,395,447,448,450,500,503,504,507,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,237,240,247,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,291,293,425,428,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,291,426,494,495,496,497,498,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,287,503,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,290,375,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,289,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,291,344,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,288,290,503,554,561,1201,1203],[101,164,172,176,178,179,181,182,183,195,236,291,425,426,427,500,503,504,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,240,246,324,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,238,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,228,229,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,234,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,240,310,554,561,1201,1203],[92,98,101,164,172,176,179,181,182,183,195,292,296,507,509,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,234,531,532,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,305,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,193,195,212,232,299,301,303,304,509,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,240,267,504,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,240,432,554,561,1201,1203],[92,101,164,172,176,178,179,181,182,183,193,195,230,232,305,403,507,508,554,561,1201,1203],[92,101,164,172,176,179,181,182,183,195,221,222,223,224,225,507,552,554,561,1036,1201,1203],[92,93,94,95,96,101,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,398,399,400,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,398,554,561,1201,1203],[92,96,101,164,172,176,178,179,180,181,182,183,193,195,220,221,222,223,224,225,226,232,260,265,442,470,505,506,509,552,554,561,1036,1201,1203],[101,164,172,176,179,181,182,183,195,517,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,519,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,523,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,981,1201,1203],[101,164,172,176,179,181,182,183,195,525,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,527,528,529,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,533,554,561,1201,1203],[97,101,164,172,176,179,181,182,183,195,511,516,518,520,524,526,530,534,536,546,547,549,553,554,555,556,561,1201,1203],[101,164,172,176,179,181,182,183,195,535,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,545,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,301,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,548,554,561,1201,1203],[101,163,164,172,176,179,181,182,183,195,291,425,426,428,494,495,497,498,550,552,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,220,561,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,675,1201,1203],[101,164,169,172,176,178,179,180,181,182,183,195,212,213,220,554,561,839,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,771,1201,1203],[101,164,165,172,176,179,181,182,183,195,200,554,561,679,680,757,770,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,772,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,602,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,600,602,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,591,599,600,601,603,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,589,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,592,597,602,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,588,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,592,593,596,597,598,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,592,593,594,596,597,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,589,590,591,592,593,597,598,599,601,602,603,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,587,589,590,591,592,593,594,596,597,598,599,600,601,602,603,604,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,587,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,592,594,595,597,598,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,596,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,597,598,602,605,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,590,600,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,792,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1029,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1028,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,957,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1008,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1007,1008,1009,1010,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,573,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,565,567,573,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,566,567,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,567,573,577,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,566,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,567,573,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,565,566,567,572,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,565,567,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,566,567,579,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,568,569,570,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,571,1201,1203],[101,164,172,176,179,181,182,183,195,200,220,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1011,1201,1203],[101,164,165,172,176,179,181,182,183,186,195,200,203,554,561,1012,1013,1016,1021,1201,1203],[92,96,101,164,172,176,179,181,182,183,195,221,222,223,224,225,507,552,554,561,994,1021,1022,1035,1195,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,996,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,995,997,1017,1018,1021,1022,1195,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1012,1021,1022,1195,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,1021,1022,1195,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1021,1022,1195,1201,1203],[92,101,164,172,176,179,181,182,183,195,554,561,993,994,995,997,1021,1022,1195,1201,1203],[101,164,165,172,175,176,179,181,182,183,186,195,200,203,220,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,995,997,1021,1022,1195,1201,1203],[101,164,169,172,176,179,181,182,183,195,554,561,1021,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1022,1107,1108,1117,1191,1192,1194,1201,1203],[92,101,164,172,176,178,179,181,182,183,185,195,554,561,993,994,995,997,1013,1017,1019,1020,1021,1022,1195,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1108,1113,1114,1116,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1109,1115,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1110,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1109,1110,1111,1113,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1109,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,1112,1201,1203],[101,116,119,122,123,164,172,176,179,181,182,183,195,212,554,561,1201,1203],[101,119,164,172,176,179,181,182,183,195,200,212,554,561,1201,1203],[101,119,123,164,172,176,179,181,182,183,195,212,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,200,554,561,1201,1203],[101,113,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,117,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,115,116,119,164,172,176,179,181,182,183,195,212,554,561,1201,1203],[101,164,172,176,179,181,182,183,185,195,209,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,220,554,561,1201,1203],[101,113,164,172,176,179,181,182,183,195,220,554,561,1201,1203],[101,115,119,164,172,176,179,181,182,183,185,195,212,554,561,1201,1203],[101,110,111,112,114,118,164,172,175,176,179,181,182,183,195,200,212,554,561,1201,1203],[101,119,128,136,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,111,117,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,119,145,146,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,111,114,119,164,172,176,179,181,182,183,195,203,212,220,554,561,1201,1203],[101,119,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,115,119,164,172,176,179,181,182,183,195,212,554,561,1201,1203],[101,110,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,113,114,115,117,118,119,120,121,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,146,147,148,149,150,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,119,138,141,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,119,128,129,130,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,117,119,129,131,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,118,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,111,113,119,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,119,123,129,131,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,123,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,117,119,122,164,172,176,179,181,182,183,195,212,554,561,1201,1203],[101,111,115,119,128,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,119,138,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,131,164,172,176,179,181,182,183,195,554,561,1201,1203],[101,113,119,145,164,172,176,179,181,182,183,195,203,218,220,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,614,777,1025,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,562,1201,1203],[101,164,172,175,176,178,179,180,181,182,183,185,195,200,209,212,219,220,554,561,562,563,564,574,575,576,578,580,582,584,585,586,606,610,611,612,613,614,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,562,563,564,581,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,564,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,583,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,609,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,574,585,614,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,574,614,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,664,669,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,641,650,777,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,616,618,619,620,622,624,625,628,629,635,649,650,661,663,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,624,643,644,650,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,624,625,632,650,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,622,624,625,628,650,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,582,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,624,625,628,641,645,650,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,614,672,777,1201,1203],[101,164,167,172,176,179,181,182,183,195,200,554,561,614,615,620,622,624,625,628,629,632,633,641,642,645,648,649,650,661,670,671,774,777,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,582,624,625,628,650,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,624,643,644,645,650,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,582,624,629,630,631,650,1201,1203],[101,164,167,172,176,179,181,182,183,195,200,554,561,582,614,615,620,622,624,625,628,629,630,631,632,633,641,642,643,644,645,648,649,650,661,670,671,672,673,774,777,1201,1203],[101,164,167,172,176,179,181,182,183,195,200,554,561,582,614,615,620,622,624,625,628,629,630,631,632,633,641,642,643,644,645,648,649,650,661,670,671,672,774,777,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,582,615,620,622,624,625,628,629,630,631,632,633,635,641,643,644,645,648,650,651,652,653,654,659,1201,1203],[101,164,167,172,176,178,179,181,182,183,195,200,554,561,582,614,615,620,622,624,625,628,629,630,631,632,633,641,642,643,644,645,648,649,650,661,670,671,672,673,674,676,774,777,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,615,622,624,625,628,629,643,644,645,650,652,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,660,667,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,756,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,758,759,770,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,760,761,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,758,759,760,762,763,768,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,759,760,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,768,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,769,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,760,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,758,759,760,763,764,765,766,767,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,747,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,747,750,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,742,745,747,748,749,750,751,752,753,754,755,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,681,683,750,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,747,748,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,682,747,749,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,683,685,687,688,689,690,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,685,687,689,690,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,685,687,689,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,682,685,687,688,690,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,681,683,684,685,686,687,688,689,690,691,692,742,743,744,745,746,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,681,683,684,687,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,683,684,687,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,687,690,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,681,682,684,685,686,688,689,690,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,681,682,683,687,747,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,687,688,689,690,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,689,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,991,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,970,1033,1034,1039,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,859,968,987,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,970,987,990,1033,1034,1039,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1041,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,968,987,990,1034,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,860,968,990,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1057,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,859,860,968,987,990,1056,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,857,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,856,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,860,861,1201,1203],[101,164,172,176,179,181,182,183,195,255,553,554,561,860,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,865,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,863,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,860,867,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,869,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,871,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,875,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,873,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,881,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,883,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,885,1201,1203],[101,164,172,176,179,181,182,183,195,255,553,554,561,860,879,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,887,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,889,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,893,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,891,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,895,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,897,1201,1203],[101,164,172,176,179,181,182,183,195,255,553,554,561,860,880,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,901,902,903,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,899,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,909,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,907,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,905,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,913,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,911,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,915,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,917,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,919,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,921,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,923,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,925,926,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,928,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,930,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,932,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,877,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,934,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,860,936,1201,1203],[101,164,172,176,179,181,182,183,195,255,553,554,561,859,860,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,940,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,938,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,947,983,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,546,554,561,859,945,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,946,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1059,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,947,968,987,990,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,1064,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,536,546,554,561,859,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1065,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,968,987,990,1064,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1062,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,968,987,990,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,1070,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,546,554,561,859,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1071,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,968,987,990,1070,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1074,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1068,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,968,987,990,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,970,1033,1039,1076,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,968,987,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,970,990,1033,1039,1076,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1078,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,968,990,1076,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,853,856,860,968,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,557,561,974,982,983,985,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,954,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,536,546,554,561,950,952,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,953,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,952,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,950,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,951,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,1082,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,954,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,968,969,987,990,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,960,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,958,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,959,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,859,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,961,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,859,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,963,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,859,945,960,962,964,965,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,966,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,860,967,968,990,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,968,990,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,860,968,990,1056,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,970,1033,1039,1090,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,970,990,1033,1039,1090,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1092,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,968,990,1090,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,970,1033,1039,1095,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,968,970,987,990,1033,1039,1095,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,968,1097,1201,1203],[101,164,172,176,179,181,182,183,195,255,536,554,561,859,860,968,987,990,1095,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,1033,1039,1056,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,1056,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,1045,1055,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,987,1033,1039,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,987,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,988,1033,1039,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,984,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,970,990,1033,1039,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,990,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,536,554,561,859,988,989,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,859,945,965,989,1033,1039,1195,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,983,989,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,536,554,561,945,950,965,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,974,1052,1054,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,860,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,856,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,969,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,859,945,971,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,859,968,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,853,856,859,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,846,853,854,855,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,859,968,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,1038,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,859,945,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,972,973,1201,1203],[101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,945,983,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,945,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,985,1201,1203],[101,164,172,176,179,181,182,183,195,554,1201,1203],[101,164,172,176,179,181,182,183,187,195,212,255,554,561,774,778,779,781,1201,1203],[92,101,164,172,176,179,181,182,183,195,255,554,561,660,667,804,1201,1203],[101,164,172,176,179,181,182,183,195,554,561,774,1201,1203]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"17f13ecb98cbc39243f2eee1f16d45cd8ec4706b03ee314f1915f1a8b42f6984","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"5fcab789c73a97cd43828ee3cc94a61264cf24d4c44472ce64ced0e0f148bdb2","affectsGlobalScope":true,"impliedFormat":1},{"version":"db59a81f070c1880ad645b2c0275022baa6a0c4f0acdc58d29d349c6efcf0903","affectsGlobalScope":true,"impliedFormat":1},{"version":"673294292640f5722b700e7d814e17aaf7d93f83a48a2c9b38f33cbc940ad8b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"d786b48f934cbca483b3c6d0a798cb43bbb4ada283e76fb22c28e53ae05b9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"142efd4ce210576f777dc34df121777be89eda476942d6d6663b03dcb53be3ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"379bc41580c2d774f82e828c70308f24a005b490c25ba34d679d84bcf05c3d9d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed484fb2aa8a1a23d0277056ec3336e0a0b52f9b8d6a961f338a642faf43235d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ffedae1d1c2d53fdbca1c96d3c7dda544281f7d262f99b6880634f8fd8d9820","affectsGlobalScope":true,"impliedFormat":1},{"version":"83a730b125d477dd264df8ba479afab27a3dae7152b005c214ab94dc7ee44fd3","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"21da358700a3893281ce0c517a7a30cbd46be020d9f0c3f2834d0a8ad1f5fc75","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc2110f7decca6bfb9392e30421cfa1436479e4a6756e8fec6cbc22625d4f881","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"4137ebf04166f3a325f056aa56101adc75e9dceb30404a1844eb8604d89770e2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2ae155afe8a01cc0ae612d99117cf8ef16692ba7c4366590156fdec1bcf2d8c","impliedFormat":1},{"version":"3f5e5d9be35913db9fea42a63f3df0b7e3c8703b97670a2125587b4dbbd56d7c","impliedFormat":1},{"version":"8caeb65fdc3bfe0d13f86f67324fcb2d858ed1c55f1f0cce892eb1acfb9f3239","impliedFormat":1},{"version":"57c23df0b5f7a8e26363a3849b0bc7763f6b241207157c8e40089d1df4116f35","affectsGlobalScope":true,"impliedFormat":1},{"version":"3b8bc0c17b54081b0878673989216229e575d67a10874e84566a21025a2461ee","impliedFormat":1},{"version":"5b0db5a58b73498792a29bfebc333438e61906fef75da898b410e24e52229e6f","impliedFormat":1},{"version":"dbe055b2b29a7bab2c1ca8f259436306adb43f469dca7e639a02cd3695d3f621","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"e3905f6902f0b69e5eefc230daa69fdd4ab707a973ec2d086d65af1b3ea47ef0","impliedFormat":1},{"version":"2ea729503db9793f2691162fec3dd1118cab62e96d025f8eeb376d43ec293395","impliedFormat":1},{"version":"9ec87fea42b92894b0f209931a880789d43c3397d09dd99c631ae40a2f7071d1","impliedFormat":1},{"version":"c68e88cdfadfb6c8ba5fc38e58a3a166b0beae77b1f05b7d921150a32a5ffb8d","impliedFormat":1},{"version":"2bc7aa4fba46df0bd495425a7c8201437a7d465f83854fac859df2d67f664df3","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"07e4e61e946a9c15045539ecd5f5d2d02e7aab6fa82567826857e09cf0f37c2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c4714ccc29149efb8777a1da0b04b8d2258f5d13ddbf4cd3c3d361fb531ac86","impliedFormat":1},{"version":"3ff275f84f89f8a7c0543da838f9da9614201abc4ce74c533029825adfb4433d","impliedFormat":1},{"version":"0eb5d0cbf09de5d34542b977fd6a933bb2e0817bffe8e1a541b2f1ad1b9af1ff","impliedFormat":1},{"version":"f9713757bcdfa4d58b48c0fb249e752c94a3eee8bf4532b906094246ac49ef88","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"c32c840c62d8bd7aeb3147aa6754cd2d922b990a6b6634530cb2ebdce5adc8e9","impliedFormat":1},{"version":"e1c1a0b4d1ead0de9eca52203aeb1f771f21e6238d6fcd15aa56ac2a02f1b7bf","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"6fe28249ac0c7bc19a79aa9264baf00efbd080e868dbe1d3052033ad1c64f206","affectsGlobalScope":true,"impliedFormat":1},{"version":"cbed824fec91efefc7bbdcb8b43d1a531fdbebd0e2ef19481501ff365a93cb70","impliedFormat":1},{"version":"d0716593b3f2b0451bcf0c24cfa86dec2235c325c89f201934248b7c742715fc","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"2991bca2cc0f0628a278df2a2ccdb8d6cbcb700f3761abbed62bba137d5b1790","impliedFormat":1},{"version":"ce8653341224f8b45ff46d2a06f2cacb96f841f768a886c9d8dd8ec0878b11bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"a74edb3bab7394a9dbde529d60632be590def2f5f01024dbd85441587fbfbbe0","impliedFormat":1},{"version":"0ea59f7d3e51440baa64f429253759b106cfcbaf51e474cae606e02265b37cf8","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"00049ccc87f3f37726db03c01ca68fe74fd9c0109b68c29eb9923ebec2c76b13","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"68d3f35108e2608b1f2f28b36d19d7055f31c4465cc5692cbd06c716a9fe7973","impliedFormat":1},{"version":"a6d543044570fbeed13a7f9925a868081cd2b14ef59cdd9da6ae76d41cab03d3","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"eab2f3179607acb3d44b2db2a76dd7d621c5039b145dc160a1ee733963f9d2f5","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"6f5383b3df1cdf4ff1aa7fb0850f77042b5786b5e65ec9a9b6be56ebfe4d9036","impliedFormat":1},{"version":"62fc21ed9ccbd83bd1166de277a4b5daaa8d15b5fa614c75610d20f3b73fba87","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"9d3821bc75c59577e52643324cec92fc2145642e8d17cf7ee07a3181f21d985d","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"201db9cf1687fab1adf5282fcba861f382b32303dc4f67c89d59655e78a25461","impliedFormat":1},{"version":"c77fb31bc17fd241d3922a9f88c59e3361cdf76d1328ba9412fc6bf7310b638d","impliedFormat":1},{"version":"0a20eaf2e4b1e3c1e1f87f7bccb0c936375b23b022baeea750519b7c9bc6ce83","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"a16b91b27bd6b706c687c88cbc8a7d4ee98e5ed6043026d6b84bda923c0aed67","impliedFormat":1},{"version":"694b812e0ed11285e8822cf8131e3ce7083a500b3b1d185fff9ed1089677bd0a","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"6eeded8c7e352be6e0efb83f4935ec752513c4d22043b52522b90849a49a3a11","impliedFormat":1},{"version":"6c1ad90050ffbb151cacc68e2d06ea1a26a945659391e32651f5d42b86fd7f2c","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"2beff543f6e9a9701df88daeee3cdd70a34b4a1c11cb4c734472195a5cb2af54","impliedFormat":1},{"version":"2e07abf27aa06353d46f4448c0bbac73431f6065eef7113128a5cd804d0c384d","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"42bc0e1a903408137c3df2b06dfd7e402cdab5bbfa5fcfb871b22ebfdb30bd0b","impliedFormat":1},{"version":"9894dafe342b976d251aac58e616ac6df8db91fb9d98934ff9dd103e9e82578f","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"446a50749b24d14deac6f8843e057a6355dd6437d1fac4f9e5ce4a5071f34bff","impliedFormat":1},{"version":"182e9fcbe08ac7c012e0a6e2b5798b4352470be29a64fdc114d23c2bab7d5106","impliedFormat":1},{"version":"2f4e6b4d39426a1b85ecf4bdeb9dddbf4d9b3397d95d8555d46f925c9519ec7d","impliedFormat":1},{"version":"78a2869ad0cbf3f9045dda08c0d4562b7e1b2bfe07b19e0db072f5c3c56e9584","impliedFormat":1},{"version":"89d5d28d4f57e000b836ac273079be1b75710e28ce14750d081fb420d37e2ca5","impliedFormat":1},{"version":"fd4e24ccff3966390600d7f5d6aa1fed5a512e92ada735ea5fbc933d313ad3d3","impliedFormat":1},{"version":"b7cddfe1aa6b86b5fad3c9ccb30d05b3ccb165aebbf112f48d2d8a5f69dd98b1","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"bd2c7ada3dee03653d3f601011d30072194bc3970cd93208f9588fbdc0c69347","impliedFormat":1},{"version":"e480da45d32313e7174b265674da504f075f59ef326852f0c5a5d863b438ae85","impliedFormat":1},{"version":"ad54850f61fcf5d014e11be80d2f46fea9265cfa7e77456da876f7833ef81769","impliedFormat":1},{"version":"6f7c9e8bd2b5b6a080b07080065f94900bd3c7e5ebbd3047bc33fcce2fab1dd8","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"da5950ee2a90721df6f3fba45f5d05308f7e4c35835392215dd2cd404505e2de","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"f42d5fed19610d485c646a0c430e768115567d078c7fc855c57b0c578b3d6cd3","impliedFormat":1},{"version":"ee8df1cb8d0faaca4013a1b442e99130769ce06f438d18d510fed95890067563","impliedFormat":1},{"version":"d5630f2ad9b4541e5ce891648121022f9412ecdca1820baa1f0104f70fd7eff7","impliedFormat":1},{"version":"4d15375ab13497104bc8fe56fdef2b5fd6853f29255737d23a33fa306ff7fd69","impliedFormat":1},{"version":"2cd3fc1d0d6a1e85baffd2d4f50f5efb192b5446eef567e97c94765402f0aad4","impliedFormat":1},{"version":"e4cbf2f1e89ecccaddd2c045e600ae41b732295953fb06247c7dcbc2d281ed30","impliedFormat":1},{"version":"6dcedaef57dff0d79a05ab0ab602cde74db803d1e765468bf91263786a383e1b","impliedFormat":1},{"version":"8c1697d90c394a6fd955b98eae01238eff628e129b987a68aea10f898a48e7da","impliedFormat":1},{"version":"7580e62139cb2b44a0270c8d01abcbfcba2819a02514a527342447fa69b34ef1","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"d10d63718e1646c2279e3b33831f82c60e31f622b2b7020f1196409ca4c09242","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"148679c6d0f449210a96e7d2e562d589e56fcde87f843a92808b3ff103f1a774","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"02436d7e9ead85e09a2f8e27d5f47d9464bced31738dec138ca735390815c9f0","impliedFormat":1},{"version":"f8d5ff8eafd37499f2b6a98659dd9b45a321de186b8db6b6142faed0fea3de77","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"a22dd55aa4d39906252000ab8e8a1b83b195eef7f4274eb51e457c1f11cf6580","impliedFormat":1},{"version":"540cc83ab772a2c6bc509fe1354f314825b5dba3669efdfbe4693ecd3048e34f","impliedFormat":1},{"version":"121b0696021ab885c570bbeb331be8ad82c6efe2f3b93a6e63874901bebc13e3","impliedFormat":1},{"version":"612d9da66bb046a9c1e2e8d026245ded881fc4b9f98cbfae714415d57ee0ae0b","impliedFormat":1},{"version":"32c2ad9494dad5d11b0564a619fee18f388db6c1e9e2cd3c360b3122549691eb","impliedFormat":1},{"version":"6c301d40aec56a74ec7bd7324e31a728dadf9bfba3e96def02938d3d973534ec","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"aa14cee20aa0db79f8df101fc027d929aec10feb5b8a8da3b9af3895d05b7ba2","impliedFormat":1},{"version":"493c700ac3bd317177b2eb913805c87fe60d4e8af4fb39c41f04ba81fae7e170","impliedFormat":1},{"version":"aeb554d876c6b8c818da2e118d8b11e1e559adbe6bf606cc9a611c1b6c09f670","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"25a5f6fd3a2243c859eddc99ab5fba11d970af2fe7a5df9c32b7668f76f97b01","impliedFormat":1},{"version":"8d207e1f9d2c30d6f77dfa693f3827c3fbf0d89240297e10bdfe1041d433df68","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"8c70ddc0c22d85e56011d49fddfaae3405eb53d47b59327b9dd589e82df672e7","impliedFormat":1},{"version":"2f9c89cbb29d362290531b48880a4024f258c6033aaeb7e59fbc62db26819650","impliedFormat":1},{"version":"a365c4d3bed3be4e4e20793c999c51f5cd7e6792322f14650949d827fbcd170f","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":"273782b8454e78f6a8b30d2cfbf6860499c930595095fcc1689637115f0eddda","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fbdd025f9d4d820414417eeb4107ffa0078d454a033b506e22d3a23bc3d9c41","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"9f9bb6755a8ce32d656ffa4763a8144aa4f274d6b69b59d7c32811031467216e","impliedFormat":1},{"version":"5c32bdfbd2d65e8fffbb9fbda04d7165e9181b08dad61154961852366deb7540","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"0c05e9842ec4f8b7bfebfd3ca61604bb8c914ba8da9b5337c4f25da427a005f2","impliedFormat":1},{"version":"faed7a5153215dbd6ebe76dfdcc0af0cfe760f7362bed43284be544308b114cf","impliedFormat":1},{"version":"7029e566b8df176f703fb59fd437a38670c7a0e02c58b2d66dfb5b2e2b2defdb","impliedFormat":1},{"version":"7f2aa4d4989a82530aaac3f72b3dceca90e9c25bee0b1a327e8a08a1262435ad","impliedFormat":1},{"version":"d96b39301d0ded3f1a27b47759676a33a02f6f5049bfcbde81e533fd10f50dcb","impliedFormat":1},{"version":"e9f147ecca73d9346a4c073432843c159ccbe50bdcb678a78f6da10eae2cecf4","impliedFormat":1},{"version":"de061f7d72bd65c06fc1419f841dfdcb29a8e22fe6fa527d1e6eb20b897d4de0","impliedFormat":1},{"version":"663beafc2446079574570cba86e9b15f986f908ddb1b01274509970126fee945","impliedFormat":1},{"version":"a3102887d5058bf4cb5b37fa6964c09e9527c42053b3b5c642b89878620748de","impliedFormat":1},{"version":"0aaaa1727edd29673d85c9b26d7ca4d54e5407a48586903c51b48b7f7d196f61","impliedFormat":1},{"version":"d35bca0b261bff02635758c48e8ab99c61c420d0dfabbcf467e847171d876b7d","impliedFormat":1},{"version":"3bc12c40d90c342ff88a3d876996c555ed5cbee5fe8c3308a240b321f401ee46","impliedFormat":1},{"version":"ba130768aae855a5477e9e148e5c879548e6e7ccbcc56fd1934c8a18ea5b7569","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"d38530db0601215d6d767f280e3a3c54b2a83b709e8d9001acb6f61c67e965fc","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"b499af2054a037a162b3b72cd886f48bbf32a3502c865c6e29fac7d2ab3ce0b5","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"48773ca557b0319c2ee62ae249cf52a81709e8be139920d6479a66274de7c4ed","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"4cceef18d7f088e797a463e90b7a9dad10c6bc667724b7686e3e740ae00122be","impliedFormat":1},{"version":"7ee86fbb3754388e004de0ef9e6505485ddfb3be7640783d6d015711c03d302d","impliedFormat":1},{"version":"cc1954b539604b1e562319119ac7e888172208b32ca873f9a357a92c826bd046","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"bb8f2dbc03533abca2066ce4655c119bff353dd4514375beb93c08590c03e023","impliedFormat":1},{"version":"706dd95827e7ebaabda91d5db2b755233e0952d98570e9c032b0f066a15c1177","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b103e9abfe82d14c0ad06a55d9f91d6747154ef7cacc73cf27ecad2bfb3afcf","impliedFormat":1},{"version":"990b8fad2327b77e6920cc792af320e8867e68f02ce849b12c0a6ab9a1aebb09","impliedFormat":1},{"version":"5eb8cd1cb0c9143d74a8190b577c522720878c31aef67d866fcd29973f83e955","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"a6805fcafed712aea7759f8bc731014f9d22738c1d6ef9d43b8091d1d48346d5","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"d88ea80a6447d7391f52352ec97e56b52ebec934a4a4af6e2464cfd8b39c3ba8","impliedFormat":1},{"version":"142617b3cdf902b69c6464c9fbd942b60ab3e733ca18c032b19e0f7e2adbefe8","impliedFormat":1},{"version":"0b603555f1881f87256ffd6344d3e3ed6d466c2e701eabf381f28be8c2125892","impliedFormat":1},{"version":"897e4f7662488e3ecc79e743bdd3b78f13bdb69a97851afa5b440c4211e32ea9","impliedFormat":1},{"version":"e2e1c6d3b2d93add5200bd7bc1a8cccb4e446836b2111ece45db8683a2c765de","impliedFormat":1},{"version":"251b03d5cd243854ce870d9a9a39f491faf69898c5d6b5eee28cc7649c57417b","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"2c4de79f406d137390608e8c0a44fba2ff8e00bacfcae7c9d1781fef10e9440d","impliedFormat":1},{"version":"07ba23a10465791be5d22deaf5ef7de7658774ddff53721e5ea17fedea1bc721","impliedFormat":1},{"version":"dca8c645c5afeb03b1ecedbf16323f33e7d0afaa6256c8e047e6e38087a97f53","impliedFormat":1},{"version":"775f181bd4a533d6f8b5e55ec1d9f1624559720ae8a70e9432258da26b38d27c","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"9109a1291dd4b9f1541bea81ee11c247a2ca9e1ea89f87f13aa1811c3c069616","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"622694a8522b46f6310c2a9b5d2530dde1e2854cb5829354e6d1ff8f371cf469","impliedFormat":1},{"version":"cd8ce8d68567f62dd580b3c3c37777ac3f5b81944c7417f5ea83030eab533385","impliedFormat":1},{"version":"e374d1eaa05b7dc38580062942ac8351ce79cbe11f6dbce4946a582a5680582d","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"a9e6c0ff3f8186fccd05752cf75fc94e147c02645087ac6de5cc16403323d870","impliedFormat":1},{"version":"49af4b52f0d4d2304c5f2c6fe5fab3e153e0acc38830d0202821b877c097dd02","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"e68b8e5a1df7c1be2bc105141456ecba70215806e1c28bfbc5c12bfce4be6e68","impliedFormat":1},{"version":"511c8f02329808d47d00b859c532ae9115590048b17325a946c74dac48428650","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"b5f9e66625783eefcbe3d2da074b2e7ba2066d61ce3fc6ef4f22805ad946cab4","impliedFormat":1},{"version":"e37115962d284b9f7a37c2bdd2add50f88365dde41f5e0ff591ffc48a8ec7575","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"f89488602bec98a142072fae7ea5ba99431a569ff580c64b7be39896474799d8","impliedFormat":1},{"version":"bbbc47961f39a57df103cf4ca3bb8f8732b4b6678a18225a0aa76d59c466956c","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"2ffb043dc5163458e473b7010859f86e01dc4edffcae0a93d885d028b426a546","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"05c7280d72f3ed26f346cbe7cbbbb002fb7f15739197cbbee6ab3fd1a6cb9347","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"04b7b2e0832dfd3c31e81df3975e8d8fda28e7ff999b0aa2932608a8f6661d5c","impliedFormat":1},{"version":"ca2d34c6ed5cbd3070b8b6f32f42ae54adcc6499c1e4b99f0a5798b3f27cc653","impliedFormat":1},{"version":"9ec68995e66dd6b9dac834bf5ae85fde802714ea2e82151a5d1d53ef01b463ef","impliedFormat":1},{"version":"5c4d626b4902f2ef8a1cc146d761d276cef988016dc674e3b98fbad70e64bc9f","impliedFormat":1},{"version":"fdfaa0aad899524962e2955287b5b991ffe3be50f64e02eb60c933ca44644a94","impliedFormat":1},{"version":"53c972a0f9bc3a4ec70fff7314123ea8cfcf75b3703046f767d2dc1eea87b2fb","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"d130c5f73768de51402351d5dc7d1b36eaec980ca697846e53156e4ea9911476","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"7303b45138d2511035056a5901a1490ebdcbf055cbb1276f8629c5121cbe733e","impliedFormat":1},{"version":"27f874cd5327507eeff699a74567f60c1215b94509f4308633a7b01922471ed2","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"2c6cf04bc525caf6546e859e8ef10bfb9573837ec0bc5ec7b53a7b1b8ca72781","impliedFormat":1},{"version":"8695dec09ad439b0ceef3776ea68a232e381135b516878f0901ed2ea114fd0fe","impliedFormat":1},{"version":"304b44b1e97dd4c94697c3313df89a578dca4930a104454c99863f1784a54357","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"87cc05fe13108f02e12da7e3efd8e360fef78d96a0c9e11408ea1b1b9fb3e03d","impliedFormat":1},{"version":"1abbf67c218d23c2ce76887caac2df6c7dab3d97ba2b65348432b876f510002a","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"c06ef3b2569b1c1ad99fcd7fe5fba8d466e2619da5375dfa940a94e0feea899b","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"8bd496cf710d4873d15e4891a5dbf945673e3321ca74cf75187e347fd5ed295e","impliedFormat":1},{"version":"a6dba407fc287f1e25454e75028c91bbc00675f2d1c4e8b3edcc36c08611a486","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"e91f7b1344577a02f051b9b471f33044fef8334a76dc9e1de003d17595a5219b","impliedFormat":1},{"version":"c0723195c85e19656d6b5b9fdb81d3f3403c1ae4679e722c6ea058c516b38d12","impliedFormat":1},{"version":"186eea74805194f04e41038fc5eca653788b9dedbab7c2d7d17e10139622dd92","impliedFormat":1},{"version":"71d9eb4c4e99456b78ae182fb20a5dfc20eb1667f091dbb9335b3c017dd1c783","impliedFormat":1},{"version":"cfa846a7b7847a1d973605fbb8c91f47f3a0f0643c18ac05c47077ebc72e71c7","impliedFormat":1},{"version":"1594da19968752a22b2ac48c2d0e60575700e745c577a8a4a676b841238ad5bb","impliedFormat":1},{"version":"e0cee12109e0a10a4c3d6769fcc7644b7c1ea7f52365bea51728f5af29f8a137","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"3536968defef8a75514f547ead5e2e9c1e984820290ec9b00c5fdfb6ef786535","impliedFormat":1},{"version":"d83773870080c30a230e322ce13a9c6f3398e8dacea4ea8a83e26370f3bac23e","impliedFormat":1},{"version":"dcfeaf98d66314fec29a9076c4290e45d0b196a65827becc19138e9c7b855f37","impliedFormat":1},{"version":"6849fe9210fe4946d5f085bfed36758f33dc6ae15a751338d178dd4daa017c46","impliedFormat":1},{"version":"888cda0fa66d7f74e985a3f7b1af1f64b8ff03eb3d5e80d051c3cbdeb7f32ab7","impliedFormat":1},{"version":"60681e13f3545be5e9477acb752b741eae6eaf4cc01658a25ec05bff8b82a2ef","impliedFormat":1},{"version":"ffae4e1e06aa848a1e4bcef162cd1c48e5909b26223515981310af9c036bdfc7","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"34e16eb7c31768a11a08aebcfb3d70d7b8f0b016197e98d8419e566ceae6d6c8","impliedFormat":1},{"version":"f94ec1f7e4b709d26960306c9082a7a1b728a6e13089346aa48ba57c74cbf47e","impliedFormat":1},{"version":"9a11cb4033405e96c247cd5aa29790212aaffdd127869e8a5219103f0b389fd5","impliedFormat":1},{"version":"01479d9d5a5dda16d529b91811375187f61a06e74be294a35ecce77e0b9e8d6c","impliedFormat":1},{"version":"aff5213585cb72e94054dfe17250ff315f3569b3919d1ef1ad235f37c4ee894e","impliedFormat":1},{"version":"fb2ea35e1be6388d722d7725e2b49c697d34d9c890c3b96758faaeb86d35cef8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"1a4dc28334a926d90ba6a2d811ba0ff6c22775fcc13679521f034c124269fd40","impliedFormat":1},{"version":"f05315ff85714f0b87cc0b54bcd3dde2716e5a6b99aedcc19cad02bf2403e08c","impliedFormat":1},{"version":"5fad3b31fc17a5bc58095118a8b160f5260964787c52e7eb51e3d4fcf5d4a6f0","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"456006a6975b26c0a1785feddae165f6d307e2d601ffde27e21fc4a790e448a4","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"1fe0d18b111e1145a7e7601855bccd4ca20f24e3b9a5aba6bb1fa9d1a7059170","impliedFormat":1},{"version":"5632c3c26d420c063eebe64c45b1248b9492a67bf44f1d0c57e9dc8f6cf449bb","impliedFormat":1},{"version":"0df5aa619ab12993a39ea6dae062ee46eadbb4d738916460e636ada52bced75b","impliedFormat":1},{"version":"8fca3039857709484e5893c05c1f9126ab7451fa6c29e19bb8c2411a2e937345","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"10ab7be91f87ebe8916b62cf28af2e45b5601fc7b0e311adf838f912c6b31dd8","impliedFormat":1},{"version":"bc636fbc08e0979ceb7eb0731a33000283d77a33b62e1f71ee65be50394e40ba","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"75bbd3be047d539988a0ff0b56384ef7a6a25f3b676ad96bee547d44c31622a7","impliedFormat":1},{"version":"42960001a776b089ade681ab5cfddc936e0afb0615133ec1841f3dee89d3e1bf","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"da47712b394d944328245482603bc6f416d3949b67c9392279caab595076b510","affectsGlobalScope":true,"impliedFormat":1},{"version":"37d0071d8f0a06dc55c2c5e0ec3391affd4fd107c53410bf358196ec0bf3923f","impliedFormat":1},{"version":"b213dad76ca37fd552274c9499056e1c0d9c1bd38a55bb7f68b22ba6b84c3ad7","impliedFormat":1},{"version":"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"19df3488557c2fc9b4d8f0bac0fd20fb59aa19dec67c81f93813951a81a867f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b25350193e103ae90423c5418ddb0ad1168dc9c393c9295ef34980b990030617","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"5a49adaef698b7ad7e6127949fa1b0bbd3d46b7cbd11c54e392a4dcdd51f5190","impliedFormat":1},{"version":"96171c03c2e7f314d66d38acd581f9667439845865b7f85da8df598ff9617476","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"2489bf04d77dc025ba67f49f1a56eb24b9db477d5ff88123d887e163ed1776aa","impliedFormat":1},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"0b77b819b5417775fccb20c678293cf614c054a5b1a65421a5b933a9124ba998","impliedFormat":1},{"version":"e1f6076688a95bd82deaac740fccbe3cdea0d8a22057cccc9c5bce4398bdd33b","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"b1f1d57fde8247599731b24a733395c880a6561ec0c882efaaf20d7df968c5af","impliedFormat":1},{"version":"6715dc4eb59c8ea9abe2b78c235ed331dc710a06fe56798868dbc4d40cd1b707","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"5a3ea721d03a361ccbdd7390ccd75f6e84cbca3a3f01f4b331ecc9af31890c49","impliedFormat":1},{"version":"e7dfaee4af38d45b1cab8a1ee0b3bc1f85ddcf64545ed391d675d78ae6526274","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8daa443eaf9a27fd382cc1f8ebe30330c0f4d89511cfb469166874806751d35","impliedFormat":1},{"version":"af48e58339188d5737b608d41411a9c054685413d8ae88b8c1d0d9bfabdf6e7e","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"1de8c302fd35220d8f29dea378a4ae45199dc8ff83ca9923aca1400f2b28848a","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"332248ee37cca52903572e66c11bef755ccc6e235835e63d3c3e60ddda3e9b93","impliedFormat":1},{"version":"94e8cc88ae2ef3d920bb3bdc369f48436db123aa2dc07f683309ad8c9968a1e1","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"07ed3ddab975995eea41b22f3010506fb9f5fb301d04820b07d7a1aee5477d7c","impliedFormat":1},{"version":"969d8b0965849f4bae7cab0ba90bd1e1220e95999c2c6f01117fa7500901c017","impliedFormat":1},{"version":"6ec840ee5e2bc103f557fe38b1d585ee250540468713d7634ee066de372bf332","impliedFormat":1},{"version":"b0309e1eda99a9e76f87c18992d9c3689b0938266242835dd4611f2b69efe456","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"6ceb10ca57943be87ff9debe978f4ab73593c0c85ee802c051a93fc96aaf7a20","impliedFormat":1},{"version":"1de3ffe0cc28a9fe2ac761ece075826836b5a02f340b412510a59ba1d41a505a","impliedFormat":1},{"version":"e46d6cc08d243d8d0d83986f609d830991f00450fb234f5b2f861648c42dc0d8","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"ff863d17c6c659440f7c5c536e4db7762d8c2565547b2608f36b798a743606ca","impliedFormat":1},{"version":"5412ad0043cd60d1f1406fc12cb4fb987e9a734decbdd4db6f6acf71791e36fe","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"e297c0a524edee7677939122f90027bfbe5f2698939d9a85728e5044b39c7124","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"b62381cae176db34f003cc6172ee8f3e0122014889d66391aa73698105cf4934","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"41eb514d9ce0a6e87957f08a4b7af70d93f87637f37dee706e2d92a6601c25a9","impliedFormat":1},{"version":"e7765aa8bcb74a38b3230d212b4547686eb9796621ffb4367a104451c3f9614f","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"7bd01f0f28cd3aeb2046274d85208e245965f6f2948edf4f7b2057bcf9f22ccc","impliedFormat":99},{"version":"d2f2cf2b8cc92bea913cda4a076e0f790b23a21e84f989d12f0116a7fe3906e0","impliedFormat":99},{"version":"6de125ea94866c736c6d58d68eb15272cf7d1020a5b459fea1c660027eca9a90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5b20bc288ee49989c95b20847fc93b96bf61cc0845598897a6a53a967dd7d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"d3b315763d91265d6b0e7e7fa93cfdb8a80ce7cdd2d9f55ba0f37a22db00bdb8","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},{"version":"462b986b7c699b7e7e52a571eb3776fdbdd6bdf38638c37e9c9781e155e9139c","affectsGlobalScope":true},"7b550dda9686c16f36a17bf9051d5dbf31e98555b30d114ac49fc49a1e712651","68937fe95088ffe97ac986edf4dcfb88cfe71df2e67db91ba03ee165779dedd7",{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"16fe60bb544cfedfd2b5bb2f7d0b3957be7978706d57d9f06edc9c0c8dbdba23","impliedFormat":99},{"version":"82179358c2d9d7347f1602dc9300039a2250e483137b38ebf31d4d2e5519c181","impliedFormat":99},{"version":"c73fdf42528325dd17940937ed787b15ae3445c6a2dae1a2b74bc4d87d337ca2","impliedFormat":99},{"version":"e8e17dfef3cfa9f0847ac93dd535a9896af7fb57c1a1b164484bb1b0ee4a25d8","impliedFormat":99},{"version":"51d2ffea2d1ee4a81c775938588c1e16620281adb60cbc26579a2fc6baa10bd2","impliedFormat":99},{"version":"148debd12783ded0a60d115daeacd8136f77757ae89a05c4e18de6dd77646fd2","impliedFormat":99},{"version":"0088b02dca63c47b273a140d0a3944bdc6dc2eb765fff0ca98e3c3a2786b3a5a","impliedFormat":99},{"version":"a651d06b780fa354231f19b040cbcde484bede3218885752b4f9e9a8f72d3b5f","impliedFormat":99},{"version":"06e26f75bed4c8389a8a63f0e6d6a9068038873dc95d8d1338e8c370a0ae8bc3","impliedFormat":99},{"version":"a2155e2675fd1af52b0b70779371c28611cdd1076b29d0f68bf93b983e5ddce0","impliedFormat":99},{"version":"a413e4b0b99280e1e58f5fe7b2b585e8a9be4996df8c58585399c9e2ca8a683e","impliedFormat":99},{"version":"609ab2c225766bc0851251c1db0fd5492673e190074045d21dc5dc7c3c46d785","impliedFormat":99},{"version":"c074e054c9db79055d37d7d70131e9a3234b8186773b3edb617c13f80bcf8774","impliedFormat":99},{"version":"7d3e062a778b8f5ea4f0cac7e925e31f88e6739812ebc5f827474324a4048f14","impliedFormat":99},{"version":"7f3857dc5cfe1e5e977edb14e931d9939a952e8e41997263a927f8f0299ea652","impliedFormat":99},{"version":"3559624d0102d10d7765c292c60ccbc229541534db32061e06df88bfe1064636","impliedFormat":99},{"version":"5a9834c603c65aee5cba0c1d6b3c7aee85cdc7862832a23165c6aa4139c165f2","impliedFormat":99},{"version":"a7d7b5fa83cd7b3b4c2aa73bc29e7cbd53d5690b74f6fb39a5558af0a94967ba","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"605450898939e8abce51e8085a41b60640278337a969c33cd6b169e7c4f9c3f2","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0864480ea083087d705f9405bd6bf59b795e8474c3447f0d6413b2bce535a09","impliedFormat":99},{"version":"e67cbea16f1994af89efd700542dbf3828a46a52b29e4d67e801bd7869dc103c","impliedFormat":99},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":99},{"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":"e3cf0611709328b449ec13f8c436712d62003620ce480139fae46ce001c2ee9f","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":99},{"version":"f093d4bd6a9267be5f8ecbfbca19f4f3359b3839883206150c5d833606569e84","impliedFormat":99},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":99},{"version":"4a13397dffad4475c45c70fde584c925fe8c9218b3c7ab94397b68fc434f63b6","impliedFormat":99},{"version":"3a582c6e8906f5b094ccf0de6cc6f4f8a54b05a34f52517aba5c9c7f704f6b28","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"72ce5b734c05da85c85a6f6dc05823b051d6aa41acaedeeb1d17c72f3b4efa72","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"9443967db823b66d1682be7fc66392be7c7924e10c3e54900f456341e94591a6","impliedFormat":99},{"version":"424f71d1fae96ac2e878af92345bb87bea1d29f757228fbc190133b305643f2c","impliedFormat":99},{"version":"61bb64660ee150f3ab618340e15cca0a81664801bede7c966ca0eca3a952fe63","impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"ec0c42bb0f465e4993f2bc68a6ce9df9a2dcbc7b83e21748f82f1b69561938e3","impliedFormat":99},{"version":"f50ff37a9cbbe74475f426474d9827083c7c2c138a954d28f1690df338f69291","impliedFormat":99},{"version":"61fd6c17235d530c40f543dd7c40afab091d91c1ef890baeed30db6d82b04b28","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"091767bc841f937654ed597d49e023ed59850355e746ae1a6f20ab31076ee1fb","impliedFormat":99},{"version":"19c6d6135af59693698d384050b45a8a049493500add442f58e4bd7c8a255ab6","impliedFormat":99},{"version":"6a0dba12d55314638a8c51108b20fe2f68f1364a619d098918bda91c22dec154","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"5c935b7fc4ddc1410ea1cd7cd4e35ed106a6e4920dd27a9480a40fd224359dc3","affectsGlobalScope":true,"impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"ed9bb55ddcbebd5cb3eee991f57ff21438546ee40ee1c310281bd12a6c7cf65b","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"437b7613a30a2fcde463f7b707c6d5567a8823fbc51de50b8641bf5b1d126fad","impliedFormat":99},{"version":"4ffba3c5848b4fe62ee59b754fd5f256ad9656a0db6d37b9a2a8cb40dfc7ac21","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"59e5e964b84fdb2378e9455e4e59405030e4ed2b4c6f891ce395f17796af3cbb","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"90ba95a763101bb61b8a799731a2ed60b5016b8135c1a2d5186862d4b534d4a1","impliedFormat":99},{"version":"63ea959e28c110923f495576e614fb8b36c09b6828b467b2c7cd7f03b03ccf9f","impliedFormat":99},{"version":"1601a95dbb33059fc3d12638ed2a9aecff899e339c5c0f3a0b28768866d385b4","impliedFormat":99},{"version":"56fc978580577d30f4c2cdb5b1eb9217b66ed66537dd27141256f426e4b8dd68","impliedFormat":99},{"version":"2c5413050a2580becf9d82dd7e3006b95623e96f145356bf73230cd635352f70","impliedFormat":99},{"version":"7cd92bc6808967f175063fce65f8d1d60a07d752b79ed20aa2eba9a2b8ed0820","impliedFormat":99},{"version":"59de9e07114b1da6421bf15359a951f1b762cb19c3a6abfc2e671a5ac2599dff","impliedFormat":99},{"version":"84e977ab810a75dc103b38cad1e019d3ab8f4ec9042b8f09f117b7d18c4076f0","impliedFormat":99},{"version":"9b98988fc27cbf7f08598871f275999540bcc267a8a47453866a198f93601959","impliedFormat":99},{"version":"2b1795d67cf9aa20167c72d795d4db6badea9cea646d9181869b5ca08c778479","impliedFormat":99},{"version":"860bedc71ead192ea4a0ea5ef4686e65724d14b391ebd1a6671a7044e6bd8e15","impliedFormat":99},{"version":"7c0a845bee4a084cbb8654709f48e5f13e2f6d45e5e2dde7c57cadf79fd9e3d5","impliedFormat":99},{"version":"07ad8a597ac75084e3dd9f9fadf5e8d7ccdcfe2f0c94ea0cf1cd8aa027a6c46e","impliedFormat":99},{"version":"94ddb4a2bb0c69e8efea22c58c2b6f84017eba469a4e433f5396ea8619d051cb","impliedFormat":99},{"version":"e903e44f2e300eea6d162c5481ef5cef28e18c3c7e165740090a65be6c80f437","impliedFormat":99},{"version":"632711a108accd4533a327ac3b60d0518fa536dfdc2d9e146222c16aa348506e","impliedFormat":99},{"version":"81b5530dfc39e1946dd771dd5526b84710e11d6a371812b1dc2e8eef9e12aa61","impliedFormat":99},{"version":"50230eca200a864bc52fd87a82c6085f1bcac19bf9865d98c3ec1d9b5672c118","impliedFormat":99},{"version":"cd71a7eb14e09b7962e8955c6b0376be99044d814e7d60d7d1e9d095716b89f3","impliedFormat":99},{"version":"e08660f21d0e8b367414e78706ae69a19b078fb67b0fe8c818ccaeeeedc00272","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"82919acbb38870fcf5786ec1292f0f5afe490f9b3060123e48675831bd947192","impliedFormat":1},{"version":"e222701788ec77bd57c28facbbd142eadf5c749a74d586bc2f317db7e33544b1","impliedFormat":1},{"version":"09154713fae0ed7befacdad783e5bd1970c06fc41a5f866f7f933b96312ce764","impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","impliedFormat":1},{"version":"a91c8d28d10fee7fe717ddf3743f287b68770c813c98f796b6e38d5d164bd459","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"f6f827cd43e92685f194002d6b52a9408309cda1cec46fb7ca8489a95cbd2fd4","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"a270a1a893d1aee5a3c1c8c276cd2778aa970a2741ee2ccf29cc3210d7da80f5","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8926594ee895917e90701d8cbb5fdf77fc238b266ac540f929c7253f8ad6233d","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"ed8763205f02fb65e84eff7432155258df7f93b7d938f01785cb447d043d53f3","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"d4a5b1d2ff02c37643e18db302488cd64c342b00e2786e65caac4e12bda9219b","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"36eb5babc665b890786550d4a8cb20ef7105673a6d5551fbdd7012877bb26942","impliedFormat":1},{"version":"fec412ded391a7239ef58f455278154b62939370309c1fed322293d98c8796a6","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":"93c3e73824ad57f98fd23b39335dbdae2db0bd98199b0dc0b9ccc60bf3c5134a","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"8324f3861a7a8db0f9d294f6a189182b2d231840cebb7f3ea5f4635773cdaf41","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},{"version":"72ef861333c7870a29fc0e248129c4afc0741c0716a74c3da409d05e41ff1322","impliedFormat":99},"49641a5eaa0ab31c12d312d53b724213afccbbbcc8e43a1119479d5e71858e61",{"version":"168aa44771e55cda628eeb5fbb6f626f6f263d827967b119e8c06abd7f1362ec","signature":"435a1e418e8338be3f39614b96b81a9aa2700bc8c27bc6b98f064ff9ce17c363"},{"version":"064499a671b662b25675beccdd04fb0bdebb6bd49bdb90d448e4b1ce3db20526","impliedFormat":99},{"version":"7bbff6783e96c691a41a7cf12dd5486b8166a01b0c57d071dbcfca55c9525ec4","impliedFormat":99},{"version":"54460343eae2288e42a041a096da60709dc8150684cb79679770b68a46a33601","impliedFormat":99},{"version":"2faebfa830ae4cfbfb58e48b0ec20a2a63882d776f0ca36ec7155d45cf1b7f2d","impliedFormat":99},{"version":"b478fad6cb2c66bfbfc027983240b416a7733013f878056ba92cf809020018a0","impliedFormat":99},{"version":"622f26fa1529ee0876a3b65d8771888bf0824f00f86784c2897e9448c396283a","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"},{"version":"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","impliedFormat":1},{"version":"f329dfad7970297cbf07ddc8fce2ad4a24e2a3855917c661922ef86eb24dd1f1","impliedFormat":1},{"version":"841784cfa9046a2b3e453d638ea5c3e53680eb8225a45db1c13813f6ea4095e5","affectsGlobalScope":true,"impliedFormat":1},{"version":"646ef1cff0ec3cf8e96adb1848357788f244b217345944c2be2942a62764b771","impliedFormat":1},{"version":"3cfb7c0c642b19fb75132154040bb7cd840f0002f9955b14154e69611b9b3f81","impliedFormat":1},{"version":"8387ec1601cf6b8948672537cf8d430431ba0d87b1f9537b4597c1ab8d3ade5b","impliedFormat":1},{"version":"d16f1c460b1ca9158e030fdf3641e1de11135e0c7169d3e8cf17cc4cc35d5e64","impliedFormat":1},{"version":"a934063af84f8117b8ce51851c1af2b76efe960aa4c7b48d0343a1b15c01aedf","impliedFormat":1},{"version":"e3c5ad476eb2fca8505aee5bdfdf9bf11760df5d0f9545db23f12a5c4d72a718","impliedFormat":1},{"version":"462bccdf75fcafc1ae8c30400c9425e1a4681db5d605d1a0edb4f990a54d8094","impliedFormat":1},{"version":"5923d8facbac6ecf7c84739a5c701a57af94a6f6648d6229a6c768cf28f0f8cb","impliedFormat":1},{"version":"d0570ce419fb38287e7b39c910b468becb5b2278cf33b1000a3d3e82a46ecae2","impliedFormat":1},{"version":"3aca7f4260dad9dcc0a0333654cb3cde6664d34a553ec06c953bce11151764d7","impliedFormat":1},{"version":"a0a6f0095f25f08a7129bc4d7cb8438039ec422dc341218d274e1e5131115988","impliedFormat":1},{"version":"b58f396fe4cfe5a0e4d594996bc8c1bfe25496fbc66cf169d41ac3c139418c77","impliedFormat":1},{"version":"45785e608b3d380c79e21957a6d1467e1206ac0281644e43e8ed6498808ace72","impliedFormat":1},{"version":"bece27602416508ba946868ad34d09997911016dbd6893fb884633017f74e2c5","impliedFormat":1},{"version":"2a90177ebaef25de89351de964c2c601ab54d6e3a157cba60d9cd3eaf5a5ee1a","impliedFormat":1},{"version":"82200e963d3c767976a5a9f41ecf8c65eca14a6b33dcbe00214fcbe959698c46","impliedFormat":1},{"version":"b4966c503c08bbd9e834037a8ab60e5f53c5fd1092e8873c4a1c344806acdab2","impliedFormat":1},{"version":"3d3208d0f061e4836dd5f144425781c172987c430f7eaee483fadaa3c5780f9f","impliedFormat":1},{"version":"34a8a5b4c21e7a6d07d3b6bce72371da300ec1aed58961067e13f1f4dc849712","impliedFormat":1},{"version":"ad763fa0c24ede2b818eb6598c12dd581451f94688fb9ed963beba20d513a7ec","signature":"90ec9100c29e008c3d9194acd818e2cfa6dc6e177154bc8e10c5959aa35619ed"},{"version":"b7ca2f47522d4ea41e65ff92c4c6dd9c4c8260da7c456a7631a9c88dc056b4d0","impliedFormat":1},{"version":"4f01e4d0959f9125b89e5737eb1ca2bfa69fd6b7d6126eba22feb8b505b00cde","impliedFormat":1},{"version":"4363a1adb9c77f2ed1ca383a41fbab1afadd35d485c018b2f84e834edde6a2c7","impliedFormat":1},{"version":"1d6458533adb99938d041a93e73c51d6c00e65f84724e9585e3cc8940b25523f","impliedFormat":1},{"version":"b0878fbd194bdc4d49fc9c42bfeeb25650842fe1412c88e283dc80854b019768","impliedFormat":1},{"version":"a892ea0b88d9d19281e99d61baba3155200acced679b8af290f86f695b589b16","impliedFormat":1},{"version":"03b42e83b3bcdf5973d28641d72b81979e3ce200318e4b46feb8347a1828cd5d","impliedFormat":1},{"version":"8a3d57426cd8fb0d59f6ca86f62e05dde8bfd769de3ba45a1a4b2265d84bac5a","impliedFormat":1},{"version":"afc6e1f323b476fdf274e61dab70f26550a1be2353e061ab34e6eed180d349b6","impliedFormat":1},{"version":"7c14483430d839976481fe42e26207f5092f797e1a4190823086f02cd09c113c","impliedFormat":1},{"version":"828a3bea78921789cbd015e968b5b09b671f19b1c14c4bbf3490b58fbf7d6841","impliedFormat":1},{"version":"69759c42e48938a714ee2f002fe5679a7ab56f0b5f29d571e4c31a5398d038fe","impliedFormat":1},{"version":"6e5e666fa6adeb60774b576084eeff65181a40443166f0a46ae9ba0829300fcb","impliedFormat":1},{"version":"1a4d43bdc0f2e240395fd204e597349411c1141dd08f5114c37d6268c3c9d577","impliedFormat":1},{"version":"874e58f8d945c7ac25599128a40ec9615aa67546e91ca12cbf12f97f6baf54ff","impliedFormat":1},{"version":"da2627da8d01662eb137ccd84af7ffa8c94cf2b2547d4970f17802324e54defc","impliedFormat":1},{"version":"07af06b740c01ed0473ebdd3f2911c8e4f5ebf4094291d31db7c1ab24ff559aa","impliedFormat":1},{"version":"ba1450574b1962fcf595fc53362b4d684c76603da5f45b44bc4c7eeed5de045b","impliedFormat":1},{"version":"b7903668ee9558d758c64c15d66a89ed328fee5ac629b2077415f0b6ca2f41bc","impliedFormat":1},{"version":"c7628425ee3076c4530b4074f7d48f012577a59f5ddade39cea236d6405c36ba","impliedFormat":1},{"version":"28c8aff998cc623ab0864a26e2eb1a31da8eb04e59f31fa80f02ec78eb225bcd","impliedFormat":1},{"version":"78d542989bdf7b6ba5410d5a884c0ab5ec54aa9ce46916d34267f885fcf65270","impliedFormat":1},{"version":"4d95060af2775a3a86db5ab47ca7a0ed146d1f6f13e71d96f7ac3b321718a832","impliedFormat":1},{"version":"6708cd298541a89c2abf66cceffc6c661f8ee31c013f98ddb58d2ec4407d0876","impliedFormat":1},{"version":"2e90928c29c445563409d89a834662c2ba6a660204fb3d4dc181914e77f8e29d","impliedFormat":1},{"version":"84be1b8b8011c2aab613901b83309d017d57f6e1c2450dfda11f7b107953286a","impliedFormat":1},{"version":"d7af890ef486b4734d206a66b215ebc09f6743b7fb2f3c79f2fb8716d1912d27","impliedFormat":1},{"version":"7e82c1d070c866eaf448ac7f820403d4e1b86112de582901178906317efc35ad","impliedFormat":1},{"version":"c5c4f547338457f4e8e2bec09f661af14ee6e157c7dc711ccca321ab476dbc6d","impliedFormat":1},{"version":"223e233cb645b44fa058320425293e68c5c00744920fc31f55f7df37b32f11ad","impliedFormat":1},{"version":"1394fe4da1ab8ab3ea2f2b0fcbfd7ccbb8f65f5581f98d10b037c91194141b03","impliedFormat":1},{"version":"086d9e59a579981bdf4f3bfa6e8e893570e5005f7219292bf7d90c153066cdfc","impliedFormat":1},{"version":"1ea59d0d71022de8ea1c98a3f88d452ad5701c7f85e74ddaa0b3b9a34ed0e81c","impliedFormat":1},{"version":"cd66a32437a555f7eb63490509a038d1122467f77fe7a114986186d156363215","impliedFormat":1},{"version":"f53d243499acfacc46e882bbf0bf1ae93ecea350e6c22066a062520b94055e47","impliedFormat":1},{"version":"65522e30a02d2720811b11b658c976bff99b553436d99bafd80944acba5b33b4","impliedFormat":1},{"version":"76b3244ec0b2f5b09b4ebf0c7419260813820f128d2b592b07ea59622038e45c","impliedFormat":1},{"version":"66eb7e876b49beff61e33f746f87b6e586382b49f3de21d54d41313aadb27ee6","impliedFormat":1},{"version":"69e8dc4b276b4d431f5517cd6507f209669691c9fb2f97933e7dbd5619fd07b7","impliedFormat":1},{"version":"361a647c06cec2e7437fa5d7cdf07a0dcce3247d93fbf3b6de1dc75139ff5700","impliedFormat":1},{"version":"fe5726291be816d0c89213057cd0c411bb9e39e315ed7e1987adc873f0e26856","impliedFormat":1},{"version":"1b76990de23762eb038e8d80b3f9c810974a7ed2335caa97262c5b752760f11a","impliedFormat":1},{"version":"5e050e05fe99cd06f2d4ad70e73aa4a72961d0df99525e9cad4a78fa588f387b","impliedFormat":1},{"version":"4ff327e8b16da9d54347b548f85675e35a1dc1076f2c22b2858e276771010dd2","impliedFormat":1},{"version":"f767787945b5c51c0c488f50b3b3aeb2804dfd2ddafcb61125d8d8857c339f5a","impliedFormat":1},{"version":"14ab21a9aeff5710d1d1262459a6d49fb42bed835aa0f4cfc36b75aa36faddcd","impliedFormat":1},{"version":"ba3c4682491b477c63716864a035b2cfdd727e64ec3a61f2ca0c9af3c0116cfd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b222d32836d745e1e021bb10f6a0f4a562dd42206203060a8539a6b9f16523f0","impliedFormat":1},{"version":"a3f6d8995864820a0207b7ef4ce1ed6a8dd2fccc7e70d015da15034807c38e1c","impliedFormat":1},{"version":"651df11341eff0b769fb83af75b1872e6cedf406674c5eaa2650551aceb5a816","impliedFormat":1},{"version":"774a466295d26eddab911b9f567040364e7b7d0eb8003ad3bfc92b97eeecf066","signature":"f15b4a91c10bf30ff3708a5e3968c0a52ca4e86a4b9a5b1c4fc8e9b5f1292f21"},{"version":"1e9d4c3b066e0228765cef074a9bf49d0b8d3af461c97f2c511e8f7110b56235","signature":"e59faabf094dd75dcf08847ca1b8ae16daf269ca02c744c521b38ed5d297578c"},{"version":"9e8f19cd697c9fdfeadb3559f0ca26514075f7054ae1ba17e8fbc8684d12eb5a","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"46fbec06cd7fe845803db91db5a9bf5b2aa8c369d58546fd01af3846e7862be5","signature":"6c1a92ef7e824a897b9a0b64e42cefce8d9d68df35769f9c37df64ded70b9b6b"},{"version":"16992ee74b4badfbf4ca9f7833b1db0850d0b1f10ea546376b5946bba6ab8401","signature":"29f8c555f5371153c1c3ec0d64235c1650b52cec47431ec93b6c629b994a10a8"},"9dfe98d745dfc706198852e032c3c936092a4484951872c0d18639cf2ab698cf","44310bdd7b563dd9b2df0e1b0c45a789492e6620b4718778fca88e029f1765f5","030523c514236148e0f25975ef74b2490c391cb9596cd668728f7db5b0702e08","4109b1fb0cffaf1f2bcaaecb49378d7971b795502484bc2dbe0d4deae60c8057","ca52a606c31ddaae5f7c4055fccb3563cf7e85601c96dbf28b7d0795d2d21af0","edadad7db67a0db1a7d474ab075cc15b975d78780218a1860e14516208d7389c","78b3214dba4e86c41e4cdf5de5dcc853806ff74fad5df3dc1087cdbe19ad00e0","37702123f9a2c93d39aeeec210394811ee157b6e32b600c5e083d271370f7733","45b82fd88270dd3d0aff39220b341eca789f77c82813dc6695b2058479d8dc28","15631c00468c358645d55b6267edf935ab0e94dea8748d619ae23a76f7388912","f212078a0ecefabbbbc627b89e28c871b559c1c57a4dcae32c8d7c2b6c4f0a00","ec4e1ceba158e76dce8afd51f6b13caa6b67fe8e9d0c0686448b77fb76586adf","cadbf01db107d2e9cceb5ecdd3f8f0084d996f07f2fca714409247deb26f0b85","a1d1b662c8d1e1d8a20612adb2c4cecd718f3b0e57d283cad95afbee8a61d132","ea7a4796f350344bbf39b19518d78169bd66a819f787b0a4d1a6ad642dbce7a2","1941ed0a7c9ff9106612c8fcc6ce92f24d656769a5d739599e4a6c34ad478df0","cc5bfa36a8f86eea23a84b78f27ba0f842426cefb5a13d4b53b80a331aaaa268","246ed9157ed5791bffc9037a1aa2a1b709a0fc75e67102d13e71d899dbbb5e0a",{"version":"75a875043a662ffade16701ad69cbcdaecacb7c7275ab8b168bd5706708d5dfd","signature":"959594ee2bcc74404b29a3049c85d0c7f2ae48df7e2b725160708a4a725fda88"},{"version":"5c7afbe31fb1e68671c798cfc06221cbade2f174e243566cf5b8fd0763e4ed52","signature":"233c0355b5b37601f3d2cb2fb9b35829c28220fbf3acc7314eb1d67509c3a2ce"},"4eb3fab1f6f7bcd67fe24efba9711e8795f20fda1ed645daf9eca7c959525f13","f1e664bce5ec40a94547de5403ddb13dd6b7515644a01a3dd329e4d35ae5fce7","fcc8fb0967eda9256921f3cfc521d49f3d473232d4c754c09de1d50faa996e35","b28e8eddf4e5bc7659dd8369e31a71ee482d55ecfa6b84831fcc80228518b701","efc9950dd0b6c0d590983a7a3f06f78b7d675f044758915eaecbbdeabfe26c54","b48a0e01738f45c64a2699efde89f826c5b7e75f58ef166e118bacdd74141a11","a49834737f1a54497bd765162a2f67aeb4274624f8a21436f976f60f3f6c7677","1f543d42652e4deeb94b0fb142643313881285fc2e87e9bc6f593532758b643f","889feac7dca6c525b2523526145105b2bc961a053e8f814916377bc1342dd1b2","204a0be7a5df6e2634afe467bc8c545aa6172065a4309f08bbcc146e1420f6df","a074bb6e2a1ece6712692135e1e3ebee82114c27032a9f77b422e7c0d509d3cf","b93da19dd21d7f80514faeb0c456773e77dc72effd3b9d5c280f65865bdfed4e","962635d6878660c1918592107ee950a1dab1ca120ae5af9948a1bf94aa58d43a","e068d3e062e5b42512f716737a30df030a9c9114e61769ecea1aaeee34739f76","d7226f89698ea8cfadb13908323d88d5e2fba9763a52e654ea675eab9e4283b5","e5c88580b8dd265d96cdde50f44aa51f5bf32486943e9088f38e1036771b69d4","7d28453729dd1e665df5f8f2480a0a851ab4d4b4572d239d261906dc2f06446e","d3bd5bae3decf12717e1be4ccae36eadfe82b9450733b93065abeddb647c53a2","1008e6f116f8169e368d70feccb510f8400b9fb204a699cd25cfeee835c88cc6","4455c74ed4fddb9ae9ba8eb37188fa934b6cf7fcd005053ddfb7dae7e5a6f072","3eb6dafdd02c962b39b09be9e31c695603b58c794e141d4eed2f49318f0af433","9b44504aab0385b4934bf502c8c06a5540c50a0090a34f4c2fb50e43e03f5505","1f08dcb29ad688246447d04e3b7e2d5dcf65311c36c09db4bce1bca316f0201c","61cb83a110e7a89d2ad5a0a4bd91fadb619619a98a16437189a856b51e1e9e0d","a794572bfb0885ec1de20b701e498a415c0480e4fb6c20dbaa125b374ae691cb","1b5be2e53f79f1f20967a235c011841152b2ca9f79b3b0640468ba8a8cf5cd7c","016e4353e0414c98c2ed2eb75df1509a38b457ddf000e9ff98125f82ea42c335","f76cdd7b076354cf26a7414ce5ebcef0a2a3384fdb6e406d4976c522349b6c93","3ef6579bdd5883302539b5370c5670331f3584dff9e2ef14bab39991f00a29cb","325d7dc15c789cc6358327f36e7cf2a916e969017c2b78decf9475af91dc86c3","3b642738f6cd019494d207949a63b67b6ad9013bb3f1fb5f8fa36687879db5c4","492bb2bed9c43e010cd0a50263969a75a72c6279f67654a6bb7def1a9cf74571","35a644763f50424937b17109eb552ddc767270a5526a0a827810ab86585dc53a","2e8ff3406c54b9e6ab83cde71a8e02eec9796f58626bfb39825d11e4e03d8bbb","eac3a35ef0fe0ab083e8cf36a29a821e014dce98f56d597ed2dd815ff4cace46","628364563c513db63865187fbf6afd635d3dc6cdbb8472e639a2c60fc3c13b86","8cfd8deb7451cb77bb467c2270e48363567984471451179e8ae2e28d48859967","3c5b8edf66216a1daebc8d8c245a35bbcf716bf0d854d5294b1e716be42a66c3","c81045d6db59c1c83c84797bc1f78422a691ced9ca9a3554e2f8ef9aacc7dcfa","0496434a31fc8cf9e490e135e87ec3202dd0298290fcffbfbe4d93b3c180756d","bce05280900b4eb3333d10064531569c9fcfce6aa7aeca1ca03b2120539892a5","13c1ff47b7b02fad7d84109dc37613ba445a7a084561485dc9aef335c4c94a84","f5a22523635ca6f47c20b386b010ca1258aa19af5f4299f8752809c599315bcf","4895c3e936eb6d99b94541c611983585d9b5d805ff5a83b8f710e27f52dbafed","4f8f48136b4a2c472edf03e168e658ac758173fb38773f7849009ee0b39a81e5","cb12e3fd9be59bf0e28d6f18ebecbb52f8bd90258cf6dd2af77f7b12545a45bf","1bbd283b943af0cce0c72cde1e843e55093235b7dd3fa7d22dbe957039c0ec76","4f69209ce0e934946c859c4cc6248ef4a2dc528f5baf9b4fcdea5cf3e08d9d38","b1a319734a490e072da3cdb0e53c3d90aa63250323e29ef7d7d554acf5a174d1","8e79adf7f7c76bf3874257d3692b76744e5a6784c91cd27f93c30a8a5cc842eb","117c70fd7a19a5369ac35034f89ab731c6f6629d791e35334fb307b7042f89a7","ad15d915012090304670ff62dd5e48d7694c11787f4884f51cf80f873dd40aa4","38786de27bad4d667abb5f948b2357fce8de7448a52feb500965735a5f3a5a6e","fb5ce2f104fde415289b4febf27da970e40afefe42b87b15db28818ca9f94132","cb504109f1c6b549fde2eed46b44eaedb73ee7754b3f3a1c1c32bc5dd1693a8c","3613723853e81414c2e1220e3e0a696a997cc49e4390060b6ac7fd91aec150e4","d63995951dabffa413e3114fc0d39108a1c183939ef54616a8019d6061ad0651","082900437524e8bc6903f0d26479f590af1814cc5080fc502e07d38c951500be","1bbff9fec02470dc8837722310fbcb7de786f75d442f3e3116a291dba247caaf","34eb44fd7813a487540b6afa04da3175388b1841aa3612569e8aa07652363b69","fb371cac529d70b2eb453e41a785acab5429502dbc8655db1bd8ad27e0808825",{"version":"5a2cdf6adeec348bbc876221be4367e8adff0bb78a5680ebd7d71e5c3bad6cc0","impliedFormat":99},{"version":"e004826eac62081f867c66dabd92d3ef7d126d93a70430a2c88429228c3ecc50","impliedFormat":99},{"version":"38d6857b58d2ac42442e396311c542062d4f0dad40f2adb496dd5fd0756ee400","impliedFormat":99},{"version":"34b7d1e2d15845cf08bcf5e3c01adbb92cea1ec27564ee249ba486cdfb28526c","impliedFormat":99},"99fb0714ec56758692403802f60e7088c75072a65b3bb54eba67b1e805acee18","9cf4f624ebba32c2bb7835548bf3bc5992501727db2ebdbc3a419d6be5350e3f",{"version":"c3d577953f04c0188d8b9c63b2748b814efda6440336fa49557f0079f5cf748a","impliedFormat":1},{"version":"787fe950e18951b7970ec98cb05b3d0b11fcdfeb2091a7ea481ac9e52bf6c086","impliedFormat":1},{"version":"13ceda04874f09091da1994ba5f58bf1e9439af93336616257691863560b3f13","impliedFormat":1},{"version":"5dad918287439ecd3d345cde1f8a60a7f0676d3b3d8aba49eb14386b35ea6e21","signature":"b41f35e5ae414583d72cc2aa3a17cc23d40f4b9e221f92acd74ed09bb3daaa63"},{"version":"9dcddf4e523bdf8938e8490390a84f95fedd295f126b14fb5fb75aea82d8c1b8","signature":"02246963bc8da857256b5a7f5c87ca46af5e88d192fb8de6b14c843f8018a0e4"},{"version":"86ddf4ebceb8bce634456e3e156d58f7521f71c18d2003be32a4de31b5dd2942","signature":"2cd90413561467d2c4c6be6a053979d8b94eafc3e38dfa52d3ff61131067a293"},{"version":"e8e2715cfbe0f1c3f6efaf1319e329f1919d8d5b47d1a713229416eeff2df002","signature":"68b7490a1bff3136af4fc97083af69c24024174ada390cd60c5d47c71fe4cad4"},{"version":"882b28abe64dae4932c83ebb71e4155da340929fe08a2055f3e573ef17f70fc3","impliedFormat":1},{"version":"4a3e425808751200a7709671667ad3d7e7cbfd0a06d469cab42adf06c2601f4a","impliedFormat":1},{"version":"401da46338f5b4f97c2a5f8a0faaace045c51aabd751d2dc704159f64feafe89","impliedFormat":1},{"version":"c705d4594093bcde53fc292c5526aedd3145170ceba73a9476ee97de6a915fe2","impliedFormat":1},{"version":"6d466c1275a10e343958cf4f62b7399bd8c580c74186621b9216866d31a3fee9","signature":"96e33f1f65f502f264076b2d36cce943078d7c66c6e8b648e3460e47b1ac50b6"},{"version":"01e869e2a849dc805147bb662e7ad3158eb7690684efff28fbe8d85b98a24d83","signature":"f7668a32206e3b649ac3fa9ac9fa8b52480ee54c932d1e043352e52348f931c0"},"8ba4077599dc474b3d418a730063b0057f7b79455dc6c098447b7c561fe8318b","059c5c0d5d54c1f19ef78d852aba6fa014c08636058ac685aec0cbfced493334","4da386b4bb26e9232cab7ffc29b6dd13e170f9139d87a624eca6bebe550348cd","ce9fa4e85d2c6d9a3be3d8d5fd1d16d1918313f99d31ad3f0560782674379646","852c367110c2934ed35a33ad276111aa9b3016ec92b36b86a37b43642ad9458d","907f713ab1a997b4c4898e631516c5addcc4ede2c2fe6c00ed8009493523631f","1f8f7fc968cd41df900a3ced1b3279273f442e9a8d9849313ad69867c07cb301","0f55b5907842f16784dca83f2c82ac05e1e8740f2ec866c95289e05061384e4b","7c8545a7c4ec6978ebb4af07475d76007eb084c4f7f45aeba7ee817eeb4316e1","c50555ef59962a30b77d29162f391e64d43ad58f0f653d9c255d51b4e9356c33","0d0861810ff9d344ab37f055edbc4d14e68e2fa18e113ce8cc33aef9bb500b5f",{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},{"version":"8658354b90861a76abc7b3c04ece2124295c7da0cc4c4d31c2c78d8607188d03","impliedFormat":1},{"version":"f1b1170112db2e1a93ea317419a35652f0e9a87ca1612674f514e6f93791d4c2","signature":"512960c0e955a2324b34354dac25e3e4d431a1af4cd33077935eda5e95c8b7e1"},"992404964e9cefb3143cde9bc8e5eb5e7010c3a207f5bfa52df49287fce758be",{"version":"968043e1fd7bb3c6b1c22d3341ede621d16a628b2bc4c35d1e43f0064ff7c1a6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"6d261c7be483027c9d281ba71314350ad8ce66efabf46f7b6099f39fe3b8d218","c02d45c2a6bc50186c1972f44c31ff22e887b30205ce84607bb4661c0fdc9846",{"version":"7fc06e1e53688bb32ccd86e730e08bacd38d9ad7ad006a234211b230825efb2d","signature":"d95aac1823e54b4183acab8f7fe3bec5dd7bd4aa297f56004fbcb972d299e377"},{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"3255b97f3f24af29c79cc1aa88004efb13b6285ebdde0a567bf32e19bb65250d","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},{"version":"c2175e53ec5b411439a03c757c499d2bb30c48bef05e83f372b5095fc2f8fb3e","signature":"2c2a937dc3435a48e0ac2cc67072dad512dc5240282c217955d3fb55e2b6a4eb"},{"version":"6c05d0fcee91437571513c404e62396ee798ff37a2d8bef2104accdc79deb9c0","impliedFormat":1},{"version":"5990e5575acfc932889f3720cf5915b1f3514d66b9d0dbcb55d2b62130b2afd5","signature":"ec851dc73402d7cce3fe5da65eb1f2e56235ce4533de1c561ea9edd6ac4b941d"},{"version":"af2d260656b2b4283e88c167b658dbf279f2832b5c5b625dc451ea04cf3ab731","signature":"1493f2b02d2b0d3a61c10e1ef4da30f36eded81b57a4480dc8e23ce2eeadc4cf"},{"version":"875a50ccdfb09cd488133676ab8d464dcc7fb4f0cf5ed07e78d4ca0c569a6d63","signature":"18d995b770cd35ebf83fe1632f8908e64ffadeee3c9aff7101bf6db902625f27"},{"version":"74bfdd5a9cf6b97dc433c172af096014fa934edbf788eda8b06547d23eb35f0a","signature":"66c6e37b8e309e7de2081eee826de0950dfecf8810b95529dd8f283ea2e71611"},"9a8f5cbe686f9815d06e1e8dc41fb79c1ea76085ac993fd1c57a8f5ec578351c","50b512f8d322aabecaf35a738ce5d8f55a47d2bf401e5a2d1dbaaf0b52b27ad8","6be6de9a5af0de2e1d1359b8055aa28967f90ff35afe8390ede427a6d376dd1a","2ab935a40ea1732892424652686f442a7212c8ed79b6dcfcff24616b63f261f1",{"version":"9da2b0eebf78cfa1a8bfda7ff79b81b488805c9b663cc313824413b402d0dc8b","affectsGlobalScope":true,"impliedFormat":99},{"version":"b51bca9749817b5ca6f945534921cff40d00fb1e44378011e8f0033ddb27a9cc","impliedFormat":99},{"version":"2e82d0ebe6ce039ec74ca4d1df4facdebda4efa23e60a6216b4176bc8f4a0aac","impliedFormat":99},{"version":"f92f4e4f821a787525611edfd46e7376c1bcb4565f70b20cc5f055b1164a8f17","affectsGlobalScope":true,"impliedFormat":99},{"version":"6cafea37fea0c60b8977c7e0d59634db0df134c7a51de02064594de3de805ec8","affectsGlobalScope":true,"impliedFormat":99},{"version":"0295c7a5d5d956391ab9bf0410e73a89e25fe26810f9a1d823cc794d682cdafc","impliedFormat":1},{"version":"19826a846db870c2261a3c4cf0695df889d9fe3eebe7775f3f5bc76fe7ad07a7","impliedFormat":1},{"version":"e04cafd03370139cdb0c846273cb19eb4264be0073c7baf78e9b2c16ffb74813","impliedFormat":1},{"version":"7c01c77fb7d8664daa64819245d785e106e0a3cb6e43da64346e4400d7fa9401","impliedFormat":1},{"version":"8c2ca98f4713d989d610fbd38a44316bc43c50aa26983e62dc31002f32ce63fa","impliedFormat":1},{"version":"ee931610d1cf7a6e666fad138187751392fc88bee931b94ac8c4571208dc7370","impliedFormat":1},{"version":"53543b3b64e624a81fc5876da6d72c94dd87655e7afc10988cf82ce7cbc74180","impliedFormat":1},{"version":"967e68e99b8a80551837321442a0e2f12ef50aa1ce567ec991ac6bf062a0c7cf","impliedFormat":1},{"version":"144ab2f3ef7404caf39c6acc88d248d7e55ab3dd1c4c0d89367ad12169aec113","impliedFormat":1},{"version":"759002d4454b851c51b3585e0837c77d159c59957fc519c876449ee5d80a6643","impliedFormat":1},{"version":"07c50b6db67b8b943aed3e410bfeebfb6d3ba1fd1e2819bc889e48f81e94ed2d","impliedFormat":1},{"version":"e3a5287471fb08f053c06fd998632792aa5f022e45278f1e6dd55fb2fa9e7362","impliedFormat":1},{"version":"28a6c8eeb48e165920067b9193555649fc43c2a28c450f23f622e5eb043d9463","impliedFormat":1},{"version":"1147c3efa5a256bcd6a3d2cfaf764185b7120bf985f8412d9bae596a0348f77b","impliedFormat":1},{"version":"490cb6f5e6c90c4eeab1d237242901fc418bd1f08345523beaccc7357122166e","impliedFormat":99},{"version":"cd4908c240506b0aa278c4c8d6bc1705acb41b03fc5b1d86a47f7a9f76f0b075","impliedFormat":99},{"version":"e663cd7abf76422500d57d6500a546fb51e79a095c23914efc33ef73a32f4f8f","impliedFormat":1},{"version":"1ac8996804c14b6ad107fa17f47cfba0f9a4e6f5bfc3ca8b6e6f6a4cfa636398","impliedFormat":1},{"version":"7a317ff3b65c289d4344ea7b6e0a9793168703a79bf1ee889b3ce379b58a54a3","impliedFormat":1},{"version":"543898906d542e8d0631f6861268286722ee148c5f847d33d01cf8bb8b56414d","affectsGlobalScope":true,"impliedFormat":99},{"version":"68ff3225eb855a861e887d0855235b5ac0dd4eacd64f4f4582e48dfde7a192ae","impliedFormat":99},{"version":"3252a756534812804c43800a431da5cae9b641d7849ced2251ac2e711920e38d","affectsGlobalScope":true,"impliedFormat":99},{"version":"06a54bbd0060db53427dd3bb3dd58e3f266a5896e84396ada2e8ff1d299a27ae","impliedFormat":99},{"version":"fabe432191f85afa382dfb08ce4519938c4365eb5c2bb2149405d88151583fc5","affectsGlobalScope":true,"impliedFormat":99},{"version":"29db2c1e2e934e0c8cdbaf8f7f5601e1b4dfdac35f0c839ebf585ab242f1476e","affectsGlobalScope":true,"impliedFormat":99},{"version":"8663fa4279da9eaddb386c1bc28de7f5b433dd2518763ebf185ed198b4b60aec","affectsGlobalScope":true,"impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"58eb22ce690f7941a952f307d51a210195798c9fbc381470fe7e0adb228d4c92","impliedFormat":1},{"version":"49a70606a1a2e65aa6daa491d863c7ff09336c69eccbfd88800bcfb487933fb8","impliedFormat":99},{"version":"3c1100ec1393484b2c486ccb4dd8c8988af1fc1c0e61c2f892e5c370e41b63ea","impliedFormat":99},{"version":"c967e03c8dbb4770f7e2f0b71b5d13593de679a41cc2b60266c4b69f1342a263","impliedFormat":1},{"version":"af5fd0c8cde550fc2c081a18517fb30954461a16daf2ed7969db3805e5a8d7d9","impliedFormat":1},{"version":"d4da3464d2c4b7d80d203ae64bb5c75a66221db5eee12a4ef2c4ce2c9d19a821","impliedFormat":1},{"version":"db820c42ed9b21f2d81ba48889aeb1317c710959346b042f07cee69a545f1326","impliedFormat":1},{"version":"695f2b1040663810ccac946cc87dea5236e3a74efb4bf5964def8961309634b1","impliedFormat":99},{"version":"8cf30ed8685586888fe2a1f781c7bf433c07422648a24c05aa4761253f8e8fec","impliedFormat":99},"0478631698204a3fb5a6162a948e616124159005c14c1416095248a5adfade33",{"version":"46e5b4c7bba4508d91d8d2b3867f4925720a5d160cf8c826a3c945826e93ec47","affectsGlobalScope":true,"impliedFormat":99},{"version":"5a636892ad5afa24b851beb4aafbe90145651d099f933ca906f1a760305e0f04","affectsGlobalScope":true,"impliedFormat":99},{"version":"a308162dc526963f9cd0b9867f65b6e89a68f87fd4db8f6c1740c39475c71386","impliedFormat":99},{"version":"d2e617c655ee5138871b3b84fb82d6b7cdd3fd4e87160e5213a7acc6b06e14f9","impliedFormat":99},{"version":"c8673badeb33eaf32b4a252830e9e99943d0e9bc8988067276b6600a838fbc32","signature":"4fd1381bd826c4fbb04cd0054ac7d2c53f1ff246d2212c263ce1a12b73eac01a"},"24b3d4a92665a6c0e7b76b45a6da52138195cc8f3a90f556586d74fcde64aa50","30ed2b7303d7126197103d88973b3a3da59148629f2435f1467670215d0022c2","8766930e75da3bc13a4560eef5b81acfb70d370616f77793b98a83f2e92aa2c2","67a4656148e1c74d57a43bb300ba8eeaf7435d364a0cb97abf326900d2bfce62","6b65f7a0c2f09243757a6c04dc03754940761536fd9581fbdcedbdca1ab31146",{"version":"c226530483794a0a83c1afb189213a2bfe109a1c0716331e5df9664471ca8d64","impliedFormat":1},{"version":"7459d85c80f2971be954b562724106b13d5a2a57e8bfde51723e94e838f6fcbf","impliedFormat":99},{"version":"c24ab9ac84d65b417a807ada25456697bb2adf1189fa80cb240625dfb3e61c42","impliedFormat":99},{"version":"03952163760a479246853f7ee56fd231d703e8d6f78deb353c7892efeef3db3e","impliedFormat":99},{"version":"0d121799b2cbac398e84a4708fcd82f980f33bf3ac7721a3cf9db9f28d9eb2b2","impliedFormat":99},{"version":"b45c2c7da9952665f78397fccb03f67535535939497b11308c9409c8505eb32a","impliedFormat":99},{"version":"9c3663fa36fb976609d8fc43372ae38dc2e066dab014a955f40ae6430733fb71","impliedFormat":99},{"version":"e38a172f8912eebc79671e07b81687a304a9d366a47933fde9f97ad79f8ac08a","impliedFormat":99},{"version":"2fbe402f0ee5aa8ab55367f88030f79d46211c0a0f342becaa9f648bf8534e9d","impliedFormat":1},{"version":"b94258ef37e67474ac5522e9c519489a55dcb3d4a8f645e335fc68ea2215fe88","impliedFormat":1},{"version":"f3aef38b4236eba6dc8305c57a73deef526acc480e86b502ef702a4a3faea496","signature":"0193b441bf83ba705815692cc642188579b3b3a8fdeceb05ec97b3e8b3dfa182"},{"version":"936a2ca9806a50b4e9be526c26e35798afa2a54e33e7ac66e63729f507f780e1","signature":"26f1753414b839143161e2cd5dc04694563b6060def71c7c557d41ad5ed670f5"},"7e3fb2cd24bad8d70f6d67a56697f75b63191e94f4d643f86a721dc045bfac64","6e6c410790a203db914fbae248cc1378bdccaedf621a521aea6849f257e104bf","22446881d2983a74363ae8793e0c5664350e0e45ab29a76bbcdc0f69187b78aa","4cb890ebe99942ea91de161ba57cced6f5d131daafc0125aea86f4aefd7fd6e0","610be97d1c2d516a9dc114dca6efa3c4fa2937ba7442cd75b4360ab4f0618d5b","f7895dc368ae934ed6a146d2069a03165f0779bf76a70a781e4854110ec75c5f","3b74ecda32d78985131688d23f103904dbe6e6b6abbc52896440e69c7db3f1e7","8ab378e14598ec82ec7ba653493d00811034e06a2b0109f2de93acc2d0dbab6a","e899a893749c662f261d553e26fd433465c9349b45db2e09ffe8ec5ad1277cdf","c0ae44cf8522b4da093b22e42469dc3bcc0f854a8e8253564e995315586eecd9","3223522b6ce796bfb9ca79c687be370296a66f064b35dd558d9a6e4f7cf8a64a","479c69aebe1b73adfea6243fa36838c99524cf8f7874edd9410cdce170be4877","9ad0e57a7360d2dd31026a63f29bca0b5fcf3f268458e6880d40511573bcf0cd","e83741e33416027c1c4452ce30f03b51873e98bc5d31285072e40bd2f7dc83cc",{"version":"0172ac349e43b46db2c895261b94b09c249d0ebb9e8655c7458137b711f02d0f","signature":"3faafdf02a62868541af7bf01d0aed7a5698fc894a120978a62ea1ad4492fa84"},"48e589080f69a8cd40fa2a08937dfd5003a4b8074620623b29906a74dc439ea6","0502599aa7d87ca66d814323d772c181cce98d96ba83112d03fbada6046fa8e7","44385d1d6a4fe4ff703bfe38267983f73c05ead7e260adc9e5abc89bb20ac800","af238051b4c996239a89cec73b7b49e013a8d12e6ca358785849599739240535","50316b5512f6223033d18e0ca00614fca74cd90210c6965c57609f5a9b77ef5f","aef39133f2f053c0b3e6a9cc9ea1f16905d965c463deb8de5c24a9764d1a0501","7cb9093ea55b4f916703f613f706cd530fc9a08754a30bcbbe5cbe1058bdcfc0","48118f50e202556762f7c6f5d5611dfd9d1c869a683c52f98feec195ba43f8b7","8bc45826c7d7e7f553304d8a4b37b072b5663a51f2d33a389dad7cf75ce03423","ea372876f98383e413c9829d44fa82ffff2fa82d74f18741ca76e17ab5a14a7e",{"version":"90f425b770bae7c83fbef9b35f16005211591e3ed59f209868ec24fc5cf31d67","signature":"3f89da23f0c251a47f8534a0b51510d1d782de69990984e592c2cc629746140b"},{"version":"7b59693c09bb678025b4d941c19e438b2e4d9ecf857935627c1ea0c52ce8a003","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"edaf68d097c0b1af14f479f354fcfa339a8b772db193c67c531228c2b20d16ac","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"6a3d6a86816c3b71308f607a824f13ec87eaa331017e59a4df22f2a1a488d2a9","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"7999dc74b57cc2dfa1640ac746bb755420a4375541732f4bff420751a375d7a3",{"version":"f90bc7dcc3efa8443876129be564fb2bd82f639fc69dd8292562585683f456d3","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"c4cff5956e1790ef385e94052a505c253e56276772476ed930e2dc7b3cb71606","96388a05b31407b5db53506560bc978dc244f57aceb42e0b5b9f18dc817ce80b","8ae95ce05f95c7483dd19442b29619e27cf7b847003720afd1beeaa8a18a8571","54a207888b3d0227ec7930a85b6692d7e645b1ef0815730d65da7c08c3ffd6f6","dd264a2a3709072636d434694bf7b2ae91d6eb1a70a3958e915ace35dd6c54f0","280d5aa87638deca867b769c75f80618eee483fab0e49cc75187773956919c9d","a21b16e26fefcf0fa3501377571130b6b1dfea4e4e39ae9ca49e5202d397d289","2f7f9fe9ef33a1305b470d58eff97c8dde754c4fc92ba23611da405694a94ae9","8263affffa2648dd249f5ba84ab1230aa73db164ef3d4052875f0c40353587db","ca37fecd6e1c3e1332f6bc8dbdf38b78435ea2eed5ef81289f39679b650ebc4a","5f5d9430c6d0b4018fb92509e36b7351f60e3bb2dd7e7325906b84a0da1a06a5","997c98da784db39942db1efa0d850088df1da2bc1a04c9c7fd90c9a2b21904bc",{"version":"39e348b373ece0f0621d887e6036e78b6eed048072b36e69d5cdd363d0aa502a","signature":"b127c955b9d61b95020ebeb44da65c30782edc9800e82ce220e085ea98e47f00"},{"version":"1bdaaa929028e63260ee0b975c2287efd7f44c1696c9673be52e412d29882012","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c7eedaba2d3be113d184bdec0b7f642fbbf23cff2747f5c6bf7159b3ddd09567","signature":"e57ae54f0d26c736de41375267018101db10f7bf5f0087b622787fe11ad0a98c"},{"version":"6a7d404a4baeec830a75fc89a760f1d5ca5fe9a95ff8931f8996d65389350281","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"9719826079648bc0d77028acb73cbd90c9721ad7d56de815742878f350cc9ce7","signature":"174f388ed9a5279a940fe654e34d517058f7105c72b6cdd16de70404e0e16745"},"495997152864d5ea9138ac650adb4e3e137c7554c48c415626690faba59d264c","4776392b08c87193d2d5ed75f1105e854544d61ce82bd30c268d23e53ae20756",{"version":"8e5a1adaae977af48997dec89d6cc6075aee453b661faf7252b4b3a44c7f2bbb","impliedFormat":1},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","impliedFormat":99},{"version":"db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","impliedFormat":99},{"version":"ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","impliedFormat":99},{"version":"f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","impliedFormat":99},{"version":"fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","impliedFormat":99},{"version":"0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"da0f84fcd93700b4a5fbf9c6f166a6cc19fc798231bff56dd1e3875bfc6966eb","impliedFormat":1},{"version":"634ff08e0143bec98401c737de7bfc6883bfec09200bd3806d2a4cfc79c62aaa","impliedFormat":1},{"version":"90a86863e3a57143c50fec5129d844ec12cef8fe44d120e56650ed51a6ce9867","impliedFormat":1},{"version":"472c0a98c5de98b8f5206132c941b052f5cc1ae78860cb8712ac4f1ebf4550ca","impliedFormat":1},{"version":"538c4903ef9f8df7d84c6cf2e065d589a2532d152fa44105c7093a606393b814","impliedFormat":1},{"version":"cfcb6acbb793a78b20899e6537c010bfbbf939c77471abcdc2a41faf9682ca1a","impliedFormat":1},{"version":"a7798e86de8e76844f774f8e0e338149893789cdc08970381f0ae78c86e8667f","impliedFormat":1},{"version":"eebc21bb922816f92302a1f9dcefc938e74d4af8c0a111b2a52519d7e25d4868","impliedFormat":1},{"version":"6b359d3c3138a9f4d3a9c9a8fda24be6fd15bd789e692252b53e68ce99db8edc","impliedFormat":1},{"version":"9488b648a6a4146b26c0fd4e85984f617056293092a89861f5259a69be16ca5c","impliedFormat":1},{"version":"e156513655462b5811a8f980e32ccd204c19042f8c9756430fe4e8d6f7c1326e","impliedFormat":1},{"version":"5679b694d138b8c4b3d56c9b1210f903c6b0ca2b5e7f1682a2dd41a6c955f094","impliedFormat":1},{"version":"ca8da035b76fb0136d2c1390dda650b7979202dbe0f5dc7eaefcde1c76dee4f4","impliedFormat":1},{"version":"4b1022a607444684abeee6537e4cace97263d1ef047c31b012c41fdc15838a79","impliedFormat":1},{"version":"dd0271250f1e4314e52d7e0da9f3b25a708827f8a43ceff847a2a5e3fd3283e8","affectsGlobalScope":true,"impliedFormat":1},{"version":"47971d8a8639a2a2dd684091c6e7660ec5909fed540c4479ca24e22ac237194e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e1075312b07671ef1cbf46409a0fa2eb2b90bb59c6215c94f0e530113013eeda","impliedFormat":1},{"version":"1bfd63c3f3749c5dc925bb0c05f229f9a376b8d3f8173d0e01901c08202caf6f","impliedFormat":1},{"version":"da850b4fdbabdd528f8b9c2784c5ba3b3bedc4e2e1e34dcd08b6407f9ec61a25","impliedFormat":1},{"version":"e61c918bb5f4a39b795a06e22bc4d44befcefd22f6a5c8a732c9ed0b565a6128","impliedFormat":1},{"version":"ee56351989b0e6f31fd35c9048e222146ced0aac68c64ce2e034f7c881327d6d","impliedFormat":1},{"version":"f58b2f1c8f4bcf519377d39f9555631b6507977ad2f4d8b73ac04622716dc925","impliedFormat":1},{"version":"4c805d3d1228c73877e7550afd8b881d89d9bc0c6b73c88940cffcdd2931b1f6","impliedFormat":1},{"version":"4aa74b4bc57c535815ae004550c59a953c8f8c3c61418ac47a7dcfefba76d1ba","impliedFormat":1},{"version":"78b17ceb133d95df989a1e073891259b54c968f71f416cd76185308af4f9a185","impliedFormat":1},{"version":"d76e5d04d111581b97e0aa35de3063022d20d572f22f388d3846a73f6ce0b788","impliedFormat":1},{"version":"0a53bb48eba6e9f5a56e3b85529fbbe786d96e84871579d10593d4f3ae0f9dba","impliedFormat":1},{"version":"d34fb8b0a66f0a406c7ce63a36f16dda7ff4500b11b0bd30a491aa0d59336d1f","impliedFormat":1},{"version":"282b31893b18a06114e5173f775dd085597ca220d183b8bd474d21846c048334","impliedFormat":1},{"version":"ed27d5ce258f069acf0036471d1fbb56b4cb3c16d7401b52a51297eca651db62","impliedFormat":1},{"version":"ec203a515afd88589bf1d384535024f5b90ebe6b5c416fb3dcca0abd428a8ba4","impliedFormat":1},{"version":"32a2a1374b57f0744d284ca93b477bd97825922513a24dfe262cbf3497377d96","impliedFormat":1},{"version":"a8b60d24dc1eb26c0e987f9461c893744339a7f48e4496f8077f258a644cffab","impliedFormat":1},{"version":"3f9df27a77a23d69088e369b42af5f95bcb3e605e6b5c2395f0bfcd82045e051","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fd080a9458c6d6f3eb6d4e2b12a3ec498d7d219863e9dca0646bdee9acce875","impliedFormat":1},{"version":"e5d31928bee2ba0e72aeb858881891f8948326e4f91823028d0aea5c6f9e7564","affectsGlobalScope":true,"impliedFormat":1},{"version":"9a9ba9f6fd097bb2f57d68da8a39403bbe4dc818b8ccd155a780e4e23fa556f2","impliedFormat":1},{"version":"e50c4cd1f5cbce3e74c19a5bbf503c460e6ae86597e6d648a98c7f6c90b596dd","impliedFormat":1},{"version":"fa140f881e20591ce163039a7968b54c5e51c11228708b4f9147473d06471cf5","affectsGlobalScope":true,"impliedFormat":1},{"version":"295eca0c47be1191690fd2fe588195fff9d4dc43852aceb8b4cab2aa634579f0","impliedFormat":1},{"version":"59ee7346e19b0050508a592702871dc943083c6dcb69a47d52e888115d840781","impliedFormat":1},{"version":"067712491fb2094c212c733dd8e2d56e74c309a9ce9dac9e919286b7245a1eb4","impliedFormat":1},{"version":"a5eae58ac55bd30c42359e4b01fb2be5eddac336869d3f04ffb4daa54b58f009","impliedFormat":1},{"version":"d12d691ef8933e8db39f2ca81d6973940ff5e37bb421752f5b6e7bc15dea3abf","impliedFormat":1},{"version":"4c5f8bd9b3a1aae4e4fddfee41667e495a045f73ed603993038fa6a8ba92fa14","impliedFormat":1},{"version":"dfb274ab0f319cf18ce7152067c25f984c7fd1924fc72b3f66734588444c934a","impliedFormat":1},{"version":"108c8c05cbc3fbbbd4ff4fc0779c9bef55655c28528eb0f77829795dc9f0b484","impliedFormat":1},{"version":"a7e5444d24cdec45f113f4fb8a687e1c83a5d30c55d2da19a04be71108ad77bd","impliedFormat":1},{"version":"41ec17e218b7358fcff25c719bc419fec8ec98f13e561b9a33b07392d4fec24c","impliedFormat":1},{"version":"23c204326746e981e02d7f0a15ab6f8015f9035998cb3766c9ddbf8ea247aea2","impliedFormat":1},{"version":"25f994b5d76ce6a3186a3319555bbba79706dac2174019915c39ac6080e98c7e","impliedFormat":1},{"version":"dfa4e2c6a612d43851ccbc499598cb006a3a78bc8c7f972c52078f862fa84e47","impliedFormat":1},{"version":"02c1705fa902f172be6e9020d74bcd92ce5db8d2ef3e1b03aabc2ac8eb46c3db","impliedFormat":1},{"version":"99d2d8a0c7bb3dd77459552269a7b5865fa912cedab69db686d40d2586b551f7","impliedFormat":1},{"version":"b47abe58626d76d258472b1d5f76752dd29efe681545f32698db84e7f83517df","impliedFormat":1},{"version":"3a99bbbbbf42e45c3d203e7c74f1319b79f9821c5e5f3cdd03249184d3e003ce","impliedFormat":1},{"version":"aaacc0e12ab4de27bdf131f666e315d8e60abec26c7f87501e0a7806fc824ae6","impliedFormat":1},{"version":"3b4195afd41a9215afc7be0820f8083f6bd2e85e5e0b45bb0061fb041944711e","impliedFormat":1},{"version":"108df8095f5e25d7189dd0d1433ac2df75ec40c779d8faf7d2670f1485beb643","impliedFormat":1},{"version":"ddd3c1d3c9ff67140191a3cf49b09875e20f28f2fc5535ae5ea16e14293a989b","impliedFormat":1},{"version":"7b496e53d5f7e1737adcb5610516476ee055bf547918797348f245c68e7418fe","impliedFormat":1},{"version":"577f44389d7faedd7fc9c0330caf73140e5d0d5f6c968210bff78be569f398a7","impliedFormat":1},{"version":"3046c57724587a59bceefadd30040d418e9df81b9f3cfd680618a3511302ed7a","impliedFormat":1},{"version":"15ccc911ed15397e838471bfe6d476c28deffe976c05cb057e6b1ea7491242c2","impliedFormat":1},{"version":"64b5a5ebdaead77a9a564aa938f4fb7a45e27cda7441d3bee8c9de8a4df5a04f","impliedFormat":1},{"version":"a48037f7af5f80df8973db5e562e17566407541de284b8dadf1879ea3aed8a2f","impliedFormat":1},{"version":"dab97d96ce986857150db03f0d435b44c060d126b4a387c7807f4e9f6c92e531","impliedFormat":1},{"version":"85f39366ea7bc5e34b596fc97de18a7e377856755e789d8e931054f2191d9b8b","impliedFormat":1},{"version":"daf3ea3d49f6e8a2fa70b7ca1f21bd97f1b65021b31fbfccb73dd55f86abb792","impliedFormat":1},{"version":"b15bd260805f9dd06cd4b2b741057209994823942c5696fd835e8a04fb4aab6b","impliedFormat":1},{"version":"6635a824edf99ed52dbd3502d5bce35990c3ed5e2ec5cef88229df8ac0c52b06","impliedFormat":1},{"version":"d6577effa37aae713c34363b7cc4c84851cbabe399882c60e2b70bcbb02bfa01","impliedFormat":1},{"version":"8eaf80ad438890fe5880c39a7bbf2c998ce7d29d4c14dd56d82db63bd871eefb","impliedFormat":1},{"version":"9b3e7f776f312c76ac67e1060e5398d7ac2c69d6a3a928a9daaae2eb05b15f56","impliedFormat":1},{"version":"202042eccb4789b7dee51ba9ecab0b854834ea5c1d6a3946504bfc733d4468c3","impliedFormat":1},{"version":"2b2ef76a9f36094b07ee6f76a5ac6903f2f65c0a20283201814a8d1e752cb592","impliedFormat":1},{"version":"8882e4e087d0bc8cc713cb3d8090c45d33e373e6f5c83e0f8d00fe6a950ef875","impliedFormat":1},{"version":"0cf60f081761b337853493462a9d5626b11fe7b02a019d86c7b21628b5f928f5","impliedFormat":99},"874f98710d165b57706e68644ea48a666fc079883b95ae0159de057bfd74e2c5","9046da5fdd6a468646f77a346a7c35e72cd86f6ab306caf9193ccef492a1b4f2","ad42288f8c9ebfd4451e4256a2f091cfc26b958d29db3612c19efbbb476882a2",{"version":"59b54146333f3ad62db9f636c988f09378b61c55c4bde0541602011d458a1ca9","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"b7724c5f8c92bf25a109abae1de5f939f4b2f08421c288329bbc01bcc515a265","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7","33881782ee0e073f6cb8ec486a7c14d4f814473af2d8a7a9f46d5cc27d1862ea","d1986184a09a52db8228cb2bb2a61a8c05c9354e5b93cec8e2628d8579c892d7",{"version":"d828ff531a832da354516464c5e25ca4970561f97ed02c77cb02d91aec4e80a6","affectsGlobalScope":true},"47ac9ac86821fc9927a2ade9b1704a713159799aad88e553ba73600c9e5852c1",{"version":"8d7cbeea0454e05a3cdf3370c5df267072c4f1dc6c48a45a9ad750d7890443d7","affectsGlobalScope":true,"impliedFormat":99}],"root":[[559,561],775,776,782,805,[856,941],946,947,[951,954],[959,971],[974,979],983,[985,992],1034,[1039,1044],[1055,1106],[1196,1205]],"options":{"allowJs":false,"esModuleInterop":true,"jsx":4,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[1203,1],[1204,2],[1205,3],[1201,4],[559,2],[1202,5],[560,6],[776,7],[1051,8],[1052,9],[1048,10],[1046,2],[1047,11],[1050,12],[1049,13],[1031,14],[403,2],[566,2],[1025,15],[637,2],[1038,16],[779,17],[1027,18],[1033,19],[1032,20],[1023,21],[942,2],[943,22],[944,23],[945,24],[800,2],[797,2],[796,2],[791,25],[802,26],[787,27],[798,28],[790,29],[789,30],[799,2],[794,31],[801,2],[795,32],[788,2],[786,33],[785,34],[1107,34],[784,27],[804,35],[1180,36],[1181,36],[1183,37],[1182,36],[1175,36],[1176,36],[1178,38],[1177,36],[1153,2],[1155,2],[1154,2],[1157,39],[1156,2],[1120,40],[1118,41],[1121,2],[1168,42],[1122,36],[1158,43],[1167,44],[1159,2],[1162,45],[1160,2],[1163,2],[1165,2],[1161,45],[1164,2],[1166,2],[1119,46],[1194,47],[1179,36],[1174,48],[1184,49],[1190,50],[1191,51],[1193,52],[1192,53],[1172,48],[1173,54],[1169,55],[1171,56],[1170,57],[1185,36],[1189,58],[1186,36],[1187,59],[1188,36],[1123,2],[1124,2],[1127,2],[1125,2],[1126,2],[1129,2],[1130,60],[1131,2],[1132,2],[1128,2],[1133,2],[1134,2],[1135,2],[1136,2],[1137,61],[1138,2],[1152,62],[1139,2],[1140,2],[1141,2],[1142,2],[1143,2],[1144,2],[1145,2],[1148,2],[1146,2],[1147,2],[1149,36],[1150,36],[1151,63],[783,2],[640,64],[638,2],[1024,2],[161,65],[162,65],[163,66],[101,67],[164,68],[165,69],[166,70],[99,2],[167,71],[168,72],[169,73],[170,74],[171,75],[172,76],[173,76],[174,77],[175,78],[176,79],[177,80],[102,2],[100,2],[178,81],[179,82],[180,83],[220,84],[181,85],[182,86],[183,85],[184,87],[185,88],[186,89],[187,90],[188,90],[189,90],[190,91],[191,92],[192,93],[193,94],[194,95],[195,96],[196,96],[197,97],[198,2],[199,2],[200,98],[201,99],[202,98],[203,100],[204,101],[205,102],[206,103],[207,104],[208,105],[209,106],[210,107],[211,108],[212,109],[213,110],[214,111],[215,112],[216,113],[217,114],[103,85],[104,2],[105,115],[106,116],[107,2],[108,117],[109,2],[152,118],[153,119],[154,120],[155,120],[156,121],[157,2],[158,68],[159,122],[160,119],[218,123],[219,124],[224,125],[488,126],[225,127],[223,128],[490,129],[489,130],[803,126],[221,131],[486,2],[222,132],[90,2],[92,133],[485,126],[255,126],[781,134],[780,2],[669,135],[774,136],[665,2],[668,137],[678,138],[666,139],[667,140],[641,141],[647,142],[648,143],[646,2],[615,2],[624,144],[623,145],[643,144],[626,146],[628,147],[671,147],[627,148],[635,149],[634,2],[622,150],[616,151],[663,152],[618,153],[620,154],[662,2],[649,153],[619,2],[621,151],[617,2],[1014,2],[1016,155],[1015,2],[639,2],[1000,156],[999,157],[998,158],[1006,159],[1007,160],[1004,161],[1005,162],[1002,163],[1003,164],[1001,165],[1054,166],[1053,167],[972,2],[91,2],[583,2],[657,168],[659,169],[658,170],[656,171],[655,2],[956,172],[955,2],[957,173],[839,174],[808,175],[818,175],[809,175],[819,175],[810,175],[811,175],[826,175],[825,175],[827,175],[828,175],[820,175],[812,175],[821,175],[813,175],[822,175],[814,175],[816,175],[824,176],[817,175],[823,176],[829,176],[815,175],[830,175],[835,175],[836,175],[831,175],[807,2],[837,2],[833,175],[832,175],[834,175],[838,175],[607,2],[609,177],[608,2],[1045,126],[806,178],[948,179],[845,180],[844,181],[851,182],[853,183],[849,184],[848,185],[852,181],[846,186],[843,187],[854,188],[855,188],[847,189],[841,2],[842,190],[950,191],[949,192],[850,2],[984,126],[511,193],[516,194],[523,195],[506,196],[259,2],[267,197],[407,198],[410,199],[382,2],[395,200],[402,201],[284,2],[384,2],[265,2],[381,202],[427,203],[266,2],[257,204],[409,205],[411,206],[412,207],[483,208],[376,209],[329,210],[389,211],[390,212],[388,213],[387,2],[383,214],[408,215],[268,216],[453,2],[454,217],[295,218],[269,219],[296,218],[332,218],[235,218],[405,220],[404,2],[394,221],[501,2],[244,2],[522,222],[461,223],[462,224],[458,225],[540,2],[359,2],[463,226],[459,227],[545,228],[544,229],[539,2],[310,2],[362,230],[361,2],[538,231],[460,126],[315,232],[322,233],[324,234],[314,2],[319,235],[321,236],[323,237],[318,238],[316,2],[320,239],[541,2],[537,2],[543,240],[542,2],[313,241],[532,242],[535,243],[303,244],[302,245],[301,246],[548,126],[300,247],[289,2],[550,2],[981,248],[980,2],[551,126],[552,249],[227,2],[391,250],[392,251],[393,252],[231,2],[396,2],[251,253],[226,2],[475,126],[233,254],[474,255],[473,256],[464,2],[465,2],[472,2],[467,2],[470,257],[466,2],[468,258],[471,259],[469,258],[264,2],[261,2],[262,218],[416,2],[421,260],[422,261],[420,262],[418,263],[419,264],[414,2],[481,226],[256,226],[510,265],[517,266],[521,267],[350,268],[349,2],[344,2],[497,269],[505,270],[377,271],[378,272],[456,273],[366,2],[479,274],[354,126],[371,275],[482,276],[367,2],[370,277],[368,2],[480,278],[477,279],[476,2],[478,2],[374,2],[452,280],[239,281],[352,282],[356,283],[372,284],[375,285],[364,286],[357,287],[504,288],[430,289],[348,290],[236,291],[503,292],[232,293],[423,294],[415,2],[424,295],[441,296],[413,2],[440,297],[98,2],[435,298],[260,2],[455,299],[431,2],[245,2],[247,2],[386,2],[439,300],[263,2],[287,301],[373,302],[293,303],[353,2],[438,2],[417,2],[443,304],[444,305],[385,2],[446,306],[448,307],[447,308],[397,2],[437,291],[450,309],[347,310],[436,311],[442,312],[272,2],[276,2],[275,2],[274,2],[279,2],[273,2],[282,2],[281,2],[278,2],[277,2],[280,2],[283,313],[271,2],[339,314],[338,2],[343,315],[340,316],[342,317],[345,315],[341,316],[252,318],[331,319],[500,320],[498,2],[527,321],[529,322],[493,323],[528,324],[240,325],[237,325],[270,2],[254,326],[253,327],[249,328],[250,329],[258,330],[286,330],[297,330],[333,331],[298,331],[242,332],[241,2],[337,333],[336,334],[335,335],[334,336],[243,337],[484,338],[285,339],[492,340],[457,341],[487,342],[491,343],[380,344],[379,345],[360,346],[346,347],[328,348],[330,349],[327,350],[449,351],[351,2],[515,2],[248,352],[451,353],[499,354],[358,2],[288,355],[365,356],[363,357],[290,358],[425,359],[494,2],[291,360],[426,360],[513,2],[512,2],[514,2],[496,2],[495,2],[428,361],[355,2],[325,362],[246,363],[304,2],[230,364],[292,2],[519,126],[229,2],[531,365],[312,126],[525,226],[311,366],[508,367],[309,365],[234,2],[533,368],[307,126],[308,126],[299,2],[228,2],[306,369],[305,370],[294,371],[369,94],[429,94],[445,2],[433,372],[432,2],[317,241],[238,2],[326,126],[502,253],[509,373],[93,126],[96,374],[97,375],[94,126],[95,2],[406,116],[401,376],[400,2],[399,377],[398,2],[507,378],[518,379],[520,380],[524,381],[982,382],[526,383],[530,384],[558,385],[534,385],[557,386],[536,387],[546,388],[547,389],[549,390],[553,391],[556,253],[555,2],[554,392],[675,117],[676,393],[840,394],[772,395],[679,2],[680,395],[771,396],[773,397],[603,398],[601,399],[602,400],[590,401],[591,399],[598,402],[589,403],[594,404],[604,2],[595,405],[600,406],[606,407],[605,408],[588,409],[596,410],[597,411],[592,412],[599,398],[593,413],[793,414],[792,2],[1030,415],[1029,416],[958,417],[1008,2],[1009,418],[1010,2],[1011,419],[612,420],[574,421],[575,422],[578,423],[567,424],[577,425],[573,426],[565,2],[579,427],[580,428],[568,2],[569,2],[571,429],[570,2],[572,430],[434,431],[587,2],[1012,432],[995,2],[1017,433],[1036,434],[997,435],[1019,436],[1013,437],[1022,438],[1037,439],[1035,440],[1020,441],[996,442],[993,126],[1018,443],[1195,444],[994,126],[1021,445],[1117,446],[1109,2],[1108,2],[1116,447],[1111,448],[1114,449],[1115,450],[1110,2],[1112,2],[1113,451],[973,2],[644,2],[636,2],[88,2],[89,2],[14,2],[15,2],[17,2],[16,2],[2,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[25,2],[3,2],[26,2],[27,2],[4,2],[28,2],[32,2],[29,2],[30,2],[31,2],[33,2],[34,2],[35,2],[5,2],[36,2],[37,2],[38,2],[39,2],[6,2],[43,2],[40,2],[41,2],[42,2],[44,2],[7,2],[45,2],[50,2],[51,2],[46,2],[47,2],[48,2],[49,2],[8,2],[55,2],[52,2],[53,2],[54,2],[56,2],[9,2],[57,2],[58,2],[59,2],[61,2],[60,2],[62,2],[63,2],[10,2],[64,2],[65,2],[66,2],[11,2],[67,2],[68,2],[69,2],[70,2],[71,2],[72,2],[12,2],[73,2],[74,2],[75,2],[76,2],[77,2],[1,2],[78,2],[79,2],[13,2],[80,2],[81,2],[82,2],[83,2],[84,2],[85,2],[86,2],[87,2],[1028,2],[128,452],[140,453],[125,454],[141,455],[150,456],[116,457],[117,458],[115,459],[149,460],[144,461],[148,462],[119,463],[137,464],[118,465],[147,466],[113,467],[114,461],[120,468],[121,2],[127,469],[124,468],[111,470],[151,471],[142,472],[131,473],[130,468],[132,474],[135,475],[129,476],[133,477],[145,460],[122,478],[123,479],[136,480],[112,455],[139,481],[138,468],[126,479],[134,482],[143,2],[110,2],[146,483],[1026,484],[563,485],[614,486],[582,487],[564,485],[562,2],[581,488],[613,2],[611,2],[584,489],[610,490],[576,491],[586,2],[585,492],[670,493],[778,494],[664,495],[645,496],[633,497],[629,498],[661,2],[630,146],[653,499],[650,500],[673,501],[672,502],[631,503],[652,504],[625,2],[632,505],[777,506],[674,507],[660,508],[677,509],[654,510],[1206,511],[651,2],[642,2],[757,512],[760,513],[762,514],[769,515],[764,2],[765,2],[763,516],[766,517],[758,2],[759,2],[770,518],[761,519],[767,2],[768,520],[751,521],[755,522],[752,522],[748,521],[756,523],[753,524],[754,522],[749,525],[750,526],[744,527],[688,528],[690,529],[743,2],[689,530],[747,531],[746,532],[745,533],[681,2],[691,528],[692,2],[683,534],[687,535],[682,2],[684,536],[685,537],[686,2],[693,538],[694,538],[695,538],[696,538],[697,538],[698,538],[699,538],[700,538],[701,538],[702,538],[703,538],[704,538],[705,538],[707,538],[706,538],[708,538],[709,538],[710,538],[711,538],[742,539],[712,538],[713,538],[714,538],[715,538],[716,538],[717,538],[718,538],[719,538],[720,538],[721,538],[722,538],[723,538],[724,538],[726,538],[725,538],[727,538],[728,538],[729,538],[730,538],[731,538],[732,538],[733,538],[734,538],[735,538],[736,538],[737,538],[738,538],[741,538],[739,538],[740,538],[992,540],[1043,541],[1034,542],[1040,543],[1042,544],[1041,545],[1044,546],[1058,547],[1057,548],[858,549],[857,550],[862,551],[861,552],[866,553],[865,552],[864,554],[863,552],[868,555],[867,552],[870,556],[869,552],[872,557],[871,552],[876,558],[875,552],[874,559],[873,552],[882,560],[881,552],[884,561],[883,552],[879,562],[886,563],[885,564],[888,565],[887,564],[890,566],[889,564],[894,567],[893,564],[892,568],[891,564],[896,569],[895,564],[898,570],[897,552],[901,571],[902,571],[903,571],[904,572],[899,571],[900,573],[910,574],[909,552],[908,575],[907,552],[906,576],[905,552],[914,577],[913,552],[912,578],[911,552],[916,579],[915,552],[918,580],[917,552],[920,581],[919,552],[922,582],[921,552],[924,583],[923,552],[925,571],[926,571],[927,584],[880,562],[929,585],[928,552],[931,586],[930,552],[933,587],[932,552],[878,588],[877,552],[935,589],[934,552],[937,590],[936,591],[941,592],[940,552],[939,593],[938,552],[1061,594],[946,595],[947,596],[1060,597],[1059,598],[1067,599],[1064,600],[1066,601],[1065,602],[1063,603],[1062,604],[1073,605],[1070,606],[1072,607],[1071,608],[1075,609],[1074,604],[1069,610],[1068,611],[1080,612],[1076,613],[1077,614],[1079,615],[1078,616],[1081,617],[986,618],[1084,619],[953,620],[954,621],[1085,622],[951,623],[952,624],[1083,625],[1082,626],[991,627],[1087,628],[959,629],[960,630],[961,631],[962,632],[963,633],[964,634],[966,635],[967,636],[1086,637],[1089,638],[1088,639],[1094,640],[1090,613],[1091,641],[1093,642],[1092,643],[1099,644],[1095,613],[1096,645],[1098,646],[1097,647],[1100,648],[1101,649],[1056,650],[1102,651],[1103,652],[987,226],[1104,653],[988,654],[1105,655],[1106,656],[990,657],[1196,658],[1197,659],[989,660],[1055,661],[975,662],[976,663],[977,664],[1198,665],[978,666],[860,667],[856,668],[969,669],[965,631],[1039,670],[970,631],[859,562],[971,671],[974,672],[968,631],[1199,673],[983,674],[1200,675],[985,654],[561,676],[979,562],[782,677],[805,678],[775,679]],"affectedFilesPendingEmit":[1205,1202,776,992,1043,1034,1040,1042,1041,1044,1058,1057,858,857,862,861,866,865,864,863,868,867,870,869,872,871,876,875,874,873,882,881,884,883,879,886,885,888,887,890,889,894,893,892,891,896,895,898,897,901,902,903,904,899,900,910,909,908,907,906,905,914,913,912,911,916,915,918,917,920,919,922,921,924,923,925,926,927,880,929,928,931,930,933,932,878,877,935,934,937,936,941,940,939,938,1061,946,947,1060,1059,1067,1064,1066,1065,1063,1062,1073,1070,1072,1071,1075,1074,1069,1068,1080,1076,1077,1079,1078,1081,986,1084,953,954,1085,951,952,1083,1082,991,1087,959,960,961,962,963,964,966,967,1086,1089,1088,1094,1090,1091,1093,1092,1099,1095,1096,1098,1097,1100,1101,1056,1102,1103,987,1104,988,1105,1106,990,1196,1197,989,1055,975,976,977,1198,978,860,856,969,965,1039,970,859,971,974,968,1199,983,1200,985,979,782,805],"version":"6.0.3"}
\ No newline at end of file
diff --git a/newsletter_maker/settings/celery.py b/newsletter_maker/settings/celery.py
index db103061..53840fab 100644
--- a/newsletter_maker/settings/celery.py
+++ b/newsletter_maker/settings/celery.py
@@ -27,6 +27,10 @@
"task": "core.tasks.run_all_source_quality_recomputations",
"schedule": crontab(hour=1, minute=45),
},
+ "run-all-scheduled-newsletter-drafts-every-minute": {
+ "task": "core.tasks.run_all_scheduled_newsletter_drafts",
+ "schedule": 60,
+ },
"run-all-authority-recomputations-nightly": {
"task": "core.tasks.run_all_authority_recomputations",
"schedule": crontab(hour=2, minute=0),
diff --git a/newsletters/api.py b/newsletters/api.py
index 29ab3dbb..d874686d 100644
--- a/newsletters/api.py
+++ b/newsletters/api.py
@@ -1,18 +1,45 @@
"""Newsletter-domain API viewsets kept under the existing nested project routes."""
-from rest_framework import viewsets
+from typing import Any, cast
+
+from django.conf import settings
+from django.db.models import Prefetch
+from django.utils import timezone
+from drf_spectacular.utils import extend_schema, inline_serializer
+from rest_framework import mixins, serializers, status, viewsets
+from rest_framework.decorators import action
+from rest_framework.filters import OrderingFilter
+from rest_framework.response import Response
from core.api import (
+ AUTHENTICATION_REQUIRED_RESPONSE,
ProjectOwnedQuerysetMixin,
build_crud_action_overrides,
document_project_owned_viewset,
)
from core.permissions import IsProjectContributor, IsProjectMember
-from newsletters.models import IntakeAllowlist, NewsletterIntake
+from newsletters.models import (
+ IntakeAllowlist,
+ NewsletterDraft,
+ NewsletterDraftItem,
+ NewsletterDraftOriginalPiece,
+ NewsletterDraftSection,
+ NewsletterIntake,
+ NewsletterDraftStatus,
+)
from newsletters.serializers import (
IntakeAllowlistSerializer,
+ NewsletterDraftItemSerializer,
+ NewsletterDraftOriginalPieceSerializer,
+ NewsletterDraftRegenerateSectionSerializer,
+ NewsletterDraftSectionSerializer,
+ NewsletterDraftSerializer,
NewsletterIntakeSerializer,
)
+from newsletters.tasks import (
+ generate_newsletter_draft,
+ regenerate_newsletter_draft_section,
+)
@document_project_owned_viewset(
@@ -65,3 +92,292 @@ def get_permissions(self):
"""Allow any project member to inspect newsletter intake history."""
return [IsProjectMember()]
+
+
+class ProjectRelatedQuerysetMixin(ProjectOwnedQuerysetMixin):
+ """Scope nested resources to a project through an indirect relationship path."""
+
+ project_filter: str = "project"
+
+ def get_queryset(self):
+ """Filter the configured queryset down to the current project path."""
+
+ queryset = self.queryset
+ if queryset is None:
+ raise AssertionError("queryset must be set on project-scoped viewsets")
+ return queryset.filter(**{self.project_filter: self.get_project()})
+
+
+class DraftEditedTimestampMixin:
+ """Touch the owning draft whenever an editor mutates a draft subtree."""
+
+ draft_lookup: str = "draft"
+
+ def perform_update(self, serializer):
+ """Persist the mutation and mark the owning draft as editor-modified."""
+
+ instance = serializer.save()
+ draft = cast(NewsletterDraft, _resolve_nested_attr(instance, self.draft_lookup))
+ draft.status = NewsletterDraftStatus.EDITED
+ draft.last_edited_at = timezone.now()
+ draft.save(update_fields=["status", "last_edited_at"])
+
+ def perform_destroy(self, instance):
+ """Delete the subtree node and mark the owning draft as editor-modified."""
+
+ draft = cast(NewsletterDraft, _resolve_nested_attr(instance, self.draft_lookup))
+ instance.delete()
+ draft.status = NewsletterDraftStatus.EDITED
+ draft.last_edited_at = timezone.now()
+ draft.save(update_fields=["status", "last_edited_at"])
+
+
+class NewsletterDraftViewSet(
+ ProjectOwnedQuerysetMixin,
+ mixins.ListModelMixin,
+ mixins.RetrieveModelMixin,
+ mixins.UpdateModelMixin,
+ viewsets.GenericViewSet,
+):
+ """Inspect, edit, and generate project-scoped newsletter drafts."""
+
+ serializer_class = NewsletterDraftSerializer
+ filter_backends = [OrderingFilter]
+ ordering_fields = ["generated_at", "target_publish_date", "status"]
+ ordering = ["-generated_at", "-id"]
+ http_method_names = ["get", "patch", "post", "head", "options"]
+ queryset = NewsletterDraft.objects.select_related("project").prefetch_related(
+ Prefetch(
+ "sections",
+ queryset=NewsletterDraftSection.objects.select_related(
+ "theme_suggestion"
+ ).prefetch_related(
+ Prefetch(
+ "items",
+ queryset=NewsletterDraftItem.objects.select_related("content"),
+ )
+ ),
+ ),
+ Prefetch(
+ "original_pieces",
+ queryset=NewsletterDraftOriginalPiece.objects.select_related("idea"),
+ ),
+ )
+
+ def get_permissions(self):
+ """Allow members to read drafts and contributors to mutate or generate."""
+
+ if self.action in {"generate", "partial_update", "regenerate_section"}:
+ return [IsProjectContributor()]
+ return [IsProjectMember()]
+
+ def perform_update(self, serializer):
+ """Persist top-level draft edits and mark the draft as editor-modified."""
+
+ serializer.save(
+ status=NewsletterDraftStatus.EDITED,
+ last_edited_at=timezone.now(),
+ )
+
+ @extend_schema(
+ summary="Generate newsletter draft",
+ description=(
+ "Trigger newsletter draft generation for the selected project. When Celery "
+ "runs eagerly, the draft is composed before the response is returned. "
+ "Otherwise, the generation task is queued for background execution."
+ ),
+ request=None,
+ responses={
+ 200: inline_serializer(
+ name="NewsletterDraftGenerateCompletedResponse",
+ fields={
+ "status": serializers.CharField(),
+ "project_id": serializers.IntegerField(),
+ "result": inline_serializer(
+ name="NewsletterDraftGenerateResult",
+ fields={
+ "project_id": serializers.IntegerField(),
+ "draft_id": serializers.IntegerField(allow_null=True),
+ "status": serializers.CharField(),
+ "reason": serializers.CharField(required=False),
+ "sections_created": serializers.IntegerField(),
+ "original_pieces_created": serializers.IntegerField(),
+ },
+ ),
+ },
+ ),
+ 202: inline_serializer(
+ name="NewsletterDraftGenerateQueuedResponse",
+ fields={
+ "status": serializers.CharField(),
+ "project_id": serializers.IntegerField(),
+ },
+ ),
+ 403: AUTHENTICATION_REQUIRED_RESPONSE,
+ },
+ tags=["Newsletter Composition"],
+ )
+ @action(detail=False, methods=["post"], url_path="generate")
+ def generate(self, request, *args, **kwargs):
+ """Trigger draft composition for the current project."""
+
+ project = self.get_project()
+ project_id = int(project.pk)
+ if settings.CELERY_TASK_ALWAYS_EAGER:
+ result = generate_newsletter_draft(project_id)
+ return Response(
+ {
+ "status": "completed",
+ "project_id": project_id,
+ "result": result,
+ }
+ )
+ generate_newsletter_draft.delay(project_id)
+ return Response(
+ {"status": "queued", "project_id": project_id},
+ status=status.HTTP_202_ACCEPTED,
+ )
+
+ @extend_schema(
+ summary="Regenerate newsletter draft section",
+ description=(
+ "Recompose one section inside an existing draft without rebuilding the rest "
+ "of the draft tree."
+ ),
+ request=NewsletterDraftRegenerateSectionSerializer,
+ responses={
+ 200: NewsletterDraftSerializer,
+ 202: inline_serializer(
+ name="NewsletterDraftRegenerateQueuedResponse",
+ fields={
+ "status": serializers.CharField(),
+ "draft_id": serializers.IntegerField(),
+ "section_id": serializers.IntegerField(),
+ },
+ ),
+ 400: NewsletterDraftRegenerateSectionSerializer,
+ 403: AUTHENTICATION_REQUIRED_RESPONSE,
+ },
+ tags=["Newsletter Composition"],
+ )
+ @action(detail=True, methods=["post"], url_path="regenerate_section")
+ def regenerate_section(self, request, *args, **kwargs):
+ """Recompose one draft section for the selected draft."""
+
+ draft = self.get_object()
+ serializer = NewsletterDraftRegenerateSectionSerializer(
+ data=request.data,
+ context={**self.get_serializer_context(), "draft": draft},
+ )
+ serializer.is_valid(raise_exception=True)
+ section_id = serializer.validated_data["section_id"]
+ if settings.CELERY_TASK_ALWAYS_EAGER:
+ regenerate_newsletter_draft_section(section_id)
+ draft.refresh_from_db()
+ response_serializer = self.get_serializer(draft)
+ return Response(response_serializer.data)
+ regenerate_newsletter_draft_section.delay(section_id)
+ return Response(
+ {
+ "status": "queued",
+ "draft_id": int(draft.pk),
+ "section_id": section_id,
+ },
+ status=status.HTTP_202_ACCEPTED,
+ )
+
+
+class NewsletterDraftSectionViewSet(
+ ProjectRelatedQuerysetMixin,
+ DraftEditedTimestampMixin,
+ mixins.ListModelMixin,
+ mixins.RetrieveModelMixin,
+ mixins.UpdateModelMixin,
+ mixins.DestroyModelMixin,
+ viewsets.GenericViewSet,
+):
+ """Edit or remove draft sections under one project."""
+
+ serializer_class = NewsletterDraftSectionSerializer
+ project_filter = "draft__project"
+ draft_lookup = "draft"
+ http_method_names = ["get", "patch", "delete", "head", "options"]
+ queryset = NewsletterDraftSection.objects.select_related(
+ "draft",
+ "theme_suggestion",
+ ).prefetch_related(
+ Prefetch(
+ "items",
+ queryset=NewsletterDraftItem.objects.select_related("content"),
+ )
+ )
+
+ def get_permissions(self):
+ """Allow members to read sections and contributors to edit them."""
+
+ if self.action in {"partial_update", "destroy"}:
+ return [IsProjectContributor()]
+ return [IsProjectMember()]
+
+
+class NewsletterDraftItemViewSet(
+ ProjectRelatedQuerysetMixin,
+ DraftEditedTimestampMixin,
+ mixins.ListModelMixin,
+ mixins.RetrieveModelMixin,
+ mixins.UpdateModelMixin,
+ mixins.DestroyModelMixin,
+ viewsets.GenericViewSet,
+):
+ """Edit or remove draft items under one project."""
+
+ serializer_class = NewsletterDraftItemSerializer
+ project_filter = "section__draft__project"
+ draft_lookup = "section.draft"
+ http_method_names = ["get", "patch", "delete", "head", "options"]
+ queryset = NewsletterDraftItem.objects.select_related(
+ "section",
+ "section__draft",
+ "content",
+ )
+
+ def get_permissions(self):
+ """Allow members to read items and contributors to edit them."""
+
+ if self.action in {"partial_update", "destroy"}:
+ return [IsProjectContributor()]
+ return [IsProjectMember()]
+
+
+class NewsletterDraftOriginalPieceViewSet(
+ ProjectRelatedQuerysetMixin,
+ DraftEditedTimestampMixin,
+ mixins.ListModelMixin,
+ mixins.RetrieveModelMixin,
+ mixins.UpdateModelMixin,
+ mixins.DestroyModelMixin,
+ viewsets.GenericViewSet,
+):
+ """Edit or remove draft original-content blocks under one project."""
+
+ serializer_class = NewsletterDraftOriginalPieceSerializer
+ project_filter = "draft__project"
+ draft_lookup = "draft"
+ http_method_names = ["get", "patch", "delete", "head", "options"]
+ queryset = NewsletterDraftOriginalPiece.objects.select_related("draft", "idea")
+
+ def get_permissions(self):
+ """Allow members to read original pieces and contributors to edit them."""
+
+ if self.action in {"partial_update", "destroy"}:
+ return [IsProjectContributor()]
+ return [IsProjectMember()]
+
+
+def _resolve_nested_attr(instance: object, dotted_path: str) -> object:
+ """Resolve a dotted attribute path on a loaded model instance."""
+
+ current: Any = instance
+ for attribute in dotted_path.split("."):
+ current = getattr(current, attribute)
+ return current
diff --git a/newsletters/api_urls.py b/newsletters/api_urls.py
index ab47d3a2..7c25e0a8 100644
--- a/newsletters/api_urls.py
+++ b/newsletters/api_urls.py
@@ -2,7 +2,14 @@
from rest_framework_nested.routers import NestedSimpleRouter
-from newsletters.api import IntakeAllowlistViewSet, NewsletterIntakeViewSet
+from newsletters.api import (
+ IntakeAllowlistViewSet,
+ NewsletterDraftItemViewSet,
+ NewsletterDraftOriginalPieceViewSet,
+ NewsletterDraftSectionViewSet,
+ NewsletterDraftViewSet,
+ NewsletterIntakeViewSet,
+)
def register_project_routes(project_router: NestedSimpleRouter) -> None:
@@ -18,3 +25,23 @@ def register_project_routes(project_router: NestedSimpleRouter) -> None:
NewsletterIntakeViewSet,
basename="project-newsletter-intake",
)
+ project_router.register(
+ r"drafts",
+ NewsletterDraftViewSet,
+ basename="project-newsletter-draft",
+ )
+ project_router.register(
+ r"draft-sections",
+ NewsletterDraftSectionViewSet,
+ basename="project-newsletter-draft-section",
+ )
+ project_router.register(
+ r"draft-items",
+ NewsletterDraftItemViewSet,
+ basename="project-newsletter-draft-item",
+ )
+ project_router.register(
+ r"draft-original-pieces",
+ NewsletterDraftOriginalPieceViewSet,
+ basename="project-newsletter-draft-original-piece",
+ )
diff --git a/newsletters/composition.py b/newsletters/composition.py
new file mode 100644
index 00000000..c8461670
--- /dev/null
+++ b/newsletters/composition.py
@@ -0,0 +1,674 @@
+"""Newsletter draft composition helpers for the WP4 editor workflow."""
+
+from __future__ import annotations
+
+from collections.abc import Iterable
+from datetime import timedelta
+from functools import lru_cache
+from pathlib import Path
+from typing import Any, cast
+
+from django.conf import settings
+from django.db import transaction
+from django.db.models import Model, Prefetch
+from django.db.models.functions import Coalesce
+from django.utils import timezone
+
+from content.models import Content
+from core.llm import openrouter_chat_json
+from newsletters.models import (
+ NewsletterDraft,
+ NewsletterDraftItem,
+ NewsletterDraftOriginalPiece,
+ NewsletterDraftSection,
+ NewsletterDraftStatus,
+)
+from projects.models import Project
+from trends.models import (
+ ContentClusterMembership,
+ OriginalContentIdea,
+ OriginalContentIdeaStatus,
+ ThemeSuggestion,
+ ThemeSuggestionStatus,
+)
+
+NEWSLETTER_COMPOSITION_SKILL_NAME = "newsletter_composition"
+THEME_LOOKBACK_DAYS = 14
+MAX_SECTION_ITEMS = 4
+MAX_STYLE_EXAMPLES = 3
+
+
+def _metadata_dict(value: object) -> dict[str, object]:
+ """Return a dictionary view of draft generation metadata."""
+
+ if isinstance(value, dict):
+ return cast(dict[str, object], value)
+ return {}
+
+
+def generate_newsletter_draft(
+ project_id: int,
+ *,
+ trigger_source: str = "manual",
+) -> dict[str, object]:
+ """Compose one newsletter draft from recent accepted themes and ideas."""
+
+ project = Project.objects.get(pk=project_id)
+ themes = _accepted_themes(project_id)
+ ideas = _accepted_ideas(project_id)
+ if len(themes) < 2 or not ideas:
+ return {
+ "project_id": project_id,
+ "draft_id": None,
+ "status": "skipped",
+ "reason": "insufficient_inputs",
+ "sections_created": 0,
+ "original_pieces_created": 0,
+ }
+
+ draft = NewsletterDraft.objects.create(
+ project=project,
+ title=_fallback_draft_title(project, themes),
+ intro="",
+ outro="",
+ status=NewsletterDraftStatus.GENERATING,
+ generation_metadata={
+ "source_theme_ids": [_require_pk(theme) for theme in themes],
+ "source_idea_ids": [_require_pk(idea) for idea in ideas],
+ "trigger_source": trigger_source,
+ "models": {},
+ },
+ )
+
+ try:
+ style_examples = _style_examples(project_id)
+ section_payloads: list[dict[str, object]] = []
+ used_content_ids: set[int] = set()
+ with transaction.atomic():
+ for index, theme in enumerate(themes):
+ supporting_contents = _supporting_contents_for_theme(
+ theme,
+ used_content_ids=used_content_ids,
+ )
+ section_payload = _compose_section(theme, supporting_contents)
+ section_payloads.append(section_payload)
+ section = NewsletterDraftSection.objects.create(
+ draft=draft,
+ theme_suggestion=theme,
+ title=str(section_payload["section_title"]),
+ lede=str(section_payload["lede"]),
+ order=index,
+ )
+ for item_index, item_payload in enumerate(
+ cast(list[dict[str, object]], section_payload["items"])
+ ):
+ content = cast(Content, item_payload["content"])
+ content_id = _require_pk(content)
+ used_content_ids.add(content_id)
+ NewsletterDraftItem.objects.create(
+ section=section,
+ content=content,
+ summary_used=str(item_payload["summary"]),
+ why_it_matters=str(item_payload["why_it_matters"]),
+ order=item_index,
+ )
+ original_piece_payloads = _compose_original_pieces(ideas)
+ for index, original_piece_payload in enumerate(original_piece_payloads):
+ NewsletterDraftOriginalPiece.objects.create(
+ draft=draft,
+ idea=cast(OriginalContentIdea, original_piece_payload["idea"]),
+ title=str(original_piece_payload["title"]),
+ pitch=str(original_piece_payload["pitch"]),
+ suggested_outline=str(original_piece_payload["suggested_outline"]),
+ order=index,
+ )
+ framing_payload = _compose_intro_outro(
+ project=project,
+ section_payloads=section_payloads,
+ original_piece_payloads=original_piece_payloads,
+ style_examples=style_examples,
+ )
+ draft.title = str(framing_payload["title"])
+ draft.intro = str(framing_payload["intro"])
+ draft.outro = str(framing_payload["outro"])
+ draft_generation_metadata = _metadata_dict(draft.generation_metadata)
+ existing_models = _metadata_dict(draft_generation_metadata.get("models"))
+ draft.generation_metadata = {
+ **draft_generation_metadata,
+ "models": {
+ **existing_models,
+ "section_composer": (
+ section_payloads[0].get(
+ "generated_by_model", "heuristic-newsletter-composition"
+ )
+ if section_payloads
+ else "heuristic-newsletter-composition"
+ ),
+ "intro_outro_composer": framing_payload.get(
+ "generated_by_model", "heuristic-newsletter-composition"
+ ),
+ },
+ "coherence_suggestions": _coherence_suggestions(
+ draft,
+ style_examples=style_examples,
+ ),
+ }
+ draft.status = NewsletterDraftStatus.READY
+ draft.save(
+ update_fields=[
+ "title",
+ "intro",
+ "outro",
+ "generation_metadata",
+ "status",
+ ]
+ )
+ except Exception as exc:
+ draft.status = NewsletterDraftStatus.DISCARDED
+ draft.generation_metadata = {
+ **cast(dict[str, object], draft.generation_metadata),
+ "error": str(exc),
+ }
+ draft.save(update_fields=["status", "generation_metadata"])
+ raise
+
+ return {
+ "project_id": project_id,
+ "draft_id": _require_pk(draft),
+ "status": draft.status,
+ "sections_created": draft.sections.count(),
+ "original_pieces_created": draft.original_pieces.count(),
+ }
+
+
+def regenerate_newsletter_draft_section(section_id: int) -> dict[str, object]:
+ """Re-run composition for one draft section without rebuilding the whole tree."""
+
+ section = NewsletterDraftSection.objects.select_related(
+ "draft",
+ "theme_suggestion",
+ ).get(pk=section_id)
+ theme = section.theme_suggestion
+ if theme is None:
+ raise ValueError(
+ "This draft section is no longer linked to a theme suggestion."
+ )
+ supporting_contents = _supporting_contents_for_theme(theme, used_content_ids=set())
+ section_payload = _compose_section(theme, supporting_contents)
+ with transaction.atomic():
+ section.title = str(section_payload["section_title"])
+ section.lede = str(section_payload["lede"])
+ section.save(update_fields=["title", "lede"])
+ section.items.all().delete()
+ for item_index, item_payload in enumerate(
+ cast(list[dict[str, object]], section_payload["items"])
+ ):
+ NewsletterDraftItem.objects.create(
+ section=section,
+ content=cast(Content, item_payload["content"]),
+ summary_used=str(item_payload["summary"]),
+ why_it_matters=str(item_payload["why_it_matters"]),
+ order=item_index,
+ )
+ section.draft.status = NewsletterDraftStatus.EDITED
+ metadata = cast(dict[str, object], section.draft.generation_metadata)
+ metadata["last_regenerated_section_id"] = _require_pk(section)
+ metadata["last_regenerated_at"] = timezone.now().isoformat()
+ section.draft.generation_metadata = metadata
+ section.draft.last_edited_at = timezone.now()
+ section.draft.save(
+ update_fields=["status", "generation_metadata", "last_edited_at"]
+ )
+ return {
+ "project_id": _require_pk(section.draft.project),
+ "draft_id": _require_pk(section.draft),
+ "section_id": _require_pk(section),
+ "status": "completed",
+ }
+
+
+def _accepted_themes(project_id: int) -> list[ThemeSuggestion]:
+ """Return recent accepted themes that are not already in published drafts."""
+
+ window_start = timezone.now() - timedelta(days=THEME_LOOKBACK_DAYS)
+ return list(
+ ThemeSuggestion.objects.filter(
+ project_id=project_id,
+ status=ThemeSuggestionStatus.ACCEPTED,
+ decided_at__gte=window_start,
+ )
+ .exclude(draft_sections__draft__status=NewsletterDraftStatus.PUBLISHED)
+ .select_related("cluster")
+ .order_by("-decided_at", "-created_at")
+ )
+
+
+def _accepted_ideas(project_id: int) -> list[OriginalContentIdea]:
+ """Return recent accepted original-content ideas for draft composition."""
+
+ window_start = timezone.now() - timedelta(days=THEME_LOOKBACK_DAYS)
+ return list(
+ OriginalContentIdea.objects.filter(
+ project_id=project_id,
+ status=OriginalContentIdeaStatus.ACCEPTED,
+ decided_at__gte=window_start,
+ )
+ .select_related("related_cluster")
+ .prefetch_related(
+ Prefetch(
+ "supporting_contents",
+ queryset=Content.objects.order_by("-published_date", "-id"),
+ )
+ )
+ .order_by("-decided_at", "-created_at")
+ )
+
+
+def _style_examples(project_id: int) -> list[str]:
+ """Return recent published draft renderings for tone grounding."""
+
+ return [
+ draft.render_markdown()
+ for draft in NewsletterDraft.objects.filter(
+ project_id=project_id,
+ status=NewsletterDraftStatus.PUBLISHED,
+ ).prefetch_related(
+ Prefetch(
+ "sections",
+ queryset=NewsletterDraftSection.objects.prefetch_related(
+ Prefetch(
+ "items",
+ queryset=NewsletterDraftItem.objects.select_related("content"),
+ )
+ ),
+ ),
+ "original_pieces",
+ )[
+ :MAX_STYLE_EXAMPLES
+ ]
+ ]
+
+
+def _supporting_contents_for_theme(
+ theme: ThemeSuggestion,
+ *,
+ used_content_ids: set[int],
+) -> list[Content]:
+ """Return the top ranked real content rows for one accepted theme."""
+
+ candidate_queryset = theme.promoted_contents.filter(is_active=True)
+ if not candidate_queryset.exists() and theme.cluster_id is not None:
+ candidate_queryset = Content.objects.filter(
+ cluster_memberships__cluster_id=theme.cluster_id,
+ is_active=True,
+ )
+ ranked_contents: list[Content] = list(
+ candidate_queryset.exclude(pk__in=used_content_ids)
+ .annotate(
+ authority_rank=Coalesce("authority_adjusted_score", 0.0),
+ relevance_rank=Coalesce("relevance_score", 0.0),
+ )
+ .order_by("-authority_rank", "-relevance_rank", "-published_date", "-id")
+ .distinct()[:MAX_SECTION_ITEMS]
+ )
+ if ranked_contents:
+ return ranked_contents
+ fallback_ranked_contents: list[Content] = list(
+ candidate_queryset.annotate(
+ authority_rank=Coalesce("authority_adjusted_score", 0.0),
+ relevance_rank=Coalesce("relevance_score", 0.0),
+ )
+ .order_by("-authority_rank", "-relevance_rank", "-published_date", "-id")
+ .distinct()[:MAX_SECTION_ITEMS]
+ )
+ return fallback_ranked_contents
+
+
+def _compose_section(
+ theme: ThemeSuggestion,
+ supporting_contents: list[Content],
+) -> dict[str, object]:
+ """Compose one section payload grounded in real theme and content rows."""
+
+ fallback_payload = _fallback_section_payload(theme, supporting_contents)
+ if settings.OPENROUTER_API_KEY and supporting_contents:
+ try:
+ response = openrouter_chat_json(
+ model=settings.AI_SUMMARIZATION_MODEL,
+ system_prompt=_newsletter_prompt_resource("section_composer"),
+ user_prompt=_build_section_prompt(
+ theme=theme,
+ supporting_contents=supporting_contents,
+ fallback_payload=fallback_payload,
+ ),
+ )
+ content_by_id = {
+ _require_pk(content): content for content in supporting_contents
+ }
+ candidate_items: list[dict[str, object]] = []
+ for fallback_item in cast(
+ list[dict[str, object]], fallback_payload["items"]
+ ):
+ fallback_content = cast(Content, fallback_item["content"])
+ content_id = _require_pk(fallback_content)
+ candidate_items.append(
+ {
+ "content": content_by_id.get(content_id, fallback_content),
+ "summary": str(fallback_item["summary"]),
+ "why_it_matters": str(fallback_item["why_it_matters"]),
+ }
+ )
+ raw_items = response.payload.get("items")
+ if isinstance(raw_items, list):
+ candidate_items = []
+ for index, raw_item in enumerate(raw_items[: len(supporting_contents)]):
+ if not isinstance(raw_item, dict):
+ continue
+ raw_content_id = raw_item.get("content_id")
+ try:
+ if isinstance(raw_content_id, int):
+ content_id = raw_content_id
+ elif isinstance(raw_content_id, str):
+ content_id = int(raw_content_id)
+ else:
+ raise TypeError
+ except (TypeError, ValueError):
+ content_id = _require_pk(supporting_contents[index])
+ content = content_by_id.get(content_id)
+ if content is None:
+ continue
+ candidate_items.append(
+ {
+ "content": content,
+ "summary": str(raw_item.get("summary", "")).strip()
+ or _fallback_item_summary(content),
+ "why_it_matters": str(
+ raw_item.get("why_it_matters", "")
+ ).strip()
+ or _fallback_item_why(theme, content),
+ }
+ )
+ if candidate_items:
+ return {
+ "section_title": str(
+ response.payload.get(
+ "section_title", fallback_payload["section_title"]
+ )
+ ).strip()
+ or str(fallback_payload["section_title"]),
+ "lede": str(
+ response.payload.get("lede", fallback_payload["lede"])
+ ).strip()
+ or str(fallback_payload["lede"]),
+ "items": candidate_items,
+ "generated_by_model": response.model,
+ }
+ except Exception:
+ pass
+ return fallback_payload
+
+
+def _compose_original_pieces(
+ ideas: list[OriginalContentIdea],
+) -> list[dict[str, object]]:
+ """Project accepted original-content ideas into draft original pieces."""
+
+ return [
+ {
+ "idea": idea,
+ "title": idea.angle_title,
+ "pitch": idea.summary,
+ "suggested_outline": idea.suggested_outline,
+ }
+ for idea in ideas
+ ]
+
+
+def _compose_intro_outro(
+ *,
+ project: Project,
+ section_payloads: list[dict[str, object]],
+ original_piece_payloads: list[dict[str, object]],
+ style_examples: list[str],
+) -> dict[str, object]:
+ """Compose the framing title, intro, and outro for the assembled draft."""
+
+ fallback_payload = _fallback_intro_outro(
+ project=project,
+ section_payloads=section_payloads,
+ original_piece_payloads=original_piece_payloads,
+ )
+ if settings.OPENROUTER_API_KEY:
+ try:
+ response = openrouter_chat_json(
+ model=settings.AI_SUMMARIZATION_MODEL,
+ system_prompt=_newsletter_prompt_resource("intro_outro_composer"),
+ user_prompt=_build_intro_outro_prompt(
+ project=project,
+ section_payloads=section_payloads,
+ original_piece_payloads=original_piece_payloads,
+ style_examples=style_examples,
+ fallback_payload=fallback_payload,
+ ),
+ )
+ return {
+ "title": str(
+ response.payload.get("title", fallback_payload["title"])
+ ).strip()
+ or str(fallback_payload["title"]),
+ "intro": str(
+ response.payload.get("intro", fallback_payload["intro"])
+ ).strip()
+ or str(fallback_payload["intro"]),
+ "outro": str(
+ response.payload.get("outro", fallback_payload["outro"])
+ ).strip()
+ or str(fallback_payload["outro"]),
+ "generated_by_model": response.model,
+ }
+ except Exception:
+ pass
+ return fallback_payload
+
+
+def _coherence_suggestions(
+ draft: NewsletterDraft,
+ *,
+ style_examples: list[str],
+) -> list[str]:
+ """Return lightweight coherence suggestions for the assembled draft."""
+
+ if not settings.OPENROUTER_API_KEY:
+ return []
+ try:
+ response = openrouter_chat_json(
+ model=settings.AI_RELEVANCE_MODEL,
+ system_prompt=_newsletter_prompt_resource("coherence_pass"),
+ user_prompt=_build_coherence_prompt(
+ draft=draft,
+ style_examples=style_examples,
+ ),
+ )
+ suggestions = response.payload.get("suggestions", [])
+ if isinstance(suggestions, list):
+ return [
+ str(suggestion).strip()
+ for suggestion in suggestions
+ if str(suggestion).strip()
+ ]
+ except Exception:
+ pass
+ return []
+
+
+def _fallback_section_payload(
+ theme: ThemeSuggestion,
+ supporting_contents: list[Content],
+) -> dict[str, object]:
+ """Build a deterministic section payload when model composition is unavailable."""
+
+ items = [
+ {
+ "content": content,
+ "summary": _fallback_item_summary(content),
+ "why_it_matters": _fallback_item_why(theme, content),
+ }
+ for content in supporting_contents
+ ]
+ return {
+ "section_title": theme.title,
+ "lede": theme.pitch.strip() or theme.why_it_matters.strip(),
+ "items": items,
+ "generated_by_model": "heuristic-newsletter-composition",
+ }
+
+
+def _fallback_intro_outro(
+ *,
+ project: Project,
+ section_payloads: list[dict[str, object]],
+ original_piece_payloads: list[dict[str, object]],
+) -> dict[str, object]:
+ """Build deterministic framing copy when the LLM path is unavailable."""
+
+ section_titles = [str(payload["section_title"]) for payload in section_payloads]
+ original_titles = [str(payload["title"]) for payload in original_piece_payloads]
+ title = _fallback_draft_title_from_titles(project, section_titles)
+ intro = (
+ f"This edition for {project.name} focuses on {', '.join(section_titles[:3])}. "
+ f"Each section below is grounded in recent high-relevance coverage for {project.topic_description}."
+ )
+ outro = (
+ "Keep an eye on the original angles worth developing next: "
+ + ", ".join(original_titles[:3])
+ + "."
+ )
+ return {
+ "title": title,
+ "intro": intro,
+ "outro": outro,
+ "generated_by_model": "heuristic-newsletter-composition",
+ }
+
+
+def _fallback_draft_title(project: Project, themes: Iterable[ThemeSuggestion]) -> str:
+ """Render one deterministic title before the framing step runs."""
+
+ return _fallback_draft_title_from_titles(project, [theme.title for theme in themes])
+
+
+def _fallback_draft_title_from_titles(
+ project: Project, section_titles: list[str]
+) -> str:
+ """Render one deterministic title from the current theme headlines."""
+
+ if section_titles:
+ return f"{project.name}: {section_titles[0]} and more"
+ return f"{project.name} newsletter draft"
+
+
+def _fallback_item_summary(content: Content) -> str:
+ """Return a concise deterministic summary for one draft item."""
+
+ body = " ".join(content.content_text.split())
+ if body:
+ return body[:240].rstrip() + ("..." if len(body) > 240 else "")
+ return content.title
+
+
+def _fallback_item_why(theme: ThemeSuggestion, content: Content) -> str:
+ """Tie one content item back to the accepted theme in deterministic text."""
+
+ why_text = theme.why_it_matters.strip() or theme.pitch.strip()
+ return (
+ f"{why_text} This item adds supporting evidence from {content.source_plugin}."
+ )
+
+
+@lru_cache(maxsize=8)
+def _newsletter_prompt_resource(resource_name: str) -> str:
+ """Load one newsletter-composition prompt resource from disk."""
+
+ resource_path = (
+ Path(__file__).resolve().parent.parent
+ / "skills"
+ / NEWSLETTER_COMPOSITION_SKILL_NAME
+ / "resources"
+ / f"{resource_name}.md"
+ )
+ return resource_path.read_text(encoding="utf-8").strip()
+
+
+def _build_section_prompt(
+ *,
+ theme: ThemeSuggestion,
+ supporting_contents: list[Content],
+ fallback_payload: dict[str, object],
+) -> str:
+ """Serialize one section-composition request into a stable prompt body."""
+
+ return (
+ f"project_topic_description:\n{theme.project.topic_description}\n\n"
+ f"theme:\n{{'id': {_require_pk(theme)}, 'title': {theme.title!r}, 'pitch': {theme.pitch!r}, 'why_it_matters': {theme.why_it_matters!r}}}\n\n"
+ f"supporting_contents:\n{[_serialize_content(content) for content in supporting_contents]}\n\n"
+ f"fallback_payload:\n{fallback_payload}\n\n"
+ "Return only a JSON object using the system prompt fields."
+ )
+
+
+def _build_intro_outro_prompt(
+ *,
+ project: Project,
+ section_payloads: list[dict[str, object]],
+ original_piece_payloads: list[dict[str, object]],
+ style_examples: list[str],
+ fallback_payload: dict[str, object],
+) -> str:
+ """Serialize the framing composition request into a stable prompt body."""
+
+ return (
+ f"project_topic_description:\n{project.topic_description}\n\n"
+ f"section_payloads:\n{section_payloads}\n\n"
+ f"original_piece_payloads:\n{[{k: v for k, v in payload.items() if k != 'idea'} for payload in original_piece_payloads]}\n\n"
+ f"style_examples:\n{style_examples}\n\n"
+ f"fallback_payload:\n{fallback_payload}\n\n"
+ "Return only a JSON object using the system prompt fields."
+ )
+
+
+def _build_coherence_prompt(
+ *,
+ draft: NewsletterDraft,
+ style_examples: list[str],
+) -> str:
+ """Serialize the coherence request into a stable prompt body."""
+
+ return (
+ f"draft_markdown:\n{draft.render_markdown()}\n\n"
+ f"style_examples:\n{style_examples}\n\n"
+ "Return only a JSON object with a suggestions array."
+ )
+
+
+def _serialize_content(content: Content) -> dict[str, object]:
+ """Serialize one content row into a prompt-safe dictionary."""
+
+ return {
+ "id": _require_pk(content),
+ "title": content.title,
+ "url": content.url,
+ "source_plugin": content.source_plugin,
+ "published_date": content.published_date.isoformat(),
+ "relevance_score": content.relevance_score,
+ "authority_adjusted_score": content.authority_adjusted_score,
+ "excerpt": _fallback_item_summary(content),
+ }
+
+
+def _require_pk(instance: Model) -> int:
+ """Return a saved model primary key for typed composition helpers."""
+
+ instance_pk = instance.pk
+ if instance_pk is None:
+ raise ValueError(f"{instance.__class__.__name__} must be saved first.")
+ return int(instance_pk)
diff --git a/newsletters/migrations/0002_newsletterdraft_and_related_models.py b/newsletters/migrations/0002_newsletterdraft_and_related_models.py
new file mode 100644
index 00000000..8f7a969b
--- /dev/null
+++ b/newsletters/migrations/0002_newsletterdraft_and_related_models.py
@@ -0,0 +1,202 @@
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("content", "0002_content_newsletter_promotion"),
+ ("newsletters", "0001_initial"),
+ ("projects", "0008_projectconfig_authority_weight_cross_newsletter_and_more"),
+ ("trends", "0006_trend_task_run"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="NewsletterDraft",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("title", models.CharField(max_length=255)),
+ ("intro", models.TextField(blank=True)),
+ ("outro", models.TextField(blank=True)),
+ ("target_publish_date", models.DateField(blank=True, null=True)),
+ (
+ "status",
+ models.CharField(
+ choices=[
+ ("generating", "Generating"),
+ ("ready", "Ready"),
+ ("edited", "Edited"),
+ ("published", "Published"),
+ ("discarded", "Discarded"),
+ ],
+ default="generating",
+ max_length=16,
+ ),
+ ),
+ ("generated_at", models.DateTimeField(auto_now_add=True)),
+ ("last_edited_at", models.DateTimeField(blank=True, null=True)),
+ ("generation_metadata", models.JSONField(blank=True, default=dict)),
+ (
+ "project",
+ models.ForeignKey(
+ on_delete=models.deletion.CASCADE,
+ related_name="drafts",
+ to="projects.project",
+ ),
+ ),
+ ],
+ options={
+ "db_table": "core_newsletterdraft",
+ "ordering": ["-generated_at", "id"],
+ },
+ ),
+ migrations.CreateModel(
+ name="NewsletterDraftOriginalPiece",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("title", models.CharField(max_length=255)),
+ ("pitch", models.TextField()),
+ ("suggested_outline", models.TextField()),
+ ("order", models.IntegerField()),
+ (
+ "draft",
+ models.ForeignKey(
+ on_delete=models.deletion.CASCADE,
+ related_name="original_pieces",
+ to="newsletters.newsletterdraft",
+ ),
+ ),
+ (
+ "idea",
+ models.ForeignKey(
+ on_delete=models.deletion.PROTECT,
+ related_name="newsletter_draft_original_pieces",
+ to="trends.originalcontentidea",
+ ),
+ ),
+ ],
+ options={
+ "db_table": "core_newsletterdraftoriginalpiece",
+ "ordering": ["order", "id"],
+ },
+ ),
+ migrations.CreateModel(
+ name="NewsletterDraftSection",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("title", models.CharField(max_length=255)),
+ ("lede", models.TextField(blank=True)),
+ ("order", models.IntegerField()),
+ (
+ "draft",
+ models.ForeignKey(
+ on_delete=models.deletion.CASCADE,
+ related_name="sections",
+ to="newsletters.newsletterdraft",
+ ),
+ ),
+ (
+ "theme_suggestion",
+ models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=models.deletion.SET_NULL,
+ related_name="draft_sections",
+ to="trends.themesuggestion",
+ ),
+ ),
+ ],
+ options={
+ "db_table": "core_newsletterdraftsection",
+ "ordering": ["order", "id"],
+ },
+ ),
+ migrations.CreateModel(
+ name="NewsletterDraftItem",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("summary_used", models.TextField()),
+ ("why_it_matters", models.TextField()),
+ ("order", models.IntegerField()),
+ (
+ "content",
+ models.ForeignKey(
+ on_delete=models.deletion.PROTECT,
+ related_name="newsletter_draft_items",
+ to="content.content",
+ ),
+ ),
+ (
+ "section",
+ models.ForeignKey(
+ on_delete=models.deletion.CASCADE,
+ related_name="items",
+ to="newsletters.newsletterdraftsection",
+ ),
+ ),
+ ],
+ options={
+ "db_table": "core_newsletterdraftitem",
+ "ordering": ["order", "id"],
+ },
+ ),
+ migrations.AddIndex(
+ model_name="newsletterdraft",
+ index=models.Index(
+ fields=["project", "-generated_at"],
+ name="core_nldraft_projgen_idx",
+ ),
+ ),
+ migrations.AddIndex(
+ model_name="newsletterdraftoriginalpiece",
+ index=models.Index(
+ fields=["draft", "order"],
+ name="core_nldorig_draftord_idx",
+ ),
+ ),
+ migrations.AddIndex(
+ model_name="newsletterdraftsection",
+ index=models.Index(
+ fields=["draft", "order"],
+ name="core_nldsec_draftord_idx",
+ ),
+ ),
+ migrations.AddIndex(
+ model_name="newsletterdraftitem",
+ index=models.Index(
+ fields=["section", "order"],
+ name="core_nlditem_secord_idx",
+ ),
+ ),
+ ]
\ No newline at end of file
diff --git a/newsletters/models.py b/newsletters/models.py
index 5ae7a2a9..6a87822e 100644
--- a/newsletters/models.py
+++ b/newsletters/models.py
@@ -2,6 +2,7 @@
import secrets
+import markdown # type: ignore[import-untyped]
from django.db import models
@@ -20,6 +21,16 @@ class NewsletterIntakeStatus(models.TextChoices):
REJECTED = "rejected", "Rejected"
+class NewsletterDraftStatus(models.TextChoices):
+ """Workflow states for generated editor-facing newsletter drafts."""
+
+ GENERATING = "generating", "Generating"
+ READY = "ready", "Ready"
+ EDITED = "edited", "Edited"
+ PUBLISHED = "published", "Published"
+ DISCARDED = "discarded", "Discarded"
+
+
class IntakeAllowlist(models.Model):
"""Tracks who is allowed to send newsletters into a project inbox."""
@@ -87,3 +98,195 @@ class Meta:
def __str__(self) -> str:
return f"{self.subject or self.message_id}"
+
+
+class NewsletterDraft(models.Model):
+ """Persist one generated newsletter draft and its editorial metadata."""
+
+ project = models.ForeignKey(
+ "projects.Project",
+ on_delete=models.CASCADE,
+ related_name="drafts",
+ )
+ title = models.CharField(max_length=255)
+ intro = models.TextField(blank=True)
+ outro = models.TextField(blank=True)
+ target_publish_date = models.DateField(null=True, blank=True)
+ status = models.CharField(
+ max_length=16,
+ choices=NewsletterDraftStatus.choices,
+ default=NewsletterDraftStatus.GENERATING,
+ )
+ generated_at = models.DateTimeField(auto_now_add=True)
+ last_edited_at = models.DateTimeField(null=True, blank=True)
+ generation_metadata = models.JSONField(default=dict, blank=True)
+
+ class Meta:
+ ordering = ["-generated_at", "id"]
+ db_table = "core_newsletterdraft"
+ indexes = [
+ models.Index(
+ fields=["project", "-generated_at"],
+ name="core_nldraft_projgen_idx",
+ )
+ ]
+
+ def __str__(self) -> str:
+ return self.title
+
+ def render_markdown(self) -> str:
+ """Render the current draft tree into editor-friendly Markdown."""
+
+ sections = list(self.sections.all())
+ original_pieces = list(self.original_pieces.all())
+ lines = [f"# {self.title}"]
+ if self.intro.strip():
+ lines.extend(["", self.intro.strip()])
+ for section in sections:
+ lines.extend(["", f"## {section.title}"])
+ if section.lede.strip():
+ lines.extend(["", section.lede.strip()])
+ for item in section.items.all():
+ lines.extend(
+ [
+ "",
+ f"- [{item.content.title}]({item.content.url})",
+ f" {item.summary_used.strip()}",
+ f" Why it matters: {item.why_it_matters.strip()}",
+ ]
+ )
+ if original_pieces:
+ lines.extend(["", "## Original Ideas"])
+ for original_piece in original_pieces:
+ lines.extend(
+ [
+ "",
+ f"### {original_piece.title}",
+ original_piece.pitch.strip(),
+ "",
+ "Suggested outline:",
+ original_piece.suggested_outline.strip(),
+ ]
+ )
+ if self.outro.strip():
+ lines.extend(["", self.outro.strip()])
+ return "\n".join(line.rstrip() for line in lines).strip()
+
+ def render_html(self) -> str:
+ """Render the current draft tree into paste-ready HTML."""
+
+ return markdown.markdown(self.render_markdown(), extensions=["extra"])
+
+
+class NewsletterDraftSection(models.Model):
+ """Store one ordered draft section derived from an accepted theme."""
+
+ draft = models.ForeignKey(
+ NewsletterDraft,
+ on_delete=models.CASCADE,
+ related_name="sections",
+ )
+ theme_suggestion = models.ForeignKey(
+ "trends.ThemeSuggestion",
+ null=True,
+ blank=True,
+ on_delete=models.SET_NULL,
+ related_name="draft_sections",
+ )
+ title = models.CharField(max_length=255)
+ lede = models.TextField(blank=True)
+ order = models.IntegerField()
+
+ class Meta:
+ ordering = ["order", "id"]
+ db_table = "core_newsletterdraftsection"
+ indexes = [
+ models.Index(
+ fields=["draft", "order"],
+ name="core_nldsec_draftord_idx",
+ )
+ ]
+
+ def __str__(self) -> str:
+ return self.title
+
+ @property
+ def project(self):
+ """Return the owning project for project-scoped permission checks."""
+
+ return self.draft.project
+
+
+class NewsletterDraftItem(models.Model):
+ """Store one ordered newsletter item under a generated draft section."""
+
+ section = models.ForeignKey(
+ NewsletterDraftSection,
+ on_delete=models.CASCADE,
+ related_name="items",
+ )
+ content = models.ForeignKey(
+ "content.Content",
+ on_delete=models.PROTECT,
+ related_name="newsletter_draft_items",
+ )
+ summary_used = models.TextField()
+ why_it_matters = models.TextField()
+ order = models.IntegerField()
+
+ class Meta:
+ ordering = ["order", "id"]
+ db_table = "core_newsletterdraftitem"
+ indexes = [
+ models.Index(
+ fields=["section", "order"],
+ name="core_nlditem_secord_idx",
+ )
+ ]
+
+ def __str__(self) -> str:
+ return f"{self.section.title}: {self.content.title}"
+
+ @property
+ def project(self):
+ """Return the owning project for project-scoped permission checks."""
+
+ return self.section.draft.project
+
+
+class NewsletterDraftOriginalPiece(models.Model):
+ """Store one accepted original-content idea in a generated draft."""
+
+ draft = models.ForeignKey(
+ NewsletterDraft,
+ on_delete=models.CASCADE,
+ related_name="original_pieces",
+ )
+ idea = models.ForeignKey(
+ "trends.OriginalContentIdea",
+ on_delete=models.PROTECT,
+ related_name="newsletter_draft_original_pieces",
+ )
+ title = models.CharField(max_length=255)
+ pitch = models.TextField()
+ suggested_outline = models.TextField()
+ order = models.IntegerField()
+
+ class Meta:
+ ordering = ["order", "id"]
+ db_table = "core_newsletterdraftoriginalpiece"
+ indexes = [
+ models.Index(
+ fields=["draft", "order"],
+ name="core_nldorig_draftord_idx",
+ )
+ ]
+
+ def __str__(self) -> str:
+ return self.title
+
+ @property
+ def project(self):
+ """Return the owning project for project-scoped permission checks."""
+
+ return self.draft.project
diff --git a/newsletters/serializers.py b/newsletters/serializers.py
index ed6addf6..af70e19b 100644
--- a/newsletters/serializers.py
+++ b/newsletters/serializers.py
@@ -3,7 +3,14 @@
from rest_framework import serializers
from core.serializer_mixins import ProjectScopedSerializerMixin
-from newsletters.models import IntakeAllowlist, NewsletterIntake
+from newsletters.models import (
+ IntakeAllowlist,
+ NewsletterDraft,
+ NewsletterDraftItem,
+ NewsletterDraftOriginalPiece,
+ NewsletterDraftSection,
+ NewsletterIntake,
+)
class IntakeAllowlistSerializer(
@@ -55,3 +62,176 @@ class Meta:
"extraction_result",
"error_message",
]
+
+
+class NewsletterDraftItemContentSerializer(serializers.Serializer):
+ """Serialize minimal content metadata embedded in draft items."""
+
+ id = serializers.IntegerField()
+ url = serializers.URLField()
+ title = serializers.CharField()
+ source_plugin = serializers.CharField()
+ published_date = serializers.DateTimeField()
+
+
+class NewsletterDraftItemSerializer(serializers.ModelSerializer):
+ """Serialize one editable draft item under a newsletter section."""
+
+ content_detail = NewsletterDraftItemContentSerializer(
+ source="content", read_only=True
+ )
+
+ class Meta:
+ model = NewsletterDraftItem
+ fields = [
+ "id",
+ "section",
+ "content",
+ "content_detail",
+ "summary_used",
+ "why_it_matters",
+ "order",
+ ]
+ read_only_fields = ["id", "section", "content", "content_detail"]
+
+
+class NewsletterDraftSectionThemeSerializer(serializers.Serializer):
+ """Serialize the accepted theme linked to a draft section."""
+
+ id = serializers.IntegerField()
+ title = serializers.CharField()
+ pitch = serializers.CharField()
+ why_it_matters = serializers.CharField()
+
+
+class NewsletterDraftSectionSerializer(serializers.ModelSerializer):
+ """Serialize one editable newsletter draft section."""
+
+ items = NewsletterDraftItemSerializer(many=True, read_only=True)
+ theme_suggestion_detail = NewsletterDraftSectionThemeSerializer(
+ source="theme_suggestion",
+ read_only=True,
+ allow_null=True,
+ )
+
+ class Meta:
+ model = NewsletterDraftSection
+ fields = [
+ "id",
+ "draft",
+ "theme_suggestion",
+ "theme_suggestion_detail",
+ "title",
+ "lede",
+ "order",
+ "items",
+ ]
+ read_only_fields = [
+ "id",
+ "draft",
+ "theme_suggestion",
+ "theme_suggestion_detail",
+ "items",
+ ]
+
+
+class NewsletterDraftOriginalIdeaSerializer(serializers.Serializer):
+ """Serialize the accepted idea linked to a draft original piece."""
+
+ id = serializers.IntegerField()
+ angle_title = serializers.CharField()
+ summary = serializers.CharField()
+ suggested_outline = serializers.CharField()
+
+
+class NewsletterDraftOriginalPieceSerializer(serializers.ModelSerializer):
+ """Serialize one editable original-content block in a draft."""
+
+ idea_detail = NewsletterDraftOriginalIdeaSerializer(source="idea", read_only=True)
+
+ class Meta:
+ model = NewsletterDraftOriginalPiece
+ fields = [
+ "id",
+ "draft",
+ "idea",
+ "idea_detail",
+ "title",
+ "pitch",
+ "suggested_outline",
+ "order",
+ ]
+ read_only_fields = ["id", "draft", "idea", "idea_detail"]
+
+
+class NewsletterDraftSerializer(
+ ProjectScopedSerializerMixin, serializers.ModelSerializer
+):
+ """Serialize one newsletter draft and its nested editable tree."""
+
+ sections = NewsletterDraftSectionSerializer(many=True, read_only=True)
+ original_pieces = NewsletterDraftOriginalPieceSerializer(many=True, read_only=True)
+ rendered_markdown = serializers.SerializerMethodField()
+ rendered_html = serializers.SerializerMethodField()
+
+ class Meta:
+ model = NewsletterDraft
+ fields = [
+ "id",
+ "project",
+ "title",
+ "intro",
+ "outro",
+ "target_publish_date",
+ "status",
+ "generated_at",
+ "last_edited_at",
+ "generation_metadata",
+ "sections",
+ "original_pieces",
+ "rendered_markdown",
+ "rendered_html",
+ ]
+ read_only_fields = [
+ "id",
+ "project",
+ "generated_at",
+ "last_edited_at",
+ "generation_metadata",
+ "sections",
+ "original_pieces",
+ "rendered_markdown",
+ "rendered_html",
+ ]
+
+ def get_rendered_markdown(self, obj: NewsletterDraft) -> str:
+ """Render the draft tree into Markdown for API consumers."""
+
+ return obj.render_markdown()
+
+ def get_rendered_html(self, obj: NewsletterDraft) -> str:
+ """Render the draft tree into HTML for API consumers."""
+
+ return obj.render_html()
+
+
+class NewsletterDraftRegenerateSectionSerializer(serializers.Serializer):
+ """Validate per-section regeneration requests for an existing draft."""
+
+ section_id = serializers.IntegerField()
+
+ def validate_section_id(self, value: int) -> int:
+ """Ensure the selected section belongs to the current project and draft."""
+
+ project = self.context["project"]
+ draft = self.context["draft"]
+ exists = NewsletterDraftSection.objects.filter(
+ pk=value,
+ draft=draft,
+ draft__project=project,
+ ).exists()
+ if not exists:
+ raise serializers.ValidationError(
+ "Draft section not found for this project."
+ )
+ return value
diff --git a/newsletters/tasks.py b/newsletters/tasks.py
index ba1bb2c3..dd29f538 100644
--- a/newsletters/tasks.py
+++ b/newsletters/tasks.py
@@ -1,16 +1,30 @@
"""Celery tasks and helpers for newsletter intake processing."""
+from functools import lru_cache
from typing import Protocol, cast
from celery import shared_task
+from celery.schedules import crontab_parser
from django.conf import settings
from django.db.models import Model, Q
from django.utils import timezone
from content.deduplication import canonicalize_url
from content.models import Content
+from newsletters.composition import (
+ generate_newsletter_draft as compose_newsletter_draft,
+)
+from newsletters.composition import (
+ regenerate_newsletter_draft_section as compose_newsletter_draft_section,
+)
from newsletters.extraction import extract_newsletter_items
-from newsletters.models import IntakeAllowlist, NewsletterIntake, NewsletterIntakeStatus
+from newsletters.models import (
+ IntakeAllowlist,
+ NewsletterDraft,
+ NewsletterIntake,
+ NewsletterIntakeStatus,
+)
+from projects.models import ProjectConfig
class DelayedTask(Protocol):
@@ -20,10 +34,10 @@ def delay(self, *args: object, **kwargs: object) -> object:
pass
-def _enqueue_task(task: object, *args: object) -> None:
+def _enqueue_task(task: object, *args: object, **kwargs: object) -> None:
"""Dispatch a Celery task through a typed ``delay`` seam."""
- cast(DelayedTask, task).delay(*args)
+ cast(DelayedTask, task).delay(*args, **kwargs)
def _require_pk(instance: Model) -> int:
@@ -119,3 +133,112 @@ def _schedule_content_processing(content: Content) -> None:
process_content(content_id)
else:
_enqueue_task(process_content, content_id)
+
+
+@shared_task(name="core.tasks.generate_newsletter_draft")
+def generate_newsletter_draft(
+ project_id: int,
+ trigger_source: str = "manual",
+) -> dict[str, object]:
+ """Compose one newsletter draft from accepted trend inputs."""
+
+ return compose_newsletter_draft(project_id, trigger_source=trigger_source)
+
+
+@shared_task(name="core.tasks.run_all_scheduled_newsletter_drafts")
+def run_all_scheduled_newsletter_drafts() -> dict[str, int]:
+ """Queue scheduled newsletter drafts for projects whose cron matches now."""
+
+ now = timezone.now()
+ checked_count = 0
+ queued_count = 0
+ skipped_not_due_count = 0
+ skipped_daily_cap_count = 0
+
+ for config in ProjectConfig.objects.exclude(draft_schedule_cron="").only(
+ "project_id",
+ "draft_schedule_cron",
+ ):
+ checked_count += 1
+ project_id = int(config.project_id)
+ if not _cron_matches_now(config.draft_schedule_cron, now=now):
+ skipped_not_due_count += 1
+ continue
+ if _project_has_scheduled_draft_today(project_id, now=now):
+ skipped_daily_cap_count += 1
+ continue
+ if settings.CELERY_TASK_ALWAYS_EAGER:
+ generate_newsletter_draft(project_id, trigger_source="scheduled")
+ else:
+ _enqueue_task(
+ generate_newsletter_draft,
+ project_id,
+ trigger_source="scheduled",
+ )
+ queued_count += 1
+
+ return {
+ "checked": checked_count,
+ "queued": queued_count,
+ "skipped_not_due": skipped_not_due_count,
+ "skipped_daily_cap": skipped_daily_cap_count,
+ }
+
+
+@shared_task(name="core.tasks.regenerate_newsletter_draft_section")
+def regenerate_newsletter_draft_section(section_id: int) -> dict[str, object]:
+ """Recompose one newsletter draft section in isolation."""
+
+ return compose_newsletter_draft_section(section_id)
+
+
+def _project_has_scheduled_draft_today(project_id: int, *, now) -> bool:
+ """Return whether the project already ran a scheduled draft today."""
+
+ return NewsletterDraft.objects.filter(
+ project_id=project_id,
+ generated_at__date=timezone.localdate(now),
+ generation_metadata__trigger_source="scheduled",
+ ).exists()
+
+
+def _cron_matches_now(cron_expression: str, *, now) -> bool:
+ """Return whether the current local minute satisfies the cron expression."""
+
+ try:
+ minute_set, hour_set, day_set, month_set, weekday_set = _parse_cron_fields(
+ cron_expression
+ )
+ except ValueError:
+ return False
+
+ current = timezone.localtime(now)
+ weekday = current.isoweekday() % 7
+ return (
+ current.minute in minute_set
+ and current.hour in hour_set
+ and current.day in day_set
+ and current.month in month_set
+ and weekday in weekday_set
+ )
+
+
+@lru_cache(maxsize=128)
+def _parse_cron_fields(cron_expression: str) -> tuple[
+ set[int],
+ set[int],
+ set[int],
+ set[int],
+ set[int],
+]:
+ """Parse a normalized 5-part cron expression into comparable field sets."""
+
+ normalized = " ".join(cron_expression.split())
+ minute, hour, day_of_month, month_of_year, day_of_week = normalized.split(" ")
+ return (
+ crontab_parser(60).parse(minute),
+ crontab_parser(24).parse(hour),
+ crontab_parser(31, 1).parse(day_of_month),
+ crontab_parser(12, 1).parse(month_of_year),
+ crontab_parser(7).parse(day_of_week),
+ )
diff --git a/newsletters/tests/test_api.py b/newsletters/tests/test_api.py
index a95438fc..988b3b4a 100644
--- a/newsletters/tests/test_api.py
+++ b/newsletters/tests/test_api.py
@@ -7,7 +7,20 @@
from rest_framework.test import APIClient, APITestCase
from newsletters.models import IntakeAllowlist
+from newsletters.models import (
+ NewsletterDraft,
+ NewsletterDraftItem,
+ NewsletterDraftOriginalPiece,
+ NewsletterDraftSection,
+ NewsletterDraftStatus,
+)
from projects.models import Project, ProjectMembership, ProjectRole
+from trends.models import (
+ OriginalContentIdea,
+ OriginalContentIdeaStatus,
+ ThemeSuggestion,
+ ThemeSuggestionStatus,
+)
def _require_pk(instance: Model) -> int:
@@ -119,3 +132,241 @@ def test_intake_allowlist_create_and_delete_manage_project_senders(self):
self.assertFalse(
IntakeAllowlist.objects.filter(pk=_require_pk(created_allowlist)).exists()
)
+
+ def test_newsletter_draft_list_is_scoped_to_request_project(self):
+ owner_draft = NewsletterDraft.objects.create(
+ project=self.owner_project,
+ title="Owner draft",
+ intro="Owner intro",
+ outro="Owner outro",
+ status=NewsletterDraftStatus.READY,
+ generation_metadata={"source_theme_ids": [], "source_idea_ids": []},
+ )
+ NewsletterDraft.objects.create(
+ project=self.other_project,
+ title="Other draft",
+ intro="Other intro",
+ outro="Other outro",
+ status=NewsletterDraftStatus.READY,
+ generation_metadata={"source_theme_ids": [], "source_idea_ids": []},
+ )
+
+ response = self.client.get(
+ reverse(
+ "v1:project-newsletter-draft-list",
+ kwargs={"project_id": _require_pk(self.owner_project)},
+ )
+ )
+
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(len(response.json()), 1)
+ self.assertEqual(response.json()[0]["id"], _require_pk(owner_draft))
+ self.assertIn("rendered_markdown", response.json()[0])
+ self.assertIn("rendered_html", response.json()[0])
+
+ def test_newsletter_draft_generate_action_runs_immediately_in_eager_mode(self):
+ with self.settings(CELERY_TASK_ALWAYS_EAGER=True):
+ from unittest.mock import patch
+
+ with patch(
+ "newsletters.api.generate_newsletter_draft",
+ return_value={
+ "project_id": _require_pk(self.owner_project),
+ "draft_id": 42,
+ "status": "ready",
+ "sections_created": 2,
+ "original_pieces_created": 1,
+ },
+ ) as generate_mock:
+ response = self.client.post(
+ reverse(
+ "v1:project-newsletter-draft-generate",
+ kwargs={"project_id": _require_pk(self.owner_project)},
+ ),
+ format="json",
+ )
+
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.json()["status"], "completed")
+ self.assertEqual(response.json()["result"]["draft_id"], 42)
+ generate_mock.assert_called_once_with(_require_pk(self.owner_project))
+
+ def test_newsletter_draft_generate_action_queues_in_background_mode(self):
+ with self.settings(CELERY_TASK_ALWAYS_EAGER=False):
+ from unittest.mock import patch
+
+ with patch("newsletters.api.generate_newsletter_draft.delay") as delay_mock:
+ response = self.client.post(
+ reverse(
+ "v1:project-newsletter-draft-generate",
+ kwargs={"project_id": _require_pk(self.owner_project)},
+ ),
+ format="json",
+ )
+
+ self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
+ self.assertEqual(response.json()["status"], "queued")
+ delay_mock.assert_called_once_with(_require_pk(self.owner_project))
+
+ def test_newsletter_draft_regenerate_section_runs_immediately_in_eager_mode(self):
+ draft = NewsletterDraft.objects.create(
+ project=self.owner_project,
+ title="Draft",
+ intro="Intro",
+ outro="Outro",
+ status=NewsletterDraftStatus.READY,
+ generation_metadata={"source_theme_ids": [], "source_idea_ids": []},
+ )
+ theme = ThemeSuggestion.objects.create(
+ project=self.owner_project,
+ title="Theme",
+ pitch="Pitch",
+ why_it_matters="Why",
+ suggested_angle="",
+ velocity_at_creation=1.0,
+ novelty_score=0.7,
+ status=ThemeSuggestionStatus.ACCEPTED,
+ )
+ section = NewsletterDraftSection.objects.create(
+ draft=draft,
+ theme_suggestion=theme,
+ title="Before",
+ lede="Before lede",
+ order=0,
+ )
+
+ with self.settings(CELERY_TASK_ALWAYS_EAGER=True):
+ from unittest.mock import patch
+
+ with patch(
+ "newsletters.api.regenerate_newsletter_draft_section",
+ return_value={
+ "project_id": _require_pk(self.owner_project),
+ "draft_id": _require_pk(draft),
+ "section_id": _require_pk(section),
+ "status": "completed",
+ },
+ ) as regenerate_mock:
+ response = self.client.post(
+ reverse(
+ "v1:project-newsletter-draft-regenerate-section",
+ kwargs={
+ "project_id": _require_pk(self.owner_project),
+ "pk": _require_pk(draft),
+ },
+ ),
+ {"section_id": _require_pk(section)},
+ format="json",
+ )
+
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ regenerate_mock.assert_called_once_with(_require_pk(section))
+ self.assertEqual(response.json()["id"], _require_pk(draft))
+
+ def test_newsletter_draft_item_patch_marks_draft_as_edited(self):
+ draft = NewsletterDraft.objects.create(
+ project=self.owner_project,
+ title="Draft",
+ intro="Intro",
+ outro="Outro",
+ status=NewsletterDraftStatus.READY,
+ generation_metadata={"source_theme_ids": [], "source_idea_ids": []},
+ )
+ theme = ThemeSuggestion.objects.create(
+ project=self.owner_project,
+ title="Theme",
+ pitch="Pitch",
+ why_it_matters="Why",
+ suggested_angle="",
+ velocity_at_creation=1.0,
+ novelty_score=0.7,
+ status=ThemeSuggestionStatus.ACCEPTED,
+ )
+ section = NewsletterDraftSection.objects.create(
+ draft=draft,
+ theme_suggestion=theme,
+ title="Section",
+ lede="Lede",
+ order=0,
+ )
+ content = self.owner_project.contents.create(
+ url="https://example.com/item",
+ title="Draft item",
+ author="Reporter",
+ source_plugin="rss",
+ published_date="2026-05-01T00:00:00Z",
+ content_text="Original summary",
+ )
+ item = NewsletterDraftItem.objects.create(
+ section=section,
+ content=content,
+ summary_used="Original summary",
+ why_it_matters="Original why",
+ order=0,
+ )
+
+ response = self.client.patch(
+ reverse(
+ "v1:project-newsletter-draft-item-detail",
+ kwargs={
+ "project_id": _require_pk(self.owner_project),
+ "pk": _require_pk(item),
+ },
+ ),
+ {"summary_used": "Updated summary"},
+ format="json",
+ )
+
+ draft.refresh_from_db()
+ item.refresh_from_db()
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(item.summary_used, "Updated summary")
+ self.assertEqual(draft.status, NewsletterDraftStatus.EDITED)
+ self.assertIsNotNone(draft.last_edited_at)
+
+ def test_newsletter_draft_original_piece_delete_marks_draft_as_edited(self):
+ draft = NewsletterDraft.objects.create(
+ project=self.owner_project,
+ title="Draft",
+ intro="Intro",
+ outro="Outro",
+ status=NewsletterDraftStatus.READY,
+ generation_metadata={"source_theme_ids": [], "source_idea_ids": []},
+ )
+ idea = OriginalContentIdea.objects.create(
+ project=self.owner_project,
+ angle_title="Idea",
+ summary="Summary",
+ suggested_outline="Outline",
+ why_now="Why now",
+ generated_by_model="heuristic",
+ self_critique_score=0.8,
+ status=OriginalContentIdeaStatus.ACCEPTED,
+ )
+ original_piece = NewsletterDraftOriginalPiece.objects.create(
+ draft=draft,
+ idea=idea,
+ title="Original piece",
+ pitch="Pitch",
+ suggested_outline="Outline",
+ order=0,
+ )
+
+ response = self.client.delete(
+ reverse(
+ "v1:project-newsletter-draft-original-piece-detail",
+ kwargs={
+ "project_id": _require_pk(self.owner_project),
+ "pk": _require_pk(original_piece),
+ },
+ )
+ )
+
+ draft.refresh_from_db()
+ self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+ self.assertEqual(draft.status, NewsletterDraftStatus.EDITED)
+ self.assertFalse(
+ NewsletterDraftOriginalPiece.objects.filter(
+ pk=_require_pk(original_piece)
+ ).exists()
+ )
diff --git a/newsletters/tests/test_tasks.py b/newsletters/tests/test_tasks.py
new file mode 100644
index 00000000..c84968ae
--- /dev/null
+++ b/newsletters/tests/test_tasks.py
@@ -0,0 +1,352 @@
+from datetime import timedelta
+
+import pytest
+from django.utils import timezone
+
+from content.models import Content
+from newsletters.composition import (
+ generate_newsletter_draft,
+ regenerate_newsletter_draft_section,
+)
+from newsletters.tasks import run_all_scheduled_newsletter_drafts
+from newsletters.models import (
+ NewsletterDraft,
+ NewsletterDraftItem,
+ NewsletterDraftOriginalPiece,
+ NewsletterDraftSection,
+ NewsletterDraftStatus,
+)
+from projects.models import Project, ProjectConfig
+from trends.models import (
+ ContentClusterMembership,
+ OriginalContentIdea,
+ OriginalContentIdeaStatus,
+ ThemeSuggestion,
+ ThemeSuggestionStatus,
+ TopicCluster,
+)
+
+pytestmark = pytest.mark.django_db
+
+
+def _require_pk(instance):
+ instance_pk = instance.pk
+ if instance_pk is None:
+ raise ValueError(f"{instance.__class__.__name__} must be saved first.")
+ return int(instance_pk)
+
+
+def _make_content(
+ project: Project, *, title: str, days_ago: int, score: float
+) -> Content:
+ return Content.objects.create(
+ project=project,
+ url=f"https://example.com/{title.lower().replace(' ', '-')}",
+ title=title,
+ author="Reporter",
+ source_plugin="rss",
+ published_date=timezone.now() - timedelta(days=days_ago),
+ content_text=f"{title} content body with useful reporting context.",
+ relevance_score=score,
+ authority_adjusted_score=score,
+ )
+
+
+def test_generate_newsletter_draft_builds_tree_and_renderings(settings):
+ settings.OPENROUTER_API_KEY = ""
+ project = Project.objects.create(
+ name="Draft Project",
+ topic_description="Platform engineering",
+ )
+ cluster = TopicCluster.objects.create(
+ project=project,
+ first_seen_at=timezone.now() - timedelta(days=3),
+ last_seen_at=timezone.now() - timedelta(days=1),
+ is_active=True,
+ member_count=2,
+ label="Delivery pipelines",
+ )
+ theme_one = ThemeSuggestion.objects.create(
+ project=project,
+ cluster=cluster,
+ title="Release automation",
+ pitch="Release automation is changing how teams ship.",
+ why_it_matters="Readers need to understand where orchestration is tightening.",
+ suggested_angle="",
+ velocity_at_creation=1.4,
+ novelty_score=0.7,
+ status=ThemeSuggestionStatus.ACCEPTED,
+ decided_at=timezone.now() - timedelta(days=1),
+ )
+ theme_two = ThemeSuggestion.objects.create(
+ project=project,
+ cluster=cluster,
+ title="CI observability",
+ pitch="Teams are investing in better CI visibility.",
+ why_it_matters="It changes where platform teams spend debugging time.",
+ suggested_angle="",
+ velocity_at_creation=1.2,
+ novelty_score=0.65,
+ status=ThemeSuggestionStatus.ACCEPTED,
+ decided_at=timezone.now() - timedelta(hours=12),
+ )
+ content_one = _make_content(
+ project, title="Automation story", days_ago=1, score=0.9
+ )
+ content_two = _make_content(
+ project, title="Observability story", days_ago=2, score=0.85
+ )
+ content_three = _make_content(
+ project, title="Debugging story", days_ago=3, score=0.8
+ )
+ content_one.newsletter_promotion_theme = theme_one
+ content_one.save(update_fields=["newsletter_promotion_theme"])
+ content_two.newsletter_promotion_theme = theme_two
+ content_two.save(update_fields=["newsletter_promotion_theme"])
+ ContentClusterMembership.objects.create(
+ content=content_three,
+ cluster=cluster,
+ project=project,
+ similarity=0.91,
+ )
+ idea = OriginalContentIdea.objects.create(
+ project=project,
+ related_cluster=cluster,
+ angle_title="What platform teams still miss",
+ summary="A forward-looking take on the operational blind spots left after tool adoption.",
+ suggested_outline="1. Adoption\n2. Blind spots\n3. Recommendations",
+ why_now="The surrounding coverage makes this timing strong.",
+ generated_by_model="heuristic",
+ self_critique_score=0.83,
+ status=OriginalContentIdeaStatus.ACCEPTED,
+ decided_at=timezone.now() - timedelta(hours=6),
+ )
+ idea.supporting_contents.add(content_one, content_two)
+
+ result = generate_newsletter_draft(
+ _require_pk(project),
+ trigger_source="scheduled",
+ )
+
+ draft = NewsletterDraft.objects.get(pk=result["draft_id"])
+ assert result["status"] == NewsletterDraftStatus.READY
+ assert draft.sections.count() == 2
+ assert draft.original_pieces.count() == 1
+ assert draft.sections.first().theme_suggestion in {theme_one, theme_two}
+ assert draft.sections.first().items.count() >= 1
+ assert draft.original_pieces.first().idea == idea
+ assert "# " in draft.render_markdown()
+ assert "" in draft.render_html()
+ assert draft.generation_metadata["trigger_source"] == "scheduled"
+ assert draft.generation_metadata["source_theme_ids"] == [
+ _require_pk(theme_two),
+ _require_pk(theme_one),
+ ] or draft.generation_metadata["source_theme_ids"] == [
+ _require_pk(theme_one),
+ _require_pk(theme_two),
+ ]
+
+
+def test_generate_newsletter_draft_skips_without_enough_inputs(settings):
+ settings.OPENROUTER_API_KEY = ""
+ project = Project.objects.create(
+ name="Sparse Project",
+ topic_description="Developer workflows",
+ )
+ ThemeSuggestion.objects.create(
+ project=project,
+ title="Only one theme",
+ pitch="Pitch",
+ why_it_matters="Why",
+ suggested_angle="",
+ velocity_at_creation=1.0,
+ novelty_score=0.5,
+ status=ThemeSuggestionStatus.ACCEPTED,
+ decided_at=timezone.now(),
+ )
+
+ result = generate_newsletter_draft(_require_pk(project))
+
+ assert result == {
+ "project_id": _require_pk(project),
+ "draft_id": None,
+ "status": "skipped",
+ "reason": "insufficient_inputs",
+ "sections_created": 0,
+ "original_pieces_created": 0,
+ }
+ assert NewsletterDraft.objects.count() == 0
+
+
+def test_regenerate_newsletter_draft_section_replaces_items_and_marks_draft_edited(
+ settings,
+):
+ settings.OPENROUTER_API_KEY = ""
+ project = Project.objects.create(
+ name="Edit Project",
+ topic_description="Reliability engineering",
+ )
+ cluster = TopicCluster.objects.create(
+ project=project,
+ first_seen_at=timezone.now() - timedelta(days=2),
+ last_seen_at=timezone.now() - timedelta(days=1),
+ is_active=True,
+ member_count=1,
+ label="Reliability",
+ )
+ theme = ThemeSuggestion.objects.create(
+ project=project,
+ cluster=cluster,
+ title="Incident review",
+ pitch="Pitch",
+ why_it_matters="Why",
+ suggested_angle="",
+ velocity_at_creation=1.0,
+ novelty_score=0.7,
+ status=ThemeSuggestionStatus.ACCEPTED,
+ decided_at=timezone.now(),
+ )
+ content = _make_content(project, title="Incident story", days_ago=1, score=0.9)
+ content.newsletter_promotion_theme = theme
+ content.save(update_fields=["newsletter_promotion_theme"])
+ draft = NewsletterDraft.objects.create(
+ project=project,
+ title="Draft",
+ intro="Intro",
+ outro="Outro",
+ status=NewsletterDraftStatus.READY,
+ generation_metadata={"source_theme_ids": [], "source_idea_ids": []},
+ )
+ section = NewsletterDraftSection.objects.create(
+ draft=draft,
+ theme_suggestion=theme,
+ title="Old title",
+ lede="Old lede",
+ order=0,
+ )
+ old_item = NewsletterDraftItem.objects.create(
+ section=section,
+ content=content,
+ summary_used="Old summary",
+ why_it_matters="Old why",
+ order=0,
+ )
+
+ result = regenerate_newsletter_draft_section(_require_pk(section))
+
+ draft.refresh_from_db()
+ section.refresh_from_db()
+ assert result["status"] == "completed"
+ assert draft.status == NewsletterDraftStatus.EDITED
+ assert draft.last_edited_at is not None
+ assert not NewsletterDraftItem.objects.filter(pk=_require_pk(old_item)).exists()
+ assert section.items.count() == 1
+ assert section.items.first().summary_used != "Old summary"
+
+
+def test_run_all_scheduled_newsletter_drafts_executes_due_projects_inline(
+ settings, mocker
+):
+ settings.CELERY_TASK_ALWAYS_EAGER = True
+ fixed_now = timezone.now().replace(second=0, microsecond=0)
+ due_expression = f"{fixed_now.minute} {fixed_now.hour} * * *"
+ due_project = Project.objects.create(
+ name="Due Project",
+ topic_description="Platform engineering",
+ )
+ not_due_project = Project.objects.create(
+ name="Not Due Project",
+ topic_description="Frontend",
+ )
+ ProjectConfig.objects.create(
+ project=due_project,
+ draft_schedule_cron=due_expression,
+ )
+ ProjectConfig.objects.create(
+ project=not_due_project,
+ draft_schedule_cron="0 0 * * *",
+ )
+ generate_mock = mocker.patch("newsletters.tasks.generate_newsletter_draft")
+ mocker.patch("newsletters.tasks.timezone.now", return_value=fixed_now)
+
+ result = run_all_scheduled_newsletter_drafts()
+
+ assert result == {
+ "checked": 2,
+ "queued": 1,
+ "skipped_not_due": 1,
+ "skipped_daily_cap": 0,
+ }
+ generate_mock.assert_called_once_with(
+ _require_pk(due_project),
+ trigger_source="scheduled",
+ )
+
+
+def test_run_all_scheduled_newsletter_drafts_enqueues_due_projects_when_not_eager(
+ settings, mocker
+):
+ settings.CELERY_TASK_ALWAYS_EAGER = False
+ fixed_now = timezone.now().replace(second=0, microsecond=0)
+ due_expression = f"{fixed_now.minute} {fixed_now.hour} * * *"
+ due_project = Project.objects.create(
+ name="Queued Project",
+ topic_description="Infra",
+ )
+ ProjectConfig.objects.create(
+ project=due_project,
+ draft_schedule_cron=due_expression,
+ )
+ delay_mock = mocker.patch("newsletters.tasks.generate_newsletter_draft.delay")
+ mocker.patch("newsletters.tasks.timezone.now", return_value=fixed_now)
+
+ result = run_all_scheduled_newsletter_drafts()
+
+ assert result == {
+ "checked": 1,
+ "queued": 1,
+ "skipped_not_due": 0,
+ "skipped_daily_cap": 0,
+ }
+ delay_mock.assert_called_once_with(
+ _require_pk(due_project),
+ trigger_source="scheduled",
+ )
+
+
+def test_run_all_scheduled_newsletter_drafts_skips_daily_cap(settings, mocker):
+ settings.CELERY_TASK_ALWAYS_EAGER = False
+ fixed_now = timezone.now().replace(second=0, microsecond=0)
+ due_expression = f"{fixed_now.minute} {fixed_now.hour} * * *"
+ capped_project = Project.objects.create(
+ name="Capped Project",
+ topic_description="Signals",
+ )
+ ProjectConfig.objects.create(
+ project=capped_project,
+ draft_schedule_cron=due_expression,
+ )
+ NewsletterDraft.objects.create(
+ project=capped_project,
+ title="Already scheduled today",
+ intro="Intro",
+ outro="Outro",
+ status=NewsletterDraftStatus.READY,
+ generation_metadata={
+ "source_theme_ids": [],
+ "source_idea_ids": [],
+ "trigger_source": "scheduled",
+ },
+ )
+ delay_mock = mocker.patch("newsletters.tasks.generate_newsletter_draft.delay")
+ mocker.patch("newsletters.tasks.timezone.now", return_value=fixed_now)
+
+ result = run_all_scheduled_newsletter_drafts()
+
+ assert result == {
+ "checked": 1,
+ "queued": 0,
+ "skipped_not_due": 0,
+ "skipped_daily_cap": 1,
+ }
+ delay_mock.assert_not_called()
diff --git a/projects/admin.py b/projects/admin.py
index 21f6135b..cae0f72f 100644
--- a/projects/admin.py
+++ b/projects/admin.py
@@ -463,6 +463,7 @@ class ProjectConfigAdmin(admin.ModelAdmin):
actions = ["recompute_selected_authority_models"]
list_display = (
"project",
+ "draft_schedule_cron",
"authority_weight_mention",
"authority_weight_engagement",
"authority_weight_recency",
@@ -478,6 +479,7 @@ class ProjectConfigAdmin(admin.ModelAdmin):
list_filter = ("recompute_topic_centroid_on_feedback_save",)
fields = (
"project",
+ "draft_schedule_cron",
"authority_weight_mention",
"authority_weight_engagement",
"authority_weight_recency",
diff --git a/projects/api.py b/projects/api.py
index 6abf03d3..5d1c6f41 100644
--- a/projects/api.py
+++ b/projects/api.py
@@ -468,12 +468,72 @@ class ProjectConfigViewSet(ProjectOwnedQuerysetMixin, viewsets.ModelViewSet):
def get_permissions(self):
"""Allow all members to read project config, but only admins to modify it."""
- if self.action in {"update", "partial_update", "create", "destroy"}:
+ if self.action in {
+ "update",
+ "partial_update",
+ "create",
+ "destroy",
+ "recompute_authority",
+ }:
permission_classes = [IsProjectAdmin]
else:
permission_classes = [IsProjectMember]
return [permission() for permission in permission_classes]
+ @extend_schema(
+ summary="Recompute project authority scores",
+ description=(
+ "Recompute source-quality inputs and authority-score snapshots for the "
+ "selected project configuration. When Celery runs eagerly, the "
+ "recomputation finishes before the response is returned. Otherwise, the "
+ "source-quality and authority tasks are queued for background execution."
+ ),
+ request=None,
+ responses={
+ 200: inline_serializer(
+ name="ProjectConfigRecomputeCompletedResponse",
+ fields={
+ "status": serializers.CharField(),
+ "project_id": serializers.IntegerField(),
+ "config_id": serializers.IntegerField(),
+ },
+ ),
+ 202: inline_serializer(
+ name="ProjectConfigRecomputeQueuedResponse",
+ fields={
+ "status": serializers.CharField(),
+ "project_id": serializers.IntegerField(),
+ "config_id": serializers.IntegerField(),
+ },
+ ),
+ 403: AUTHENTICATION_REQUIRED_RESPONSE,
+ },
+ tags=["Project Management"],
+ )
+ @action(detail=True, methods=["post"], url_path="recompute_authority")
+ def recompute_authority(self, request, *args, **kwargs):
+ """Recompute source quality and entity authority for the selected project."""
+
+ from core.tasks import recompute_authority_scores, recompute_source_quality
+
+ config = self.get_object()
+ project_id = int(config.project_id)
+ payload = {
+ "status": "queued",
+ "project_id": project_id,
+ "config_id": int(config.pk),
+ }
+
+ if settings.CELERY_TASK_ALWAYS_EAGER:
+ recompute_source_quality(project_id)
+ recompute_authority_scores(project_id)
+ payload["status"] = "completed"
+ return Response(payload)
+
+ recompute_source_quality.delay(project_id)
+ recompute_authority_scores.delay(project_id)
+ return Response(payload, status=status.HTTP_202_ACCEPTED)
+
@document_project_owned_viewset(
resource_plural="Bluesky credentials",
diff --git a/projects/migrations/0009_projectconfig_draft_schedule_cron.py b/projects/migrations/0009_projectconfig_draft_schedule_cron.py
new file mode 100644
index 00000000..c4239657
--- /dev/null
+++ b/projects/migrations/0009_projectconfig_draft_schedule_cron.py
@@ -0,0 +1,15 @@
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("projects", "0008_projectconfig_authority_weight_cross_newsletter_and_more"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="projectconfig",
+ name="draft_schedule_cron",
+ field=models.CharField(blank=True, default="", max_length=64),
+ ),
+ ]
\ No newline at end of file
diff --git a/projects/models.py b/projects/models.py
index e7d98c34..bd9859f6 100644
--- a/projects/models.py
+++ b/projects/models.py
@@ -372,6 +372,7 @@ class ProjectConfig(models.Model):
project = models.OneToOneField(
Project, on_delete=models.CASCADE, related_name="config"
)
+ draft_schedule_cron = models.CharField(max_length=64, blank=True, default="")
authority_weight_mention = models.FloatField(default=0.20)
authority_weight_engagement = models.FloatField(default=0.15)
authority_weight_recency = models.FloatField(default=0.15)
diff --git a/projects/serializers.py b/projects/serializers.py
index fc9168f1..6dba8b7d 100644
--- a/projects/serializers.py
+++ b/projects/serializers.py
@@ -2,6 +2,7 @@
import logging
+from celery.schedules import crontab
from rest_framework import serializers
from core.permissions import get_user_role
@@ -98,11 +99,26 @@ class ProjectConfigSerializer(
):
"""Serialize per-project authority and scoring settings."""
+ def validate_draft_schedule_cron(self, value: str) -> str:
+ """Normalize and validate the optional draft-generation cron string."""
+
+ normalized = " ".join(value.split())
+ if not normalized:
+ return ""
+ try:
+ crontab.from_string(normalized)
+ except Exception as exc:
+ raise serializers.ValidationError(
+ "Enter a valid 5-part cron expression."
+ ) from exc
+ return normalized
+
class Meta:
model = ProjectConfig
fields = [
"id",
"project",
+ "draft_schedule_cron",
"authority_weight_mention",
"authority_weight_engagement",
"authority_weight_recency",
diff --git a/projects/tests/test_admin.py b/projects/tests/test_admin.py
index e4e9dad3..0d5f55b0 100644
--- a/projects/tests/test_admin.py
+++ b/projects/tests/test_admin.py
@@ -123,12 +123,16 @@ def test_project_config_admin_exposes_centroid_toggle_field(source_admin_context
config = ProjectConfig.objects.create(project=source_admin_context.project)
admin_instance = ProjectConfigAdmin(ProjectConfig, AdminSite())
+ assert "draft_schedule_cron" in admin_instance.list_display
assert "authority_weight_mention" in admin_instance.list_display
assert "authority_weight_engagement" in admin_instance.list_display
assert "authority_weight_source_quality" in admin_instance.list_display
assert "authority_weight_cross_newsletter" in admin_instance.list_display
assert "recompute_topic_centroid_on_feedback_save" in admin_instance.list_display
assert "recompute_topic_centroid_on_feedback_save" in admin_instance.list_filter
+ assert "draft_schedule_cron" in admin_instance.get_fields(
+ request=_request(), obj=config
+ )
assert "authority_weight_duplicate" in admin_instance.get_fields(
request=_request(), obj=config
)
diff --git a/projects/tests/test_api.py b/projects/tests/test_api.py
index 3da3dee9..9f2aff11 100644
--- a/projects/tests/test_api.py
+++ b/projects/tests/test_api.py
@@ -148,7 +148,10 @@ def test_project_rotate_intake_token_returns_updated_project(self):
)
def test_project_config_detail_exposes_multi_signal_authority_weights(self):
- config = ProjectConfig.objects.create(project=self.owner_project)
+ config = ProjectConfig.objects.create(
+ project=self.owner_project,
+ draft_schedule_cron="0 9 * * *",
+ )
response = self.client.get(
reverse(
@@ -161,6 +164,7 @@ def test_project_config_detail_exposes_multi_signal_authority_weights(self):
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.json()["draft_schedule_cron"], "0 9 * * *")
self.assertEqual(response.json()["authority_weight_mention"], 0.2)
self.assertEqual(response.json()["authority_weight_engagement"], 0.15)
self.assertEqual(response.json()["authority_weight_cross_newsletter"], 0.2)
@@ -177,6 +181,7 @@ def test_project_config_patch_updates_multi_signal_authority_weights(self):
},
),
{
+ "draft_schedule_cron": "15 7 * * 1",
"authority_weight_engagement": 0.25,
"authority_weight_source_quality": 0.3,
},
@@ -185,9 +190,63 @@ def test_project_config_patch_updates_multi_signal_authority_weights(self):
config.refresh_from_db()
self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(config.draft_schedule_cron, "15 7 * * 1")
self.assertEqual(config.authority_weight_engagement, 0.25)
self.assertEqual(config.authority_weight_source_quality, 0.3)
+ def test_project_config_patch_rejects_invalid_draft_schedule_cron(self):
+ config = ProjectConfig.objects.create(project=self.owner_project)
+
+ response = self.client.patch(
+ reverse(
+ "v1:project-config-detail",
+ kwargs={
+ "project_id": _require_pk(self.owner_project),
+ "pk": _require_pk(config),
+ },
+ ),
+ {"draft_schedule_cron": "not a cron"},
+ format="json",
+ )
+
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+ self.assert_standardized_validation_error(
+ response.json(),
+ "draft_schedule_cron",
+ )
+
+ @override_settings(CELERY_TASK_ALWAYS_EAGER=True)
+ @patch("core.tasks.recompute_authority_scores")
+ @patch("core.tasks.recompute_source_quality")
+ def test_project_config_recompute_authority_runs_tasks_immediately(
+ self,
+ recompute_source_quality_mock,
+ recompute_authority_scores_mock,
+ ):
+ config = ProjectConfig.objects.create(project=self.owner_project)
+
+ response = self.client.post(
+ reverse(
+ "v1:project-config-recompute-authority",
+ kwargs={
+ "project_id": _require_pk(self.owner_project),
+ "pk": _require_pk(config),
+ },
+ ),
+ format="json",
+ )
+
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.json()["status"], "completed")
+ self.assertEqual(response.json()["project_id"], _require_pk(self.owner_project))
+ self.assertEqual(response.json()["config_id"], _require_pk(config))
+ recompute_source_quality_mock.assert_called_once_with(
+ _require_pk(self.owner_project)
+ )
+ recompute_authority_scores_mock.assert_called_once_with(
+ _require_pk(self.owner_project)
+ )
+
def test_bluesky_credentials_list_create_and_update_hide_stored_password(self):
list_response = self.client.get(
reverse(
diff --git a/skills/newsletter_composition/SKILL.md b/skills/newsletter_composition/SKILL.md
new file mode 100644
index 00000000..269cb27a
--- /dev/null
+++ b/skills/newsletter_composition/SKILL.md
@@ -0,0 +1,15 @@
+---
+name: newsletter-composition
+description: Compose editor-ready newsletter drafts from accepted themes, ideas, and recent supporting content.
+input: project_topic_description, themes, supporting_contents, original_pieces, style_examples, fallback_payload
+output: title, intro, outro, section_title, lede, items, suggestions
+---
+
+This skill composes project-scoped newsletter drafts from already accepted editorial inputs.
+
+The runtime flow uses three prompt resources under `resources/`:
+- `section_composer.md`
+- `intro_outro_composer.md`
+- `coherence_pass.md`
+
+Each step must stay grounded in real `ThemeSuggestion`, `OriginalContentIdea`, and `Content` rows. Never invent linked items or rewrite the draft from scratch when a lighter-touch edit suggestion is sufficient.
\ No newline at end of file
diff --git a/skills/newsletter_composition/resources/coherence_pass.md b/skills/newsletter_composition/resources/coherence_pass.md
new file mode 100644
index 00000000..0ec2bbea
--- /dev/null
+++ b/skills/newsletter_composition/resources/coherence_pass.md
@@ -0,0 +1,7 @@
+You review an already assembled newsletter draft and suggest small editorial improvements.
+
+Requirements:
+- Return JSON with a `suggestions` array.
+- Suggestions should focus on repetition, weak transitions, and tone mismatches.
+- Do not rewrite the draft.
+- Suggest only light-touch edits that an editor could apply manually.
\ No newline at end of file
diff --git a/skills/newsletter_composition/resources/intro_outro_composer.md b/skills/newsletter_composition/resources/intro_outro_composer.md
new file mode 100644
index 00000000..3af9ce5d
--- /dev/null
+++ b/skills/newsletter_composition/resources/intro_outro_composer.md
@@ -0,0 +1,8 @@
+You compose the framing copy for a newsletter edition.
+
+Requirements:
+- Return JSON with fields `title`, `intro`, and `outro`.
+- Use the project topic description, section payloads, and original-piece payloads as the source of truth.
+- Match the tone implied by the provided style examples when they exist.
+- Keep the intro focused on what this edition covers and why the selection matters now.
+- Keep the outro concise and tie back to the original pieces without promising work that is not in the prompt.
\ No newline at end of file
diff --git a/skills/newsletter_composition/resources/section_composer.md b/skills/newsletter_composition/resources/section_composer.md
new file mode 100644
index 00000000..c23e1287
--- /dev/null
+++ b/skills/newsletter_composition/resources/section_composer.md
@@ -0,0 +1,9 @@
+You compose one newsletter section from one accepted theme and a small set of supporting content rows.
+
+Requirements:
+- Stay grounded in the supplied theme and supporting content only.
+- Return JSON with fields `section_title`, `lede`, and `items`.
+- `items` must be an array of objects with `content_id`, `summary`, and `why_it_matters`.
+- Keep summaries concise and editorially polished.
+- `why_it_matters` must connect each item back to the accepted theme.
+- Do not invent content IDs, URLs, or facts that are not present in the prompt.
\ No newline at end of file