← Back to search
io.github.hatgit/forex-gpt-mcp

Forex-GPT MCP Server

AI-powered forex and crypto trading analysis with real-time data across 127+ instruments.

Status
Healthy
Score
74.7
Transport
sse
Tools
45

Production readiness

Verdict
Needs remediation
Current validation evidence shows operational or discovery gaps that should be fixed first.
Critical alerts
0
Production verdicts degrade quickly when critical alerts are active.

Evidence confidence

Confidence score
65.0
Based on 20 recent validations, 26 captured checks, and validation age of 614.4 hours.
Live checks captured
26
More direct checks increase trust in the current verdict.
Validation age
614.4h
Lower age means fresher evidence.

Recommended for

Claude Desktop
Claude Desktop is marked compatible with score 83.
Smithery
Smithery is marked compatible with score 80.
Generic Streamable HTTP
Generic Streamable HTTP is marked compatible with score 100.

Client readiness verdicts

Ready for ChatGPT custom connector
Partial
Requires a streamable HTTP endpoint.; Transport compliance should be in good shape.
Confidence: medium (65.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history, server_card
Disagreements: none
  • initializeOK
  • tools_listOK
  • transport_compliance_probeError
  • step_up_auth_probeWarning
  • connector_replay_probeOK — Frozen tool snapshots must survive refresh.
  • request_association_probeMissing — Roots, sampling, and elicitation should stay request-scoped.
Ready for Claude remote MCP
Ready
Transport behavior should match Claude-compatible HTTP expectations.
Confidence: medium (65.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history, server_card
Disagreements: none
  • initializeOK
  • tools_listOK
  • transport_compliance_probeError
Unsafe for write actions
Yes
High-risk write, exec, or destructive tools need stronger auth and confirmation semantics.
Confidence: medium (65.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history
Disagreements: none
  • action_safety_probeError
Snapshot churn risk
Low
No material tool-surface churn detected in the latest comparison.
Confidence: medium (65.0)
Evidence provenance
Winner: history
Supporting sources: history, live_validation
Disagreements: none
  • tool_snapshot_probeOK
  • connector_replay_probeOK

Why not ready by client

ChatGPT custom connector
Partial
Remediation checklist
  • No explicit blockers recorded.
Claude remote MCP
Ready
Remediation checklist
  • No explicit blockers recorded.
Write-safe publishing
Blocked
Remediation checklist
  • No explicit blockers recorded.

Verdict traces

Production verdict
Needs remediation
Current validation evidence shows operational or discovery gaps that should be fixed first.
Confidence: medium (65.0)
Winning source: live_validation
Triggering alerts
  • validation_stale • medium • Validation evidence is stale
Client verdict trace table
VerdictStatusChecksWinning sourceConflicts
openai_connectors Partial initialize, tools_list, transport_compliance_probe, step_up_auth_probe, connector_replay_probe, request_association_probe live_validation none
claude_desktop Ready initialize, tools_list, transport_compliance_probe live_validation none
unsafe_for_write_actions Yes action_safety_probe live_validation none
snapshot_churn_risk Low tool_snapshot_probe, connector_replay_probe history none

Publishability policy profiles

ChatGPT custom connector publishability
Caution
Requires a streamable HTTP endpoint.; Transport compliance should be in good shape.
  • Search Fetch Only: No
  • Write Actions Present: Yes
  • Oauth Configured: Yes
  • Admin Refresh Required: No
  • Safe For Company Knowledge: No
  • Safe For Messages Api Remote Mcp: No
Claude remote MCP publishability
Ready
Transport behavior should match Claude-compatible HTTP expectations.
  • Search Fetch Only: No
  • Write Actions Present: Yes
  • Oauth Configured: Yes
  • Admin Refresh Required: No
  • Safe For Company Knowledge: No
  • Safe For Messages Api Remote Mcp: No

Compatibility fixtures

ChatGPT custom connector fixture
Degraded
Requires a streamable HTTP endpoint.; Transport compliance should be in good shape.
  • remote_http_endpoint: Passes
  • oauth_discovery: Passes
  • frozen_tool_snapshot_refresh: Passes
  • request_association: Passes
Anthropic remote MCP fixture
Degraded
Transport behavior should match Claude-compatible HTTP expectations.
  • remote_transport: Passes
  • tool_discovery: Passes
  • auth_connect: Passes
  • safe_write_review: Degraded

Authenticated validation sessions

Latest profile
remote_mcp
Authenticated session used
Public score isolation
Preview endpoint
/v1/verify
CI preview endpoint
/v1/ci/preview

Public server reputation

Validation success 7d
n/a
Validation success 30d
1.0
Mean time to recover
91.53h
Breaking diffs 30d
0
Registry drift frequency 30d
0
Snapshot changes 30d
0

Incident & change feed

TimestampEventDetails
Apr 08, 2026 04:24:36 PM UTC Latest validation: healthy Score 74.7 with status healthy.

Capabilities

Use-case taxonomy
development database search communication

Security posture

Tools analyzed
45
High-risk tools
3
Destructive tools
2
Exec tools
2
Egress tools
0
Secret tools
6
Bulk-access tools
2
Risk distribution
low:19, medium:23, high:3

Tool capability & risk inventory

ToolCapabilitiesRiskFindingsNotes
save_oanda_credentials write secrets Medium secret material access freeform input surface No explicit safeguard hints detected.
delete_oanda_credentials write delete secrets High destructive operation secret material access No explicit safeguard hints detected.
trade_modify_trade write Medium none No explicit safeguard hints detected.
trade_market_order other Low none No explicit safeguard hints detected.
trade_limit_order other Low none No explicit safeguard hints detected.
trade_stop_order write Medium none No explicit safeguard hints detected.
cancel_pending_order other Low none No explicit safeguard hints detected.
replace_pending_order other Low none No explicit safeguard hints detected.
get_open_trades read Low none No explicit safeguard hints detected.
get_open_positions read Low none No explicit safeguard hints detected.
get_account_history read Low freeform input surface No explicit safeguard hints detected.
get_trade_details read Low none No explicit safeguard hints detected.
get_order_history read Low none No explicit safeguard hints detected.
get_pending_orders read Low none No explicit safeguard hints detected.
get_trading_account read Low none No explicit safeguard hints detected.
close_trade other Low none No explicit safeguard hints detected.
close_position other Low none No explicit safeguard hints detected.
get_market_hours read write secrets Medium secret material access No explicit safeguard hints detected.
is_market_open read write Medium none No explicit safeguard hints detected.
get_market_categories read Low none No explicit safeguard hints detected.
get_instrument_specs read Low freeform input surface No explicit safeguard hints detected.
refresh_instrument_data read write admin secrets Medium secret material access admin mutation No explicit safeguard hints detected.
get_instrument_cache_status read write Medium none No explicit safeguard hints detected.
get_token_balances read write filesystem admin secrets High secret material access filesystem mutation admin mutation No explicit safeguard hints detected.
list_assets read write admin Medium freeform input surface admin mutation No explicit safeguard hints detected.
analyze_asset write exec Medium command execution No explicit safeguard hints detected.
get_watchlist read write Medium none No explicit safeguard hints detected.
add_to_watchlist read write Medium none No explicit safeguard hints detected.
remove_from_watchlist read write delete Medium destructive operation No explicit safeguard hints detected.
analyze_watchlist read write admin Medium admin mutation No explicit safeguard hints detected.
analyze_timeframes read write Medium none No explicit safeguard hints detected.
economic_events read Low none No explicit safeguard hints detected.
get_blog_articles read network Medium none No explicit safeguard hints detected.
health read Low none No explicit safeguard hints detected.
get_chart_data read write Medium none No explicit safeguard hints detected.
get_live_heatmap read write admin export Medium bulk data access admin mutation No explicit safeguard hints detected.
search read write exec High command execution freeform input surface No explicit safeguard hints detected.
fetch read write Medium none No explicit safeguard hints detected.
scan_market read export Medium bulk data access No explicit safeguard hints detected.
get_spreads read write Medium none No explicit safeguard hints detected.
get_server_time read Low none No explicit safeguard hints detected.
help_tutorial other Low none No explicit safeguard hints detected.
get_price_stream_url read network Medium none No explicit safeguard hints detected.
get_sentiment_stream_url read network Medium none No explicit safeguard hints detected.
chart_chat_proxy secrets Medium secret material access No explicit safeguard hints detected.

Write-action governance

Governance status
Error
Safe to publish
Auth boundary
oauth_or_auth_required
Blast radius
High
High-risk tools
3
Confirmation signals
none
Safeguard count
0

Status detail: 3 high-risk tool(s), 2 destructive tool(s), 2 exec-capable tool(s) are exposed behind auth, but still risky; no safeguards or confirmation signals detected.

ToolRiskFlagsSafeguards
delete_oanda_credentials High destructive operation secret material access no
get_token_balances High secret material access filesystem mutation admin mutation no
search High command execution freeform input surface no

Action-controls diff

Snapshot changed
no
Disabled-by-default candidates
none
Manual review candidates
none
New actions
ActionRiskFlags
No newly added actions.
Changed actions
ActionChange typesRisk
No materially changed actions.

Why this score?

Access & Protocol
38.5/44
Connectivity, auth, and transport expectations for common clients.
Interface Quality
35/56
How well the tool/resource interface communicates and behaves under automation.
Security Posture
22.5/36
How safely the exposed tool surface handles destructive actions, egress, execution, secrets, and risky inputs.
Reliability & Trust
23/24
Operational stability, consistency, and trustworthiness over time.
Discovery & Governance
22.5/28
How well the server is documented, listed, and governed in public registries.
Adoption & Market
5/8
Adoption clues and public evidence that the server is intended for external use.

Algorithmic score breakdown

Auth Operability
4/4
Measures whether auth discovery and protected access behave predictably for clients.
Error Contract Quality
0/4
Grades machine-readable error structure, status alignment, and remediation hints.
Rate-Limit Semantics
2/4
Checks whether quota/throttle responses are deterministic and automation-friendly.
Schema Completeness
2/4
Completeness of tool descriptions, parameter docs, examples, and schema shape.
Backward Compatibility
4/4
Stability score across tool schema/name drift relative to prior validations.
SLO Health
3/4
Availability, latency, and burst-failure profile across recent validation history.
Security Hygiene
2/4
HTTPS posture, endpoint hygiene, and response-surface hardening checks.
Task Success
4/4
Can an agent reliably initialize, enumerate tools, and execute core MCP flows?
Trust Confidence
4/4
Confidence-adjusted reliability score that penalizes low evidence volume.
Abuse/Noise Resilience
4/4
How well the server preserves core behavior in the presence of noisy traffic patterns.
Prompt Contract
2/4
Quality of prompt metadata, argument shape, and prompt discoverability for clients.
Resource Contract
3/4
How completely resources and resource templates describe URIs, types, and usage shape.
Discovery Metadata
3/4
Homepage, docs, icon, repository, support, and license coverage for directory consumers.
Registry Consistency
2/4
Agreement between stored registry metadata, live server-card data, and current validation output.
Installability
4/4
How cleanly a real client can connect, initialize, enumerate tools, and proceed through auth.
Session Semantics
4/4
Determinism and state behavior across repeated MCP calls, including sticky-session surprises.
Tool Surface Design
3/4
Naming clarity, schema ergonomics, and parameter complexity across the tool surface.
Result Shape Stability
3/4
Stability of declared output schemas across validations, with penalties for drift or missing shapes.
OAuth Interop
4/4
Depth and client compatibility of OAuth/OIDC metadata beyond the minimal protected-resource check.
Recovery Semantics
0/4
Whether failures include actionable machine-readable next steps such as retry or upgrade guidance.
Maintenance Signal
3/4
Versioning, update recency, and historical validation cadence that indicate active stewardship.
Adoption Signal
2/4
Directory presence and distribution clues that suggest the server is intended for external use.
Freshness Confidence
4/4
Confidence that recent validations are current enough and dense enough to trust operationally.
Transport Fidelity
3/4
Whether declared transport metadata matches the observed endpoint behavior and response formats.
Spec Recency
4/4
How close the server’s claimed MCP protocol version is to the latest known public revision.
Session Resume
4/4
Whether Streamable HTTP session identifiers and resumed requests behave cleanly for real clients.
Step-Up Auth
3/4
Whether OAuth metadata and WWW-Authenticate challenges support granular, incremental consent instead of broad upfront scopes.
Transport Compliance
2.5/4
Checks session headers, protocol-version enforcement, session teardown, and expired-session behavior.
Utility Coverage
2/4
Signals support for completions, pagination, and task-oriented utility surfaces that larger clients increasingly expect.
Advanced Capability Coverage
3/4
Coverage of newer MCP surfaces like roots, sampling, elicitation, structured output, and related metadata.
Connector Publishability
3/4
How ready the server looks for client catalogs and managed connector programs.
Tool Snapshot Churn
4/4
Stability of the tool surface across recent validations, including add/remove and output-shape drift.
Connector Replay
4/4
Whether a previously published frozen connector snapshot would remain backward compatible after the latest tool refresh.
Request Association
3/4
Whether roots, sampling, and elicitation appear tied to active client requests instead of arriving unsolicited on idle sessions.
Interactive Flow Safety
3/4
Whether prompts and docs steer users toward safe auth flows instead of pasting secrets directly.
Action Safety
2/4
Risk-weighted view of destructive, exec, egress, and confirmation semantics across the tool surface.
Official Registry Presence
4/4
Whether the server appears directly or indirectly in the official MCP registry.
Provenance Divergence
4/4
How closely official registry metadata, the live server card, and public repo/package signals agree with each other.
Safety Transparency
4/4
Clarity of docs, auth disclosure, support links, and other trust signals visible to integrators.
Tool Capability Clarity
3/4
How clearly the tool surface communicates whether each action reads, writes, deletes, executes, or exports data.
Destructive Operation Safety
2/4
Penalizes delete/revoke/destroy style tools unless auth and safeguards reduce blast radius.
Egress / SSRF Resilience
3/4
Assesses arbitrary URL fetch, crawl, webhook, and remote-request exposure on the tool surface.
Execution / Sandbox Safety
2/4
Evaluates shell, code, script, and command-execution exposure and whether that surface appears contained.
Data Exfiltration Resilience
2/4
Assesses export, dump, backup, and bulk-read behavior against the surrounding auth and safeguard signals.
Least Privilege Scope
3/4
Rewards scoped auth metadata and penalizes broad or missing scopes around privileged tools.
Secret Handling Hygiene
3.5/4
Assesses secret-bearing tools, token leakage risk, and whether the public surface avoids obvious secret exposure.
Supply Chain Signal
2.5/4
Public metadata signal for repository, changelog, license, versioning, and recency that supports supply-chain trust.
Input Sanitization Safety
3/4
Penalizes risky freeform string inputs when schemas do not constrain URLs, code, paths, queries, or templates.
Tool Namespace Clarity
4/4
Measures naming uniqueness and ambiguity across the tool namespace to reduce collision and confusion risk.

Compatibility profiles

OpenAI Connectors
77.8
partial
Requires a streamable HTTP endpoint.; Transport compliance should be in good shape.
Connector URL: https://mcp.forex-gpt.ai/mcp
# Complete OAuth in the client when prompted.
# Server: io.github.hatgit/forex-gpt-mcp
Claude Desktop
83.3
compatible
Transport behavior should match Claude-compatible HTTP expectations.
{
  "mcpServers": {
    "forex-gpt-mcp": {
      "command": "npx",
      "args": ["mcp-remote", "https://mcp.forex-gpt.ai/mcp"]
    }
  }
}
Smithery
80.0
compatible
Machine-readable failure semantics should be present.
smithery mcp add "https://mcp.forex-gpt.ai/mcp"
Generic Streamable HTTP
100.0
compatible
No major blockers detected.
curl -sS https://mcp.forex-gpt.ai/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'

Actionable remediation

SeverityRemediationWhy it mattersRecommended action
High Add confirmation and dry-run semantics for risky actions High-risk write, delete, exec, or egress tools should communicate safeguards clearly. Inspect the latest validation evidence and resolve the client-visible regression.
Playbook
  • Inspect the latest validation evidence.
  • Resolve the highest-severity client-facing gap first.
  • Revalidate and confirm the score and verdict improve.
High Align session and protocol behavior with Streamable HTTP expectations Clients increasingly rely on MCP-Protocol-Version, session teardown, and expired-session semantics. Align MCP-Protocol-Version, MCP-Session-Id, DELETE teardown, and expired-session handling with the transport spec.
Playbook
  • Return `Mcp-Session-Id` and `Mcp-Protocol-Version` headers consistently on streamable HTTP responses.
  • Honor `DELETE` session teardown and return `404` when a deleted session is reused.
  • Reject invalid protocol-version headers with `400 Bad Request`.
High Associate roots, sampling, and elicitation with active client requests Modern MCP guidance expects roots, sampling, and elicitation traffic to be tied to an active client request instead of arriving unsolicited on idle sessions. Inspect the latest validation evidence and resolve the client-visible regression.
Playbook
  • Inspect the latest validation evidence.
  • Resolve the highest-severity client-facing gap first.
  • Revalidate and confirm the score and verdict improve.
High Publish a complete server card Missing or incomplete server-card metadata weakens discovery, documentation, and trust signals. Serve /.well-known/mcp/server-card.json and include tools, prompts/resources, homepage, and support links.
Playbook
  • Publish `/.well-known/mcp/server-card.json`.
  • Include homepage, repository, support, tools, prompts/resources, and auth metadata.
  • Revalidate the server after publishing the card.
Medium Adopt a current MCP protocol revision Older protocol revisions reduce compatibility with newer clients and registry programs. Inspect the latest validation evidence and resolve the client-visible regression.
Playbook
  • Inspect the latest validation evidence.
  • Resolve the highest-severity client-facing gap first.
  • Revalidate and confirm the score and verdict improve.
Medium Close connector-publishing gaps Connector catalogs care about protocol recency, session behavior, auth clarity, and tool-surface stability. Inspect the latest validation evidence and resolve the client-visible regression.
Playbook
  • Inspect the latest validation evidence.
  • Resolve the highest-severity client-facing gap first.
  • Revalidate and confirm the score and verdict improve.
Medium Document minimal scopes and return cleaner auth challenges Modern clients expect granular scopes and step-up auth signals such as WWW-Authenticate scope hints. Return granular scopes and WWW-Authenticate challenge hints instead of forcing overly broad auth upfront.
Playbook
  • Advertise the narrowest viable scopes in OAuth metadata.
  • Return `WWW-Authenticate` challenges with scope or insufficient-scope hints when additional consent is needed.
  • Revalidate with both public discovery and auth-required flows.
Medium Repair prompts/list or stop advertising prompts Prompt metadata should either work live or be removed from the advertised capability set. Only advertise prompts if prompts/list works and prompt arguments are documented.
Playbook
  • Only advertise prompts that are actually accessible.
  • Add prompt descriptions and argument docs.
  • Run a live `prompts/list` check after any prompt changes.
Medium Respond to validation evidence is stale Latest validation is 614.4 hours old. Trigger a fresh validation run or increase scheduler priority for this server.
Playbook
  • Queue a new validation run now.
  • Inspect whether the scheduler priority should be raised for this server.
  • Do not rely on stale evidence for production decisions.
Low Expose modern utility surfaces like completions, pagination, or tasks Utility coverage improves interoperability with larger clients and long-lived agent workflows. Expose completions, pagination, and task metadata where supported so larger clients can plan and resume work safely.
Playbook
  • Advertise `completions`, pagination cursors, and `tasks` only when they are actually supported.
  • Return `nextCursor` on large list operations when pagination is available.
  • Document task support and whether it requires step-up auth.
Low Publish newer MCP capability signals Roots, sampling, elicitation, structured outputs, and related metadata improve client understanding and ranking. Inspect the latest validation evidence and resolve the client-visible regression.
Playbook
  • Inspect the latest validation evidence.
  • Resolve the highest-severity client-facing gap first.
  • Revalidate and confirm the score and verdict improve.

Point loss breakdown

ComponentCurrentPoints missing
Recovery Semantics 0/4 -4.0
Error Contract 0/4 -4.0
Utility Coverage 2/4 -2.0
Security Hygiene 2/4 -2.0
Schema Completeness 2/4 -2.0
Registry Consistency 2/4 -2.0
Rate Limit Semantics 2/4 -2.0
Prompt Contract 2/4 -2.0
Execution Sandbox Safety 2/4 -2.0
Destructive Operation Safety 2/4 -2.0
Data Exfiltration Resilience 2/4 -2.0
Adoption Signal 2/4 -2.0

Validation diff

Score delta
0
Summary changed
no
Tool delta
0
Prompt delta
0
Auth mode changed
no
Write surface expanded
no
Protocol regressed
no
Registry drift changed
no

Regressed checks: none

Improved checks: none

ComponentPreviousLatestDelta
No component deltas between the latest two runs.

Tool snapshot diff & changelog

Snapshot changed
no
Added tools
none
Removed tools
none
Required-argument changes
ToolAdded required argsRemoved required args
No required-argument changes detected.
Output-schema drift
ToolPrevious propertiesLatest properties
No output-schema drift detected.

Connector replay

Status
OK
Backward compatible
Would break after refresh
Added tools
none
Removed tools
none
Additive output changes
none
Required-argument replay breaks
ToolAdded required argsRemoved required args
No required-argument replay breaks detected.
Output-schema replay breaks
ToolRemoved propertiesAdded properties
No output-schema replay breaks detected.

Transport compliance drilldown

Probe status
Error
Transport
sse
Session header
yes
Protocol header
no
Bad protocol response
200
DELETE teardown
405
Expired session retry
200
Last-Event-ID visible
no

Issues: missing_protocol_header, bad_protocol_not_rejected, delete_session_unexpected, expired_session_not_404

Request association

Status
Missing
Advertised capabilities
none
Observed idle methods
none
Violating methods
none
Probe HTTP status
n/a
Issues
none

Utility coverage

Probe status
Missing
Completions
not detected
Completion probe target: { "type": "resource", "uri": "ui://widget/spread-card.html" }
Pagination
not detected
No nextCursor evidence.
Tasks
Missing
Advertised: no

Benchmark tasks

Benchmark taskStatusEvidence
Discover tools Passes
  • initializeOK
  • tools_listOK
Read-only fetch flow Passes
  • resource_readOK
  • read_only_tool_surfaceOK
OAuth-required connect Passes
  • oauth_protected_resourceOK
  • step_up_auth_probeWarning
Safe write flow with confirmation Likely to fail
  • action_safety_probeError

Registry & provenance divergence

Probe status
OK
Direct official match
yes
Drift fields
none
FieldRegistryLive server card
Titlen/an/a
Versionn/an/a
Homepagen/an/a

Active alerts

Aliases & registry graph

IdentifierSourceCanonicalScore
io.github.hatgit/forex-gpt-mcp official_registry yes 74.74

Alias consolidation

Canonical identifier
io.github.hatgit/forex-gpt-mcp
Duplicate aliases
0
Registry sources
official_registry
Homepages
none
Source disagreements
FieldWhat differsObserved values
No source disagreements detected.

Install snippets

Openai Connectors
Connector URL: https://mcp.forex-gpt.ai/mcp
# Complete OAuth in the client when prompted.
# Server: io.github.hatgit/forex-gpt-mcp
Claude Desktop
{
  "mcpServers": {
    "forex-gpt-mcp": {
      "command": "npx",
      "args": ["mcp-remote", "https://mcp.forex-gpt.ai/mcp"]
    }
  }
}
Smithery
smithery mcp add "https://mcp.forex-gpt.ai/mcp"
Generic Http
curl -sS https://mcp.forex-gpt.ai/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'

Agent access & tool surface

Live server tools
save_oanda_credentials delete_oanda_credentials trade_modify_trade trade_market_order trade_limit_order trade_stop_order cancel_pending_order replace_pending_order
Observed from the latest live validation against https://mcp.forex-gpt.ai/mcp. This is the target server surface, not Verify's own inspection tools.
Live capability counts
45 tools • 0 prompts • 33 resources
Counts come from the latest tools/list, prompts/list, and resources/list checks.
Inspect with Verify
search_servers recommend_servers get_server_report compare_servers
Use Verify itself to search, recommend, compare, and fetch the full report for io.github.hatgit/forex-gpt-mcp.
Direct machine links

Claims & monitoring

Server ownership

No verified maintainer claim recorded.

Watch subscriptions
0
Teams: none

Alert routing

Active watches
0
Generic webhooks
0
Slack routes
0
Teams routes
0
Email routes
0
WatchTeamChannelsMinimum severity
No active watch destinations.

Maintainer analytics

Validation Run Count
20
Average Latency Ms
1131.45
Healthy Run Ratio Recent
0.9
Registry Presence Count
1
Active Alert Count
1
Watcher Count
0
Verified Claim
False
Taxonomy Tags
development, database, search, communication
Score Trend
74.74, 74.74, 74.74, 74.74, 74.74, 74.74, 74.74, 75.26, 75.26, 72.64
Remediation Count
11
High Risk Tool Count
3
Destructive Tool Count
2
Exec Tool Count
2

Maintainer response quality

Score
16.67
Verified claim
Support contact
Changelog present
Incident notes present
Tool changes documented
Annotation history
Annotation count
0

Maintainer annotations

No maintainer annotations have been recorded yet.

Maintainer rebuttals & expected behavior

No maintainer rebuttals or expected-behavior overrides are recorded yet.

Latest validation evidence

Latest summary
Healthy
Validation profile
remote_mcp
Started
Apr 08, 2026 04:24:35 PM UTC
Latency
1123.9 ms

Failures

Checks

CheckStatusLatencyEvidence
action_safety_probe Error n/a 3 high-risk, 2 destructive, 2 exec-capable tool(s); auth present; safeguards=0; confirmation=none.
advanced_capabilities_probe Warning n/a Only 2 capability signal(s): resource links, resources.
connector_publishability_probe Warning n/a Publishability blockers: transport compliance, action safety, server card.
connector_replay_probe OK n/a Backward compatible with no breaking tool-surface changes.
determinism_probe OK 18.3 ms Check completed
initialize OK 20.4 ms Protocol 2024-11-05
interactive_flow_probe OK n/a Check completed
oauth_authorization_server OK 38.7 ms authorization_endpoint, grant_types_supported, issuer, registration_endpoint
oauth_protected_resource OK 48.2 ms 1 authorization server(s)
official_registry_probe OK n/a Check completed
openid_configuration OK 19.9 ms authorization_endpoint, grant_types_supported, issuer, registration_endpoint
probe_noise_resilience OK 12.8 ms Fetched https://mcp.forex-gpt.ai/robots.txt
prompt_get Missing n/a not advertised
prompts_list Missing 34.8 ms Client error '404 ' for url 'https://mcp.forex-gpt.ai/mcp' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
protocol_version_probe Warning n/a Claims 2024-11-05; 3 release(s) behind 2025-11-25.
provenance_divergence_probe OK n/a Check completed
request_association_probe Missing n/a No request-association capabilities were advertised.
resource_read OK 37.1 ms 1 resource content item(s) returned
resources_list OK 29.9 ms 33 resource item(s) exposed
server_card Error 111.8 ms Client error '404 ' for url 'https://mcp.forex-gpt.ai/.well-known/mcp/server-card.json' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
session_resume_probe OK 89.7 ms 45 tool(s) exposed
step_up_auth_probe Warning n/a Scopes=email, offline access, openid, profile.
tool_snapshot_probe OK n/a Check completed
tools_list OK 23.6 ms 45 tool(s) exposed
transport_compliance_probe Error 73.6 ms Issues: missing protocol header, bad protocol not rejected, delete session unexpected, expired session not 404 (bad protocol=200, DELETE=405, expired session=200).
utility_coverage_probe Missing 18.6 ms No completions evidence; no pagination evidence; tasks missing.

Raw evidence view

Show raw JSON evidence
{
  "checks": {
    "action_safety_probe": {
      "details": {
        "auth_present": true,
        "confirmation_signals": [],
        "safeguard_count": 0,
        "summary": {
          "bulk_access_tools": 2,
          "capability_distribution": {
            "admin": 5,
            "delete": 2,
            "exec": 2,
            "export": 2,
            "filesystem": 1,
            "network": 3,
            "other": 7,
            "read": 32,
            "secrets": 6,
            "write": 21
          },
          "destructive_tools": 2,
          "egress_tools": 0,
          "exec_tools": 2,
          "high_risk_tools": 3,
          "risk_distribution": {
            "critical": 0,
            "high": 3,
            "low": 19,
            "medium": 23
          },
          "secret_tools": 6,
          "tool_count": 45
        }
      },
      "latency_ms": null,
      "status": "error"
    },
    "advanced_capabilities_probe": {
      "details": {
        "capabilities": {
          "completions": false,
          "elicitation": false,
          "prompts": false,
          "resource_links": true,
          "resources": true,
          "roots": false,
          "sampling": false,
          "structured_outputs": false
        },
        "enabled": [
          "resource_links",
          "resources"
        ],
        "enabled_count": 2,
        "initialize_capability_keys": [
          "extensions",
          "resources",
          "tools"
        ]
      },
      "latency_ms": null,
      "status": "warning"
    },
    "connector_publishability_probe": {
      "details": {
        "blockers": [
          "transport_compliance",
          "action_safety",
          "server_card"
        ],
        "criteria": {
          "action_safety": false,
          "auth_flow": true,
          "connector_replay": true,
          "initialize": true,
          "protocol_version": true,
          "remote_transport": true,
          "request_association": true,
          "server_card": false,
          "session_resume": true,
          "step_up_auth": true,
          "tool_surface": true,
          "tools_list": true,
          "transport_compliance": false
        },
        "high_risk_tools": 3,
        "tool_count": 45,
        "transport": "sse"
      },
      "latency_ms": null,
      "status": "warning"
    },
    "connector_replay_probe": {
      "details": {
        "added_tools": [],
        "additive_output_changes": [],
        "backward_compatible": true,
        "output_breaks": [],
        "removed_tools": [],
        "required_arg_breaks": [],
        "would_break_after_refresh": false
      },
      "latency_ms": null,
      "status": "ok"
    },
    "determinism_probe": {
      "details": {
        "attempts": 2,
        "baseline_signature": "bfae074541c0840ca4a688e76198bb6a55717a944258ec70c9ae7250786ae49d",
        "errors": [],
        "matches": 2,
        "stable_ratio": 1.0,
        "successful": 2
      },
      "latency_ms": 18.27,
      "status": "ok"
    },
    "initialize": {
      "details": {
        "headers": {
          "content-type": "application/json; charset=utf-8",
          "mcp-session-id": "80bd6123-4ca4-4cb4-b5dc-7e5d32a14785"
        },
        "http_status": 200,
        "payload": {
          "id": 1,
          "jsonrpc": "2.0",
          "result": {
            "capabilities": {
              "extensions": {
                "io.modelcontextprotocol/ui": {
                  "mimeTypes": [
                    "text/html;profile=mcp-app"
                  ]
                }
              },
              "resources": {
                "listChanged": false
              },
              "tools": {
                "listChanged": false
              }
            },
            "protocolVersion": "2024-11-05",
            "serverInfo": {
              "name": "forex-gpt-mcp",
              "version": "2.0.0"
            }
          }
        },
        "url": "https://mcp.forex-gpt.ai/mcp"
      },
      "latency_ms": 20.43,
      "status": "ok"
    },
    "interactive_flow_probe": {
      "details": {
        "oauth_supported": true,
        "prompt_available": false,
        "risk_hits": [],
        "safe_hits": []
      },
      "latency_ms": null,
      "status": "ok"
    },
    "oauth_authorization_server": {
      "details": {
        "headers": {
          "content-type": "application/json; charset=utf-8"
        },
        "http_status": 200,
        "payload": {
          "authorization_endpoint": "https://mcp.forex-gpt.ai/oauth/authorize",
          "grant_types_supported": [
            "authorization_code",
            "refresh_token"
          ],
          "issuer": "https://oauth.forex-gpt.ai/",
          "registration_endpoint": "https://mcp.forex-gpt.ai/.well-known/openid-configuration/register",
          "resource": "https://mcp.forex-gpt.ai",
          "response_types_supported": [
            "code"
          ],
          "scopes_supported": [
            "openid",
            "profile",
            "email",
            "offline_access"
          ],
          "token_endpoint": "https://mcp.forex-gpt.ai/oauth/token",
          "token_endpoint_auth_method": "none"
        },
        "url": "https://mcp.forex-gpt.ai/.well-known/oauth-authorization-server"
      },
      "latency_ms": 38.74,
      "status": "ok"
    },
    "oauth_protected_resource": {
      "details": {
        "headers": {
          "content-type": "application/json; charset=utf-8"
        },
        "http_status": 200,
        "payload": {
          "authorization_servers": [
            "https://mcp.forex-gpt.ai"
          ],
          "bearer_methods_supported": [
            "header"
          ],
          "resource": "https://mcp.forex-gpt.ai/mcp",
          "scopes_supported": [
            "openid",
            "profile",
            "email",
            "offline_access"
          ]
        },
        "url": "https://mcp.forex-gpt.ai/.well-known/oauth-protected-resource"
      },
      "latency_ms": 48.24,
      "status": "ok"
    },
    "official_registry_probe": {
      "details": {
        "direct_match": true,
        "official_peer_count": 1,
        "registry_identifier": "io.github.hatgit/forex-gpt-mcp",
        "registry_source": "official_registry"
      },
      "latency_ms": null,
      "status": "ok"
    },
    "openid_configuration": {
      "details": {
        "headers": {
          "content-type": "application/json; charset=utf-8"
        },
        "http_status": 200,
        "payload": {
          "authorization_endpoint": "https://mcp.forex-gpt.ai/oauth/authorize",
          "grant_types_supported": [
            "authorization_code",
            "refresh_token"
          ],
          "issuer": "https://oauth.forex-gpt.ai/",
          "registration_endpoint": "https://mcp.forex-gpt.ai/.well-known/openid-configuration/register",
          "resource": "https://mcp.forex-gpt.ai",
          "response_types_supported": [
            "code"
          ],
          "scopes_supported": [
            "openid",
            "profile",
            "email",
            "offline_access"
          ],
          "token_endpoint": "https://mcp.forex-gpt.ai/oauth/token",
          "token_endpoint_auth_method": "none"
        },
        "url": "https://mcp.forex-gpt.ai/.well-known/openid-configuration"
      },
      "latency_ms": 19.94,
      "status": "ok"
    },
    "probe_noise_resilience": {
      "details": {
        "headers": {
          "content-type": "text/plain; charset=utf-8"
        },
        "http_status": 404,
        "url": "https://mcp.forex-gpt.ai/robots.txt"
      },
      "latency_ms": 12.82,
      "status": "ok"
    },
    "prompt_get": {
      "details": {
        "reason": "not_advertised"
      },
      "latency_ms": null,
      "status": "missing"
    },
    "prompts_list": {
      "details": {
        "error": "Client error '404 ' for url 'https://mcp.forex-gpt.ai/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
        "headers": {
          "content-type": "application/json; charset=utf-8"
        },
        "http_status": 404,
        "payload": {},
        "reason": "not_supported",
        "url": "https://mcp.forex-gpt.ai/mcp"
      },
      "latency_ms": 34.77,
      "status": "missing"
    },
    "protocol_version_probe": {
      "details": {
        "claimed_version": "2024-11-05",
        "lag_days": 385,
        "latest_known_version": "2025-11-25",
        "releases_behind": 3,
        "validator_protocol_version": "2025-03-26"
      },
      "latency_ms": null,
      "status": "warning"
    },
    "provenance_divergence_probe": {
      "details": {
        "direct_official_match": true,
        "drift_fields": [],
        "metadata_document_count": 1,
        "registry_homepage": null,
        "registry_repository": null,
        "registry_title": null,
        "registry_version": null,
        "server_card_homepage": null,
        "server_card_repository": null,
        "server_card_title": null,
        "server_card_version": null
      },
      "latency_ms": null,
      "status": "ok"
    },
    "request_association_probe": {
      "details": {
        "reason": "no_request_association_capabilities_advertised"
      },
      "latency_ms": null,
      "status": "missing"
    },
    "resource_read": {
      "details": {
        "headers": {
          "content-type": "application/json; charset=utf-8"
        },
        "http_status": 200,
        "payload": {
          "id": 6,
          "jsonrpc": "2.0",
          "result": {
            "contents": [
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "text": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>spread-card</title>\n  <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n  <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n  <style>\n@layer theme,base,components,utilities;@layer theme{@theme default{ --font-sans: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; --font-serif: ui-serif, Georgia, Cambria, \"Times New Roman\", Times, serif; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; --color-red-50: oklch(97.1% .013 17.38); --color-red-100: oklch(93.6% .032 17.717); --color-red-200: oklch(88.5% .062 18.334); --color-red-300: oklch(80.8% .114 19.571); --color-red-400: oklch(70.4% .191 22.216); --color-red-500: oklch(63.7% .237 25.331); --color-red-600: oklch(57.7% .245 27.325); --color-red-700: oklch(50.5% .213 27.518); --color-red-800: oklch(44.4% .177 26.899); --color-red-900: oklch(39.6% .141 25.723); --color-red-950: oklch(25.8% .092 26.042); --color-orange-50: oklch(98% .016 73.684); --color-orange-100: oklch(95.4% .038 75.164); --color-orange-200: oklch(90.1% .076 70.697); --color-orange-300: oklch(83.7% .128 66.29); --color-orange-400: oklch(75% .183 55.934); --color-orange-500: oklch(70.5% .213 47.604); --color-orange-600: oklch(64.6% .222 41.116); --color-orange-700: oklch(55.3% .195 38.402); --color-orange-800: oklch(47% .157 37.304); --color-orange-900: oklch(40.8% .123 38.172); --color-orange-950: oklch(26.6% .079 36.259); --color-amber-50: oklch(98.7% .022 95.277); --color-amber-100: oklch(96.2% .059 95.617); --color-amber-200: oklch(92.4% .12 95.746); --color-amber-300: oklch(87.9% .169 91.605); --color-amber-400: oklch(82.8% .189 84.429); --color-amber-500: oklch(76.9% .188 70.08); --color-amber-600: oklch(66.6% .179 58.318); --color-amber-700: oklch(55.5% .163 48.998); --color-amber-800: oklch(47.3% .137 46.201); --color-amber-900: oklch(41.4% .112 45.904); --color-amber-950: oklch(27.9% .077 45.635); --color-yellow-50: oklch(98.7% .026 102.212); --color-yellow-100: oklch(97.3% .071 103.193); --color-yellow-200: oklch(94.5% .129 101.54); --color-yellow-300: oklch(90.5% .182 98.111); --color-yellow-400: oklch(85.2% .199 91.936); --color-yellow-500: oklch(79.5% .184 86.047); --color-yellow-600: oklch(68.1% .162 75.834); --color-yellow-700: oklch(55.4% .135 66.442); --color-yellow-800: oklch(47.6% .114 61.907); --color-yellow-900: oklch(42.1% .095 57.708); --color-yellow-950: oklch(28.6% .066 53.813); --color-lime-50: oklch(98.6% .031 120.757); --color-lime-100: oklch(96.7% .067 122.328); --color-lime-200: oklch(93.8% .127 124.321); --color-lime-300: oklch(89.7% .196 126.665); --color-lime-400: oklch(84.1% .238 128.85); --color-lime-500: oklch(76.8% .233 130.85); --color-lime-600: oklch(64.8% .2 131.684); --color-lime-700: oklch(53.2% .157 131.589); --color-lime-800: oklch(45.3% .124 130.933); --color-lime-900: oklch(40.5% .101 131.063); --color-lime-950: oklch(27.4% .072 132.109); --color-green-50: oklch(98.2% .018 155.826); --color-green-100: oklch(96.2% .044 156.743); --color-green-200: oklch(92.5% .084 155.995); --color-green-300: oklch(87.1% .15 154.449); --color-green-400: oklch(79.2% .209 151.711); --color-green-500: oklch(72.3% .219 149.579); --color-green-600: oklch(62.7% .194 149.214); --color-green-700: oklch(52.7% .154 150.069); --color-green-800: oklch(44.8% .119 151.328); --color-green-900: oklch(39.3% .095 152.535); --color-green-950: oklch(26.6% .065 152.934); --color-emerald-50: oklch(97.9% .021 166.113); --color-emerald-100: oklch(95% .052 163.051); --color-emerald-200: oklch(90.5% .093 164.15); --color-emerald-300: oklch(84.5% .143 164.978); --color-emerald-400: oklch(76.5% .177 163.223); --color-emerald-500: oklch(69.6% .17 162.48); --color-emerald-600: oklch(59.6% .145 163.225); --color-emerald-700: oklch(50.8% .118 165.612); --color-emerald-800: oklch(43.2% .095 166.913); --color-emerald-900: oklch(37.8% .077 168.94); --color-emerald-950: oklch(26.2% .051 172.552); --color-teal-50: oklch(98.4% .014 180.72); --color-teal-100: oklch(95.3% .051 180.801); --color-teal-200: oklch(91% .096 180.426); --color-teal-300: oklch(85.5% .138 181.071); --color-teal-400: oklch(77.7% .152 181.912); --color-teal-500: oklch(70.4% .14 182.503); --color-teal-600: oklch(60% .118 184.704); --color-teal-700: oklch(51.1% .096 186.391); --color-teal-800: oklch(43.7% .078 188.216); --color-teal-900: oklch(38.6% .063 188.416); --color-teal-950: oklch(27.7% .046 192.524); --color-cyan-50: oklch(98.4% .019 200.873); --color-cyan-100: oklch(95.6% .045 203.388); --color-cyan-200: oklch(91.7% .08 205.041); --color-cyan-300: oklch(86.5% .127 207.078); --color-cyan-400: oklch(78.9% .154 211.53); --color-cyan-500: oklch(71.5% .143 215.221); --color-cyan-600: oklch(60.9% .126 221.723); --color-cyan-700: oklch(52% .105 223.128); --color-cyan-800: oklch(45% .085 224.283); --color-cyan-900: oklch(39.8% .07 227.392); --color-cyan-950: oklch(30.2% .056 229.695); --color-sky-50: oklch(97.7% .013 236.62); --color-sky-100: oklch(95.1% .026 236.824); --color-sky-200: oklch(90.1% .058 230.902); --color-sky-300: oklch(82.8% .111 230.318); --color-sky-400: oklch(74.6% .16 232.661); --color-sky-500: oklch(68.5% .169 237.323); --color-sky-600: oklch(58.8% .158 241.966); --color-sky-700: oklch(50% .134 242.749); --color-sky-800: oklch(44.3% .11 240.79); --color-sky-900: oklch(39.1% .09 240.876); --color-sky-950: oklch(29.3% .066 243.157); --color-blue-50: oklch(97% .014 254.604); --color-blue-100: oklch(93.2% .032 255.585); --color-blue-200: oklch(88.2% .059 254.128); --color-blue-300: oklch(80.9% .105 251.813); --color-blue-400: oklch(70.7% .165 254.624); --color-blue-500: oklch(62.3% .214 259.815); --color-blue-600: oklch(54.6% .245 262.881); --color-blue-700: oklch(48.8% .243 264.376); --color-blue-800: oklch(42.4% .199 265.638); --color-blue-900: oklch(37.9% .146 265.522); --color-blue-950: oklch(28.2% .091 267.935); --color-indigo-50: oklch(96.2% .018 272.314); --color-indigo-100: oklch(93% .034 272.788); --color-indigo-200: oklch(87% .065 274.039); --color-indigo-300: oklch(78.5% .115 274.713); --color-indigo-400: oklch(67.3% .182 276.935); --color-indigo-500: oklch(58.5% .233 277.117); --color-indigo-600: oklch(51.1% .262 276.966); --color-indigo-700: oklch(45.7% .24 277.023); --color-indigo-800: oklch(39.8% .195 277.366); --color-indigo-900: oklch(35.9% .144 278.697); --color-indigo-950: oklch(25.7% .09 281.288); --color-violet-50: oklch(96.9% .016 293.756); --color-violet-100: oklch(94.3% .029 294.588); --color-violet-200: oklch(89.4% .057 293.283); --color-violet-300: oklch(81.1% .111 293.571); --color-violet-400: oklch(70.2% .183 293.541); --color-violet-500: oklch(60.6% .25 292.717); --color-violet-600: oklch(54.1% .281 293.009); --color-violet-700: oklch(49.1% .27 292.581); --color-violet-800: oklch(43.2% .232 292.759); --color-violet-900: oklch(38% .189 293.745); --color-violet-950: oklch(28.3% .141 291.089); --color-purple-50: oklch(97.7% .014 308.299); --color-purple-100: oklch(94.6% .033 307.174); --color-purple-200: oklch(90.2% .063 306.703); --color-purple-300: oklch(82.7% .119 306.383); --color-purple-400: oklch(71.4% .203 305.504); --color-purple-500: oklch(62.7% .265 303.9); --color-purple-600: oklch(55.8% .288 302.321); --color-purple-700: oklch(49.6% .265 301.924); --color-purple-800: oklch(43.8% .218 303.724); --color-purple-900: oklch(38.1% .176 304.987); --color-purple-950: oklch(29.1% .149 302.717); --color-fuchsia-50: oklch(97.7% .017 320.058); --color-fuchsia-100: oklch(95.2% .037 318.852); --color-fuchsia-200: oklch(90.3% .076 319.62); --color-fuchsia-300: oklch(83.3% .145 321.434); --color-fuchsia-400: oklch(74% .238 322.16); --color-fuchsia-500: oklch(66.7% .295 322.15); --color-fuchsia-600: oklch(59.1% .293 322.896); --color-fuchsia-700: oklch(51.8% .253 323.949); --color-fuchsia-800: oklch(45.2% .211 324.591); --color-fuchsia-900: oklch(40.1% .17 325.612); --color-fuchsia-950: oklch(29.3% .136 325.661); --color-pink-50: oklch(97.1% .014 343.198); --color-pink-100: oklch(94.8% .028 342.258); --color-pink-200: oklch(89.9% .061 343.231); --color-pink-300: oklch(82.3% .12 346.018); --color-pink-400: oklch(71.8% .202 349.761); --color-pink-500: oklch(65.6% .241 354.308); --color-pink-600: oklch(59.2% .249 .584); --color-pink-700: oklch(52.5% .223 3.958); --color-pink-800: oklch(45.9% .187 3.815); --color-pink-900: oklch(40.8% .153 2.432); --color-pink-950: oklch(28.4% .109 3.907); --color-rose-50: oklch(96.9% .015 12.422); --color-rose-100: oklch(94.1% .03 12.58); --color-rose-200: oklch(89.2% .058 10.001); --color-rose-300: oklch(81% .117 11.638); --color-rose-400: oklch(71.2% .194 13.428); --color-rose-500: oklch(64.5% .246 16.439); --color-rose-600: oklch(58.6% .253 17.585); --color-rose-700: oklch(51.4% .222 16.935); --color-rose-800: oklch(45.5% .188 13.697); --color-rose-900: oklch(41% .159 10.272); --color-rose-950: oklch(27.1% .105 12.094); --color-slate-50: oklch(98.4% .003 247.858); --color-slate-100: oklch(96.8% .007 247.896); --color-slate-200: oklch(92.9% .013 255.508); --color-slate-300: oklch(86.9% .022 252.894); --color-slate-400: oklch(70.4% .04 256.788); --color-slate-500: oklch(55.4% .046 257.417); --color-slate-600: oklch(44.6% .043 257.281); --color-slate-700: oklch(37.2% .044 257.287); --color-slate-800: oklch(27.9% .041 260.031); --color-slate-900: oklch(20.8% .042 265.755); --color-slate-950: oklch(12.9% .042 264.695); --color-gray-50: oklch(98.5% .002 247.839); --color-gray-100: oklch(96.7% .003 264.542); --color-gray-200: oklch(92.8% .006 264.531); --color-gray-300: oklch(87.2% .01 258.338); --color-gray-400: oklch(70.7% .022 261.325); --color-gray-500: oklch(55.1% .027 264.364); --color-gray-600: oklch(44.6% .03 256.802); --color-gray-700: oklch(37.3% .034 259.733); --color-gray-800: oklch(27.8% .033 256.848); --color-gray-900: oklch(21% .034 264.665); --color-gray-950: oklch(13% .028 261.692); --color-zinc-50: oklch(98.5% 0 0); --color-zinc-100: oklch(96.7% .001 286.375); --color-zinc-200: oklch(92% .004 286.32); --color-zinc-300: oklch(87.1% .006 286.286); --color-zinc-400: oklch(70.5% .015 286.067); --color-zinc-500: oklch(55.2% .016 285.938); --color-zinc-600: oklch(44.2% .017 285.786); --color-zinc-700: oklch(37% .013 285.805); --color-zinc-800: oklch(27.4% .006 286.033); --color-zinc-900: oklch(21% .006 285.885); --color-zinc-950: oklch(14.1% .005 285.823); --color-neutral-50: oklch(98.5% 0 0); --color-neutral-100: oklch(97% 0 0); --color-neutral-200: oklch(92.2% 0 0); --color-neutral-300: oklch(87% 0 0); --color-neutral-400: oklch(70.8% 0 0); --color-neutral-500: oklch(55.6% 0 0); --color-neutral-600: oklch(43.9% 0 0); --color-neutral-700: oklch(37.1% 0 0); --color-neutral-800: oklch(26.9% 0 0); --color-neutral-900: oklch(20.5% 0 0); --color-neutral-950: oklch(14.5% 0 0); --color-stone-50: oklch(98.5% .001 106.423); --color-stone-100: oklch(97% .001 106.424); --color-stone-200: oklch(92.3% .003 48.717); --color-stone-300: oklch(86.9% .005 56.366); --color-stone-400: oklch(70.9% .01 56.259); --color-stone-500: oklch(55.3% .013 58.071); --color-stone-600: oklch(44.4% .011 73.639); --color-stone-700: oklch(37.4% .01 67.558); --color-stone-800: oklch(26.8% .007 34.298); --color-stone-900: oklch(21.6% .006 56.043); --color-stone-950: oklch(14.7% .004 49.25); --color-black: #000; --color-white: #fff; --spacing: .25rem; --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; --breakpoint-xl: 80rem; --breakpoint-2xl: 96rem; --container-3xs: 16rem; --container-2xs: 18rem; --container-xs: 20rem; --container-sm: 24rem; --container-md: 28rem; --container-lg: 32rem; --container-xl: 36rem; --container-2xl: 42rem; --container-3xl: 48rem; --container-4xl: 56rem; --container-5xl: 64rem; --container-6xl: 72rem; --container-7xl: 80rem; --text-xs: .75rem; --text-xs--line-height: calc(1 / .75); --text-sm: .875rem; --text-sm--line-height: calc(1.25 / .875); --text-base: 1rem; --text-base--line-height: 1.5 ; --text-lg: 1.125rem; --text-lg--line-height: calc(1.75 / 1.125); --text-xl: 1.25rem; --text-xl--line-height: calc(1.75 / 1.25); --text-2xl: 1.5rem; --text-2xl--line-height: calc(2 / 1.5); --text-3xl: 1.875rem; --text-3xl--line-height: 1.2 ; --text-4xl: 2.25rem; --text-4xl--line-height: calc(2.5 / 2.25); --text-5xl: 3rem; --text-5xl--line-height: 1; --text-6xl: 3.75rem; --text-6xl--line-height: 1; --text-7xl: 4.5rem; --text-7xl--line-height: 1; --text-8xl: 6rem; --text-8xl--line-height: 1; --text-9xl: 8rem; --text-9xl--line-height: 1; --font-weight-thin: 100; --font-weight-extralight: 200; --font-weight-light: 300; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --font-weight-extrabold: 800; --font-weight-black: 900; --tracking-tighter: -.05em; --tracking-tight: -.025em; --tracking-normal: 0em; --tracking-wide: .025em; --tracking-wider: .05em; --tracking-widest: .1em; --leading-tight: 1.25; --leading-snug: 1.375; --leading-normal: 1.5; --leading-relaxed: 1.625; --leading-loose: 2; --radius-xs: .125rem; --radius-sm: .25rem; --radius-md: .375rem; --radius-lg: .5rem; --radius-xl: .75rem; --radius-2xl: 1rem; --radius-3xl: 1.5rem; --radius-4xl: 2rem; --shadow-2xs: 0 1px rgb(0 0 0 / .05); --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / .05); --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1); --shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1); --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1); --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1); --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / .25); --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / .05); --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / .05); --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / .05); --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / .05); --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / .15); --drop-shadow-md: 0 3px 3px rgb(0 0 0 / .12); --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / .15); --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / .1); --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / .15); --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / .15); --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / .2); --text-shadow-sm: 0px 1px 0px rgb(0 0 0 / .075), 0px 1px 1px rgb(0 0 0 / .075), 0px 2px 2px rgb(0 0 0 / .075); --text-shadow-md: 0px 1px 1px rgb(0 0 0 / .1), 0px 1px 2px rgb(0 0 0 / .1), 0px 2px 4px rgb(0 0 0 / .1); --text-shadow-lg: 0px 1px 2px rgb(0 0 0 / .1), 0px 3px 2px rgb(0 0 0 / .1), 0px 4px 8px rgb(0 0 0 / .1); --ease-in: cubic-bezier(.4, 0, 1, 1); --ease-out: cubic-bezier(0, 0, .2, 1); --ease-in-out: cubic-bezier(.4, 0, .2, 1); --animate-spin: spin 1s linear infinite; --animate-ping: ping 1s cubic-bezier(0, 0, .2, 1) infinite; --animate-pulse: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite; --animate-bounce: bounce 1s infinite; @keyframes spin { to { transform: rotate(360deg); } } @keyframes ping { 75%, 100% { transform: scale(2); opacity: 0; } } @keyframes pulse { 50% { opacity: .5; } } @keyframes bounce { 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(.8, 0, 1, 1); } 50% { transform: none; animation-timing-function: cubic-bezier(0, 0, .2, 1); } } --blur-xs: 4px; --blur-sm: 8px; --blur-md: 12px; --blur-lg: 16px; --blur-xl: 24px; --blur-2xl: 40px; --blur-3xl: 64px; --perspective-dramatic: 100px; --perspective-near: 300px; --perspective-normal: 500px; --perspective-midrange: 800px; --perspective-distant: 1200px; --aspect-video: 16 / 9; --default-transition-duration: .15s; --default-transition-timing-function: cubic-bezier(.4, 0, .2, 1); --default-font-family: --theme(--font-sans, initial); --default-font-feature-settings: --theme( --font-sans--font-feature-settings, initial ); --default-font-variation-settings: --theme( --font-sans--font-variation-settings, initial ); --default-mono-font-family: --theme(--font-mono, initial); --default-mono-font-feature-settings: --theme( --font-mono--font-feature-settings, initial ); --default-mono-font-variation-settings: --theme( --font-mono--font-variation-settings, initial ); }@theme default inline reference{ --blur: 8px; --shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1); --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / .05); --drop-shadow: 0 1px 2px rgb(0 0 0 / .1), 0 1px 1px rgb(0 0 0 / .06); --radius: .25rem; --max-width-prose: 65ch; }}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:--theme(--default-font-family,ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\");font-feature-settings:--theme(--default-font-feature-settings,normal);font-variation-settings:--theme(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:--theme(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace);font-feature-settings:--theme(--default-mono-font-feature-settings,normal);font-variation-settings:--theme(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{@tailwind utilities;}@layer base{html,:host{font-synthesis-weight:none}textarea{resize:none}img,svg{flex-grow:0;flex-shrink:0}input,textarea,select,optgroup{-webkit-appearance:none;-moz-appearance:none;appearance:none;box-shadow:none;filter:none;outline-offset:0;outline-width:2px}a,button,input,label,select,textarea,:where([aria-role=button]){touch-action:manipulation}button{text-transform:none;vertical-align:middle}button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}pre{white-space:pre-wrap}table{border-spacing:0}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}}@custom-variant hover{@media (hover: hover) and (pointer: fine) {&:hover {@slot;}}}@custom-variant dark (&:where([data-theme=dark],[data-theme=dark] *));@custom-variant light (&:where([data-theme=light],[data-theme=light] *));@layer theme{:root,:where([data-theme]){--gray-500: #5d5d5d;--alpha-0: color-mix(in oklab, var(--alpha-base) 0%, transparent);--alpha-02: color-mix(in oklab, var(--alpha-base) 2%, transparent);--alpha-04: color-mix(in oklab, var(--alpha-base) 4%, transparent);--alpha-05: color-mix(in oklab, var(--alpha-base) 5%, transparent);--alpha-06: color-mix(in oklab, var(--alpha-base) 6%, transparent);--alpha-08: color-mix(in oklab, var(--alpha-base) 8%, transparent);--alpha-10: color-mix(in oklab, var(--alpha-base) 10%, transparent);--alpha-12: color-mix(in oklab, var(--alpha-base) 12%, transparent);--alpha-15: color-mix(in oklab, var(--alpha-base) 15%, transparent);--alpha-16: color-mix(in oklab, var(--alpha-base) 16%, transparent);--alpha-20: color-mix(in oklab, var(--alpha-base) 20%, transparent);--alpha-25: color-mix(in oklab, var(--alpha-base) 25%, transparent);--alpha-30: color-mix(in oklab, var(--alpha-base) 30%, transparent);--alpha-35: color-mix(in oklab, var(--alpha-base) 35%, transparent);--alpha-40: color-mix(in oklab, var(--alpha-base) 40%, transparent);--alpha-50: color-mix(in oklab, var(--alpha-base) 50%, transparent);--alpha-60: color-mix(in oklab, var(--alpha-base) 60%, transparent);--alpha-70: color-mix(in oklab, var(--alpha-base) 70%, transparent);--white: #ffffff;--black: #000000;--green-25: #edfaf2;--green-50: #d9f4e4;--green-75: #b8ebcc;--green-100: #8cdfad;--green-200: #66d492;--green-300: #40c977;--green-400: #04b84c;--green-500: #00a240;--green-600: #008635;--green-700: #00692a;--green-800: #004f1f;--green-900: #003716;--green-950: #011c0b;--green-1000: #001207;--green-a25: color-mix(in oklab, var(--green-400) 8%, transparent);--green-a50: color-mix(in oklab, var(--green-400) 15%, transparent);--green-a75: color-mix(in oklab, var(--green-400) 29%, transparent);--green-a100: color-mix(in oklab, var(--green-400) 45%, transparent);--green-a200: color-mix(in oklab, var(--green-400) 60%, transparent);--green-a300: color-mix(in oklab, var(--green-400) 75%, transparent);--red-25: #fff0f0;--red-50: #ffd9d9;--red-75: #ffc6c5;--red-100: #ffa4a2;--red-200: #ff8583;--red-300: #ff6764;--red-400: #fa423e;--red-500: #e02e2a;--red-600: #ba2623;--red-700: #911e1b;--red-800: #6e1615;--red-900: #4d100e;--red-950: #280b0a;--red-1000: #1f0909;--red-a25: color-mix(in oklab, var(--red-400) 8%, transparent);--red-a50: color-mix(in oklab, var(--red-400) 16%, transparent);--red-a75: color-mix(in oklab, var(--red-400) 30%, transparent);--red-a100: color-mix(in oklab, var(--red-400) 48%, transparent);--red-a200: color-mix(in oklab, var(--red-400) 64%, transparent);--red-a300: color-mix(in oklab, var(--red-400) 79%, transparent);--pink-25: #fff4f9;--pink-50: #ffe8f3;--pink-75: #ffd4e8;--pink-100: #ffbada;--pink-200: #ffa3ce;--pink-300: #ff8cc1;--pink-400: #ff66ad;--pink-500: #e04c91;--pink-600: #ba437a;--pink-700: #963c67;--pink-800: #6e2c4a;--pink-900: #4d1f34;--pink-950: #29101c;--pink-1000: #1a0a11;--pink-a25: color-mix(in oklab, var(--pink-400) 8%, transparent);--pink-a50: color-mix(in oklab, var(--pink-400) 16%, transparent);--pink-a75: color-mix(in oklab, var(--pink-400) 28%, transparent);--pink-a100: color-mix(in oklab, var(--pink-400) 45%, transparent);--pink-a200: color-mix(in oklab, var(--pink-400) 60%, transparent);--pink-a300: color-mix(in oklab, var(--pink-400) 76%, transparent);--orange-25: #fff5f0;--orange-50: #ffe7d9;--orange-75: #ffcfb4;--orange-100: #ffb790;--orange-200: #ff9e6c;--orange-300: #ff8549;--orange-400: #fb6a22;--orange-500: #e25507;--orange-600: #b9480d;--orange-700: #923b0f;--orange-800: #6d2e0f;--orange-900: #4a2206;--orange-950: #281105;--orange-1000: #211107;--orange-a25: color-mix(in oklab, var(--orange-400) 7%, transparent);--orange-a50: color-mix(in oklab, var(--orange-400) 16%, transparent);--orange-a75: color-mix(in oklab, var(--orange-400) 33%, transparent);--orange-a100: color-mix(in oklab, var(--orange-400) 48%, transparent);--orange-a200: color-mix(in oklab, var(--orange-400) 65%, transparent);--orange-a300: color-mix(in oklab, var(--orange-400) 81%, transparent);--yellow-25: #fffbed;--yellow-50: #fff6d9;--yellow-75: #ffeeb8;--yellow-100: #ffe48c;--yellow-200: #ffdb66;--yellow-300: #ffd240;--yellow-400: #ffc300;--yellow-500: #e0ac00;--yellow-600: #ba8e00;--yellow-700: #916f00;--yellow-800: #6e5400;--yellow-900: #4d3b00;--yellow-950: #261d00;--yellow-1000: #1a1400;--yellow-a25: color-mix(in oklab, var(--yellow-400) 8%, transparent);--yellow-a50: color-mix(in oklab, var(--yellow-400) 15%, transparent);--yellow-a75: color-mix(in oklab, var(--yellow-400) 27%, transparent);--yellow-a100: color-mix(in oklab, var(--yellow-400) 45%, transparent);--yellow-a200: color-mix(in oklab, var(--yellow-400) 59%, transparent);--yellow-a300: color-mix(in oklab, var(--yellow-400) 74%, transparent);--purple-25: #f9f5fe;--purple-50: #efe5fe;--purple-75: #e0cefd;--purple-100: #ceb0fb;--purple-200: #be95fa;--purple-300: #ad7bf9;--purple-400: #924ff7;--purple-500: #8046d9;--purple-600: #6b3ab4;--purple-700: #532d8d;--purple-800: #3f226a;--purple-900: #2c184a;--purple-950: #160c25;--purple-1000: #100a19;--purple-a25: color-mix(in oklab, var(--purple-400) 6%, transparent);--purple-a50: color-mix(in oklab, var(--purple-400) 15%, transparent);--purple-a75: color-mix(in oklab, var(--purple-400) 28%, transparent);--purple-a100: color-mix(in oklab, var(--purple-400) 45%, transparent);--purple-a200: color-mix(in oklab, var(--purple-400) 60%, transparent);--purple-a300: color-mix(in oklab, var(--purple-400) 75%, transparent);--blue-25: #f5faff;--blue-50: #e5f3ff;--blue-75: #cce6ff;--blue-100: #99ceff;--blue-200: #66b5ff;--blue-300: #339cff;--blue-400: #0285ff;--blue-500: #0169cc;--blue-600: #004f99;--blue-700: #003f7a;--blue-800: #013566;--blue-900: #00284d;--blue-950: #000e1a;--blue-1000: #000d19;--blue-a25: color-mix(in oklab, var(--blue-400) 4%, transparent);--blue-a50: color-mix(in oklab, var(--blue-400) 13%, transparent);--blue-a75: color-mix(in oklab, var(--blue-400) 25%, transparent);--blue-a100: color-mix(in oklab, var(--blue-400) 40%, transparent);--blue-a200: color-mix(in oklab, var(--blue-400) 60%, transparent);--blue-a300: color-mix(in oklab, var(--blue-400) 80%, transparent);--hairline: 1px}:where(:root),:where([data-theme=light]){--gray-0: #ffffff;--gray-25: #fcfcfc;--gray-50: #f9f9f9;--gray-75: #f3f3f3;--gray-100: #ededed;--gray-150: #dfdfdf;--gray-200: #cdcdcd;--gray-250: #b9b9b9;--gray-300: #afafaf;--gray-350: #9f9f9f;--gray-400: #8f8f8f;--gray-450: #767676;--gray-550: #4f4f4f;--gray-600: #414141;--gray-650: #393939;--gray-700: #303030;--gray-750: #282828;--gray-800: #212121;--gray-850: #1c1c1c;--gray-900: #181818;--gray-925: #161616;--gray-950: #131313;--gray-975: #101010;--gray-1000: #0d0d0d;--alpha-base: #0d0d0d}:where([data-theme=dark]){--gray-0: #0d0d0d;--gray-25: #101010;--gray-50: #131313;--gray-75: #161616;--gray-100: #181818;--gray-150: #1c1c1c;--gray-200: #212121;--gray-250: #282828;--gray-300: #303030;--gray-350: #393939;--gray-400: #414141;--gray-450: #4f4f4f;--gray-550: #767676;--gray-600: #8f8f8f;--gray-650: #9f9f9f;--gray-700: #afafaf;--gray-750: #b9b9b9;--gray-800: #cdcdcd;--gray-850: #dcdcdc;--gray-900: #ededed;--gray-925: #f3f3f3;--gray-950: #f3f3f3;--gray-975: #f9f9f9;--gray-1000: #ffffff;--alpha-base: #ffffff}@media(min-resolution:150dpi),(min-resolution:1.5dppx){:root,:where([data-theme]){--hairline: .5px}}:root,:where([data-theme]){--shadow-color: 0 0 0;--elevation-100-geo: 0 1px 2px -1px;--elevation-200-geo: 0 2px 4px -1px;--elevation-300-geo: 0 4px 8px -2px;--elevation-400-geo: 0 8px 16px -4px}:where(:root),:where([data-theme=light]){--shadow-alpha-100: .08;--shadow-alpha-200: .08;--shadow-alpha-300: .1;--shadow-alpha-400: .12;--shadow-hairline-width: 1px;--shadow-hairline-color: rgb(0 0 0 / 8%)}@media(min-resolution:150dpi),(min-resolution:1.5dppx){:where(:root),:where([data-theme=light]){--shadow-hairline-width: .5px;--shadow-hairline-color: rgb(0 0 0 / 10%) }}:where([data-theme=dark]){--shadow-alpha-100: .2;--shadow-alpha-200: .2;--shadow-alpha-300: .36;--shadow-alpha-400: .3;--shadow-hairline-width: 1px;--shadow-hairline-color: rgb(255 255 255 / 10%)}@media(min-resolution:150dpi),(min-resolution:1.5dppx){:where([data-theme=dark]){--shadow-hairline-width: .5px;--shadow-hairline-color: rgb(255 255 255 / 12%) }}:where([data-theme=dark]) [data-surface=elevated]{--shadow-hairline: 0 0 rgb(0 0 0 / 0%)}}@theme static{ --breakpoint-xs: 380px; --breakpoint-sm: 576px; --breakpoint-md: 768px; --breakpoint-lg: 1024px; --breakpoint-xl: 1280px; --breakpoint-2xl: 1536px; --font-serif: initial; --font-sans: ui-sans-serif, -apple-system, system-ui, \"Segoe UI\", \"Noto Sans\", \"Helvetica\", \"Arial\", \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", sans-serif; --font-mono: ui-monospace, \"SFMono-Regular\", \"SF Mono\", \"Menlo\", \"Monaco\", \"Consolas\", \"Liberation Mono\", \"DejaVu Sans Mono\", \"Courier New\", monospace; --font-weight-*: initial; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --radius-*: initial; --radius-2xs: .125rem; --radius-xs: .25rem; --radius-sm: .375rem; --radius-md: .5rem; --radius-lg: .625rem; --radius-xl: .75rem; --radius-2xl: 1rem; --radius-3xl: 1.25rem; --radius-4xl: 1.5rem; --radius-full: 9999px; --spacing: .25rem; }@layer theme{:root,:where([data-theme]){--color-text: var(--gray-1000);--color-text-inverse: var(--gray-0);--color-text-primary: var(--color-text);--color-text-primary-soft: var(--color-text);--color-background-primary-soft-alt: var(--alpha-02);--color-border-primary-soft-alt: var(--alpha-06);--color-text-primary-soft-alt: var(--color-text);--color-text-primary-surface: var(--color-text);--color-text-primary-solid: var(--color-text-inverse);--color-text-primary-outline: var(--color-text);--color-text-primary-outline-hover: var(--color-text);--color-text-primary-ghost: var(--color-text);--color-text-primary-ghost-hover: var(--color-text);--color-ring-primary: var(--color-ring);--color-ring-primary-soft: var(--color-ring-primary);--color-ring-primary-solid: var(--color-ring-primary);--color-ring-primary-outline: var(--color-ring-primary);--color-ring-primary-ghost: var(--color-ring-primary);--color-text-secondary-soft: var(--color-text);--color-background-secondary-soft-alt: var(--alpha-02);--color-border-secondary-soft-alt: var(--alpha-06);--color-text-secondary-soft-alt: var(--color-text);--color-text-secondary-solid: var(--white);--color-text-secondary-outline: var(--color-text-secondary);--color-text-secondary-outline-hover: var(--color-text);--color-text-secondary-ghost: var(--color-text-secondary);--color-text-secondary-ghost-hover: var(--color-text);--color-ring-secondary: var(--color-ring);--color-ring-secondary-soft: var(--color-ring-secondary);--color-ring-secondary-solid: var(--color-ring-secondary);--color-ring-secondary-outline: var(--color-ring-secondary);--color-ring-secondary-ghost: var(--color-ring-secondary);--color-background-info-soft: var(--blue-50);--color-background-info-soft-hover: var(--blue-75);--color-background-info-soft-active: var(--blue-75);--color-background-info-soft-alpha: var(--blue-a50);--color-background-info-soft-alpha-hover: var(--blue-a75);--color-background-info-soft-alpha-active: var(--blue-a75);--color-background-info-solid: var(--blue-400);--color-background-info-solid-hover: var(--blue-500);--color-background-info-solid-active: var(--blue-500);--color-text-info-solid: var(--white);--color-background-info-outline-hover: var(--blue-a25);--color-background-info-outline-active: var(--blue-a25);--color-border-info-outline: var(--blue-500);--color-border-info-outline-hover: var(--blue-500);--color-text-info-outline: var(--blue-500);--color-text-info-outline-hover: var(--blue-500);--color-background-info-ghost-hover: var(--blue-a50);--color-background-info-ghost-active: var(--blue-a50);--color-ring-info: var(--color-ring);--color-ring-info-soft: var(--color-ring-info);--color-ring-info-solid: var(--color-ring-info);--color-ring-info-outline: var(--color-ring-info);--color-ring-info-ghost: var(--color-ring-info);--color-background-warning-soft: var(--orange-50);--color-background-warning-soft-hover: var(--orange-75);--color-background-warning-soft-active: var(--orange-75);--color-background-warning-soft-alpha: var(--orange-a50);--color-background-warning-soft-alpha-hover: var(--orange-a75);--color-background-warning-soft-alpha-active: var(--orange-a75);--color-background-warning-solid: var(--orange-500);--color-background-warning-solid-hover: var(--orange-600);--color-background-warning-solid-active: var(--orange-600);--color-text-warning-solid: var(--white);--color-background-warning-outline-hover: var(--orange-a25);--color-background-warning-outline-active: var(--orange-a25);--color-border-warning-outline: var(--orange-500);--color-border-warning-outline-hover: var(--orange-500);--color-text-warning-outline: var(--orange-500);--color-text-warning-outline-hover: var(--orange-500);--color-background-warning-ghost-hover: var(--orange-a50);--color-background-warning-ghost-active: var(--orange-a50);--color-text-warning-ghost: var(--orange-500);--color-text-warning-ghost-hover: var(--orange-500);--color-ring-warning: var(--color-ring);--color-ring-warning-soft: var(--color-ring-warning);--color-ring-warning-solid: var(--color-ring-warning);--color-ring-warning-outline: var(--color-ring-warning);--color-ring-warning-ghost: var(--color-ring-warning);--color-text-caution-hover: var(--yellow-800);--color-background-caution-soft: var(--yellow-50);--color-background-caution-soft-hover: var(--yellow-75);--color-background-caution-soft-active: var(--yellow-75);--color-background-caution-soft-alpha: var(--yellow-a50);--color-background-caution-soft-alpha-hover: var(--yellow-a75);--color-background-caution-soft-alpha-active: var(--yellow-a75);--color-background-caution-solid: var(--yellow-600);--color-background-caution-solid-hover: var(--yellow-700);--color-background-caution-solid-active: var(--yellow-700);--color-text-caution-solid: var(--white);--color-background-caution-outline-hover: var(--yellow-a25);--color-background-caution-outline-active: var(--yellow-a25);--color-border-caution-outline: var(--yellow-700);--color-border-caution-outline-hover: var(--yellow-700);--color-text-caution-outline: var(--yellow-700);--color-text-caution-outline-hover: var(--yellow-700);--color-background-caution-ghost-hover: var(--yellow-a50);--color-background-caution-ghost-active: var(--yellow-a50);--color-text-caution-ghost: var(--yellow-700);--color-text-caution-ghost-hover: var(--yellow-700);--color-ring-caution: var(--color-ring);--color-ring-caution-soft: var(--color-ring-caution);--color-ring-caution-solid: var(--color-ring-caution);--color-ring-caution-outline: var(--color-ring-caution);--color-ring-caution-ghost: var(--color-ring-caution);--color-background-danger-soft: var(--red-50);--color-background-danger-soft-hover: var(--red-75);--color-background-danger-soft-active: var(--red-75);--color-background-danger-soft-alpha: var(--red-a50);--color-background-danger-soft-alpha-hover: var(--red-a75);--color-background-danger-soft-alpha-active: var(--red-a75);--color-background-danger-solid: var(--red-500);--color-background-danger-solid-hover: var(--red-600);--color-background-danger-solid-active: var(--red-600);--color-text-danger-solid: var(--white);--color-background-danger-outline-hover: var(--red-a25);--color-background-danger-outline-active: var(--red-a25);--color-border-danger-outline: var(--red-500);--color-border-danger-outline-hover: var(--red-500);--color-text-danger-outline: var(--red-500);--color-text-danger-outline-hover: var(--red-500);--color-background-danger-ghost-hover: var(--red-a50);--color-background-danger-ghost-active: var(--red-a50);--color-text-danger-ghost: var(--red-500);--color-text-danger-ghost-hover: var(--red-500);--color-ring-danger: var(--red-200);--color-ring-danger-soft: var(--color-ring-danger);--color-ring-danger-solid: var(--color-ring-danger);--color-ring-danger-outline: var(--color-ring-danger);--color-ring-danger-ghost: var(--color-ring-danger);--color-background-success-soft: var(--green-50);--color-background-success-soft-hover: var(--green-75);--color-background-success-soft-active: var(--green-75);--color-background-success-soft-alpha: var(--green-a50);--color-background-success-soft-alpha-hover: var(--green-a75);--color-background-success-soft-alpha-active: var(--green-a75);--color-text-success-solid: var(--white);--color-background-success-outline-hover: var(--green-a25);--color-background-success-outline-active: var(--green-a25);--color-text-success-outline: var(--green-500);--color-text-success-outline-hover: var(--green-500);--color-background-success-ghost-hover: var(--green-a50);--color-background-success-ghost-active: var(--green-a50);--color-text-success-ghost: var(--green-500);--color-text-success-ghost-hover: var(--green-500);--color-ring-success: var(--color-ring);--color-ring-success-soft: var(--color-ring-info);--color-ring-success-solid: var(--color-ring-info);--color-ring-success-outline: var(--color-ring-info);--color-ring-success-ghost: var(--color-ring-info);--color-background-discovery-soft: var(--purple-50);--color-background-discovery-soft-hover: var(--purple-75);--color-background-discovery-soft-active: var(--purple-75);--color-background-discovery-soft-alpha: var(--purple-a50);--color-background-discovery-soft-alpha-hover: var(--purple-a75);--color-background-discovery-soft-alpha-active: var(--purple-a75);--color-background-discovery-solid: var(--purple-400);--color-background-discovery-solid-hover: var(--purple-500);--color-background-discovery-solid-active: var(--purple-500);--color-text-discovery-solid: var(--white);--color-background-discovery-outline-hover: var(--purple-a25);--color-background-discovery-outline-active: var(--purple-a25);--color-border-discovery-outline: var(--purple-500);--color-border-discovery-outline-hover: var(--purple-500);--color-background-discovery-ghost-hover: var(--purple-a50);--color-background-discovery-ghost-active: var(--purple-a50);--color-text-discovery-ghost: var(--purple-500);--color-text-discovery-ghost-hover: var(--purple-500);--color-ring-discovery: var(--color-ring);--color-ring-discovery-soft: var(--color-ring);--color-ring-discovery-solid: var(--color-ring);--color-ring-discovery-outline: var(--color-ring);--color-ring-discovery-ghost: var(--color-ring);--color-background-disabled: var(--alpha-05);--color-border-disabled: var(--alpha-06);--font-tracking-wide: 0em;--font-tracking-normal: 0em;--font-tracking-tight: 0em;--font-heading-5xl-size: 4.5rem;--font-heading-5xl-line-height: 4.5rem;--font-heading-5xl-weight: var(--font-weight-semibold);--font-heading-5xl-tracking: var(--tracking-tight);--font-heading-4xl-size: 3.75rem;--font-heading-4xl-line-height: 3.75rem;--font-heading-4xl-weight: var(--font-weight-semibold);--font-heading-4xl-tracking: var(--tracking-tight);--font-heading-3xl-size: 3rem;--font-heading-3xl-line-height: 3rem;--font-heading-3xl-weight: var(--font-weight-semibold);--font-heading-3xl-tracking: var(--tracking-tight);--font-heading-2xl-size: 2.25rem;--font-heading-2xl-line-height: 2.625rem;--font-heading-2xl-weight: var(--font-weight-semibold);--font-heading-2xl-tracking: var(--tracking-tight);--font-heading-xl-size: 2rem;--font-heading-xl-line-height: 2.375rem;--font-heading-xl-weight: var(--font-weight-semibold);--font-heading-xl-tracking: var(--tracking-tight);--font-heading-lg-size: 1.5rem;--font-heading-lg-line-height: 1.75rem;--font-heading-lg-weight: var(--font-weight-semibold);--font-heading-lg-tracking: var(--tracking-normal);--font-heading-md-size: 1.25rem;--font-heading-md-line-height: 1.625rem;--font-heading-md-weight: var(--font-weight-semibold);--font-heading-md-tracking: var(--tracking-normal);--font-heading-sm-size: 1.125rem;--font-heading-sm-line-height: 1.625rem;--font-heading-sm-weight: var(--font-weight-semibold);--font-heading-sm-tracking: var(--tracking-normal);--font-heading-xs-size: 1rem;--font-heading-xs-line-height: 1.5rem;--font-heading-xs-weight: var(--font-weight-semibold);--font-heading-xs-tracking: var(--tracking-normal);--font-text-lg-size: 1.125rem;--font-text-lg-line-height: 1.8125rem;--font-text-lg-weight: var(--font-weight-normal);--font-text-lg-tracking: var(--tracking-normal);--font-text-md-size: 1rem;--font-text-md-line-height: 1.5rem;--font-text-md-weight: var(--font-weight-normal);--font-text-md-tracking: var(--tracking-normal);--font-text-sm-size: .875rem;--font-text-sm-line-height: 1.25rem;--font-text-sm-weight: var(--font-weight-normal);--font-text-sm-tracking: var(--tracking-normal);--font-text-xs-size: .75rem;--font-text-xs-line-height: 1.125rem;--font-text-xs-weight: var(--font-weight-normal);--font-text-xs-tracking: var(--tracking-wide);--font-text-2xs-size: .625rem;--font-text-2xs-line-height: .875rem;--font-text-2xs-weight: var(--font-weight-normal);--font-text-2xs-tracking: var(--tracking-wide);--font-text-3xs-size: .5rem;--font-text-3xs-line-height: .75rem;--font-text-3xs-weight: var(--font-weight-normal);--font-text-3xs-tracking: var(--tracking-wide);--control-size-3xs: 1.375rem;--control-size-2xs: 1.5rem;--control-size-xs: 1.625rem;--control-size-sm: 1.75rem;--control-size-md: 2rem;--control-size-lg: 2.25rem;--control-size-xl: 2.5rem;--control-size-2xl: 2.75rem;--control-size-3xl: 3rem;--control-gutter-2xs: .375rem;--control-gutter-xs: .5rem;--control-gutter-sm: .625rem;--control-gutter-md: .75rem;--control-gutter-lg: .875rem;--control-gutter-xl: 1rem;--control-gutter-pill-scaling: 1.33;--control-radius-sm: var(--radius-sm);--control-radius-md: var(--radius-md);--control-radius-lg: var(--radius-lg);--control-radius-xl: var(--radius-xl);--control-font-size-sm: var(--font-text-xs-size);--control-font-size-md: var(--font-text-sm-size);--control-font-size-lg: var(--font-text-md-size);--control-icon-size-xs: .875rem;--control-icon-size-sm: 1rem;--control-icon-size-md: 1.125rem;--control-icon-size-lg: 1.25rem;--control-icon-size-xl: 1.375rem;--control-icon-size-2xl: 1.5rem;--cubic-enter: cubic-bezier(.19, 1, .22, 1);--cubic-exit: cubic-bezier(.8, 0, .4, 1);--cubic-exit-snappy: cubic-bezier(.65, 0, .4, 1);--cubic-move: cubic-bezier(.65, 0, .35, 1);--transition-duration-basic: .15s;--transition-ease-basic: ease;--scrollbar-color: var(--alpha-30);--shadow-hairline: 0 0 0 var(--shadow-hairline-width) var(--shadow-hairline-color);--shadow-100: var(--elevation-100-geo) rgb(var(--shadow-color) / var(--shadow-alpha-100));--shadow-100-strong: var(--elevation-100-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-100) * 1.25));--shadow-100-stronger: var(--elevation-100-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-100) * 1.6));--shadow-200: var(--elevation-200-geo) rgb(var(--shadow-color) / var(--shadow-alpha-200));--shadow-200-strong: var(--elevation-200-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-200) * 1.25));--shadow-200-stronger: var(--elevation-200-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-200) * 1.6));--shadow-300: var(--elevation-300-geo) rgb(var(--shadow-color) / var(--shadow-alpha-300));--shadow-300-strong: var(--elevation-300-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-300) * 1.25));--shadow-300-stronger: var(--elevation-300-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-300) * 1.6));--shadow-400: var(--elevation-400-geo) rgb(var(--shadow-color) / var(--shadow-alpha-400));--shadow-400-strong: var(--elevation-400-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-400) * 1.25));--shadow-400-stronger: var(--elevation-400-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-400) * 1.6))}:where(:root),:where([data-theme=light]){--color-text-secondary: var(--gray-500);--color-text-tertiary: var(--gray-400);--color-ring: var(--blue-500);--color-background-primary-soft: var(--gray-100);--color-background-primary-soft-hover: var(--gray-150);--color-background-primary-soft-active: var(--gray-200);--color-background-primary-soft-alpha: var(--alpha-08);--color-background-primary-soft-alpha-hover: var(--alpha-12);--color-background-primary-soft-alpha-active: var(--alpha-16);--color-background-primary-surface: var(--alpha-05);--color-border-primary-surface: var(--alpha-05);--color-background-primary-solid: var(--gray-900);--color-background-primary-solid-hover: var(--gray-700);--color-background-primary-solid-active: var(--gray-600);--color-background-primary-outline-hover: var(--alpha-02);--color-background-primary-outline-active: var(--alpha-04);--color-border-primary-outline: var(--alpha-16);--color-border-primary-outline-hover: var(--alpha-20);--color-background-primary-ghost-hover: var(--alpha-08);--color-background-primary-ghost-active: var(--alpha-12);--color-background-secondary-soft: var(--gray-100);--color-background-secondary-soft-hover: var(--gray-150);--color-background-secondary-soft-active: var(--gray-200);--color-background-secondary-soft-alpha: var(--alpha-08);--color-background-secondary-soft-alpha-hover: var(--alpha-12);--color-background-secondary-soft-alpha-active: var(--alpha-16);--color-background-secondary-solid: var(--gray-500);--color-background-secondary-solid-hover: var(--gray-600);--color-background-secondary-solid-active: var(--gray-700);--color-background-secondary-outline-hover: var(--alpha-02);--color-background-secondary-outline-active: var(--alpha-04);--color-border-secondary-outline: var(--alpha-16);--color-border-secondary-outline-hover: var(--alpha-20);--color-background-secondary-ghost-hover: var(--alpha-08);--color-background-secondary-ghost-active: var(--alpha-12);--color-text-info: var(--blue-500);--color-text-info-soft: var(--blue-600);--color-background-info-surface: var(--blue-a25);--color-border-info-surface: var(--blue-a25);--color-text-info-surface: var(--blue-600);--color-text-info-ghost: var(--blue-500);--color-text-info-ghost-hover: var(--blue-500);--color-text-warning: var(--orange-700);--color-text-warning-soft: var(--orange-700);--color-background-warning-surface: var(--orange-a25);--color-border-warning-surface: var(--orange-a25);--color-text-warning-surface: var(--orange-700);--color-text-caution: var(--yellow-700);--color-text-caution-soft: var(--yellow-800);--color-background-caution-surface: var(--yellow-a25);--color-border-caution-surface: var(--yellow-a25);--color-text-caution-surface: var(--yellow-800);--color-text-danger: var(--red-700);--color-text-danger-soft: var(--red-600);--color-background-danger-surface: var(--red-a25);--color-border-danger-surface: var(--red-a25);--color-text-danger-surface: var(--red-600);--color-text-success: var(--green-700);--color-text-success-soft: var(--green-600);--color-background-success-surface: var(--green-a25);--color-border-success-surface: var(--green-a25);--color-text-success-surface: var(--green-600);--color-background-success-solid: var(--green-500);--color-background-success-solid-hover: var(--green-500);--color-background-success-solid-active: var(--green-500);--color-border-success-outline: var(--green-500);--color-border-success-outline-hover: var(--green-500);--color-text-discovery: var(--purple-700);--color-text-discovery-soft: var(--purple-600);--color-background-discovery-surface: var(--purple-a25);--color-border-discovery-surface: var(--purple-a25);--color-text-discovery-surface: var(--purple-600);--color-text-discovery-outline: var(--purple-500);--color-text-discovery-outline-hover: var(--purple-500);--color-text-disabled: var(--gray-400);--color-border-subtle: var(--alpha-05);--color-border: var(--alpha-10);--color-border-strong: var(--alpha-15);--shadow: 0 10px 15px -3px rgba(0 0 0 / 10%), 0 4px 6px -4px rgba(0 0 0 / 10%);--color-surface: var(--gray-0);--color-surface-secondary: var(--gray-50);--color-surface-tertiary: var(--gray-75);--color-surface-elevated: var(--gray-0);--color-surface-elevated-secondary: var(--gray-50) }:where([data-theme=dark]){--color-text-secondary: var(--gray-700);--color-text-tertiary: var(--gray-600);--color-ring: var(--blue-400);--color-background-primary-soft: var(--gray-300);--color-background-primary-soft-hover: var(--gray-350);--color-background-primary-soft-active: var(--gray-400);--color-background-primary-soft-alpha: var(--alpha-12);--color-background-primary-soft-alpha-hover: var(--alpha-16);--color-background-primary-soft-alpha-active: var(--alpha-20);--color-background-primary-surface: var(--alpha-08);--color-border-primary-surface: var(--alpha-08);--color-background-primary-solid: var(--gray-950);--color-background-primary-solid-hover: var(--gray-900);--color-background-primary-solid-active: var(--gray-850);--color-background-primary-outline-hover: var(--alpha-04);--color-background-primary-outline-active: var(--alpha-06);--color-border-primary-outline: var(--alpha-25);--color-border-primary-outline-hover: var(--alpha-30);--color-background-primary-ghost-hover: var(--alpha-12);--color-background-primary-ghost-active: var(--alpha-16);--color-background-secondary-soft: var(--gray-300);--color-background-secondary-soft-hover: var(--gray-350);--color-background-secondary-soft-active: var(--gray-400);--color-background-secondary-soft-alpha: var(--alpha-12);--color-background-secondary-soft-alpha-hover: var(--alpha-16);--color-background-secondary-soft-alpha-active: var(--alpha-20);--color-background-secondary-solid: var(--gray-400);--color-background-secondary-solid-hover: var(--gray-450);--color-background-secondary-solid-active: var(--gray-500);--color-background-secondary-outline-hover: var(--alpha-04);--color-background-secondary-outline-active: var(--alpha-06);--color-border-secondary-outline: var(--alpha-25);--color-border-secondary-outline-hover: var(--alpha-30);--color-background-secondary-ghost-hover: var(--alpha-12);--color-background-secondary-ghost-active: var(--alpha-16);--color-text-info: var(--blue-200);--color-text-info-soft: var(--blue-300);--color-background-info-surface: var(--blue-a50);--color-border-info-surface: var(--blue-a50);--color-text-info-surface: var(--blue-300);--color-text-info-ghost: var(--blue-200);--color-text-info-ghost-hover: var(--blue-200);--color-text-warning: var(--orange-500);--color-text-warning-soft: var(--orange-400);--color-background-warning-surface: var(--orange-a50);--color-border-warning-surface: var(--orange-a50);--color-text-warning-surface: var(--orange-400);--color-text-caution: var(--yellow-500);--color-text-caution-soft: var(--yellow-400);--color-background-caution-surface: var(--yellow-a50);--color-border-caution-surface: var(--yellow-a50);--color-text-caution-surface: var(--yellow-400);--color-text-danger: var(--red-500);--color-text-danger-soft: var(--red-400);--color-background-danger-surface: var(--red-a50);--color-border-danger-surface: var(--red-a50);--color-text-danger-surface: var(--red-400);--color-text-success: var(--green-400);--color-text-success-soft: var(--green-400);--color-background-success-surface: var(--green-a50);--color-border-success-surface: var(--green-a50);--color-text-success-surface: var(--green-400);--color-background-success-solid: var(--green-600);--color-background-success-solid-hover: var(--green-600);--color-background-success-solid-active: var(--green-600);--color-border-success-outline: var(--green-600);--color-border-success-outline-hover: var(--green-600);--color-text-discovery: var(--purple-500);--color-text-discovery-soft: var(--purple-200);--color-background-discovery-surface: var(--purple-a50);--color-border-discovery-surface: var(--purple-a50);--color-text-discovery-surface: var(--purple-200);--color-text-discovery-outline: var(--purple-400);--color-text-discovery-outline-hover: var(--purple-400);--color-text-disabled: var(--gray-500);--color-border-subtle: var(--alpha-06);--color-border: var(--alpha-12);--color-border-strong: var(--alpha-20);--shadow: 0 10px 15px -3px rgba(0 0 0 / 20%), 0 4px 6px -4px rgba(0 0 0 / 20%);--color-surface: var(--gray-200);--color-surface-secondary: var(--gray-100);--color-surface-tertiary: var(--gray-50);--color-surface-elevated: var(--gray-300);--color-surface-elevated-secondary: var(--gray-400) }}@layer theme{:root,:where([data-theme]){--alert-border-radius: var(--radius-xl);--alert-gap: calc(var(--spacing) * 3);--alert-gutter: calc(var(--spacing) * 4);--alert-font-size: var(--font-text-sm-size);--alert-line-height: var(--font-text-sm-line-height);--alert-title-font-weight: var(--font-weight-semibold);--avatar-radius: var(--radius-full);--avatar-size: 28px;--avatar-font-size-scaling: .5;--avatar-overflow-font-size-scaling-one: .45;--avatar-overflow-font-size-scaling-two: .37;--avatar-overflow-font-size-scaling-three: .3;--avatar-group-cutout-width: 3px;--avatar-group-cutout-color: var(--color-surface);--avatar-group-spacing: -8px;--badge-gutter-sm: calc(var(--control-gutter-2xs) - 1px);--badge-gutter-md: var(--control-gutter-2xs);--badge-gutter-lg: var(--control-gutter-xs);--badge-size-sm: calc(var(--control-size-3xs) - 2px);--badge-size-md: var(--control-size-3xs);--badge-size-lg: var(--control-size-2xs);--badge-radius-sm: var(--radius-xs);--badge-radius-md: var(--radius-xs);--badge-radius-lg: var(--radius-sm);--badge-font-size-sm: var(--font-text-xs-size);--badge-font-size-md: var(--font-text-sm-size);--badge-font-size-lg: var(--font-text-sm-size);--badge-tracking-sm: var(--tracking-wide);--badge-tracking-md: var(--tracking-normal);--badge-tracking-lg: var(--tracking-normal);--badge-font-weight-sm: var(--font-weight-semibold);--badge-font-weight-md: var(--font-weight-semibold);--badge-font-weight-lg: var(--font-weight-semibold);--badge-icon-font-size-sm: var(--font-text-xs-size);--badge-icon-font-size-md: var(--font-text-md-size);--badge-icon-font-size-lg: var(--font-text-md-size);--badge-indicator-size-sm: var(--font-text-xs-size);--badge-indicator-size-md: var(--font-text-xs-size);--badge-indicator-size-lg: var(--font-text-sm-size);--button-gap-sm: 3px;--button-gap-md: 4px;--button-gap-lg: 6px;--button-font-weight: var(--font-weight-medium);--input-gap-xs: 4px;--input-gap-sm: 6px;--input-gap-md: 8px;--input-gap-lg: 10px;--input-text-color: var(--color-text);--input-placeholder-text-color: var(--color-text-tertiary);--input-outline-border-color: var(--color-border-primary-outline);--input-outline-border-color-focus: var(--alpha-50);--input-soft-background-color: var(--color-background-primary-soft-alpha);--input-soft-border-color-focus: var(--alpha-20);--link-font-weight: inherit;--link-gap: calc(var(--spacing) * .5);--link-radius: var(--radius-sm);--link-underline-decoration-offset: .1em;--chat-max-width: 800px;--chat-gutter: calc(var(--spacing) * 5);--chat-background-color: var(--color-surface);--thread-gutter: calc(var(--spacing) * 4);--composer-gutter: calc(var(--spacing) * 3);--composer-compact-gutter: calc(var(--spacing) * 2);--composer-radius: var(--radius-4xl);--composer-background-color: var(--color-surface-elevated);--smoothing-background-color: var(--color-surface);--user-message-text-color: var(--color-text);--source-list-gutter: var(--thread-gutter);--codeblock-background-color: var(--gray-25);--codeblock-syntax-4: var(--pink-500);--dialog-min-width: 250px;--dialog-max-width: 450px;--dialog-container-inner-padding: calc(var(--spacing) * 5);--dialog-backdrop-fade-background: color-mix(in oklab, var(--color-surface-elevated) 60%, transparent);--menu-gutter: calc(var(--spacing) * 1.5);--menu-radius: var(--radius-xl);--menu-font-size: var(--font-text-sm-size);--menu-line-height: var(--font-text-sm-line-height);--menu-item-padding: calc(var(--spacing) * 1.5) calc(var(--spacing) * 2);--menu-item-gap: calc(var(--spacing) * 1.5);--menu-separator-gutter: var(--menu-gutter) calc(-1 * var(--menu-gutter));--menu-separator-background-color: var(--color-border);--menu-radio-indicator-size: var(--font-text-lg-size);--menu-radio-indicator-hole-size: var(--font-text-3xs-size);--menu-checkbox-indicator-size: var(--font-text-lg-size);--modal-container-inner-padding: calc(var(--spacing) * 5);--popover-radius: var(--radius-xl);--radio-group-col-gap: calc(var(--spacing) * 2.5);--radio-group-row-gap: calc(var(--spacing) * 5);--radio-group-item-gap: calc(var(--spacing) * 1.5);--radio-group-item-font-size: var(--font-text-sm-size);--radio-group-item-line-height: var(--font-text-sm-line-height);--radio-group-indicator-size: var(--font-text-md-size);--radio-group-indicator-border-color: var(--color-border-primary-outline);--radio-group-indicator-border-color-hover: var(--alpha-25);--radio-group-indicator-background-color: var(--color-background-primary-solid);--radio-group-indicator-hole-size: .375rem;--radio-group-indicator-hole-background-color: var(--color-text-primary-solid);--segmented-control-gap: 2px;--segmented-control-gutter: 2px;--segmented-control-font-weight: var(--font-weight-semibold);--segmented-control-thumb-shadow: 0 1px 4px -1px rgb(0 0 0 / 20%);--segmented-control-option-highlight-gutter: 1px;--select-control-font-weight: var(--font-weight-medium);--switch-track-width: 32px;--switch-track-height: 19px;--switch-thumb-offset: 3px;--switch-thumb-size: calc(var(--switch-track-height) - 2 * var(--switch-thumb-offset));--switch-thumb-shadow: 0 1px 2px rgb(0 0 0 / 20%);--switch-label-gap: calc(var(--spacing) * 2)}:where(:root),:where([data-theme=light]){--avatar-image-border-color: var(--alpha-04);--input-outline-border-color-hover: var(--alpha-25);--input-border-color-invalid: var(--red-500);--link-primary-text-color: var(--blue-500);--link-primary-text-color-hover: var(--blue-800);--user-message-background-color: var(--alpha-05);--codeblock-syntax-1: #c0660d;--codeblock-syntax-2: var(--blue-500);--codeblock-syntax-3: var(--green-600);--codeblock-syntax-5: var(--purple-500);--dialog-backdrop-dim-background: rgb(0 0 0 / 30%);--menu-item-background-color: var(--alpha-08);--modal-backdrop-background: rgb(0 0 0 / 30%);--segmented-control-background: var(--gray-100);--segmented-control-thumb-background: var(--gray-0);--segmented-control-option-highlight-background-color: var(--gray-200);--slider-track-color: var(--gray-150);--slider-range-color: var(--gray-450);--switch-track-color: var(--gray-150);--switch-track-color-hover: var(--gray-200);--switch-track-color-checked: var(--gray-900);--switch-track-color-checked-disabled: var(--gray-300);--switch-track-color-disabled: var(--gray-100);--switch-thumb-color: var(--gray-0);--switch-thumb-color-disabled: var(--gray-0)}:where([data-theme=dark]){--avatar-image-border-color: var(--alpha-15);--input-outline-border-color-hover: var(--alpha-30);--input-border-color-invalid: var(--red-600);--link-primary-text-color: var(--blue-300);--link-primary-text-color-hover: var(--blue-400);--user-message-background-color: var(--alpha-08);--codeblock-syntax-1: var(--yellow-100);--codeblock-syntax-2: var(--blue-200);--codeblock-syntax-3: var(--green-300);--codeblock-syntax-5: var(--purple-300);--dialog-backdrop-dim-background: rgb(0 0 0 / 50%);--menu-item-background-color: var(--alpha-10);--modal-backdrop-background: rgb(0 0 0 / 50%);--segmented-control-background: var(--gray-0);--segmented-control-thumb-background: var(--gray-300);--segmented-control-option-highlight-background-color: var(--gray-300);--slider-track-color: var(--gray-400);--slider-range-color: var(--gray-600);--switch-track-color: var(--gray-400);--switch-track-color-hover: var(--gray-450);--switch-track-color-checked: var(--blue-400);--switch-track-color-checked-disabled: var(--blue-700);--switch-track-color-disabled: var(--gray-300);--switch-thumb-color: var(--gray-1000);--switch-thumb-color-disabled: var(--gray-800)}}@theme{--text-*: initial; --text-lg: var(--font-text-lg-size); --text-lg--line-height: var(--font-text-lg-line-height); --text-lg--font-weight: var(--font-text-lg-weight); --text-lg--letter-spacing: var(--font-text-lg-tracking); --text-base: var(--font-text-md-size); --text-base--line-height: var(--font-text-md-line-height); --text-base--font-weight: var(--font-text-md-weight); --text-base--letter-spacing: var(--font-text-md-tracking); --text-sm: var(--font-text-sm-size); --text-sm--line-height: var(--font-text-sm-line-height); --text-sm--font-weight: var(--font-text-sm-weight); --text-sm--letter-spacing: var(--font-text-sm-tracking); --text-xs: var(--font-text-xs-size); --text-xs--line-height: var(--font-text-xs-line-height); --text-xs--font-weight: var(--font-text-xs-weight); --text-xs--letter-spacing: var(--font-text-xs-tracking); --text-2xs: var(--font-text-2xs-size); --text-2xs--line-height: var(--font-text-2xs-line-height); --text-2xs--font-weight: var(--font-text-2xs-weight); --text-2xs--letter-spacing: var(--font-text-2xs-tracking); --text-3xs: var(--font-text-3xs-size); --text-3xs--line-height: var(--font-text-3xs-line-height); --text-3xs--font-weight: var(--font-text-3xs-weight); --text-3xs--letter-spacing: var(--font-text-3xs-tracking); --text-xl: var(--font-heading-md-size); --text-xl--line-height: var(--font-heading-md-line-height); --text-xl--font-weight: var(--font-text-lg-weight); --text-xl--letter-spacing: var(--font-heading-md-tracking); --text-2xl: var(--font-heading-lg-size); --text-2xl--line-height: var(--font-heading-lg-line-height); --text-2xl--font-weight: var(--font-text-lg-weight); --text-2xl--letter-spacing: var(--font-heading-lg-tracking); --text-3xl: var(--font-heading-xl-size); --text-3xl--line-height: var(--font-heading-xl-line-height); --text-3xl--font-weight: var(--font-text-lg-weight); --text-3xl--letter-spacing: var(--font-heading-xl-tracking); --text-4xl: var(--font-heading-2xl-size); --text-4xl--line-height: var(--font-heading-2xl-line-height); --text-4xl--font-weight: var(--font-text-lg-weight); --text-4xl--letter-spacing: var(--font-heading-2xl-tracking); --text-5xl: var(--font-heading-3xl-size); --text-5xl--line-height: var(--font-heading-3xl-line-height); --text-5xl--font-weight: var(--font-text-lg-weight); --text-5xl--letter-spacing: var(--font-heading-3xl-tracking); --text-6xl: var(--font-heading-4xl-size); --text-6xl--line-height: var(--font-heading-4xl-line-height); --text-6xl--font-weight: var(--font-text-lg-weight); --text-6xl--letter-spacing: var(--font-heading-4xl-tracking); --text-7xl: var(--font-heading-5xl-size); --text-7xl--line-height: var(--font-heading-5xl-line-height); --text-7xl--font-weight: var(--font-text-lg-weight); --text-7xl--letter-spacing: var(--font-heading-5xl-tracking); --text-8xl: 6rem; --text-8xl--line-height: 1; --text-8xl--letter-spacing: var(--font-heading-4xl-tracking); --text-9xl: 8rem; --text-9xl--line-height: 1; --text-9xl--letter-spacing: var(--font-heading-4xl-tracking); --tracking-*: initial; --tracking-wide: var(--font-tracking-wide); --tracking-normal: var(--font-tracking-normal); --tracking-tight: var(--font-tracking-tight); --inset-shadow-*: initial; --drop-shadow-*: initial; --shadow-*: initial; --shadow-sm: var(--shadow-100); --shadow-md: var(--shadow-200); --shadow-lg: var(--shadow-300); --shadow-xl: var(--shadow-400); --shadow-hairline: var(--shadow-hairline); --inset-shadow-hairline: inset var(--shadow-hairline); --color-*: initial; --color-gray-0: var(--gray-0); --color-gray-25: var(--gray-25); --color-gray-50: var(--gray-50); --color-gray-75: var(--gray-75); --color-gray-100: var(--gray-100); --color-gray-150: var(--gray-150); --color-gray-200: var(--gray-200); --color-gray-250: var(--gray-250); --color-gray-300: var(--gray-300); --color-gray-350: var(--gray-350); --color-gray-400: var(--gray-400); --color-gray-450: var(--gray-450); --color-gray-500: var(--gray-500); --color-gray-550: var(--gray-550); --color-gray-600: var(--gray-600); --color-gray-650: var(--gray-650); --color-gray-700: var(--gray-700); --color-gray-750: var(--gray-750); --color-gray-800: var(--gray-800); --color-gray-850: var(--gray-850); --color-gray-900: var(--gray-900); --color-gray-950: var(--gray-950); --color-gray-975: var(--gray-975); --color-gray-1000: var(--gray-1000); --color-green-25: var(--green-25); --color-green-50: var(--green-50); --color-green-75: var(--green-75); --color-green-100: var(--green-100); --color-green-200: var(--green-200); --color-green-300: var(--green-300); --color-green-400: var(--green-400); --color-green-500: var(--green-500); --color-green-600: var(--green-600); --color-green-700: var(--green-700); --color-green-800: var(--green-800); --color-green-900: var(--green-900); --color-green-1000: var(--green-1000); --color-red-25: var(--red-25); --color-red-50: var(--red-50); --color-red-75: var(--red-75); --color-red-100: var(--red-100); --color-red-200: var(--red-200); --color-red-300: var(--red-300); --color-red-400: var(--red-400); --color-red-500: var(--red-500); --color-red-600: var(--red-600); --color-red-700: var(--red-700); --color-red-800: var(--red-800); --color-red-900: var(--red-900); --color-red-1000: var(--red-1000); --color-pink-25: var(--pink-25); --color-pink-50: var(--pink-50); --color-pink-75: var(--pink-75); --color-pink-100: var(--pink-100); --color-pink-200: var(--pink-200); --color-pink-300: var(--pink-300); --color-pink-400: var(--pink-400); --color-pink-500: var(--pink-500); --color-pink-600: var(--pink-600); --color-pink-700: var(--pink-700); --color-pink-800: var(--pink-800); --color-pink-900: var(--pink-900); --color-pink-1000: var(--pink-1000); --color-orange-25: var(--orange-25); --color-orange-50: var(--orange-50); --color-orange-75: var(--orange-75); --color-orange-100: var(--orange-100); --color-orange-200: var(--orange-200); --color-orange-300: var(--orange-300); --color-orange-400: var(--orange-400); --color-orange-500: var(--orange-500); --color-orange-600: var(--orange-600); --color-orange-700: var(--orange-700); --color-orange-800: var(--orange-800); --color-orange-900: var(--orange-900); --color-orange-1000: var(--orange-1000); --color-yellow-25: var(--yellow-25); --color-yellow-50: var(--yellow-50); --color-yellow-75: var(--yellow-75); --color-yellow-100: var(--yellow-100); --color-yellow-200: var(--yellow-200); --color-yellow-300: var(--yellow-300); --color-yellow-400: var(--yellow-400); --color-yellow-500: var(--yellow-500); --color-yellow-600: var(--yellow-600); --color-yellow-700: var(--yellow-700); --color-yellow-800: var(--yellow-800); --color-yellow-900: var(--yellow-900); --color-yellow-1000: var(--yellow-1000); --color-purple-25: var(--purple-25); --color-purple-50: var(--purple-50); --color-purple-75: var(--purple-75); --color-purple-100: var(--purple-100); --color-purple-200: var(--purple-200); --color-purple-300: var(--purple-300); --color-purple-400: var(--purple-400); --color-purple-500: var(--purple-500); --color-purple-600: var(--purple-600); --color-purple-700: var(--purple-700); --color-purple-800: var(--purple-800); --color-purple-900: var(--purple-900); --color-purple-1000: var(--purple-1000); --color-blue-25: var(--blue-25); --color-blue-50: var(--blue-50); --color-blue-75: var(--blue-75); --color-blue-100: var(--blue-100); --color-blue-200: var(--blue-200); --color-blue-300: var(--blue-300); --color-blue-400: var(--blue-400); --color-blue-500: var(--blue-500); --color-blue-600: var(--blue-600); --color-blue-700: var(--blue-700); --color-blue-800: var(--blue-800); --color-blue-900: var(--blue-900); --color-blue-1000: var(--blue-1000); --color-alpha: var(--alpha-base); --color-white: var(--white); --color-black: var(--black); --ease-*: initial; --duration-basic: var(--transition-duration-basic); --ease-basic: var(--transition-ease-basic); --ease-cubic-enter: var(--cubic-enter); --ease-cubic-exit: var(--cubic-exit); --ease-cubic-exit-snappy: var(--cubic-exit-snappy); --ease-cubic-move: var(--cubic-move);}@utility heading-5xl{font-size: var(--font-heading-5xl-size); font-weight: var(--font-heading-5xl-weight); letter-spacing: var(--font-heading-5xl-tracking); line-height: var(--font-heading-5xl-line-height);}@utility heading-4xl{font-size: var(--font-heading-4xl-size); font-weight: var(--font-heading-4xl-weight); letter-spacing: var(--font-heading-4xl-tracking); line-height: var(--font-heading-4xl-line-height);}@utility heading-3xl{font-size: var(--font-heading-3xl-size); font-weight: var(--font-heading-3xl-weight); letter-spacing: var(--font-heading-3xl-tracking); line-height: var(--font-heading-3xl-line-height);}@utility heading-2xl{font-size: var(--font-heading-2xl-size); font-weight: var(--font-heading-2xl-weight); letter-spacing: var(--font-heading-2xl-tracking); line-height: var(--font-heading-2xl-line-height);}@utility heading-xl{font-size: var(--font-heading-xl-size); font-weight: var(--font-heading-xl-weight); letter-spacing: var(--font-heading-xl-tracking); line-height: var(--font-heading-xl-line-height);}@utility heading-lg{font-size: var(--font-heading-lg-size); font-weight: var(--font-heading-lg-weight); letter-spacing: var(--font-heading-lg-tracking); line-height: var(--font-heading-lg-line-height);}@utility heading-md{font-size: var(--font-heading-md-size); font-weight: var(--font-heading-md-weight); letter-spacing: var(--font-heading-md-tracking); line-height: var(--font-heading-md-line-height);}@utility heading-sm{font-size: var(--font-heading-sm-size); font-weight: var(--font-heading-sm-weight); letter-spacing: var(--font-heading-sm-tracking); line-height: var(--font-heading-sm-line-height);}@utility heading-xs{font-size: var(--font-heading-xs-size); font-weight: var(--font-heading-xs-weight); letter-spacing: var(--font-heading-xs-tracking); line-height: var(--font-heading-xs-line-height);}@utility text-default{color: var(--color-text);}@utility text-secondary{color: var(--color-text-secondary);}@utility text-tertiary{color: var(--color-text-tertiary);}@utility text-inverse{color: var(--color-text-inverse);}@utility fill-default{fill: var(--color-text);}@utility fill-secondary{fill: var(--color-text-secondary);}@utility fill-tertiary{fill: var(--color-text-tertiary);}@utility bg-surface{background-color: var(--color-surface);}@utility bg-surface-secondary{background-color: var(--color-surface-secondary);}@utility bg-surface-tertiary{background-color: var(--color-surface-tertiary);}@utility bg-surface-elevated{background-color: var(--color-surface-elevated);}@utility bg-surface-elevated-secondary{background-color: var(--color-surface-elevated-secondary);}@utility border-default{border-color: var(--color-border);}@utility border-subtle{border-color: var(--color-border-subtle);}@utility border-strong{border-color: var(--color-border-strong);}@utility text-info{color: var(--color-text-info);}@utility bg-info-soft{background-color: var(--color-background-info-soft);}@utility bg-info-soft-hover{background-color: var(--color-background-info-soft-hover);}@utility bg-info-soft-active{background-color: var(--color-background-info-soft-active);}@utility bg-info-soft-alpha{background-color: var(--color-background-info-soft-alpha);}@utility bg-info-soft-alpha-hover{background-color: var(--color-background-info-soft-alpha-hover);}@utility bg-info-soft-alpha-active{background-color: var(--color-background-info-soft-alpha-active);}@utility text-info-soft{color: var(--color-text-info-soft);}@utility bg-info-solid{background-color: var(--color-background-info-solid);}@utility bg-info-solid-hover{background-color: var(--color-background-info-solid-hover);}@utility bg-info-solid-active{background-color: var(--color-background-info-solid-active);}@utility text-info-solid{color: var(--color-text-info-solid);}@utility bg-info-outline-hover{background-color: var(--color-background-info-outline-hover);}@utility bg-info-outline-active{background-color: var(--color-background-info-outline-active);}@utility border-info-outline{border-color: var(--color-border-info-outline);}@utility border-info-outline-hover{border-color: var(--color-border-info-outline-hover);}@utility text-info-outline{color: var(--color-text-info-outline);}@utility text-info-outline-hover{color: var(--color-text-info-outline-hover);}@utility bg-info-ghost-hover{background-color: var(--color-background-info-ghost-hover);}@utility bg-info-ghost-active{background-color: var(--color-background-info-ghost-active);}@utility text-info-ghost{color: var(--color-text-info-ghost);}@utility text-info-ghost-hover{color: var(--color-text-info-ghost-hover);}@utility ring-info{outline-color: var(--color-ring-info);}@utility bg-info-surface{background-color: var(--color-background-info-surface);}@utility border-info-surface{border-color: var(--color-border-info-surface);}@utility text-info-surface{color: var(--color-text-info-surface);}@utility text-primary{color: var(--color-text-primary);}@utility bg-primary-soft{background-color: var(--color-background-primary-soft);}@utility bg-primary-soft-hover{background-color: var(--color-background-primary-soft-hover);}@utility bg-primary-soft-active{background-color: var(--color-background-primary-soft-active);}@utility bg-primary-soft-alpha{background-color: var(--color-background-primary-soft-alpha);}@utility bg-primary-soft-alpha-hover{background-color: var(--color-background-primary-soft-alpha-hover);}@utility bg-primary-soft-alpha-active{background-color: var(--color-background-primary-soft-alpha-active);}@utility text-primary-soft{color: var(--color-text-primary-soft);}@utility bg-primary-surface{background-color: var(--color-background-primary-surface);}@utility border-primary-surface{border-color: var(--color-border-primary-surface);}@utility text-primary-surface{color: var(--color-text-primary-surface);}@utility bg-primary-solid{background-color: var(--color-background-primary-solid);}@utility bg-primary-solid-hover{background-color: var(--color-background-primary-solid-hover);}@utility bg-primary-solid-active{background-color: var(--color-background-primary-solid-active);}@utility text-primary-solid{color: var(--color-text-primary-solid);}@utility bg-primary-outline-hover{background-color: var(--color-background-primary-outline-hover);}@utility bg-primary-outline-active{background-color: var(--color-background-primary-outline-active);}@utility border-primary-outline{border-color: var(--color-border-primary-outline);}@utility border-primary-outline-hover{border-color: var(--color-border-primary-outline-hover);}@utility text-primary-outline{color: var(--color-text-primary-outline);}@utility text-primary-outline-hover{color: var(--color-text-primary-outline-hover);}@utility bg-primary-ghost-hover{background-color: var(--color-background-primary-ghost-hover);}@utility bg-primary-ghost-active{background-color: var(--color-background-primary-ghost-active);}@utility text-primary-ghost{color: var(--color-text-primary-ghost);}@utility text-primary-ghost-hover{color: var(--color-text-primary-ghost-hover);}@utility ring-primary{outline-color: var(--color-ring-primary);}@utility text-secondary-soft{color: var(--color-text-secondary-soft);}@utility bg-secondary-soft{background-color: var(--color-background-secondary-soft);}@utility bg-secondary-soft-hover{background-color: var(--color-background-secondary-soft-hover);}@utility bg-secondary-soft-active{background-color: var(--color-background-secondary-soft-active);}@utility bg-secondary-soft-alpha{background-color: var(--color-background-secondary-soft-alpha);}@utility bg-secondary-soft-alpha-hover{background-color: var(--color-background-secondary-soft-alpha-hover);}@utility bg-secondary-soft-alpha-active{background-color: var(--color-background-secondary-soft-alpha-active);}@utility bg-secondary-soft-alt{background-color: var(--color-background-secondary-soft-alt);}@utility border-secondary-soft-alt{border-color: var(--color-border-secondary-soft-alt);}@utility text-secondary-soft-alt{color: var(--color-text-secondary-soft-alt);}@utility bg-secondary-solid{background-color: var(--color-background-secondary-solid);}@utility bg-secondary-solid-hover{background-color: var(--color-background-secondary-solid-hover);}@utility bg-secondary-solid-active{background-color: var(--color-background-secondary-solid-active);}@utility text-secondary-solid{color: var(--color-text-secondary-solid);}@utility bg-secondary-outline-hover{background-color: var(--color-background-secondary-outline-hover);}@utility bg-secondary-outline-active{background-color: var(--color-background-secondary-outline-active);}@utility border-secondary-outline{border-color: var(--color-border-secondary-outline);}@utility border-secondary-outline-hover{border-color: var(--color-border-secondary-outline-hover);}@utility text-secondary-outline{color: var(--color-text-secondary-outline);}@utility text-secondary-outline-hover{color: var(--color-text-secondary-outline-hover);}@utility bg-secondary-ghost-hover{background-color: var(--color-background-secondary-ghost-hover);}@utility bg-secondary-ghost-active{background-color: var(--color-background-secondary-ghost-active);}@utility text-secondary-ghost{color: var(--color-text-secondary-ghost);}@utility text-secondary-ghost-hover{color: var(--color-text-secondary-ghost-hover);}@utility ring-secondary{outline-color: var(--color-ring-secondary);}@utility text-danger{color: var(--color-text-danger);}@utility bg-danger-soft{background-color: var(--color-background-danger-soft);}@utility bg-danger-soft-hover{background-color: var(--color-background-danger-soft-hover);}@utility bg-danger-soft-active{background-color: var(--color-background-danger-soft-active);}@utility bg-danger-soft-alpha{background-color: var(--color-background-danger-soft-alpha);}@utility bg-danger-soft-alpha-hover{background-color: var(--color-background-danger-soft-alpha-hover);}@utility bg-danger-soft-alpha-active{background-color: var(--color-background-danger-soft-alpha-active);}@utility text-danger-soft{color: var(--color-text-danger-soft);}@utility bg-danger-surface{background-color: var(--color-background-danger-surface);}@utility border-danger-surface{border-color: var(--color-border-danger-surface);}@utility text-danger-surface{color: var(--color-text-danger-surface);}@utility bg-danger-solid{background-color: var(--color-background-danger-solid);}@utility bg-danger-solid-hover{background-color: var(--color-background-danger-solid-hover);}@utility bg-danger-solid-active{background-color: var(--color-background-danger-solid-active);}@utility text-danger-solid{color: var(--color-text-danger-solid);}@utility bg-danger-outline-hover{background-color: var(--color-background-danger-outline-hover);}@utility bg-danger-outline-active{background-color: var(--color-background-danger-outline-active);}@utility border-danger-outline{border-color: var(--color-border-danger-outline);}@utility border-danger-outline-hover{border-color: var(--color-border-danger-outline-hover);}@utility text-danger-outline{color: var(--color-text-danger-outline);}@utility text-danger-outline-hover{color: var(--color-text-danger-outline-hover);}@utility bg-danger-ghost-hover{background-color: var(--color-background-danger-ghost-hover);}@utility bg-danger-ghost-active{background-color: var(--color-background-danger-ghost-active);}@utility text-danger-ghost{color: var(--color-text-danger-ghost);}@utility text-danger-ghost-hover{color: var(--color-text-danger-ghost-hover);}@utility ring-danger{outline-color: var(--color-ring-danger);}@utility text-warning{color: var(--color-text-warning);}@utility bg-warning-soft{background-color: var(--color-background-warning-soft);}@utility bg-warning-soft-hover{background-color: var(--color-background-warning-soft-hover);}@utility bg-warning-soft-active{background-color: var(--color-background-warning-soft-active);}@utility bg-warning-soft-alpha{background-color: var(--color-background-warning-soft-alpha);}@utility bg-warning-soft-alpha-hover{background-color: var(--color-background-warning-soft-alpha-hover);}@utility bg-warning-soft-alpha-active{background-color: var(--color-background-warning-soft-alpha-active);}@utility text-warning-soft{color: var(--color-text-warning-soft);}@utility bg-warning-surface{background-color: var(--color-background-warning-surface);}@utility border-warning-surface{border-color: var(--color-border-warning-surface);}@utility text-warning-surface{color: var(--color-text-warning-surface);}@utility bg-warning-solid{background-color: var(--color-background-warning-solid);}@utility bg-warning-solid-hover{background-color: var(--color-background-warning-solid-hover);}@utility bg-warning-solid-active{background-color: var(--color-background-warning-solid-active);}@utility text-warning-solid{color: var(--color-text-warning-solid);}@utility bg-warning-outline-hover{background-color: var(--color-background-warning-outline-hover);}@utility bg-warning-outline-active{background-color: var(--color-background-warning-outline-active);}@utility border-warning-outline{border-color: var(--color-border-warning-outline);}@utility border-warning-outline-hover{border-color: var(--color-border-warning-outline-hover);}@utility text-warning-outline{color: var(--color-text-warning-outline);}@utility text-warning-outline-hover{color: var(--color-text-warning-outline-hover);}@utility bg-warning-ghost-hover{background-color: var(--color-background-warning-ghost-hover);}@utility bg-warning-ghost-active{background-color: var(--color-background-warning-ghost-active);}@utility text-warning-ghost{color: var(--color-text-warning-ghost);}@utility text-warning-ghost-hover{color: var(--color-text-warning-ghost-hover);}@utility ring-warning{outline-color: var(--color-ring-warning);}@utility text-caution{color: var(--color-text-caution);}@utility bg-caution-soft{background-color: var(--color-background-caution-soft);}@utility bg-caution-soft-hover{background-color: var(--color-background-caution-soft-hover);}@utility bg-caution-soft-active{background-color: var(--color-background-caution-soft-active);}@utility bg-caution-soft-alpha{background-color: var(--color-background-caution-soft-alpha);}@utility bg-caution-soft-alpha-hover{background-color: var(--color-background-caution-soft-alpha-hover);}@utility bg-caution-soft-alpha-active{background-color: var(--color-background-caution-soft-alpha-active);}@utility text-caution-soft{color: var(--color-text-caution-soft);}@utility bg-caution-surface{background-color: var(--color-background-caution-surface);}@utility border-caution-surface{border-color: var(--color-border-caution-surface);}@utility text-caution-surface{color: var(--color-text-caution-surface);}@utility bg-caution-solid{background-color: var(--color-background-caution-solid);}@utility bg-caution-solid-hover{background-color: var(--color-background-caution-solid-hover);}@utility bg-caution-solid-active{background-color: var(--color-background-caution-solid-active);}@utility text-caution-solid{color: var(--color-text-caution-solid);}@utility bg-caution-outline-hover{background-color: var(--color-background-caution-outline-hover);}@utility bg-caution-outline-active{background-color: var(--color-background-caution-outline-active);}@utility border-caution-outline{border-color: var(--color-border-caution-outline);}@utility border-caution-outline-hover{border-color: var(--color-border-caution-outline-hover);}@utility text-caution-outline{color: var(--color-text-caution-outline);}@utility text-caution-outline-hover{color: var(--color-text-caution-outline-hover);}@utility bg-caution-ghost-hover{background-color: var(--color-background-caution-ghost-hover);}@utility bg-caution-ghost-active{background-color: var(--color-background-caution-ghost-active);}@utility text-caution-ghost{color: var(--color-text-caution-ghost);}@utility text-caution-ghost-hover{color: var(--color-text-caution-ghost-hover);}@utility ring-caution{outline-color: var(--color-ring-caution);}@utility text-success{color: var(--color-text-success);}@utility bg-success-soft{background-color: var(--color-background-success-soft);}@utility bg-success-soft-hover{background-color: var(--color-background-success-soft-hover);}@utility bg-success-soft-active{background-color: var(--color-background-success-soft-active);}@utility bg-success-soft-alpha{background-color: var(--color-background-success-soft-alpha);}@utility bg-success-soft-alpha-hover{background-color: var(--color-background-success-soft-alpha-hover);}@utility bg-success-soft-alpha-active{background-color: var(--color-background-success-soft-alpha-active);}@utility text-success-soft{color: var(--color-text-success-soft);}@utility bg-success-surface{background-color: var(--color-background-success-surface);}@utility border-success-surface{border-color: var(--color-border-success-surface);}@utility text-success-surface{color: var(--color-text-success-surface);}@utility bg-success-solid{background-color: var(--color-background-success-solid);}@utility bg-success-solid-hover{background-color: var(--color-background-success-solid-hover);}@utility bg-success-solid-active{background-color: var(--color-background-success-solid-active);}@utility text-success-solid{color: var(--color-text-success-solid);}@utility bg-success-outline-hover{background-color: var(--color-background-success-outline-hover);}@utility bg-success-outline-active{background-color: var(--color-background-success-outline-active);}@utility border-success-outline{border-color: var(--color-border-success-outline);}@utility border-success-outline-hover{border-color: var(--color-border-success-outline-hover);}@utility text-success-outline{color: var(--color-text-success-outline);}@utility text-success-outline-hover{color: var(--color-text-success-outline-hover);}@utility bg-success-ghost-hover{background-color: var(--color-background-success-ghost-hover);}@utility bg-success-ghost-active{background-color: var(--color-background-success-ghost-active);}@utility text-success-ghost{color: var(--color-text-success-ghost);}@utility text-success-ghost-hover{color: var(--color-text-success-ghost-hover);}@utility ring-success{outline-color: var(--color-ring-success);}@utility text-discovery{color: var(--color-text-discovery);}@utility bg-discovery-soft{background-color: var(--color-background-discovery-soft);}@utility bg-discovery-soft-hover{background-color: var(--color-background-discovery-soft-hover);}@utility bg-discovery-soft-active{background-color: var(--color-background-discovery-soft-active);}@utility bg-discovery-soft-alpha{background-color: var(--color-background-discovery-soft-alpha);}@utility bg-discovery-soft-alpha-hover{background-color: var(--color-background-discovery-soft-alpha-hover);}@utility bg-discovery-soft-alpha-active{background-color: var(--color-background-discovery-soft-alpha-active);}@utility text-discovery-soft{color: var(--color-text-discovery-soft);}@utility bg-discovery-surface{background-color: var(--color-background-discovery-surface);}@utility border-discovery-surface{border-color: var(--color-border-discovery-surface);}@utility text-discovery-surface{color: var(--color-text-discovery-surface);}@utility bg-discovery-solid{background-color: var(--color-background-discovery-solid);}@utility bg-discovery-solid-hover{background-color: var(--color-background-discovery-solid-hover);}@utility bg-discovery-solid-active{background-color: var(--color-background-discovery-solid-active);}@utility text-discovery-solid{color: var(--color-text-discovery-solid);}@utility bg-discovery-outline-hover{background-color: var(--color-background-discovery-outline-hover);}@utility bg-discovery-outline-active{background-color: var(--color-background-discovery-outline-active);}@utility border-discovery-outline{border-color: var(--color-border-discovery-outline);}@utility border-discovery-outline-hover{border-color: var(--color-border-discovery-outline-hover);}@utility text-discovery-outline{color: var(--color-text-discovery-outline);}@utility text-discovery-outline-hover{color: var(--color-text-discovery-outline-hover);}@utility bg-discovery-ghost-hover{background-color: var(--color-background-discovery-ghost-hover);}@utility bg-discovery-ghost-active{background-color: var(--color-background-discovery-ghost-active);}@utility text-discovery-ghost{color: var(--color-text-discovery-ghost);}@utility text-discovery-ghost-hover{color: var(--color-text-discovery-ghost-hover);}@utility ring-discovery{outline-color: var(--color-ring-discovery);}@utility bg-disabled{background-color: var(--color-background-disabled);}@utility border-disabled{border-color: var(--color-border-disabled);}@utility text-disabled{color: var(--color-text-disabled);}@utility icon-xs{width: var(--control-icon-size-xs); height: var(--control-icon-size-xs);}@utility icon-sm{width: var(--control-icon-size-sm); height: var(--control-icon-size-sm);}@utility icon-md{width: var(--control-icon-size-md); height: var(--control-icon-size-md);}@utility icon-lg{width: var(--control-icon-size-lg); height: var(--control-icon-size-lg);}@utility icon-xl{width: var(--control-icon-size-xl); height: var(--control-icon-size-xl);}@utility icon-2xl{width: var(--control-icon-size-2xl); height: var(--control-icon-size-2xl);}@layer base{html,:host{color:var(--color-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;letter-spacing:var(--tracking-normal)}[data-theme=light]{color-scheme:light}[data-theme=dark]{color-scheme:dark}*{scrollbar-color:var(--scrollbar-color) transparent;scrollbar-width:thin}[data-exiting]{pointer-events:none}::-moz-placeholder{color:var(--color-text-tertiary)}::placeholder{color:var(--color-text-tertiary)}b,strong{font-weight:var(--font-weight-semibold)}}@layer base{@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_AMS-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Caligraphic-Bold.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Caligraphic-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Fraktur-Bold.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Fraktur-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Main-Bold.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Main-BoldItalic.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Main-Italic.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Main-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Math-BoldItalic.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Math-Italic.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_SansSerif-Bold.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_SansSerif;font-style:italic;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_SansSerif-Italic.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_SansSerif-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Script-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Size1-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Size2-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Size3-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Size4-Regular.woff2) format(\"woff2\")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Typewriter-Regular.woff2) format(\"woff2\")}.katex{font: 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{border-color:currentcolor;-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:\"0.16.0\"}.katex .katex-mathml{position:absolute;overflow:hidden;width:1px;height:1px;padding:0;border:0;clip:rect(1px,1px,1px,1px)}.katex .katex-html>.newline{display:block}.katex .base{position:relative;width:-moz-min-content;width:min-content;white-space:nowrap}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;border-collapse:collapse;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{position:relative;display:table-cell;vertical-align:bottom}.katex .vlist>span{position:relative;display:block;height:0}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;width:2px;min-width:2px;font-size:1px;vertical-align:bottom}.katex .vbox{display:inline-flex;flex-direction:column;align-items:baseline}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{width:0;max-width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-right:50%;margin-left:-50%}.katex .rule{position:relative;display:inline-block;border:0 solid}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-right:-.55555556em;margin-left:.27777778em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{position:absolute;display:block;width:100%;height:inherit;fill:currentcolor;fill-opacity:1;fill-rule:nonzero;stroke:currentcolor;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-width:1}.katex svg path{stroke:none}.katex img{min-width:0;max-width:none;min-height:0;max-height:none;border-style:none}.katex .stretchy{position:relative;overflow:hidden;display:block;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:\"\"}.katex .hide-tail{position:relative;overflow:hidden;width:100%}.katex .halfarrow-left{position:absolute;left:0;overflow:hidden;width:50.2%}.katex .halfarrow-right{position:absolute;right:0;overflow:hidden;width:50.2%}.katex .brace-left{position:absolute;left:0;overflow:hidden;width:25.1%}.katex .brace-center{position:absolute;left:25%;overflow:hidden;width:50%}.katex .brace-right{position:absolute;right:0;overflow:hidden;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-right:-.2em;margin-left:-.2em}.katex .sout{border-bottom-width:.08em;border-bottom-style:solid}.katex .angl{box-sizing:border-box;border-top:.049em solid;border-right:.049em solid;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:\"(\" counter(katexEqnNo) \")\";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:\"(\" counter(mmlEqnNo) \")\";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{position:relative;display:inline-block}.katex .cd-label-left{position:absolute;right:calc(50% + .3em);display:inline-block;text-align:left}.katex .cd-label-right{position:absolute;left:calc(50% + .3em);display:inline-block;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{position:relative;display:block}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{right:auto;left:0}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}}@source \"../node_modules/@openai/apps-sdk-ui\";@source \".\";:root{--brand-dark: #0b0f1a;--brand-purple: #2d064d;--brand-panel: #4d4f60;--brand-neon: #F97316;--brand-green: #10B981;--brand-red: #EF4444;--brand-text: #cfd3ff;--brand-text-secondary: #9ca3af;--brand-border: rgba(255, 255, 255, .1);--color-surface: var(--brand-dark);--color-primary: var(--brand-green)}@layer base{body{background-color:var(--brand-dark);color:#fff;font-family:Inter,system-ui,sans-serif}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{background:var(--brand-dark)}::-webkit-scrollbar-thumb{background:var(--brand-panel);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--brand-neon)}}@layer components{.fx-card{background:linear-gradient(135deg,#2d064d4d,#0b0f1acc);border:1px solid var(--brand-border);border-radius:1rem;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:1rem}.fx-price{font-family:JetBrains Mono,monospace;font-weight:600}.fx-price-up{color:var(--brand-green)}.fx-price-down{color:var(--brand-red)}.fx-badge{display:inline-flex;align-items:center;padding:.25rem .75rem;font-size:.75rem;font-weight:500;border-radius:9999px;text-transform:uppercase;letter-spacing:.05em}.fx-badge-bullish{background:#10b98133;color:var(--brand-green);border:1px solid rgba(16,185,129,.3)}.fx-badge-bearish{background:#ef444433;color:var(--brand-red);border:1px solid rgba(239,68,68,.3)}.fx-badge-neutral{background:#f9731633;color:var(--brand-neon);border:1px solid rgba(249,115,22,.3)}.fx-button{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.625rem 1rem;font-weight:500;border-radius:.5rem;transition:all .2s}.fx-button-primary{background:var(--brand-green);color:#fff}.fx-button-primary:hover{background:#059669}.fx-button-danger{background:var(--brand-red);color:#fff}.fx-button-danger:hover{background:#dc2626}}@layer utilities{.mono{font-family:JetBrains Mono,monospace}.text-brand-text{color:var(--brand-text)}.text-brand-secondary{color:var(--brand-text-secondary)}.bg-brand-dark{background-color:var(--brand-dark)}.bg-brand-panel{background-color:var(--brand-panel)}.border-brand{border-color:var(--brand-border)}}\n\n</style>\n  <style>\n    body {\n      margin: 0;\n      padding: 0;\n      background-color: #0b0f1a;\n      font-family: 'Inter', system-ui, sans-serif;\n      color: #fff;\n    }\n  </style>\n</head>\n<body>\n  <div id=\"root\"></div>\n  \n<script>\n(function(){\nvar ForexGPT_spread_card=(function(){\"use strict\";var QT=Object.defineProperty;var XT=(rn,Mt,ia)=>Mt in rn?QT(rn,Mt,{enumerable:!0,configurable:!0,writable:!0,value:ia}):rn[Mt]=ia;var mt=(rn,Mt,ia)=>XT(rn,typeof Mt!=\"symbol\"?Mt+\"\":Mt,ia);var rn={exports:{}},Mt={};/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var ia;function ig(){if(ia)return Mt;ia=1;var a=Symbol.for(\"react.transitional.element\"),u=Symbol.for(\"react.fragment\");function o(c,r,d){var m=null;if(d!==void 0&&(m=\"\"+d),r.key!==void 0&&(m=\"\"+r.key),\"key\"in r){d={};for(var v in r)v!==\"key\"&&(d[v]=r[v])}else d=r;return r=d.ref,{$$typeof:a,type:c,key:m,ref:r!==void 0?r:null,props:d}}return Mt.Fragment=u,Mt.jsx=o,Mt.jsxs=o,Mt}var _r;function og(){return _r||(_r=1,rn.exports=ig()),rn.exports}var dt=og(),fo={exports:{}},Tl={},ho={exports:{}},mo={};/**\n * @license React\n * scheduler.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var br;function cg(){return br||(br=1,(function(a){function u(U,j){var I=U.length;U.push(j);e:for(;0<I;){var Ee=I-1>>>1,Ce=U[Ee];if(0<r(Ce,j))U[Ee]=j,U[I]=Ce,I=Ee;else break e}}function o(U){return U.length===0?null:U[0]}function c(U){if(U.length===0)return null;var j=U[0],I=U.pop();if(I!==j){U[0]=I;e:for(var Ee=0,Ce=U.length,b=Ce>>>1;Ee<b;){var x=2*(Ee+1)-1,B=U[x],Q=x+1,P=U[Q];if(0>r(B,I))Q<Ce&&0>r(P,B)?(U[Ee]=P,U[Q]=I,Ee=Q):(U[Ee]=B,U[x]=I,Ee=x);else if(Q<Ce&&0>r(P,I))U[Ee]=P,U[Q]=I,Ee=Q;else break e}}return j}function r(U,j){var I=U.sortIndex-j.sortIndex;return I!==0?I:U.id-j.id}if(a.unstable_now=void 0,typeof performance==\"object\"&&typeof performance.now==\"function\"){var d=performance;a.unstable_now=function(){return d.now()}}else{var m=Date,v=m.now();a.unstable_now=function(){return m.now()-v}}var p=[],g=[],z=1,T=null,k=3,H=!1,L=!1,G=!1,re=!1,we=typeof setTimeout==\"function\"?setTimeout:null,de=typeof clearTimeout==\"function\"?clearTimeout:null,Ne=typeof setImmediate<\"u\"?setImmediate:null;function Ze(U){for(var j=o(g);j!==null;){if(j.callback===null)c(g);else if(j.startTime<=U)c(g),j.sortIndex=j.expirationTime,u(p,j);else break;j=o(g)}}function Te(U){if(G=!1,Ze(U),!L)if(o(p)!==null)L=!0,ye||(ye=!0,bt());else{var j=o(g);j!==null&&en(Te,j.startTime-U)}}var ye=!1,$=-1,ke=5,Qe=-1;function Zn(){return re?!0:!(a.unstable_now()-Qe<ke)}function ln(){if(re=!1,ye){var U=a.unstable_now();Qe=U;var j=!0;try{e:{L=!1,G&&(G=!1,de($),$=-1),H=!0;var I=k;try{t:{for(Ze(U),T=o(p);T!==null&&!(T.expirationTime>U&&Zn());){var Ee=T.callback;if(typeof Ee==\"function\"){T.callback=null,k=T.priorityLevel;var Ce=Ee(T.expirationTime<=U);if(U=a.unstable_now(),typeof Ce==\"function\"){T.callback=Ce,Ze(U),j=!0;break t}T===o(p)&&c(p),Ze(U)}else c(p);T=o(p)}if(T!==null)j=!0;else{var b=o(g);b!==null&&en(Te,b.startTime-U),j=!1}}break e}finally{T=null,k=I,H=!1}j=void 0}}finally{j?bt():ye=!1}}}var bt;if(typeof Ne==\"function\")bt=function(){Ne(ln)};else if(typeof MessageChannel<\"u\"){var fa=new MessageChannel,fn=fa.port2;fa.port1.onmessage=ln,bt=function(){fn.postMessage(null)}}else bt=function(){we(ln,0)};function en(U,j){$=we(function(){U(a.unstable_now())},j)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(U){U.callback=null},a.unstable_forceFrameRate=function(U){0>U||125<U?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):ke=0<U?Math.floor(1e3/U):5},a.unstable_getCurrentPriorityLevel=function(){return k},a.unstable_next=function(U){switch(k){case 1:case 2:case 3:var j=3;break;default:j=k}var I=k;k=j;try{return U()}finally{k=I}},a.unstable_requestPaint=function(){re=!0},a.unstable_runWithPriority=function(U,j){switch(U){case 1:case 2:case 3:case 4:case 5:break;default:U=3}var I=k;k=U;try{return j()}finally{k=I}},a.unstable_scheduleCallback=function(U,j,I){var Ee=a.unstable_now();switch(typeof I==\"object\"&&I!==null?(I=I.delay,I=typeof I==\"number\"&&0<I?Ee+I:Ee):I=Ee,U){case 1:var Ce=-1;break;case 2:Ce=250;break;case 5:Ce=1073741823;break;case 4:Ce=1e4;break;default:Ce=5e3}return Ce=I+Ce,U={id:z++,callback:j,priorityLevel:U,startTime:I,expirationTime:Ce,sortIndex:-1},I>Ee?(U.sortIndex=I,u(g,U),o(p)===null&&U===o(g)&&(G?(de($),$=-1):G=!0,en(Te,I-Ee))):(U.sortIndex=Ce,u(p,U),L||H||(L=!0,ye||(ye=!0,bt()))),U},a.unstable_shouldYield=Zn,a.unstable_wrapCallback=function(U){var j=k;return function(){var I=k;k=j;try{return U.apply(this,arguments)}finally{k=I}}}})(mo)),mo}var Sr;function sg(){return Sr||(Sr=1,ho.exports=cg()),ho.exports}var po={exports:{}},F={};/**\n * @license React\n * react.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var zr;function rg(){if(zr)return F;zr=1;var a=Symbol.for(\"react.transitional.element\"),u=Symbol.for(\"react.portal\"),o=Symbol.for(\"react.fragment\"),c=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),d=Symbol.for(\"react.consumer\"),m=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),p=Symbol.for(\"react.suspense\"),g=Symbol.for(\"react.memo\"),z=Symbol.for(\"react.lazy\"),T=Symbol.for(\"react.activity\"),k=Symbol.iterator;function H(b){return b===null||typeof b!=\"object\"?null:(b=k&&b[k]||b[\"@@iterator\"],typeof b==\"function\"?b:null)}var L={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},G=Object.assign,re={};function we(b,x,B){this.props=b,this.context=x,this.refs=re,this.updater=B||L}we.prototype.isReactComponent={},we.prototype.setState=function(b,x){if(typeof b!=\"object\"&&typeof b!=\"function\"&&b!=null)throw Error(\"takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,b,x,\"setState\")},we.prototype.forceUpdate=function(b){this.updater.enqueueForceUpdate(this,b,\"forceUpdate\")};function de(){}de.prototype=we.prototype;function Ne(b,x,B){this.props=b,this.context=x,this.refs=re,this.updater=B||L}var Ze=Ne.prototype=new de;Ze.constructor=Ne,G(Ze,we.prototype),Ze.isPureReactComponent=!0;var Te=Array.isArray;function ye(){}var $={H:null,A:null,T:null,S:null},ke=Object.prototype.hasOwnProperty;function Qe(b,x,B){var Q=B.ref;return{$$typeof:a,type:b,key:x,ref:Q!==void 0?Q:null,props:B}}function Zn(b,x){return Qe(b.type,x,b.props)}function ln(b){return typeof b==\"object\"&&b!==null&&b.$$typeof===a}function bt(b){var x={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+b.replace(/[=:]/g,function(B){return x[B]})}var fa=/\\/+/g;function fn(b,x){return typeof b==\"object\"&&b!==null&&b.key!=null?bt(\"\"+b.key):x.toString(36)}function en(b){switch(b.status){case\"fulfilled\":return b.value;case\"rejected\":throw b.reason;default:switch(typeof b.status==\"string\"?b.then(ye,ye):(b.status=\"pending\",b.then(function(x){b.status===\"pending\"&&(b.status=\"fulfilled\",b.value=x)},function(x){b.status===\"pending\"&&(b.status=\"rejected\",b.reason=x)})),b.status){case\"fulfilled\":return b.value;case\"rejected\":throw b.reason}}throw b}function U(b,x,B,Q,P){var ae=typeof b;(ae===\"undefined\"||ae===\"boolean\")&&(b=null);var ve=!1;if(b===null)ve=!0;else switch(ae){case\"bigint\":case\"string\":case\"number\":ve=!0;break;case\"object\":switch(b.$$typeof){case a:case u:ve=!0;break;case z:return ve=b._init,U(ve(b._payload),x,B,Q,P)}}if(ve)return P=P(b),ve=Q===\"\"?\".\"+fn(b,0):Q,Te(P)?(B=\"\",ve!=null&&(B=ve.replace(fa,\"$&/\")+\"/\"),U(P,x,B,\"\",function(xl){return xl})):P!=null&&(ln(P)&&(P=Zn(P,B+(P.key==null||b&&b.key===P.key?\"\":(\"\"+P.key).replace(fa,\"$&/\")+\"/\")+ve)),x.push(P)),1;ve=0;var gt=Q===\"\"?\".\":Q+\":\";if(Te(b))for(var $e=0;$e<b.length;$e++)Q=b[$e],ae=gt+fn(Q,$e),ve+=U(Q,x,B,ae,P);else if($e=H(b),typeof $e==\"function\")for(b=$e.call(b),$e=0;!(Q=b.next()).done;)Q=Q.value,ae=gt+fn(Q,$e++),ve+=U(Q,x,B,ae,P);else if(ae===\"object\"){if(typeof b.then==\"function\")return U(en(b),x,B,Q,P);throw x=String(b),Error(\"Objects are not valid as a React child (found: \"+(x===\"[object Object]\"?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":x)+\"). If you meant to render a collection of children, use an array instead.\")}return ve}function j(b,x,B){if(b==null)return b;var Q=[],P=0;return U(b,Q,\"\",\"\",function(ae){return x.call(B,ae,P++)}),Q}function I(b){if(b._status===-1){var x=b._result;x=x(),x.then(function(B){(b._status===0||b._status===-1)&&(b._status=1,b._result=B)},function(B){(b._status===0||b._status===-1)&&(b._status=2,b._result=B)}),b._status===-1&&(b._status=0,b._result=x)}if(b._status===1)return b._result.default;throw b._result}var Ee=typeof reportError==\"function\"?reportError:function(b){if(typeof window==\"object\"&&typeof window.ErrorEvent==\"function\"){var x=new window.ErrorEvent(\"error\",{bubbles:!0,cancelable:!0,message:typeof b==\"object\"&&b!==null&&typeof b.message==\"string\"?String(b.message):String(b),error:b});if(!window.dispatchEvent(x))return}else if(typeof process==\"object\"&&typeof process.emit==\"function\"){process.emit(\"uncaughtException\",b);return}console.error(b)},Ce={map:j,forEach:function(b,x,B){j(b,function(){x.apply(this,arguments)},B)},count:function(b){var x=0;return j(b,function(){x++}),x},toArray:function(b){return j(b,function(x){return x})||[]},only:function(b){if(!ln(b))throw Error(\"React.Children.only expected to receive a single React element child.\");return b}};return F.Activity=T,F.Children=Ce,F.Component=we,F.Fragment=o,F.Profiler=r,F.PureComponent=Ne,F.StrictMode=c,F.Suspense=p,F.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=$,F.__COMPILER_RUNTIME={__proto__:null,c:function(b){return $.H.useMemoCache(b)}},F.cache=function(b){return function(){return b.apply(null,arguments)}},F.cacheSignal=function(){return null},F.cloneElement=function(b,x,B){if(b==null)throw Error(\"The argument must be a React element, but you passed \"+b+\".\");var Q=G({},b.props),P=b.key;if(x!=null)for(ae in x.key!==void 0&&(P=\"\"+x.key),x)!ke.call(x,ae)||ae===\"key\"||ae===\"__self\"||ae===\"__source\"||ae===\"ref\"&&x.ref===void 0||(Q[ae]=x[ae]);var ae=arguments.length-2;if(ae===1)Q.children=B;else if(1<ae){for(var ve=Array(ae),gt=0;gt<ae;gt++)ve[gt]=arguments[gt+2];Q.children=ve}return Qe(b.type,P,Q)},F.createContext=function(b){return b={$$typeof:m,_currentValue:b,_currentValue2:b,_threadCount:0,Provider:null,Consumer:null},b.Provider=b,b.Consumer={$$typeof:d,_context:b},b},F.createElement=function(b,x,B){var Q,P={},ae=null;if(x!=null)for(Q in x.key!==void 0&&(ae=\"\"+x.key),x)ke.call(x,Q)&&Q!==\"key\"&&Q!==\"__self\"&&Q!==\"__source\"&&(P[Q]=x[Q]);var ve=arguments.length-2;if(ve===1)P.children=B;else if(1<ve){for(var gt=Array(ve),$e=0;$e<ve;$e++)gt[$e]=arguments[$e+2];P.children=gt}if(b&&b.defaultProps)for(Q in ve=b.defaultProps,ve)P[Q]===void 0&&(P[Q]=ve[Q]);return Qe(b,ae,P)},F.createRef=function(){return{current:null}},F.forwardRef=function(b){return{$$typeof:v,render:b}},F.isValidElement=ln,F.lazy=function(b){return{$$typeof:z,_payload:{_status:-1,_result:b},_init:I}},F.memo=function(b,x){return{$$typeof:g,type:b,compare:x===void 0?null:x}},F.startTransition=function(b){var x=$.T,B={};$.T=B;try{var Q=b(),P=$.S;P!==null&&P(B,Q),typeof Q==\"object\"&&Q!==null&&typeof Q.then==\"function\"&&Q.then(ye,Ee)}catch(ae){Ee(ae)}finally{x!==null&&B.types!==null&&(x.types=B.types),$.T=x}},F.unstable_useCacheRefresh=function(){return $.H.useCacheRefresh()},F.use=function(b){return $.H.use(b)},F.useActionState=function(b,x,B){return $.H.useActionState(b,x,B)},F.useCallback=function(b,x){return $.H.useCallback(b,x)},F.useContext=function(b){return $.H.useContext(b)},F.useDebugValue=function(){},F.useDeferredValue=function(b,x){return $.H.useDeferredValue(b,x)},F.useEffect=function(b,x){return $.H.useEffect(b,x)},F.useEffectEvent=function(b){return $.H.useEffectEvent(b)},F.useId=function(){return $.H.useId()},F.useImperativeHandle=function(b,x,B){return $.H.useImperativeHandle(b,x,B)},F.useInsertionEffect=function(b,x){return $.H.useInsertionEffect(b,x)},F.useLayoutEffect=function(b,x){return $.H.useLayoutEffect(b,x)},F.useMemo=function(b,x){return $.H.useMemo(b,x)},F.useOptimistic=function(b,x){return $.H.useOptimistic(b,x)},F.useReducer=function(b,x,B){return $.H.useReducer(b,x,B)},F.useRef=function(b){return $.H.useRef(b)},F.useState=function(b){return $.H.useState(b)},F.useSyncExternalStore=function(b,x,B){return $.H.useSyncExternalStore(b,x,B)},F.useTransition=function(){return $.H.useTransition()},F.version=\"19.2.3\",F}var Tr;function go(){return Tr||(Tr=1,po.exports=rg()),po.exports}var vo={exports:{}},ht={};/**\n * @license React\n * react-dom.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var Er;function fg(){if(Er)return ht;Er=1;var a=go();function u(p){var g=\"https://react.dev/errors/\"+p;if(1<arguments.length){g+=\"?args[]=\"+encodeURIComponent(arguments[1]);for(var z=2;z<arguments.length;z++)g+=\"&args[]=\"+encodeURIComponent(arguments[z])}return\"Minified React error #\"+p+\"; visit \"+g+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}function o(){}var c={d:{f:o,r:function(){throw Error(u(522))},D:o,C:o,L:o,m:o,X:o,S:o,M:o},p:0,findDOMNode:null},r=Symbol.for(\"react.portal\");function d(p,g,z){var T=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:r,key:T==null?null:\"\"+T,children:p,containerInfo:g,implementation:z}}var m=a.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function v(p,g){if(p===\"font\")return\"\";if(typeof g==\"string\")return g===\"use-credentials\"?g:\"\"}return ht.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=c,ht.createPortal=function(p,g){var z=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!g||g.nodeType!==1&&g.nodeType!==9&&g.nodeType!==11)throw Error(u(299));return d(p,g,null,z)},ht.flushSync=function(p){var g=m.T,z=c.p;try{if(m.T=null,c.p=2,p)return p()}finally{m.T=g,c.p=z,c.d.f()}},ht.preconnect=function(p,g){typeof p==\"string\"&&(g?(g=g.crossOrigin,g=typeof g==\"string\"?g===\"use-credentials\"?g:\"\":void 0):g=null,c.d.C(p,g))},ht.prefetchDNS=function(p){typeof p==\"string\"&&c.d.D(p)},ht.preinit=function(p,g){if(typeof p==\"string\"&&g&&typeof g.as==\"string\"){var z=g.as,T=v(z,g.crossOrigin),k=typeof g.integrity==\"string\"?g.integrity:void 0,H=typeof g.fetchPriority==\"string\"?g.fetchPriority:void 0;z===\"style\"?c.d.S(p,typeof g.precedence==\"string\"?g.precedence:void 0,{crossOrigin:T,integrity:k,fetchPriority:H}):z===\"script\"&&c.d.X(p,{crossOrigin:T,integrity:k,fetchPriority:H,nonce:typeof g.nonce==\"string\"?g.nonce:void 0})}},ht.preinitModule=function(p,g){if(typeof p==\"string\")if(typeof g==\"object\"&&g!==null){if(g.as==null||g.as===\"script\"){var z=v(g.as,g.crossOrigin);c.d.M(p,{crossOrigin:z,integrity:typeof g.integrity==\"string\"?g.integrity:void 0,nonce:typeof g.nonce==\"string\"?g.nonce:void 0})}}else g==null&&c.d.M(p)},ht.preload=function(p,g){if(typeof p==\"string\"&&typeof g==\"object\"&&g!==null&&typeof g.as==\"string\"){var z=g.as,T=v(z,g.crossOrigin);c.d.L(p,z,{crossOrigin:T,integrity:typeof g.integrity==\"string\"?g.integrity:void 0,nonce:typeof g.nonce==\"string\"?g.nonce:void 0,type:typeof g.type==\"string\"?g.type:void 0,fetchPriority:typeof g.fetchPriority==\"string\"?g.fetchPriority:void 0,referrerPolicy:typeof g.referrerPolicy==\"string\"?g.referrerPolicy:void 0,imageSrcSet:typeof g.imageSrcSet==\"string\"?g.imageSrcSet:void 0,imageSizes:typeof g.imageSizes==\"string\"?g.imageSizes:void 0,media:typeof g.media==\"string\"?g.media:void 0})}},ht.preloadModule=function(p,g){if(typeof p==\"string\")if(g){var z=v(g.as,g.crossOrigin);c.d.m(p,{as:typeof g.as==\"string\"&&g.as!==\"script\"?g.as:void 0,crossOrigin:z,integrity:typeof g.integrity==\"string\"?g.integrity:void 0})}else c.d.m(p)},ht.requestFormReset=function(p){c.d.r(p)},ht.unstable_batchedUpdates=function(p,g){return p(g)},ht.useFormState=function(p,g,z){return m.H.useFormState(p,g,z)},ht.useFormStatus=function(){return m.H.useHostTransitionStatus()},ht.version=\"19.2.3\",ht}var Or;function dg(){if(Or)return vo.exports;Or=1;function a(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>\"u\"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=\"function\"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(u){console.error(u)}}return a(),vo.exports=fg(),vo.exports}/**\n * @license React\n * react-dom-client.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var Ar;function hg(){if(Ar)return Tl;Ar=1;var a=sg(),u=go(),o=dg();function c(e){var t=\"https://react.dev/errors/\"+e;if(1<arguments.length){t+=\"?args[]=\"+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=\"&args[]=\"+encodeURIComponent(arguments[n])}return\"Minified React error #\"+e+\"; visit \"+t+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}function r(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function d(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function m(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function v(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function p(e){if(d(e)!==e)throw Error(c(188))}function g(e){var t=e.alternate;if(!t){if(t=d(e),t===null)throw Error(c(188));return t!==e?null:e}for(var n=e,l=t;;){var i=n.return;if(i===null)break;var s=i.alternate;if(s===null){if(l=i.return,l!==null){n=l;continue}break}if(i.child===s.child){for(s=i.child;s;){if(s===n)return p(i),e;if(s===l)return p(i),t;s=s.sibling}throw Error(c(188))}if(n.return!==l.return)n=i,l=s;else{for(var f=!1,h=i.child;h;){if(h===n){f=!0,n=i,l=s;break}if(h===l){f=!0,l=i,n=s;break}h=h.sibling}if(!f){for(h=s.child;h;){if(h===n){f=!0,n=s,l=i;break}if(h===l){f=!0,l=s,n=i;break}h=h.sibling}if(!f)throw Error(c(189))}}if(n.alternate!==l)throw Error(c(190))}if(n.tag!==3)throw Error(c(188));return n.stateNode.current===n?e:t}function z(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=z(e),t!==null)return t;e=e.sibling}return null}var T=Object.assign,k=Symbol.for(\"react.element\"),H=Symbol.for(\"react.transitional.element\"),L=Symbol.for(\"react.portal\"),G=Symbol.for(\"react.fragment\"),re=Symbol.for(\"react.strict_mode\"),we=Symbol.for(\"react.profiler\"),de=Symbol.for(\"react.consumer\"),Ne=Symbol.for(\"react.context\"),Ze=Symbol.for(\"react.forward_ref\"),Te=Symbol.for(\"react.suspense\"),ye=Symbol.for(\"react.suspense_list\"),$=Symbol.for(\"react.memo\"),ke=Symbol.for(\"react.lazy\"),Qe=Symbol.for(\"react.activity\"),Zn=Symbol.for(\"react.memo_cache_sentinel\"),ln=Symbol.iterator;function bt(e){return e===null||typeof e!=\"object\"?null:(e=ln&&e[ln]||e[\"@@iterator\"],typeof e==\"function\"?e:null)}var fa=Symbol.for(\"react.client.reference\");function fn(e){if(e==null)return null;if(typeof e==\"function\")return e.$$typeof===fa?null:e.displayName||e.name||null;if(typeof e==\"string\")return e;switch(e){case G:return\"Fragment\";case we:return\"Profiler\";case re:return\"StrictMode\";case Te:return\"Suspense\";case ye:return\"SuspenseList\";case Qe:return\"Activity\"}if(typeof e==\"object\")switch(e.$$typeof){case L:return\"Portal\";case Ne:return e.displayName||\"Context\";case de:return(e._context.displayName||\"Context\")+\".Consumer\";case Ze:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||\"\",e=e!==\"\"?\"ForwardRef(\"+e+\")\":\"ForwardRef\"),e;case $:return t=e.displayName||null,t!==null?t:fn(e.type)||\"Memo\";case ke:t=e._payload,e=e._init;try{return fn(e(t))}catch{}}return null}var en=Array.isArray,U=u.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,j=o.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,I={pending:!1,data:null,method:null,action:null},Ee=[],Ce=-1;function b(e){return{current:e}}function x(e){0>Ce||(e.current=Ee[Ce],Ee[Ce]=null,Ce--)}function B(e,t){Ce++,Ee[Ce]=e.current,e.current=t}var Q=b(null),P=b(null),ae=b(null),ve=b(null);function gt(e,t){switch(B(ae,t),B(P,e),B(Q,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?wp(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=wp(t),e=Np(t,e);else switch(e){case\"svg\":e=1;break;case\"math\":e=2;break;default:e=0}}x(Q),B(Q,e)}function $e(){x(Q),x(P),x(ae)}function xl(e){e.memoizedState!==null&&B(ve,e);var t=Q.current,n=Np(t,e.type);t!==n&&(B(P,e),B(Q,n))}function $u(e){P.current===e&&(x(Q),x(P)),ve.current===e&&(x(ve),Ou._currentValue=I)}var tc,ud;function da(e){if(tc===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\\n( *(at )?)/);tc=t&&t[1]||\"\",ud=-1<n.stack.indexOf(`\n    at`)?\" (<anonymous>)\":-1<n.stack.indexOf(\"@\")?\"@unknown:0:0\":\"\"}return`\n`+tc+e+ud}var nc=!1;function ac(e,t){if(!e||nc)return\"\";nc=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var l={DetermineComponentFrameRoot:function(){try{if(t){var q=function(){throw Error()};if(Object.defineProperty(q.prototype,\"props\",{set:function(){throw Error()}}),typeof Reflect==\"object\"&&Reflect.construct){try{Reflect.construct(q,[])}catch(N){var M=N}Reflect.construct(e,[],q)}else{try{q.call()}catch(N){M=N}e.call(q.prototype)}}else{try{throw Error()}catch(N){M=N}(q=e())&&typeof q.catch==\"function\"&&q.catch(function(){})}}catch(N){if(N&&M&&typeof N.stack==\"string\")return[N.stack,M.stack]}return[null,null]}};l.DetermineComponentFrameRoot.displayName=\"DetermineComponentFrameRoot\";var i=Object.getOwnPropertyDescriptor(l.DetermineComponentFrameRoot,\"name\");i&&i.configurable&&Object.defineProperty(l.DetermineComponentFrameRoot,\"name\",{value:\"DetermineComponentFrameRoot\"});var s=l.DetermineComponentFrameRoot(),f=s[0],h=s[1];if(f&&h){var y=f.split(`\n`),A=h.split(`\n`);for(i=l=0;l<y.length&&!y[l].includes(\"DetermineComponentFrameRoot\");)l++;for(;i<A.length&&!A[i].includes(\"DetermineComponentFrameRoot\");)i++;if(l===y.length||i===A.length)for(l=y.length-1,i=A.length-1;1<=l&&0<=i&&y[l]!==A[i];)i--;for(;1<=l&&0<=i;l--,i--)if(y[l]!==A[i]){if(l!==1||i!==1)do if(l--,i--,0>i||y[l]!==A[i]){var C=`\n`+y[l].replace(\" at new \",\" at \");return e.displayName&&C.includes(\"<anonymous>\")&&(C=C.replace(\"<anonymous>\",e.displayName)),C}while(1<=l&&0<=i);break}}}finally{nc=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:\"\")?da(n):\"\"}function S1(e,t){switch(e.tag){case 26:case 27:case 5:return da(e.type);case 16:return da(\"Lazy\");case 13:return e.child!==t&&t!==null?da(\"Suspense Fallback\"):da(\"Suspense\");case 19:return da(\"SuspenseList\");case 0:case 15:return ac(e.type,!1);case 11:return ac(e.type.render,!1);case 1:return ac(e.type,!0);case 31:return da(\"Activity\");default:return\"\"}}function id(e){try{var t=\"\",n=null;do t+=S1(e,n),n=e,e=e.return;while(e);return t}catch(l){return`\nError generating stack: `+l.message+`\n`+l.stack}}var lc=Object.prototype.hasOwnProperty,uc=a.unstable_scheduleCallback,ic=a.unstable_cancelCallback,z1=a.unstable_shouldYield,T1=a.unstable_requestPaint,Ct=a.unstable_now,E1=a.unstable_getCurrentPriorityLevel,od=a.unstable_ImmediatePriority,cd=a.unstable_UserBlockingPriority,Ju=a.unstable_NormalPriority,O1=a.unstable_LowPriority,sd=a.unstable_IdlePriority,A1=a.log,R1=a.unstable_setDisableYieldValue,kl=null,Dt=null;function qn(e){if(typeof A1==\"function\"&&R1(e),Dt&&typeof Dt.setStrictMode==\"function\")try{Dt.setStrictMode(kl,e)}catch{}}var Ut=Math.clz32?Math.clz32:N1,M1=Math.log,w1=Math.LN2;function N1(e){return e>>>=0,e===0?32:31-(M1(e)/w1|0)|0}var Ku=256,Iu=262144,Wu=4194304;function ha(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Fu(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var i=0,s=e.suspendedLanes,f=e.pingedLanes;e=e.warmLanes;var h=l&134217727;return h!==0?(l=h&~s,l!==0?i=ha(l):(f&=h,f!==0?i=ha(f):n||(n=h&~e,n!==0&&(i=ha(n))))):(h=l&~s,h!==0?i=ha(h):f!==0?i=ha(f):n||(n=l&~e,n!==0&&(i=ha(n)))),i===0?0:t!==0&&t!==i&&(t&s)===0&&(s=i&-i,n=t&-t,s>=n||s===32&&(n&4194048)!==0)?t:i}function Hl(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function C1(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function rd(){var e=Wu;return Wu<<=1,(Wu&62914560)===0&&(Wu=4194304),e}function oc(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function jl(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function D1(e,t,n,l,i,s){var f=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var h=e.entanglements,y=e.expirationTimes,A=e.hiddenUpdates;for(n=f&~n;0<n;){var C=31-Ut(n),q=1<<C;h[C]=0,y[C]=-1;var M=A[C];if(M!==null)for(A[C]=null,C=0;C<M.length;C++){var N=M[C];N!==null&&(N.lane&=-536870913)}n&=~q}l!==0&&fd(e,l,0),s!==0&&i===0&&e.tag!==0&&(e.suspendedLanes|=s&~(f&~t))}function fd(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var l=31-Ut(t);e.entangledLanes|=t,e.entanglements[l]=e.entanglements[l]|1073741824|n&261930}function dd(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var l=31-Ut(n),i=1<<l;i&t|e[l]&t&&(e[l]|=t),n&=~i}}function hd(e,t){var n=t&-t;return n=(n&42)!==0?1:cc(n),(n&(e.suspendedLanes|t))!==0?0:n}function cc(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:e=128;break;case 268435456:e=134217728;break;default:e=0}return e}function sc(e){return e&=-e,2<e?8<e?(e&134217727)!==0?32:268435456:8:2}function md(){var e=j.p;return e!==0?e:(e=window.event,e===void 0?32:Pp(e.type))}function pd(e,t){var n=j.p;try{return j.p=e,t()}finally{j.p=n}}var xn=Math.random().toString(36).slice(2),ot=\"__reactFiber$\"+xn,St=\"__reactProps$\"+xn,ja=\"__reactContainer$\"+xn,rc=\"__reactEvents$\"+xn,U1=\"__reactListeners$\"+xn,Z1=\"__reactHandles$\"+xn,gd=\"__reactResources$\"+xn,Bl=\"__reactMarker$\"+xn;function fc(e){delete e[ot],delete e[St],delete e[rc],delete e[U1],delete e[Z1]}function Ba(e){var t=e[ot];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ja]||n[ot]){if(n=t.alternate,t.child!==null||n!==null&&n.child!==null)for(e=kp(e);e!==null;){if(n=e[ot])return n;e=kp(e)}return t}e=n,n=e.parentNode}return null}function Ya(e){if(e=e[ot]||e[ja]){var t=e.tag;if(t===5||t===6||t===13||t===31||t===26||t===27||t===3)return e}return null}function Yl(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e.stateNode;throw Error(c(33))}function La(e){var t=e[gd];return t||(t=e[gd]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function nt(e){e[Bl]=!0}var vd=new Set,yd={};function ma(e,t){Ga(e,t),Ga(e+\"Capture\",t)}function Ga(e,t){for(yd[e]=t,e=0;e<t.length;e++)vd.add(t[e])}var q1=RegExp(\"^[:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD][:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$\"),_d={},bd={};function x1(e){return lc.call(bd,e)?!0:lc.call(_d,e)?!1:q1.test(e)?bd[e]=!0:(_d[e]=!0,!1)}function Pu(e,t,n){if(x1(t))if(n===null)e.removeAttribute(t);else{switch(typeof n){case\"undefined\":case\"function\":case\"symbol\":e.removeAttribute(t);return;case\"boolean\":var l=t.toLowerCase().slice(0,5);if(l!==\"data-\"&&l!==\"aria-\"){e.removeAttribute(t);return}}e.setAttribute(t,\"\"+n)}}function ei(e,t,n){if(n===null)e.removeAttribute(t);else{switch(typeof n){case\"undefined\":case\"function\":case\"symbol\":case\"boolean\":e.removeAttribute(t);return}e.setAttribute(t,\"\"+n)}}function dn(e,t,n,l){if(l===null)e.removeAttribute(n);else{switch(typeof l){case\"undefined\":case\"function\":case\"symbol\":case\"boolean\":e.removeAttribute(n);return}e.setAttributeNS(t,n,\"\"+l)}}function Qt(e){switch(typeof e){case\"bigint\":case\"boolean\":case\"number\":case\"string\":case\"undefined\":return e;case\"object\":return e;default:return\"\"}}function Sd(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()===\"input\"&&(t===\"checkbox\"||t===\"radio\")}function k1(e,t,n){var l=Object.getOwnPropertyDescriptor(e.constructor.prototype,t);if(!e.hasOwnProperty(t)&&typeof l<\"u\"&&typeof l.get==\"function\"&&typeof l.set==\"function\"){var i=l.get,s=l.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(f){n=\"\"+f,s.call(this,f)}}),Object.defineProperty(e,t,{enumerable:l.enumerable}),{getValue:function(){return n},setValue:function(f){n=\"\"+f},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function dc(e){if(!e._valueTracker){var t=Sd(e)?\"checked\":\"value\";e._valueTracker=k1(e,t,\"\"+e[t])}}function zd(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),l=\"\";return e&&(l=Sd(e)?e.checked?\"true\":\"false\":e.value),e=l,e!==n?(t.setValue(e),!0):!1}function ti(e){if(e=e||(typeof document<\"u\"?document:void 0),typeof e>\"u\")return null;try{return e.activeElement||e.body}catch{return e.body}}var H1=/[\\n\"\\\\]/g;function Xt(e){return e.replace(H1,function(t){return\"\\\\\"+t.charCodeAt(0).toString(16)+\" \"})}function hc(e,t,n,l,i,s,f,h){e.name=\"\",f!=null&&typeof f!=\"function\"&&typeof f!=\"symbol\"&&typeof f!=\"boolean\"?e.type=f:e.removeAttribute(\"type\"),t!=null?f===\"number\"?(t===0&&e.value===\"\"||e.value!=t)&&(e.value=\"\"+Qt(t)):e.value!==\"\"+Qt(t)&&(e.value=\"\"+Qt(t)):f!==\"submit\"&&f!==\"reset\"||e.removeAttribute(\"value\"),t!=null?mc(e,f,Qt(t)):n!=null?mc(e,f,Qt(n)):l!=null&&e.removeAttribute(\"value\"),i==null&&s!=null&&(e.defaultChecked=!!s),i!=null&&(e.checked=i&&typeof i!=\"function\"&&typeof i!=\"symbol\"),h!=null&&typeof h!=\"function\"&&typeof h!=\"symbol\"&&typeof h!=\"boolean\"?e.name=\"\"+Qt(h):e.removeAttribute(\"name\")}function Td(e,t,n,l,i,s,f,h){if(s!=null&&typeof s!=\"function\"&&typeof s!=\"symbol\"&&typeof s!=\"boolean\"&&(e.type=s),t!=null||n!=null){if(!(s!==\"submit\"&&s!==\"reset\"||t!=null)){dc(e);return}n=n!=null?\"\"+Qt(n):\"\",t=t!=null?\"\"+Qt(t):n,h||t===e.value||(e.value=t),e.defaultValue=t}l=l??i,l=typeof l!=\"function\"&&typeof l!=\"symbol\"&&!!l,e.checked=h?e.checked:!!l,e.defaultChecked=!!l,f!=null&&typeof f!=\"function\"&&typeof f!=\"symbol\"&&typeof f!=\"boolean\"&&(e.name=f),dc(e)}function mc(e,t,n){t===\"number\"&&ti(e.ownerDocument)===e||e.defaultValue===\"\"+n||(e.defaultValue=\"\"+n)}function Qa(e,t,n,l){if(e=e.options,t){t={};for(var i=0;i<n.length;i++)t[\"$\"+n[i]]=!0;for(n=0;n<e.length;n++)i=t.hasOwnProperty(\"$\"+e[n].value),e[n].selected!==i&&(e[n].selected=i),i&&l&&(e[n].defaultSelected=!0)}else{for(n=\"\"+Qt(n),t=null,i=0;i<e.length;i++){if(e[i].value===n){e[i].selected=!0,l&&(e[i].defaultSelected=!0);return}t!==null||e[i].disabled||(t=e[i])}t!==null&&(t.selected=!0)}}function Ed(e,t,n){if(t!=null&&(t=\"\"+Qt(t),t!==e.value&&(e.value=t),n==null)){e.defaultValue!==t&&(e.defaultValue=t);return}e.defaultValue=n!=null?\"\"+Qt(n):\"\"}function Od(e,t,n,l){if(t==null){if(l!=null){if(n!=null)throw Error(c(92));if(en(l)){if(1<l.length)throw Error(c(93));l=l[0]}n=l}n==null&&(n=\"\"),t=n}n=Qt(t),e.defaultValue=n,l=e.textContent,l===n&&l!==\"\"&&l!==null&&(e.value=l),dc(e)}function Xa(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var j1=new Set(\"animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp\".split(\" \"));function Ad(e,t,n){var l=t.indexOf(\"--\")===0;n==null||typeof n==\"boolean\"||n===\"\"?l?e.setProperty(t,\"\"):t===\"float\"?e.cssFloat=\"\":e[t]=\"\":l?e.setProperty(t,n):typeof n!=\"number\"||n===0||j1.has(t)?t===\"float\"?e.cssFloat=n:e[t]=(\"\"+n).trim():e[t]=n+\"px\"}function Rd(e,t,n){if(t!=null&&typeof t!=\"object\")throw Error(c(62));if(e=e.style,n!=null){for(var l in n)!n.hasOwnProperty(l)||t!=null&&t.hasOwnProperty(l)||(l.indexOf(\"--\")===0?e.setProperty(l,\"\"):l===\"float\"?e.cssFloat=\"\":e[l]=\"\");for(var i in t)l=t[i],t.hasOwnProperty(i)&&n[i]!==l&&Ad(e,i,l)}else for(var s in t)t.hasOwnProperty(s)&&Ad(e,s,t[s])}function pc(e){if(e.indexOf(\"-\")===-1)return!1;switch(e){case\"annotation-xml\":case\"color-profile\":case\"font-face\":case\"font-face-src\":case\"font-face-uri\":case\"font-face-format\":case\"font-face-name\":case\"missing-glyph\":return!1;default:return!0}}var B1=new Map([[\"acceptCharset\",\"accept-charset\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"],[\"crossOrigin\",\"crossorigin\"],[\"accentHeight\",\"accent-height\"],[\"alignmentBaseline\",\"alignment-baseline\"],[\"arabicForm\",\"arabic-form\"],[\"baselineShift\",\"baseline-shift\"],[\"capHeight\",\"cap-height\"],[\"clipPath\",\"clip-path\"],[\"clipRule\",\"clip-rule\"],[\"colorInterpolation\",\"color-interpolation\"],[\"colorInterpolationFilters\",\"color-interpolation-filters\"],[\"colorProfile\",\"color-profile\"],[\"colorRendering\",\"color-rendering\"],[\"dominantBaseline\",\"dominant-baseline\"],[\"enableBackground\",\"enable-background\"],[\"fillOpacity\",\"fill-opacity\"],[\"fillRule\",\"fill-rule\"],[\"floodColor\",\"flood-color\"],[\"floodOpacity\",\"flood-opacity\"],[\"fontFamily\",\"font-family\"],[\"fontSize\",\"font-size\"],[\"fontSizeAdjust\",\"font-size-adjust\"],[\"fontStretch\",\"font-stretch\"],[\"fontStyle\",\"font-style\"],[\"fontVariant\",\"font-variant\"],[\"fontWeight\",\"font-weight\"],[\"glyphName\",\"glyph-name\"],[\"glyphOrientationHorizontal\",\"glyph-orientation-horizontal\"],[\"glyphOrientationVertical\",\"glyph-orientation-vertical\"],[\"horizAdvX\",\"horiz-adv-x\"],[\"horizOriginX\",\"horiz-origin-x\"],[\"imageRendering\",\"image-rendering\"],[\"letterSpacing\",\"letter-spacing\"],[\"lightingColor\",\"lighting-color\"],[\"markerEnd\",\"marker-end\"],[\"markerMid\",\"marker-mid\"],[\"markerStart\",\"marker-start\"],[\"overlinePosition\",\"overline-position\"],[\"overlineThickness\",\"overline-thickness\"],[\"paintOrder\",\"paint-order\"],[\"panose-1\",\"panose-1\"],[\"pointerEvents\",\"pointer-events\"],[\"renderingIntent\",\"rendering-intent\"],[\"shapeRendering\",\"shape-rendering\"],[\"stopColor\",\"stop-color\"],[\"stopOpacity\",\"stop-opacity\"],[\"strikethroughPosition\",\"strikethrough-position\"],[\"strikethroughThickness\",\"strikethrough-thickness\"],[\"strokeDasharray\",\"stroke-dasharray\"],[\"strokeDashoffset\",\"stroke-dashoffset\"],[\"strokeLinecap\",\"stroke-linecap\"],[\"strokeLinejoin\",\"stroke-linejoin\"],[\"strokeMiterlimit\",\"stroke-miterlimit\"],[\"strokeOpacity\",\"stroke-opacity\"],[\"strokeWidth\",\"stroke-width\"],[\"textAnchor\",\"text-anchor\"],[\"textDecoration\",\"text-decoration\"],[\"textRendering\",\"text-rendering\"],[\"transformOrigin\",\"transform-origin\"],[\"underlinePosition\",\"underline-position\"],[\"underlineThickness\",\"underline-thickness\"],[\"unicodeBidi\",\"unicode-bidi\"],[\"unicodeRange\",\"unicode-range\"],[\"unitsPerEm\",\"units-per-em\"],[\"vAlphabetic\",\"v-alphabetic\"],[\"vHanging\",\"v-hanging\"],[\"vIdeographic\",\"v-ideographic\"],[\"vMathematical\",\"v-mathematical\"],[\"vectorEffect\",\"vector-effect\"],[\"vertAdvY\",\"vert-adv-y\"],[\"vertOriginX\",\"vert-origin-x\"],[\"vertOriginY\",\"vert-origin-y\"],[\"wordSpacing\",\"word-spacing\"],[\"writingMode\",\"writing-mode\"],[\"xmlnsXlink\",\"xmlns:xlink\"],[\"xHeight\",\"x-height\"]]),Y1=/^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*:/i;function ni(e){return Y1.test(\"\"+e)?\"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')\":e}function hn(){}var gc=null;function vc(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Va=null,$a=null;function Md(e){var t=Ya(e);if(t&&(e=t.stateNode)){var n=e[St]||null;e:switch(e=t.stateNode,t.type){case\"input\":if(hc(e,n.value,n.defaultValue,n.defaultValue,n.checked,n.defaultChecked,n.type,n.name),t=n.name,n.type===\"radio\"&&t!=null){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll('input[name=\"'+Xt(\"\"+t)+'\"][type=\"radio\"]'),t=0;t<n.length;t++){var l=n[t];if(l!==e&&l.form===e.form){var i=l[St]||null;if(!i)throw Error(c(90));hc(l,i.value,i.defaultValue,i.defaultValue,i.checked,i.defaultChecked,i.type,i.name)}}for(t=0;t<n.length;t++)l=n[t],l.form===e.form&&zd(l)}break e;case\"textarea\":Ed(e,n.value,n.defaultValue);break e;case\"select\":t=n.value,t!=null&&Qa(e,!!n.multiple,t,!1)}}}var yc=!1;function wd(e,t,n){if(yc)return e(t,n);yc=!0;try{var l=e(t);return l}finally{if(yc=!1,(Va!==null||$a!==null)&&(Gi(),Va&&(t=Va,e=$a,$a=Va=null,Md(t),e)))for(t=0;t<e.length;t++)Md(e[t])}}function Ll(e,t){var n=e.stateNode;if(n===null)return null;var l=n[St]||null;if(l===null)return null;n=l[t];e:switch(t){case\"onClick\":case\"onClickCapture\":case\"onDoubleClick\":case\"onDoubleClickCapture\":case\"onMouseDown\":case\"onMouseDownCapture\":case\"onMouseMove\":case\"onMouseMoveCapture\":case\"onMouseUp\":case\"onMouseUpCapture\":case\"onMouseEnter\":(l=!l.disabled)||(e=e.type,l=!(e===\"button\"||e===\"input\"||e===\"select\"||e===\"textarea\")),e=!l;break e;default:e=!1}if(e)return null;if(n&&typeof n!=\"function\")throw Error(c(231,t,typeof n));return n}var mn=!(typeof window>\"u\"||typeof window.document>\"u\"||typeof window.document.createElement>\"u\"),_c=!1;if(mn)try{var Gl={};Object.defineProperty(Gl,\"passive\",{get:function(){_c=!0}}),window.addEventListener(\"test\",Gl,Gl),window.removeEventListener(\"test\",Gl,Gl)}catch{_c=!1}var kn=null,bc=null,ai=null;function Nd(){if(ai)return ai;var e,t=bc,n=t.length,l,i=\"value\"in kn?kn.value:kn.textContent,s=i.length;for(e=0;e<n&&t[e]===i[e];e++);var f=n-e;for(l=1;l<=f&&t[n-l]===i[s-l];l++);return ai=i.slice(e,1<l?1-l:void 0)}function li(e){var t=e.keyCode;return\"charCode\"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function ui(){return!0}function Cd(){return!1}function zt(e){function t(n,l,i,s,f){this._reactName=n,this._targetInst=i,this.type=l,this.nativeEvent=s,this.target=f,this.currentTarget=null;for(var h in e)e.hasOwnProperty(h)&&(n=e[h],this[h]=n?n(s):s[h]);return this.isDefaultPrevented=(s.defaultPrevented!=null?s.defaultPrevented:s.returnValue===!1)?ui:Cd,this.isPropagationStopped=Cd,this}return T(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var n=this.nativeEvent;n&&(n.preventDefault?n.preventDefault():typeof n.returnValue!=\"unknown\"&&(n.returnValue=!1),this.isDefaultPrevented=ui)},stopPropagation:function(){var n=this.nativeEvent;n&&(n.stopPropagation?n.stopPropagation():typeof n.cancelBubble!=\"unknown\"&&(n.cancelBubble=!0),this.isPropagationStopped=ui)},persist:function(){},isPersistent:ui}),t}var pa={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},ii=zt(pa),Ql=T({},pa,{view:0,detail:0}),L1=zt(Ql),Sc,zc,Xl,oi=T({},Ql,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Ec,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return\"movementX\"in e?e.movementX:(e!==Xl&&(Xl&&e.type===\"mousemove\"?(Sc=e.screenX-Xl.screenX,zc=e.screenY-Xl.screenY):zc=Sc=0,Xl=e),Sc)},movementY:function(e){return\"movementY\"in e?e.movementY:zc}}),Dd=zt(oi),G1=T({},oi,{dataTransfer:0}),Q1=zt(G1),X1=T({},Ql,{relatedTarget:0}),Tc=zt(X1),V1=T({},pa,{animationName:0,elapsedTime:0,pseudoElement:0}),$1=zt(V1),J1=T({},pa,{clipboardData:function(e){return\"clipboardData\"in e?e.clipboardData:window.clipboardData}}),K1=zt(J1),I1=T({},pa,{data:0}),Ud=zt(I1),W1={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},F1={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},P1={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function ez(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=P1[e])?!!t[e]:!1}function Ec(){return ez}var tz=T({},Ql,{key:function(e){if(e.key){var t=W1[e.key]||e.key;if(t!==\"Unidentified\")return t}return e.type===\"keypress\"?(e=li(e),e===13?\"Enter\":String.fromCharCode(e)):e.type===\"keydown\"||e.type===\"keyup\"?F1[e.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Ec,charCode:function(e){return e.type===\"keypress\"?li(e):0},keyCode:function(e){return e.type===\"keydown\"||e.type===\"keyup\"?e.keyCode:0},which:function(e){return e.type===\"keypress\"?li(e):e.type===\"keydown\"||e.type===\"keyup\"?e.keyCode:0}}),nz=zt(tz),az=T({},oi,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Zd=zt(az),lz=T({},Ql,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Ec}),uz=zt(lz),iz=T({},pa,{propertyName:0,elapsedTime:0,pseudoElement:0}),oz=zt(iz),cz=T({},oi,{deltaX:function(e){return\"deltaX\"in e?e.deltaX:\"wheelDeltaX\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\"deltaY\"in e?e.deltaY:\"wheelDeltaY\"in e?-e.wheelDeltaY:\"wheelDelta\"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),sz=zt(cz),rz=T({},pa,{newState:0,oldState:0}),fz=zt(rz),dz=[9,13,27,32],Oc=mn&&\"CompositionEvent\"in window,Vl=null;mn&&\"documentMode\"in document&&(Vl=document.documentMode);var hz=mn&&\"TextEvent\"in window&&!Vl,qd=mn&&(!Oc||Vl&&8<Vl&&11>=Vl),xd=\" \",kd=!1;function Hd(e,t){switch(e){case\"keyup\":return dz.indexOf(t.keyCode)!==-1;case\"keydown\":return t.keyCode!==229;case\"keypress\":case\"mousedown\":case\"focusout\":return!0;default:return!1}}function jd(e){return e=e.detail,typeof e==\"object\"&&\"data\"in e?e.data:null}var Ja=!1;function mz(e,t){switch(e){case\"compositionend\":return jd(t);case\"keypress\":return t.which!==32?null:(kd=!0,xd);case\"textInput\":return e=t.data,e===xd&&kd?null:e;default:return null}}function pz(e,t){if(Ja)return e===\"compositionend\"||!Oc&&Hd(e,t)?(e=Nd(),ai=bc=kn=null,Ja=!1,e):null;switch(e){case\"paste\":return null;case\"keypress\":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case\"compositionend\":return qd&&t.locale!==\"ko\"?null:t.data;default:return null}}var gz={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Bd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t===\"input\"?!!gz[e.type]:t===\"textarea\"}function Yd(e,t,n,l){Va?$a?$a.push(l):$a=[l]:Va=l,t=Ii(t,\"onChange\"),0<t.length&&(n=new ii(\"onChange\",\"change\",null,n,l),e.push({event:n,listeners:t}))}var $l=null,Jl=null;function vz(e){Tp(e,0)}function ci(e){var t=Yl(e);if(zd(t))return e}function Ld(e,t){if(e===\"change\")return t}var Gd=!1;if(mn){var Ac;if(mn){var Rc=\"oninput\"in document;if(!Rc){var Qd=document.createElement(\"div\");Qd.setAttribute(\"oninput\",\"return;\"),Rc=typeof Qd.oninput==\"function\"}Ac=Rc}else Ac=!1;Gd=Ac&&(!document.documentMode||9<document.documentMode)}function Xd(){$l&&($l.detachEvent(\"onpropertychange\",Vd),Jl=$l=null)}function Vd(e){if(e.propertyName===\"value\"&&ci(Jl)){var t=[];Yd(t,Jl,e,vc(e)),wd(vz,t)}}function yz(e,t,n){e===\"focusin\"?(Xd(),$l=t,Jl=n,$l.attachEvent(\"onpropertychange\",Vd)):e===\"focusout\"&&Xd()}function _z(e){if(e===\"selectionchange\"||e===\"keyup\"||e===\"keydown\")return ci(Jl)}function bz(e,t){if(e===\"click\")return ci(t)}function Sz(e,t){if(e===\"input\"||e===\"change\")return ci(t)}function zz(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Zt=typeof Object.is==\"function\"?Object.is:zz;function Kl(e,t){if(Zt(e,t))return!0;if(typeof e!=\"object\"||e===null||typeof t!=\"object\"||t===null)return!1;var n=Object.keys(e),l=Object.keys(t);if(n.length!==l.length)return!1;for(l=0;l<n.length;l++){var i=n[l];if(!lc.call(t,i)||!Zt(e[i],t[i]))return!1}return!0}function $d(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Jd(e,t){var n=$d(e);e=0;for(var l;n;){if(n.nodeType===3){if(l=e+n.textContent.length,e<=t&&l>=t)return{node:n,offset:t-e};e=l}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=$d(n)}}function Kd(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Kd(e,t.parentNode):\"contains\"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Id(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ti(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==\"string\"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ti(e.document)}return t}function Mc(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===\"input\"&&(e.type===\"text\"||e.type===\"search\"||e.type===\"tel\"||e.type===\"url\"||e.type===\"password\")||t===\"textarea\"||e.contentEditable===\"true\")}var Tz=mn&&\"documentMode\"in document&&11>=document.documentMode,Ka=null,wc=null,Il=null,Nc=!1;function Wd(e,t,n){var l=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Nc||Ka==null||Ka!==ti(l)||(l=Ka,\"selectionStart\"in l&&Mc(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),Il&&Kl(Il,l)||(Il=l,l=Ii(wc,\"onSelect\"),0<l.length&&(t=new ii(\"onSelect\",\"select\",null,t,n),e.push({event:t,listeners:l}),t.target=Ka)))}function ga(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n[\"Webkit\"+e]=\"webkit\"+t,n[\"Moz\"+e]=\"moz\"+t,n}var Ia={animationend:ga(\"Animation\",\"AnimationEnd\"),animationiteration:ga(\"Animation\",\"AnimationIteration\"),animationstart:ga(\"Animation\",\"AnimationStart\"),transitionrun:ga(\"Transition\",\"TransitionRun\"),transitionstart:ga(\"Transition\",\"TransitionStart\"),transitioncancel:ga(\"Transition\",\"TransitionCancel\"),transitionend:ga(\"Transition\",\"TransitionEnd\")},Cc={},Fd={};mn&&(Fd=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Ia.animationend.animation,delete Ia.animationiteration.animation,delete Ia.animationstart.animation),\"TransitionEvent\"in window||delete Ia.transitionend.transition);function va(e){if(Cc[e])return Cc[e];if(!Ia[e])return e;var t=Ia[e],n;for(n in t)if(t.hasOwnProperty(n)&&n in Fd)return Cc[e]=t[n];return e}var Pd=va(\"animationend\"),eh=va(\"animationiteration\"),th=va(\"animationstart\"),Ez=va(\"transitionrun\"),Oz=va(\"transitionstart\"),Az=va(\"transitioncancel\"),nh=va(\"transitionend\"),ah=new Map,Dc=\"abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");Dc.push(\"scrollEnd\");function tn(e,t){ah.set(e,t),ma(t,[e])}var si=typeof reportError==\"function\"?reportError:function(e){if(typeof window==\"object\"&&typeof window.ErrorEvent==\"function\"){var t=new window.ErrorEvent(\"error\",{bubbles:!0,cancelable:!0,message:typeof e==\"object\"&&e!==null&&typeof e.message==\"string\"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==\"object\"&&typeof process.emit==\"function\"){process.emit(\"uncaughtException\",e);return}console.error(e)},Vt=[],Wa=0,Uc=0;function ri(){for(var e=Wa,t=Uc=Wa=0;t<e;){var n=Vt[t];Vt[t++]=null;var l=Vt[t];Vt[t++]=null;var i=Vt[t];Vt[t++]=null;var s=Vt[t];if(Vt[t++]=null,l!==null&&i!==null){var f=l.pending;f===null?i.next=i:(i.next=f.next,f.next=i),l.pending=i}s!==0&&lh(n,i,s)}}function fi(e,t,n,l){Vt[Wa++]=e,Vt[Wa++]=t,Vt[Wa++]=n,Vt[Wa++]=l,Uc|=l,e.lanes|=l,e=e.alternate,e!==null&&(e.lanes|=l)}function Zc(e,t,n,l){return fi(e,t,n,l),di(e)}function ya(e,t){return fi(e,null,null,t),di(e)}function lh(e,t,n){e.lanes|=n;var l=e.alternate;l!==null&&(l.lanes|=n);for(var i=!1,s=e.return;s!==null;)s.childLanes|=n,l=s.alternate,l!==null&&(l.childLanes|=n),s.tag===22&&(e=s.stateNode,e===null||e._visibility&1||(i=!0)),e=s,s=s.return;return e.tag===3?(s=e.stateNode,i&&t!==null&&(i=31-Ut(n),e=s.hiddenUpdates,l=e[i],l===null?e[i]=[t]:l.push(t),t.lane=n|536870912),s):null}function di(e){if(50<yu)throw yu=0,Gs=null,Error(c(185));for(var t=e.return;t!==null;)e=t,t=e.return;return e.tag===3?e.stateNode:null}var Fa={};function Rz(e,t,n,l){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=l,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function qt(e,t,n,l){return new Rz(e,t,n,l)}function qc(e){return e=e.prototype,!(!e||!e.isReactComponent)}function pn(e,t){var n=e.alternate;return n===null?(n=qt(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&65011712,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n.refCleanup=e.refCleanup,n}function uh(e,t){e.flags&=65011714;var n=e.alternate;return n===null?(e.childLanes=0,e.lanes=t,e.child=null,e.subtreeFlags=0,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.stateNode=null):(e.childLanes=n.childLanes,e.lanes=n.lanes,e.child=n.child,e.subtreeFlags=0,e.deletions=null,e.memoizedProps=n.memoizedProps,e.memoizedState=n.memoizedState,e.updateQueue=n.updateQueue,e.type=n.type,t=n.dependencies,e.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext}),e}function hi(e,t,n,l,i,s){var f=0;if(l=e,typeof e==\"function\")qc(e)&&(f=1);else if(typeof e==\"string\")f=DT(e,n,Q.current)?26:e===\"html\"||e===\"head\"||e===\"body\"?27:5;else e:switch(e){case Qe:return e=qt(31,n,t,i),e.elementType=Qe,e.lanes=s,e;case G:return _a(n.children,i,s,t);case re:f=8,i|=24;break;case we:return e=qt(12,n,t,i|2),e.elementType=we,e.lanes=s,e;case Te:return e=qt(13,n,t,i),e.elementType=Te,e.lanes=s,e;case ye:return e=qt(19,n,t,i),e.elementType=ye,e.lanes=s,e;default:if(typeof e==\"object\"&&e!==null)switch(e.$$typeof){case Ne:f=10;break e;case de:f=9;break e;case Ze:f=11;break e;case $:f=14;break e;case ke:f=16,l=null;break e}f=29,n=Error(c(130,e===null?\"null\":typeof e,\"\")),l=null}return t=qt(f,n,t,i),t.elementType=e,t.type=l,t.lanes=s,t}function _a(e,t,n,l){return e=qt(7,e,l,t),e.lanes=n,e}function xc(e,t,n){return e=qt(6,e,null,t),e.lanes=n,e}function ih(e){var t=qt(18,null,null,0);return t.stateNode=e,t}function kc(e,t,n){return t=qt(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}var oh=new WeakMap;function $t(e,t){if(typeof e==\"object\"&&e!==null){var n=oh.get(e);return n!==void 0?n:(t={value:e,source:t,stack:id(t)},oh.set(e,t),t)}return{value:e,source:t,stack:id(t)}}var Pa=[],el=0,mi=null,Wl=0,Jt=[],Kt=0,Hn=null,un=1,on=\"\";function gn(e,t){Pa[el++]=Wl,Pa[el++]=mi,mi=e,Wl=t}function ch(e,t,n){Jt[Kt++]=un,Jt[Kt++]=on,Jt[Kt++]=Hn,Hn=e;var l=un;e=on;var i=32-Ut(l)-1;l&=~(1<<i),n+=1;var s=32-Ut(t)+i;if(30<s){var f=i-i%5;s=(l&(1<<f)-1).toString(32),l>>=f,i-=f,un=1<<32-Ut(t)+i|n<<i|l,on=s+e}else un=1<<s|n<<i|l,on=e}function Hc(e){e.return!==null&&(gn(e,1),ch(e,1,0))}function jc(e){for(;e===mi;)mi=Pa[--el],Pa[el]=null,Wl=Pa[--el],Pa[el]=null;for(;e===Hn;)Hn=Jt[--Kt],Jt[Kt]=null,on=Jt[--Kt],Jt[Kt]=null,un=Jt[--Kt],Jt[Kt]=null}function sh(e,t){Jt[Kt++]=un,Jt[Kt++]=on,Jt[Kt++]=Hn,un=t.id,on=t.overflow,Hn=e}var ct=null,He=null,se=!1,jn=null,It=!1,Bc=Error(c(519));function Bn(e){var t=Error(c(418,1<arguments.length&&arguments[1]!==void 0&&arguments[1]?\"text\":\"HTML\",\"\"));throw Fl($t(t,e)),Bc}function rh(e){var t=e.stateNode,n=e.type,l=e.memoizedProps;switch(t[ot]=e,t[St]=l,n){case\"dialog\":ue(\"cancel\",t),ue(\"close\",t);break;case\"iframe\":case\"object\":case\"embed\":ue(\"load\",t);break;case\"video\":case\"audio\":for(n=0;n<bu.length;n++)ue(bu[n],t);break;case\"source\":ue(\"error\",t);break;case\"img\":case\"image\":case\"link\":ue(\"error\",t),ue(\"load\",t);break;case\"details\":ue(\"toggle\",t);break;case\"input\":ue(\"invalid\",t),Td(t,l.value,l.defaultValue,l.checked,l.defaultChecked,l.type,l.name,!0);break;case\"select\":ue(\"invalid\",t);break;case\"textarea\":ue(\"invalid\",t),Od(t,l.value,l.defaultValue,l.children)}n=l.children,typeof n!=\"string\"&&typeof n!=\"number\"&&typeof n!=\"bigint\"||t.textContent===\"\"+n||l.suppressHydrationWarning===!0||Rp(t.textContent,n)?(l.popover!=null&&(ue(\"beforetoggle\",t),ue(\"toggle\",t)),l.onScroll!=null&&ue(\"scroll\",t),l.onScrollEnd!=null&&ue(\"scrollend\",t),l.onClick!=null&&(t.onclick=hn),t=!0):t=!1,t||Bn(e,!0)}function fh(e){for(ct=e.return;ct;)switch(ct.tag){case 5:case 31:case 13:It=!1;return;case 27:case 3:It=!0;return;default:ct=ct.return}}function tl(e){if(e!==ct)return!1;if(!se)return fh(e),se=!0,!1;var t=e.tag,n;if((n=t!==3&&t!==27)&&((n=t===5)&&(n=e.type,n=!(n!==\"form\"&&n!==\"button\")||lr(e.type,e.memoizedProps)),n=!n),n&&He&&Bn(e),fh(e),t===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(c(317));He=xp(e)}else if(t===31){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(c(317));He=xp(e)}else t===27?(t=He,ea(e.type)?(e=sr,sr=null,He=e):He=t):He=ct?Ft(e.stateNode.nextSibling):null;return!0}function ba(){He=ct=null,se=!1}function Yc(){var e=jn;return e!==null&&(At===null?At=e:At.push.apply(At,e),jn=null),e}function Fl(e){jn===null?jn=[e]:jn.push(e)}var Lc=b(null),Sa=null,vn=null;function Yn(e,t,n){B(Lc,t._currentValue),t._currentValue=n}function yn(e){e._currentValue=Lc.current,x(Lc)}function Gc(e,t,n){for(;e!==null;){var l=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,l!==null&&(l.childLanes|=t)):l!==null&&(l.childLanes&t)!==t&&(l.childLanes|=t),e===n)break;e=e.return}}function Qc(e,t,n,l){var i=e.child;for(i!==null&&(i.return=e);i!==null;){var s=i.dependencies;if(s!==null){var f=i.child;s=s.firstContext;e:for(;s!==null;){var h=s;s=i;for(var y=0;y<t.length;y++)if(h.context===t[y]){s.lanes|=n,h=s.alternate,h!==null&&(h.lanes|=n),Gc(s.return,n,e),l||(f=null);break e}s=h.next}}else if(i.tag===18){if(f=i.return,f===null)throw Error(c(341));f.lanes|=n,s=f.alternate,s!==null&&(s.lanes|=n),Gc(f,n,e),f=null}else f=i.child;if(f!==null)f.return=i;else for(f=i;f!==null;){if(f===e){f=null;break}if(i=f.sibling,i!==null){i.return=f.return,f=i;break}f=f.return}i=f}}function nl(e,t,n,l){e=null;for(var i=t,s=!1;i!==null;){if(!s){if((i.flags&524288)!==0)s=!0;else if((i.flags&262144)!==0)break}if(i.tag===10){var f=i.alternate;if(f===null)throw Error(c(387));if(f=f.memoizedProps,f!==null){var h=i.type;Zt(i.pendingProps.value,f.value)||(e!==null?e.push(h):e=[h])}}else if(i===ve.current){if(f=i.alternate,f===null)throw Error(c(387));f.memoizedState.memoizedState!==i.memoizedState.memoizedState&&(e!==null?e.push(Ou):e=[Ou])}i=i.return}e!==null&&Qc(t,e,n,l),t.flags|=262144}function pi(e){for(e=e.firstContext;e!==null;){if(!Zt(e.context._currentValue,e.memoizedValue))return!0;e=e.next}return!1}function za(e){Sa=e,vn=null,e=e.dependencies,e!==null&&(e.firstContext=null)}function st(e){return dh(Sa,e)}function gi(e,t){return Sa===null&&za(e),dh(e,t)}function dh(e,t){var n=t._currentValue;if(t={context:t,memoizedValue:n,next:null},vn===null){if(e===null)throw Error(c(308));vn=t,e.dependencies={lanes:0,firstContext:t},e.flags|=524288}else vn=vn.next=t;return n}var Mz=typeof AbortController<\"u\"?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(n,l){e.push(l)}};this.abort=function(){t.aborted=!0,e.forEach(function(n){return n()})}},wz=a.unstable_scheduleCallback,Nz=a.unstable_NormalPriority,We={$$typeof:Ne,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function Xc(){return{controller:new Mz,data:new Map,refCount:0}}function Pl(e){e.refCount--,e.refCount===0&&wz(Nz,function(){e.controller.abort()})}var eu=null,Vc=0,al=0,ll=null;function Cz(e,t){if(eu===null){var n=eu=[];Vc=0,al=Ks(),ll={status:\"pending\",value:void 0,then:function(l){n.push(l)}}}return Vc++,t.then(hh,hh),t}function hh(){if(--Vc===0&&eu!==null){ll!==null&&(ll.status=\"fulfilled\");var e=eu;eu=null,al=0,ll=null;for(var t=0;t<e.length;t++)(0,e[t])()}}function Dz(e,t){var n=[],l={status:\"pending\",value:null,reason:null,then:function(i){n.push(i)}};return e.then(function(){l.status=\"fulfilled\",l.value=t;for(var i=0;i<n.length;i++)(0,n[i])(t)},function(i){for(l.status=\"rejected\",l.reason=i,i=0;i<n.length;i++)(0,n[i])(void 0)}),l}var mh=U.S;U.S=function(e,t){Wm=Ct(),typeof t==\"object\"&&t!==null&&typeof t.then==\"function\"&&Cz(e,t),mh!==null&&mh(e,t)};var Ta=b(null);function $c(){var e=Ta.current;return e!==null?e:De.pooledCache}function vi(e,t){t===null?B(Ta,Ta.current):B(Ta,t.pool)}function ph(){var e=$c();return e===null?null:{parent:We._currentValue,pool:e}}var ul=Error(c(460)),Jc=Error(c(474)),yi=Error(c(542)),_i={then:function(){}};function gh(e){return e=e.status,e===\"fulfilled\"||e===\"rejected\"}function vh(e,t,n){switch(n=e[n],n===void 0?e.push(t):n!==t&&(t.then(hn,hn),t=n),t.status){case\"fulfilled\":return t.value;case\"rejected\":throw e=t.reason,_h(e),e;default:if(typeof t.status==\"string\")t.then(hn,hn);else{if(e=De,e!==null&&100<e.shellSuspendCounter)throw Error(c(482));e=t,e.status=\"pending\",e.then(function(l){if(t.status===\"pending\"){var i=t;i.status=\"fulfilled\",i.value=l}},function(l){if(t.status===\"pending\"){var i=t;i.status=\"rejected\",i.reason=l}})}switch(t.status){case\"fulfilled\":return t.value;case\"rejected\":throw e=t.reason,_h(e),e}throw Oa=t,ul}}function Ea(e){try{var t=e._init;return t(e._payload)}catch(n){throw n!==null&&typeof n==\"object\"&&typeof n.then==\"function\"?(Oa=n,ul):n}}var Oa=null;function yh(){if(Oa===null)throw Error(c(459));var e=Oa;return Oa=null,e}function _h(e){if(e===ul||e===yi)throw Error(c(483))}var il=null,tu=0;function bi(e){var t=tu;return tu+=1,il===null&&(il=[]),vh(il,e,t)}function nu(e,t){t=t.props.ref,e.ref=t!==void 0?t:null}function Si(e,t){throw t.$$typeof===k?Error(c(525)):(e=Object.prototype.toString.call(t),Error(c(31,e===\"[object Object]\"?\"object with keys {\"+Object.keys(t).join(\", \")+\"}\":e)))}function bh(e){function t(S,_){if(e){var O=S.deletions;O===null?(S.deletions=[_],S.flags|=16):O.push(_)}}function n(S,_){if(!e)return null;for(;_!==null;)t(S,_),_=_.sibling;return null}function l(S){for(var _=new Map;S!==null;)S.key!==null?_.set(S.key,S):_.set(S.index,S),S=S.sibling;return _}function i(S,_){return S=pn(S,_),S.index=0,S.sibling=null,S}function s(S,_,O){return S.index=O,e?(O=S.alternate,O!==null?(O=O.index,O<_?(S.flags|=67108866,_):O):(S.flags|=67108866,_)):(S.flags|=1048576,_)}function f(S){return e&&S.alternate===null&&(S.flags|=67108866),S}function h(S,_,O,Z){return _===null||_.tag!==6?(_=xc(O,S.mode,Z),_.return=S,_):(_=i(_,O),_.return=S,_)}function y(S,_,O,Z){var J=O.type;return J===G?C(S,_,O.props.children,Z,O.key):_!==null&&(_.elementType===J||typeof J==\"object\"&&J!==null&&J.$$typeof===ke&&Ea(J)===_.type)?(_=i(_,O.props),nu(_,O),_.return=S,_):(_=hi(O.type,O.key,O.props,null,S.mode,Z),nu(_,O),_.return=S,_)}function A(S,_,O,Z){return _===null||_.tag!==4||_.stateNode.containerInfo!==O.containerInfo||_.stateNode.implementation!==O.implementation?(_=kc(O,S.mode,Z),_.return=S,_):(_=i(_,O.children||[]),_.return=S,_)}function C(S,_,O,Z,J){return _===null||_.tag!==7?(_=_a(O,S.mode,Z,J),_.return=S,_):(_=i(_,O),_.return=S,_)}function q(S,_,O){if(typeof _==\"string\"&&_!==\"\"||typeof _==\"number\"||typeof _==\"bigint\")return _=xc(\"\"+_,S.mode,O),_.return=S,_;if(typeof _==\"object\"&&_!==null){switch(_.$$typeof){case H:return O=hi(_.type,_.key,_.props,null,S.mode,O),nu(O,_),O.return=S,O;case L:return _=kc(_,S.mode,O),_.return=S,_;case ke:return _=Ea(_),q(S,_,O)}if(en(_)||bt(_))return _=_a(_,S.mode,O,null),_.return=S,_;if(typeof _.then==\"function\")return q(S,bi(_),O);if(_.$$typeof===Ne)return q(S,gi(S,_),O);Si(S,_)}return null}function M(S,_,O,Z){var J=_!==null?_.key:null;if(typeof O==\"string\"&&O!==\"\"||typeof O==\"number\"||typeof O==\"bigint\")return J!==null?null:h(S,_,\"\"+O,Z);if(typeof O==\"object\"&&O!==null){switch(O.$$typeof){case H:return O.key===J?y(S,_,O,Z):null;case L:return O.key===J?A(S,_,O,Z):null;case ke:return O=Ea(O),M(S,_,O,Z)}if(en(O)||bt(O))return J!==null?null:C(S,_,O,Z,null);if(typeof O.then==\"function\")return M(S,_,bi(O),Z);if(O.$$typeof===Ne)return M(S,_,gi(S,O),Z);Si(S,O)}return null}function N(S,_,O,Z,J){if(typeof Z==\"string\"&&Z!==\"\"||typeof Z==\"number\"||typeof Z==\"bigint\")return S=S.get(O)||null,h(_,S,\"\"+Z,J);if(typeof Z==\"object\"&&Z!==null){switch(Z.$$typeof){case H:return S=S.get(Z.key===null?O:Z.key)||null,y(_,S,Z,J);case L:return S=S.get(Z.key===null?O:Z.key)||null,A(_,S,Z,J);case ke:return Z=Ea(Z),N(S,_,O,Z,J)}if(en(Z)||bt(Z))return S=S.get(O)||null,C(_,S,Z,J,null);if(typeof Z.then==\"function\")return N(S,_,O,bi(Z),J);if(Z.$$typeof===Ne)return N(S,_,O,gi(_,Z),J);Si(_,Z)}return null}function Y(S,_,O,Z){for(var J=null,he=null,V=_,te=_=0,ce=null;V!==null&&te<O.length;te++){V.index>te?(ce=V,V=null):ce=V.sibling;var me=M(S,V,O[te],Z);if(me===null){V===null&&(V=ce);break}e&&V&&me.alternate===null&&t(S,V),_=s(me,_,te),he===null?J=me:he.sibling=me,he=me,V=ce}if(te===O.length)return n(S,V),se&&gn(S,te),J;if(V===null){for(;te<O.length;te++)V=q(S,O[te],Z),V!==null&&(_=s(V,_,te),he===null?J=V:he.sibling=V,he=V);return se&&gn(S,te),J}for(V=l(V);te<O.length;te++)ce=N(V,S,te,O[te],Z),ce!==null&&(e&&ce.alternate!==null&&V.delete(ce.key===null?te:ce.key),_=s(ce,_,te),he===null?J=ce:he.sibling=ce,he=ce);return e&&V.forEach(function(ua){return t(S,ua)}),se&&gn(S,te),J}function K(S,_,O,Z){if(O==null)throw Error(c(151));for(var J=null,he=null,V=_,te=_=0,ce=null,me=O.next();V!==null&&!me.done;te++,me=O.next()){V.index>te?(ce=V,V=null):ce=V.sibling;var ua=M(S,V,me.value,Z);if(ua===null){V===null&&(V=ce);break}e&&V&&ua.alternate===null&&t(S,V),_=s(ua,_,te),he===null?J=ua:he.sibling=ua,he=ua,V=ce}if(me.done)return n(S,V),se&&gn(S,te),J;if(V===null){for(;!me.done;te++,me=O.next())me=q(S,me.value,Z),me!==null&&(_=s(me,_,te),he===null?J=me:he.sibling=me,he=me);return se&&gn(S,te),J}for(V=l(V);!me.done;te++,me=O.next())me=N(V,S,te,me.value,Z),me!==null&&(e&&me.alternate!==null&&V.delete(me.key===null?te:me.key),_=s(me,_,te),he===null?J=me:he.sibling=me,he=me);return e&&V.forEach(function(GT){return t(S,GT)}),se&&gn(S,te),J}function Re(S,_,O,Z){if(typeof O==\"object\"&&O!==null&&O.type===G&&O.key===null&&(O=O.props.children),typeof O==\"object\"&&O!==null){switch(O.$$typeof){case H:e:{for(var J=O.key;_!==null;){if(_.key===J){if(J=O.type,J===G){if(_.tag===7){n(S,_.sibling),Z=i(_,O.props.children),Z.return=S,S=Z;break e}}else if(_.elementType===J||typeof J==\"object\"&&J!==null&&J.$$typeof===ke&&Ea(J)===_.type){n(S,_.sibling),Z=i(_,O.props),nu(Z,O),Z.return=S,S=Z;break e}n(S,_);break}else t(S,_);_=_.sibling}O.type===G?(Z=_a(O.props.children,S.mode,Z,O.key),Z.return=S,S=Z):(Z=hi(O.type,O.key,O.props,null,S.mode,Z),nu(Z,O),Z.return=S,S=Z)}return f(S);case L:e:{for(J=O.key;_!==null;){if(_.key===J)if(_.tag===4&&_.stateNode.containerInfo===O.containerInfo&&_.stateNode.implementation===O.implementation){n(S,_.sibling),Z=i(_,O.children||[]),Z.return=S,S=Z;break e}else{n(S,_);break}else t(S,_);_=_.sibling}Z=kc(O,S.mode,Z),Z.return=S,S=Z}return f(S);case ke:return O=Ea(O),Re(S,_,O,Z)}if(en(O))return Y(S,_,O,Z);if(bt(O)){if(J=bt(O),typeof J!=\"function\")throw Error(c(150));return O=J.call(O),K(S,_,O,Z)}if(typeof O.then==\"function\")return Re(S,_,bi(O),Z);if(O.$$typeof===Ne)return Re(S,_,gi(S,O),Z);Si(S,O)}return typeof O==\"string\"&&O!==\"\"||typeof O==\"number\"||typeof O==\"bigint\"?(O=\"\"+O,_!==null&&_.tag===6?(n(S,_.sibling),Z=i(_,O),Z.return=S,S=Z):(n(S,_),Z=xc(O,S.mode,Z),Z.return=S,S=Z),f(S)):n(S,_)}return function(S,_,O,Z){try{tu=0;var J=Re(S,_,O,Z);return il=null,J}catch(V){if(V===ul||V===yi)throw V;var he=qt(29,V,null,S.mode);return he.lanes=Z,he.return=S,he}finally{}}}var Aa=bh(!0),Sh=bh(!1),Ln=!1;function Kc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ic(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Gn(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Qn(e,t,n){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(pe&2)!==0){var i=l.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),l.pending=t,t=di(e),lh(e,null,n),t}return fi(e,l,t,n),di(e)}function au(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,dd(e,n)}}function Wc(e,t){var n=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,n===l)){var i=null,s=null;if(n=n.firstBaseUpdate,n!==null){do{var f={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};s===null?i=s=f:s=s.next=f,n=n.next}while(n!==null);s===null?i=s=t:s=s.next=t}else i=s=t;n={baseState:l.baseState,firstBaseUpdate:i,lastBaseUpdate:s,shared:l.shared,callbacks:l.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Fc=!1;function lu(){if(Fc){var e=ll;if(e!==null)throw e}}function uu(e,t,n,l){Fc=!1;var i=e.updateQueue;Ln=!1;var s=i.firstBaseUpdate,f=i.lastBaseUpdate,h=i.shared.pending;if(h!==null){i.shared.pending=null;var y=h,A=y.next;y.next=null,f===null?s=A:f.next=A,f=y;var C=e.alternate;C!==null&&(C=C.updateQueue,h=C.lastBaseUpdate,h!==f&&(h===null?C.firstBaseUpdate=A:h.next=A,C.lastBaseUpdate=y))}if(s!==null){var q=i.baseState;f=0,C=A=y=null,h=s;do{var M=h.lane&-536870913,N=M!==h.lane;if(N?(oe&M)===M:(l&M)===M){M!==0&&M===al&&(Fc=!0),C!==null&&(C=C.next={lane:0,tag:h.tag,payload:h.payload,callback:null,next:null});e:{var Y=e,K=h;M=t;var Re=n;switch(K.tag){case 1:if(Y=K.payload,typeof Y==\"function\"){q=Y.call(Re,q,M);break e}q=Y;break e;case 3:Y.flags=Y.flags&-65537|128;case 0:if(Y=K.payload,M=typeof Y==\"function\"?Y.call(Re,q,M):Y,M==null)break e;q=T({},q,M);break e;case 2:Ln=!0}}M=h.callback,M!==null&&(e.flags|=64,N&&(e.flags|=8192),N=i.callbacks,N===null?i.callbacks=[M]:N.push(M))}else N={lane:M,tag:h.tag,payload:h.payload,callback:h.callback,next:null},C===null?(A=C=N,y=q):C=C.next=N,f|=M;if(h=h.next,h===null){if(h=i.shared.pending,h===null)break;N=h,h=N.next,N.next=null,i.lastBaseUpdate=N,i.shared.pending=null}}while(!0);C===null&&(y=q),i.baseState=y,i.firstBaseUpdate=A,i.lastBaseUpdate=C,s===null&&(i.shared.lanes=0),Kn|=f,e.lanes=f,e.memoizedState=q}}function zh(e,t){if(typeof e!=\"function\")throw Error(c(191,e));e.call(t)}function Th(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;e<n.length;e++)zh(n[e],t)}var ol=b(null),zi=b(0);function Eh(e,t){e=Rn,B(zi,e),B(ol,t),Rn=e|t.baseLanes}function Pc(){B(zi,Rn),B(ol,ol.current)}function es(){Rn=zi.current,x(ol),x(zi)}var xt=b(null),Wt=null;function Xn(e){var t=e.alternate;B(Je,Je.current&1),B(xt,e),Wt===null&&(t===null||ol.current!==null||t.memoizedState!==null)&&(Wt=e)}function ts(e){B(Je,Je.current),B(xt,e),Wt===null&&(Wt=e)}function Oh(e){e.tag===22?(B(Je,Je.current),B(xt,e),Wt===null&&(Wt=e)):Vn()}function Vn(){B(Je,Je.current),B(xt,xt.current)}function kt(e){x(xt),Wt===e&&(Wt=null),x(Je)}var Je=b(0);function Ti(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||or(n)||cr(n)))return t}else if(t.tag===19&&(t.memoizedProps.revealOrder===\"forwards\"||t.memoizedProps.revealOrder===\"backwards\"||t.memoizedProps.revealOrder===\"unstable_legacy-backwards\"||t.memoizedProps.revealOrder===\"together\")){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var _n=0,ee=null,Oe=null,Fe=null,Ei=!1,cl=!1,Ra=!1,Oi=0,iu=0,sl=null,Uz=0;function Xe(){throw Error(c(321))}function ns(e,t){if(t===null)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!Zt(e[n],t[n]))return!1;return!0}function as(e,t,n,l,i,s){return _n=s,ee=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,U.H=e===null||e.memoizedState===null?cm:ys,Ra=!1,s=n(l,i),Ra=!1,cl&&(s=Rh(t,n,l,i)),Ah(e),s}function Ah(e){U.H=su;var t=Oe!==null&&Oe.next!==null;if(_n=0,Fe=Oe=ee=null,Ei=!1,iu=0,sl=null,t)throw Error(c(300));e===null||Pe||(e=e.dependencies,e!==null&&pi(e)&&(Pe=!0))}function Rh(e,t,n,l){ee=e;var i=0;do{if(cl&&(sl=null),iu=0,cl=!1,25<=i)throw Error(c(301));if(i+=1,Fe=Oe=null,e.updateQueue!=null){var s=e.updateQueue;s.lastEffect=null,s.events=null,s.stores=null,s.memoCache!=null&&(s.memoCache.index=0)}U.H=sm,s=t(n,l)}while(cl);return s}function Zz(){var e=U.H,t=e.useState()[0];return t=typeof t.then==\"function\"?ou(t):t,e=e.useState()[0],(Oe!==null?Oe.memoizedState:null)!==e&&(ee.flags|=1024),t}function ls(){var e=Oi!==0;return Oi=0,e}function us(e,t,n){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n}function is(e){if(Ei){for(e=e.memoizedState;e!==null;){var t=e.queue;t!==null&&(t.pending=null),e=e.next}Ei=!1}_n=0,Fe=Oe=ee=null,cl=!1,iu=Oi=0,sl=null}function vt(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Fe===null?ee.memoizedState=Fe=e:Fe=Fe.next=e,Fe}function Ke(){if(Oe===null){var e=ee.alternate;e=e!==null?e.memoizedState:null}else e=Oe.next;var t=Fe===null?ee.memoizedState:Fe.next;if(t!==null)Fe=t,Oe=e;else{if(e===null)throw ee.alternate===null?Error(c(467)):Error(c(310));Oe=e,e={memoizedState:Oe.memoizedState,baseState:Oe.baseState,baseQueue:Oe.baseQueue,queue:Oe.queue,next:null},Fe===null?ee.memoizedState=Fe=e:Fe=Fe.next=e}return Fe}function Ai(){return{lastEffect:null,events:null,stores:null,memoCache:null}}function ou(e){var t=iu;return iu+=1,sl===null&&(sl=[]),e=vh(sl,e,t),t=ee,(Fe===null?t.memoizedState:Fe.next)===null&&(t=t.alternate,U.H=t===null||t.memoizedState===null?cm:ys),e}function Ri(e){if(e!==null&&typeof e==\"object\"){if(typeof e.then==\"function\")return ou(e);if(e.$$typeof===Ne)return st(e)}throw Error(c(438,String(e)))}function os(e){var t=null,n=ee.updateQueue;if(n!==null&&(t=n.memoCache),t==null){var l=ee.alternate;l!==null&&(l=l.updateQueue,l!==null&&(l=l.memoCache,l!=null&&(t={data:l.data.map(function(i){return i.slice()}),index:0})))}if(t==null&&(t={data:[],index:0}),n===null&&(n=Ai(),ee.updateQueue=n),n.memoCache=t,n=t.data[t.index],n===void 0)for(n=t.data[t.index]=Array(e),l=0;l<e;l++)n[l]=Zn;return t.index++,n}function bn(e,t){return typeof t==\"function\"?t(e):t}function Mi(e){var t=Ke();return cs(t,Oe,e)}function cs(e,t,n){var l=e.queue;if(l===null)throw Error(c(311));l.lastRenderedReducer=n;var i=e.baseQueue,s=l.pending;if(s!==null){if(i!==null){var f=i.next;i.next=s.next,s.next=f}t.baseQueue=i=s,l.pending=null}if(s=e.baseState,i===null)e.memoizedState=s;else{t=i.next;var h=f=null,y=null,A=t,C=!1;do{var q=A.lane&-536870913;if(q!==A.lane?(oe&q)===q:(_n&q)===q){var M=A.revertLane;if(M===0)y!==null&&(y=y.next={lane:0,revertLane:0,gesture:null,action:A.action,hasEagerState:A.hasEagerState,eagerState:A.eagerState,next:null}),q===al&&(C=!0);else if((_n&M)===M){A=A.next,M===al&&(C=!0);continue}else q={lane:0,revertLane:A.revertLane,gesture:null,action:A.action,hasEagerState:A.hasEagerState,eagerState:A.eagerState,next:null},y===null?(h=y=q,f=s):y=y.next=q,ee.lanes|=M,Kn|=M;q=A.action,Ra&&n(s,q),s=A.hasEagerState?A.eagerState:n(s,q)}else M={lane:q,revertLane:A.revertLane,gesture:A.gesture,action:A.action,hasEagerState:A.hasEagerState,eagerState:A.eagerState,next:null},y===null?(h=y=M,f=s):y=y.next=M,ee.lanes|=q,Kn|=q;A=A.next}while(A!==null&&A!==t);if(y===null?f=s:y.next=h,!Zt(s,e.memoizedState)&&(Pe=!0,C&&(n=ll,n!==null)))throw n;e.memoizedState=s,e.baseState=f,e.baseQueue=y,l.lastRenderedState=s}return i===null&&(l.lanes=0),[e.memoizedState,l.dispatch]}function ss(e){var t=Ke(),n=t.queue;if(n===null)throw Error(c(311));n.lastRenderedReducer=e;var l=n.dispatch,i=n.pending,s=t.memoizedState;if(i!==null){n.pending=null;var f=i=i.next;do s=e(s,f.action),f=f.next;while(f!==i);Zt(s,t.memoizedState)||(Pe=!0),t.memoizedState=s,t.baseQueue===null&&(t.baseState=s),n.lastRenderedState=s}return[s,l]}function Mh(e,t,n){var l=ee,i=Ke(),s=se;if(s){if(n===void 0)throw Error(c(407));n=n()}else n=t();var f=!Zt((Oe||i).memoizedState,n);if(f&&(i.memoizedState=n,Pe=!0),i=i.queue,ds(Ch.bind(null,l,i,e),[e]),i.getSnapshot!==t||f||Fe!==null&&Fe.memoizedState.tag&1){if(l.flags|=2048,rl(9,{destroy:void 0},Nh.bind(null,l,i,n,t),null),De===null)throw Error(c(349));s||(_n&127)!==0||wh(l,t,n)}return n}function wh(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},t=ee.updateQueue,t===null?(t=Ai(),ee.updateQueue=t,t.stores=[e]):(n=t.stores,n===null?t.stores=[e]:n.push(e))}function Nh(e,t,n,l){t.value=n,t.getSnapshot=l,Dh(t)&&Uh(e)}function Ch(e,t,n){return n(function(){Dh(t)&&Uh(e)})}function Dh(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!Zt(e,n)}catch{return!0}}function Uh(e){var t=ya(e,2);t!==null&&Rt(t,e,2)}function rs(e){var t=vt();if(typeof e==\"function\"){var n=e;if(e=n(),Ra){qn(!0);try{n()}finally{qn(!1)}}}return t.memoizedState=t.baseState=e,t.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:bn,lastRenderedState:e},t}function Zh(e,t,n,l){return e.baseState=n,cs(e,Oe,typeof l==\"function\"?l:bn)}function qz(e,t,n,l,i){if(Ci(e))throw Error(c(485));if(e=t.action,e!==null){var s={payload:i,action:e,next:null,isTransition:!0,status:\"pending\",value:null,reason:null,listeners:[],then:function(f){s.listeners.push(f)}};U.T!==null?n(!0):s.isTransition=!1,l(s),n=t.pending,n===null?(s.next=t.pending=s,qh(t,s)):(s.next=n.next,t.pending=n.next=s)}}function qh(e,t){var n=t.action,l=t.payload,i=e.state;if(t.isTransition){var s=U.T,f={};U.T=f;try{var h=n(i,l),y=U.S;y!==null&&y(f,h),xh(e,t,h)}catch(A){fs(e,t,A)}finally{s!==null&&f.types!==null&&(s.types=f.types),U.T=s}}else try{s=n(i,l),xh(e,t,s)}catch(A){fs(e,t,A)}}function xh(e,t,n){n!==null&&typeof n==\"object\"&&typeof n.then==\"function\"?n.then(function(l){kh(e,t,l)},function(l){return fs(e,t,l)}):kh(e,t,n)}function kh(e,t,n){t.status=\"fulfilled\",t.value=n,Hh(t),e.state=n,t=e.pending,t!==null&&(n=t.next,n===t?e.pending=null:(n=n.next,t.next=n,qh(e,n)))}function fs(e,t,n){var l=e.pending;if(e.pending=null,l!==null){l=l.next;do t.status=\"rejected\",t.reason=n,Hh(t),t=t.next;while(t!==l)}e.action=null}function Hh(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}function jh(e,t){return t}function Bh(e,t){if(se){var n=De.formState;if(n!==null){e:{var l=ee;if(se){if(He){t:{for(var i=He,s=It;i.nodeType!==8;){if(!s){i=null;break t}if(i=Ft(i.nextSibling),i===null){i=null;break t}}s=i.data,i=s===\"F!\"||s===\"F\"?i:null}if(i){He=Ft(i.nextSibling),l=i.data===\"F!\";break e}}Bn(l)}l=!1}l&&(t=n[0])}}return n=vt(),n.memoizedState=n.baseState=t,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:jh,lastRenderedState:t},n.queue=l,n=um.bind(null,ee,l),l.dispatch=n,l=rs(!1),s=vs.bind(null,ee,!1,l.queue),l=vt(),i={state:t,dispatch:null,action:e,pending:null},l.queue=i,n=qz.bind(null,ee,i,s,n),i.dispatch=n,l.memoizedState=e,[t,n,!1]}function Yh(e){var t=Ke();return Lh(t,Oe,e)}function Lh(e,t,n){if(t=cs(e,t,jh)[0],e=Mi(bn)[0],typeof t==\"object\"&&t!==null&&typeof t.then==\"function\")try{var l=ou(t)}catch(f){throw f===ul?yi:f}else l=t;t=Ke();var i=t.queue,s=i.dispatch;return n!==t.memoizedState&&(ee.flags|=2048,rl(9,{destroy:void 0},xz.bind(null,i,n),null)),[l,s,e]}function xz(e,t){e.action=t}function Gh(e){var t=Ke(),n=Oe;if(n!==null)return Lh(t,n,e);Ke(),t=t.memoizedState,n=Ke();var l=n.queue.dispatch;return n.memoizedState=e,[t,l,!1]}function rl(e,t,n,l){return e={tag:e,create:n,deps:l,inst:t,next:null},t=ee.updateQueue,t===null&&(t=Ai(),ee.updateQueue=t),n=t.lastEffect,n===null?t.lastEffect=e.next=e:(l=n.next,n.next=e,e.next=l,t.lastEffect=e),e}function Qh(){return Ke().memoizedState}function wi(e,t,n,l){var i=vt();ee.flags|=e,i.memoizedState=rl(1|t,{destroy:void 0},n,l===void 0?null:l)}function Ni(e,t,n,l){var i=Ke();l=l===void 0?null:l;var s=i.memoizedState.inst;Oe!==null&&l!==null&&ns(l,Oe.memoizedState.deps)?i.memoizedState=rl(t,s,n,l):(ee.flags|=e,i.memoizedState=rl(1|t,s,n,l))}function Xh(e,t){wi(8390656,8,e,t)}function ds(e,t){Ni(2048,8,e,t)}function kz(e){ee.flags|=4;var t=ee.updateQueue;if(t===null)t=Ai(),ee.updateQueue=t,t.events=[e];else{var n=t.events;n===null?t.events=[e]:n.push(e)}}function Vh(e){var t=Ke().memoizedState;return kz({ref:t,nextImpl:e}),function(){if((pe&2)!==0)throw Error(c(440));return t.impl.apply(void 0,arguments)}}function $h(e,t){return Ni(4,2,e,t)}function Jh(e,t){return Ni(4,4,e,t)}function Kh(e,t){if(typeof t==\"function\"){e=e();var n=t(e);return function(){typeof n==\"function\"?n():t(null)}}if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function Ih(e,t,n){n=n!=null?n.concat([e]):null,Ni(4,4,Kh.bind(null,t,e),n)}function hs(){}function Wh(e,t){var n=Ke();t=t===void 0?null:t;var l=n.memoizedState;return t!==null&&ns(t,l[1])?l[0]:(n.memoizedState=[e,t],e)}function Fh(e,t){var n=Ke();t=t===void 0?null:t;var l=n.memoizedState;if(t!==null&&ns(t,l[1]))return l[0];if(l=e(),Ra){qn(!0);try{e()}finally{qn(!1)}}return n.memoizedState=[l,t],l}function ms(e,t,n){return n===void 0||(_n&1073741824)!==0&&(oe&261930)===0?e.memoizedState=t:(e.memoizedState=n,e=Pm(),ee.lanes|=e,Kn|=e,n)}function Ph(e,t,n,l){return Zt(n,t)?n:ol.current!==null?(e=ms(e,n,l),Zt(e,t)||(Pe=!0),e):(_n&42)===0||(_n&1073741824)!==0&&(oe&261930)===0?(Pe=!0,e.memoizedState=n):(e=Pm(),ee.lanes|=e,Kn|=e,t)}function em(e,t,n,l,i){var s=j.p;j.p=s!==0&&8>s?s:8;var f=U.T,h={};U.T=h,vs(e,!1,t,n);try{var y=i(),A=U.S;if(A!==null&&A(h,y),y!==null&&typeof y==\"object\"&&typeof y.then==\"function\"){var C=Dz(y,l);cu(e,t,C,Bt(e))}else cu(e,t,l,Bt(e))}catch(q){cu(e,t,{then:function(){},status:\"rejected\",reason:q},Bt())}finally{j.p=s,f!==null&&h.types!==null&&(f.types=h.types),U.T=f}}function Hz(){}function ps(e,t,n,l){if(e.tag!==5)throw Error(c(476));var i=tm(e).queue;em(e,i,t,I,n===null?Hz:function(){return nm(e),n(l)})}function tm(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:I,baseState:I,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:bn,lastRenderedState:I},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:bn,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function nm(e){var t=tm(e);t.next===null&&(t=e.alternate.memoizedState),cu(e,t.next.queue,{},Bt())}function gs(){return st(Ou)}function am(){return Ke().memoizedState}function lm(){return Ke().memoizedState}function jz(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=Bt();e=Gn(n);var l=Qn(t,e,n);l!==null&&(Rt(l,t,n),au(l,t,n)),t={cache:Xc()},e.payload=t;return}t=t.return}}function Bz(e,t,n){var l=Bt();n={lane:l,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Ci(e)?im(t,n):(n=Zc(e,t,n,l),n!==null&&(Rt(n,e,l),om(n,t,l)))}function um(e,t,n){var l=Bt();cu(e,t,n,l)}function cu(e,t,n,l){var i={lane:l,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ci(e))im(t,i);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var f=t.lastRenderedState,h=s(f,n);if(i.hasEagerState=!0,i.eagerState=h,Zt(h,f))return fi(e,t,i,0),De===null&&ri(),!1}catch{}finally{}if(n=Zc(e,t,i,l),n!==null)return Rt(n,e,l),om(n,t,l),!0}return!1}function vs(e,t,n,l){if(l={lane:2,revertLane:Ks(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},Ci(e)){if(t)throw Error(c(479))}else t=Zc(e,n,l,2),t!==null&&Rt(t,e,2)}function Ci(e){var t=e.alternate;return e===ee||t!==null&&t===ee}function im(e,t){cl=Ei=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function om(e,t,n){if((n&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,dd(e,n)}}var su={readContext:st,use:Ri,useCallback:Xe,useContext:Xe,useEffect:Xe,useImperativeHandle:Xe,useLayoutEffect:Xe,useInsertionEffect:Xe,useMemo:Xe,useReducer:Xe,useRef:Xe,useState:Xe,useDebugValue:Xe,useDeferredValue:Xe,useTransition:Xe,useSyncExternalStore:Xe,useId:Xe,useHostTransitionStatus:Xe,useFormState:Xe,useActionState:Xe,useOptimistic:Xe,useMemoCache:Xe,useCacheRefresh:Xe};su.useEffectEvent=Xe;var cm={readContext:st,use:Ri,useCallback:function(e,t){return vt().memoizedState=[e,t===void 0?null:t],e},useContext:st,useEffect:Xh,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,wi(4194308,4,Kh.bind(null,t,e),n)},useLayoutEffect:function(e,t){return wi(4194308,4,e,t)},useInsertionEffect:function(e,t){wi(4,2,e,t)},useMemo:function(e,t){var n=vt();t=t===void 0?null:t;var l=e();if(Ra){qn(!0);try{e()}finally{qn(!1)}}return n.memoizedState=[l,t],l},useReducer:function(e,t,n){var l=vt();if(n!==void 0){var i=n(t);if(Ra){qn(!0);try{n(t)}finally{qn(!1)}}}else i=t;return l.memoizedState=l.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},l.queue=e,e=e.dispatch=Bz.bind(null,ee,e),[l.memoizedState,e]},useRef:function(e){var t=vt();return e={current:e},t.memoizedState=e},useState:function(e){e=rs(e);var t=e.queue,n=um.bind(null,ee,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:hs,useDeferredValue:function(e,t){var n=vt();return ms(n,e,t)},useTransition:function(){var e=rs(!1);return e=em.bind(null,ee,e.queue,!0,!1),vt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var l=ee,i=vt();if(se){if(n===void 0)throw Error(c(407));n=n()}else{if(n=t(),De===null)throw Error(c(349));(oe&127)!==0||wh(l,t,n)}i.memoizedState=n;var s={value:n,getSnapshot:t};return i.queue=s,Xh(Ch.bind(null,l,s,e),[e]),l.flags|=2048,rl(9,{destroy:void 0},Nh.bind(null,l,s,n,t),null),n},useId:function(){var e=vt(),t=De.identifierPrefix;if(se){var n=on,l=un;n=(l&~(1<<32-Ut(l)-1)).toString(32)+n,t=\"_\"+t+\"R_\"+n,n=Oi++,0<n&&(t+=\"H\"+n.toString(32)),t+=\"_\"}else n=Uz++,t=\"_\"+t+\"r_\"+n.toString(32)+\"_\";return e.memoizedState=t},useHostTransitionStatus:gs,useFormState:Bh,useActionState:Bh,useOptimistic:function(e){var t=vt();t.memoizedState=t.baseState=e;var n={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return t.queue=n,t=vs.bind(null,ee,!0,n),n.dispatch=t,[e,t]},useMemoCache:os,useCacheRefresh:function(){return vt().memoizedState=jz.bind(null,ee)},useEffectEvent:function(e){var t=vt(),n={impl:e};return t.memoizedState=n,function(){if((pe&2)!==0)throw Error(c(440));return n.impl.apply(void 0,arguments)}}},ys={readContext:st,use:Ri,useCallback:Wh,useContext:st,useEffect:ds,useImperativeHandle:Ih,useInsertionEffect:$h,useLayoutEffect:Jh,useMemo:Fh,useReducer:Mi,useRef:Qh,useState:function(){return Mi(bn)},useDebugValue:hs,useDeferredValue:function(e,t){var n=Ke();return Ph(n,Oe.memoizedState,e,t)},useTransition:function(){var e=Mi(bn)[0],t=Ke().memoizedState;return[typeof e==\"boolean\"?e:ou(e),t]},useSyncExternalStore:Mh,useId:am,useHostTransitionStatus:gs,useFormState:Yh,useActionState:Yh,useOptimistic:function(e,t){var n=Ke();return Zh(n,Oe,e,t)},useMemoCache:os,useCacheRefresh:lm};ys.useEffectEvent=Vh;var sm={readContext:st,use:Ri,useCallback:Wh,useContext:st,useEffect:ds,useImperativeHandle:Ih,useInsertionEffect:$h,useLayoutEffect:Jh,useMemo:Fh,useReducer:ss,useRef:Qh,useState:function(){return ss(bn)},useDebugValue:hs,useDeferredValue:function(e,t){var n=Ke();return Oe===null?ms(n,e,t):Ph(n,Oe.memoizedState,e,t)},useTransition:function(){var e=ss(bn)[0],t=Ke().memoizedState;return[typeof e==\"boolean\"?e:ou(e),t]},useSyncExternalStore:Mh,useId:am,useHostTransitionStatus:gs,useFormState:Gh,useActionState:Gh,useOptimistic:function(e,t){var n=Ke();return Oe!==null?Zh(n,Oe,e,t):(n.baseState=e,[e,n.queue.dispatch])},useMemoCache:os,useCacheRefresh:lm};sm.useEffectEvent=Vh;function _s(e,t,n,l){t=e.memoizedState,n=n(l,t),n=n==null?t:T({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var bs={enqueueSetState:function(e,t,n){e=e._reactInternals;var l=Bt(),i=Gn(l);i.payload=t,n!=null&&(i.callback=n),t=Qn(e,i,l),t!==null&&(Rt(t,e,l),au(t,e,l))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var l=Bt(),i=Gn(l);i.tag=1,i.payload=t,n!=null&&(i.callback=n),t=Qn(e,i,l),t!==null&&(Rt(t,e,l),au(t,e,l))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Bt(),l=Gn(n);l.tag=2,t!=null&&(l.callback=t),t=Qn(e,l,n),t!==null&&(Rt(t,e,n),au(t,e,n))}};function rm(e,t,n,l,i,s,f){return e=e.stateNode,typeof e.shouldComponentUpdate==\"function\"?e.shouldComponentUpdate(l,s,f):t.prototype&&t.prototype.isPureReactComponent?!Kl(n,l)||!Kl(i,s):!0}function fm(e,t,n,l){e=t.state,typeof t.componentWillReceiveProps==\"function\"&&t.componentWillReceiveProps(n,l),typeof t.UNSAFE_componentWillReceiveProps==\"function\"&&t.UNSAFE_componentWillReceiveProps(n,l),t.state!==e&&bs.enqueueReplaceState(t,t.state,null)}function Ma(e,t){var n=t;if(\"ref\"in t){n={};for(var l in t)l!==\"ref\"&&(n[l]=t[l])}if(e=e.defaultProps){n===t&&(n=T({},n));for(var i in e)n[i]===void 0&&(n[i]=e[i])}return n}function dm(e){si(e)}function hm(e){console.error(e)}function mm(e){si(e)}function Di(e,t){try{var n=e.onUncaughtError;n(t.value,{componentStack:t.stack})}catch(l){setTimeout(function(){throw l})}}function pm(e,t,n){try{var l=e.onCaughtError;l(n.value,{componentStack:n.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(i){setTimeout(function(){throw i})}}function Ss(e,t,n){return n=Gn(n),n.tag=3,n.payload={element:null},n.callback=function(){Di(e,t)},n}function gm(e){return e=Gn(e),e.tag=3,e}function vm(e,t,n,l){var i=n.type.getDerivedStateFromError;if(typeof i==\"function\"){var s=l.value;e.payload=function(){return i(s)},e.callback=function(){pm(t,n,l)}}var f=n.stateNode;f!==null&&typeof f.componentDidCatch==\"function\"&&(e.callback=function(){pm(t,n,l),typeof i!=\"function\"&&(In===null?In=new Set([this]):In.add(this));var h=l.stack;this.componentDidCatch(l.value,{componentStack:h!==null?h:\"\"})})}function Yz(e,t,n,l,i){if(n.flags|=32768,l!==null&&typeof l==\"object\"&&typeof l.then==\"function\"){if(t=n.alternate,t!==null&&nl(t,n,i,!0),n=xt.current,n!==null){switch(n.tag){case 31:case 13:return Wt===null?Qi():n.alternate===null&&Ve===0&&(Ve=3),n.flags&=-257,n.flags|=65536,n.lanes=i,l===_i?n.flags|=16384:(t=n.updateQueue,t===null?n.updateQueue=new Set([l]):t.add(l),Vs(e,l,i)),!1;case 22:return n.flags|=65536,l===_i?n.flags|=16384:(t=n.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([l])},n.updateQueue=t):(n=t.retryQueue,n===null?t.retryQueue=new Set([l]):n.add(l)),Vs(e,l,i)),!1}throw Error(c(435,n.tag))}return Vs(e,l,i),Qi(),!1}if(se)return t=xt.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=i,l!==Bc&&(e=Error(c(422),{cause:l}),Fl($t(e,n)))):(l!==Bc&&(t=Error(c(423),{cause:l}),Fl($t(t,n))),e=e.current.alternate,e.flags|=65536,i&=-i,e.lanes|=i,l=$t(l,n),i=Ss(e.stateNode,l,i),Wc(e,i),Ve!==4&&(Ve=2)),!1;var s=Error(c(520),{cause:l});if(s=$t(s,n),vu===null?vu=[s]:vu.push(s),Ve!==4&&(Ve=2),t===null)return!0;l=$t(l,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=i&-i,n.lanes|=e,e=Ss(n.stateNode,l,e),Wc(n,e),!1;case 1:if(t=n.type,s=n.stateNode,(n.flags&128)===0&&(typeof t.getDerivedStateFromError==\"function\"||s!==null&&typeof s.componentDidCatch==\"function\"&&(In===null||!In.has(s))))return n.flags|=65536,i&=-i,n.lanes|=i,i=gm(i),vm(i,e,n,l),Wc(n,i),!1}n=n.return}while(n!==null);return!1}var zs=Error(c(461)),Pe=!1;function rt(e,t,n,l){t.child=e===null?Sh(t,null,n,l):Aa(t,e.child,n,l)}function ym(e,t,n,l,i){n=n.render;var s=t.ref;if(\"ref\"in l){var f={};for(var h in l)h!==\"ref\"&&(f[h]=l[h])}else f=l;return za(t),l=as(e,t,n,f,s,i),h=ls(),e!==null&&!Pe?(us(e,t,i),Sn(e,t,i)):(se&&h&&Hc(t),t.flags|=1,rt(e,t,l,i),t.child)}function _m(e,t,n,l,i){if(e===null){var s=n.type;return typeof s==\"function\"&&!qc(s)&&s.defaultProps===void 0&&n.compare===null?(t.tag=15,t.type=s,bm(e,t,s,l,i)):(e=hi(n.type,null,l,t,t.mode,i),e.ref=t.ref,e.return=t,t.child=e)}if(s=e.child,!Ns(e,i)){var f=s.memoizedProps;if(n=n.compare,n=n!==null?n:Kl,n(f,l)&&e.ref===t.ref)return Sn(e,t,i)}return t.flags|=1,e=pn(s,l),e.ref=t.ref,e.return=t,t.child=e}function bm(e,t,n,l,i){if(e!==null){var s=e.memoizedProps;if(Kl(s,l)&&e.ref===t.ref)if(Pe=!1,t.pendingProps=l=s,Ns(e,i))(e.flags&131072)!==0&&(Pe=!0);else return t.lanes=e.lanes,Sn(e,t,i)}return Ts(e,t,n,l,i)}function Sm(e,t,n,l){var i=l.children,s=e!==null?e.memoizedState:null;if(e===null&&t.stateNode===null&&(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),l.mode===\"hidden\"){if((t.flags&128)!==0){if(s=s!==null?s.baseLanes|n:n,e!==null){for(l=t.child=e.child,i=0;l!==null;)i=i|l.lanes|l.childLanes,l=l.sibling;l=i&~s}else l=0,t.child=null;return zm(e,t,s,n,l)}if((n&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},e!==null&&vi(t,s!==null?s.cachePool:null),s!==null?Eh(t,s):Pc(),Oh(t);else return l=t.lanes=536870912,zm(e,t,s!==null?s.baseLanes|n:n,n,l)}else s!==null?(vi(t,s.cachePool),Eh(t,s),Vn(),t.memoizedState=null):(e!==null&&vi(t,null),Pc(),Vn());return rt(e,t,i,n),t.child}function ru(e,t){return e!==null&&e.tag===22||t.stateNode!==null||(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),t.sibling}function zm(e,t,n,l,i){var s=$c();return s=s===null?null:{parent:We._currentValue,pool:s},t.memoizedState={baseLanes:n,cachePool:s},e!==null&&vi(t,null),Pc(),Oh(t),e!==null&&nl(e,t,l,!0),t.childLanes=i,null}function Ui(e,t){return t=qi({mode:t.mode,children:t.children},e.mode),t.ref=e.ref,e.child=t,t.return=e,t}function Tm(e,t,n){return Aa(t,e.child,null,n),e=Ui(t,t.pendingProps),e.flags|=2,kt(t),t.memoizedState=null,e}function Lz(e,t,n){var l=t.pendingProps,i=(t.flags&128)!==0;if(t.flags&=-129,e===null){if(se){if(l.mode===\"hidden\")return e=Ui(t,l),t.lanes=536870912,ru(null,e);if(ts(t),(e=He)?(e=qp(e,It),e=e!==null&&e.data===\"&\"?e:null,e!==null&&(t.memoizedState={dehydrated:e,treeContext:Hn!==null?{id:un,overflow:on}:null,retryLane:536870912,hydrationErrors:null},n=ih(e),n.return=t,t.child=n,ct=t,He=null)):e=null,e===null)throw Bn(t);return t.lanes=536870912,null}return Ui(t,l)}var s=e.memoizedState;if(s!==null){var f=s.dehydrated;if(ts(t),i)if(t.flags&256)t.flags&=-257,t=Tm(e,t,n);else if(t.memoizedState!==null)t.child=e.child,t.flags|=128,t=null;else throw Error(c(558));else if(Pe||nl(e,t,n,!1),i=(n&e.childLanes)!==0,Pe||i){if(l=De,l!==null&&(f=hd(l,n),f!==0&&f!==s.retryLane))throw s.retryLane=f,ya(e,f),Rt(l,e,f),zs;Qi(),t=Tm(e,t,n)}else e=s.treeContext,He=Ft(f.nextSibling),ct=t,se=!0,jn=null,It=!1,e!==null&&sh(t,e),t=Ui(t,l),t.flags|=4096;return t}return e=pn(e.child,{mode:l.mode,children:l.children}),e.ref=t.ref,t.child=e,e.return=t,e}function Zi(e,t){var n=t.ref;if(n===null)e!==null&&e.ref!==null&&(t.flags|=4194816);else{if(typeof n!=\"function\"&&typeof n!=\"object\")throw Error(c(284));(e===null||e.ref!==n)&&(t.flags|=4194816)}}function Ts(e,t,n,l,i){return za(t),n=as(e,t,n,l,void 0,i),l=ls(),e!==null&&!Pe?(us(e,t,i),Sn(e,t,i)):(se&&l&&Hc(t),t.flags|=1,rt(e,t,n,i),t.child)}function Em(e,t,n,l,i,s){return za(t),t.updateQueue=null,n=Rh(t,l,n,i),Ah(e),l=ls(),e!==null&&!Pe?(us(e,t,s),Sn(e,t,s)):(se&&l&&Hc(t),t.flags|=1,rt(e,t,n,s),t.child)}function Om(e,t,n,l,i){if(za(t),t.stateNode===null){var s=Fa,f=n.contextType;typeof f==\"object\"&&f!==null&&(s=st(f)),s=new n(l,s),t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,s.updater=bs,t.stateNode=s,s._reactInternals=t,s=t.stateNode,s.props=l,s.state=t.memoizedState,s.refs={},Kc(t),f=n.contextType,s.context=typeof f==\"object\"&&f!==null?st(f):Fa,s.state=t.memoizedState,f=n.getDerivedStateFromProps,typeof f==\"function\"&&(_s(t,n,f,l),s.state=t.memoizedState),typeof n.getDerivedStateFromProps==\"function\"||typeof s.getSnapshotBeforeUpdate==\"function\"||typeof s.UNSAFE_componentWillMount!=\"function\"&&typeof s.componentWillMount!=\"function\"||(f=s.state,typeof s.componentWillMount==\"function\"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount==\"function\"&&s.UNSAFE_componentWillMount(),f!==s.state&&bs.enqueueReplaceState(s,s.state,null),uu(t,l,s,i),lu(),s.state=t.memoizedState),typeof s.componentDidMount==\"function\"&&(t.flags|=4194308),l=!0}else if(e===null){s=t.stateNode;var h=t.memoizedProps,y=Ma(n,h);s.props=y;var A=s.context,C=n.contextType;f=Fa,typeof C==\"object\"&&C!==null&&(f=st(C));var q=n.getDerivedStateFromProps;C=typeof q==\"function\"||typeof s.getSnapshotBeforeUpdate==\"function\",h=t.pendingProps!==h,C||typeof s.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof s.componentWillReceiveProps!=\"function\"||(h||A!==f)&&fm(t,s,l,f),Ln=!1;var M=t.memoizedState;s.state=M,uu(t,l,s,i),lu(),A=t.memoizedState,h||M!==A||Ln?(typeof q==\"function\"&&(_s(t,n,q,l),A=t.memoizedState),(y=Ln||rm(t,n,y,l,M,A,f))?(C||typeof s.UNSAFE_componentWillMount!=\"function\"&&typeof s.componentWillMount!=\"function\"||(typeof s.componentWillMount==\"function\"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount==\"function\"&&s.UNSAFE_componentWillMount()),typeof s.componentDidMount==\"function\"&&(t.flags|=4194308)):(typeof s.componentDidMount==\"function\"&&(t.flags|=4194308),t.memoizedProps=l,t.memoizedState=A),s.props=l,s.state=A,s.context=f,l=y):(typeof s.componentDidMount==\"function\"&&(t.flags|=4194308),l=!1)}else{s=t.stateNode,Ic(e,t),f=t.memoizedProps,C=Ma(n,f),s.props=C,q=t.pendingProps,M=s.context,A=n.contextType,y=Fa,typeof A==\"object\"&&A!==null&&(y=st(A)),h=n.getDerivedStateFromProps,(A=typeof h==\"function\"||typeof s.getSnapshotBeforeUpdate==\"function\")||typeof s.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof s.componentWillReceiveProps!=\"function\"||(f!==q||M!==y)&&fm(t,s,l,y),Ln=!1,M=t.memoizedState,s.state=M,uu(t,l,s,i),lu();var N=t.memoizedState;f!==q||M!==N||Ln||e!==null&&e.dependencies!==null&&pi(e.dependencies)?(typeof h==\"function\"&&(_s(t,n,h,l),N=t.memoizedState),(C=Ln||rm(t,n,C,l,M,N,y)||e!==null&&e.dependencies!==null&&pi(e.dependencies))?(A||typeof s.UNSAFE_componentWillUpdate!=\"function\"&&typeof s.componentWillUpdate!=\"function\"||(typeof s.componentWillUpdate==\"function\"&&s.componentWillUpdate(l,N,y),typeof s.UNSAFE_componentWillUpdate==\"function\"&&s.UNSAFE_componentWillUpdate(l,N,y)),typeof s.componentDidUpdate==\"function\"&&(t.flags|=4),typeof s.getSnapshotBeforeUpdate==\"function\"&&(t.flags|=1024)):(typeof s.componentDidUpdate!=\"function\"||f===e.memoizedProps&&M===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!=\"function\"||f===e.memoizedProps&&M===e.memoizedState||(t.flags|=1024),t.memoizedProps=l,t.memoizedState=N),s.props=l,s.state=N,s.context=y,l=C):(typeof s.componentDidUpdate!=\"function\"||f===e.memoizedProps&&M===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!=\"function\"||f===e.memoizedProps&&M===e.memoizedState||(t.flags|=1024),l=!1)}return s=l,Zi(e,t),l=(t.flags&128)!==0,s||l?(s=t.stateNode,n=l&&typeof n.getDerivedStateFromError!=\"function\"?null:s.render(),t.flags|=1,e!==null&&l?(t.child=Aa(t,e.child,null,i),t.child=Aa(t,null,n,i)):rt(e,t,n,i),t.memoizedState=s.state,e=t.child):e=Sn(e,t,i),e}function Am(e,t,n,l){return ba(),t.flags|=256,rt(e,t,n,l),t.child}var Es={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Os(e){return{baseLanes:e,cachePool:ph()}}function As(e,t,n){return e=e!==null?e.childLanes&~n:0,t&&(e|=jt),e}function Rm(e,t,n){var l=t.pendingProps,i=!1,s=(t.flags&128)!==0,f;if((f=s)||(f=e!==null&&e.memoizedState===null?!1:(Je.current&2)!==0),f&&(i=!0,t.flags&=-129),f=(t.flags&32)!==0,t.flags&=-33,e===null){if(se){if(i?Xn(t):Vn(),(e=He)?(e=qp(e,It),e=e!==null&&e.data!==\"&\"?e:null,e!==null&&(t.memoizedState={dehydrated:e,treeContext:Hn!==null?{id:un,overflow:on}:null,retryLane:536870912,hydrationErrors:null},n=ih(e),n.return=t,t.child=n,ct=t,He=null)):e=null,e===null)throw Bn(t);return cr(e)?t.lanes=32:t.lanes=536870912,null}var h=l.children;return l=l.fallback,i?(Vn(),i=t.mode,h=qi({mode:\"hidden\",children:h},i),l=_a(l,i,n,null),h.return=t,l.return=t,h.sibling=l,t.child=h,l=t.child,l.memoizedState=Os(n),l.childLanes=As(e,f,n),t.memoizedState=Es,ru(null,l)):(Xn(t),Rs(t,h))}var y=e.memoizedState;if(y!==null&&(h=y.dehydrated,h!==null)){if(s)t.flags&256?(Xn(t),t.flags&=-257,t=Ms(e,t,n)):t.memoizedState!==null?(Vn(),t.child=e.child,t.flags|=128,t=null):(Vn(),h=l.fallback,i=t.mode,l=qi({mode:\"visible\",children:l.children},i),h=_a(h,i,n,null),h.flags|=2,l.return=t,h.return=t,l.sibling=h,t.child=l,Aa(t,e.child,null,n),l=t.child,l.memoizedState=Os(n),l.childLanes=As(e,f,n),t.memoizedState=Es,t=ru(null,l));else if(Xn(t),cr(h)){if(f=h.nextSibling&&h.nextSibling.dataset,f)var A=f.dgst;f=A,l=Error(c(419)),l.stack=\"\",l.digest=f,Fl({value:l,source:null,stack:null}),t=Ms(e,t,n)}else if(Pe||nl(e,t,n,!1),f=(n&e.childLanes)!==0,Pe||f){if(f=De,f!==null&&(l=hd(f,n),l!==0&&l!==y.retryLane))throw y.retryLane=l,ya(e,l),Rt(f,e,l),zs;or(h)||Qi(),t=Ms(e,t,n)}else or(h)?(t.flags|=192,t.child=e.child,t=null):(e=y.treeContext,He=Ft(h.nextSibling),ct=t,se=!0,jn=null,It=!1,e!==null&&sh(t,e),t=Rs(t,l.children),t.flags|=4096);return t}return i?(Vn(),h=l.fallback,i=t.mode,y=e.child,A=y.sibling,l=pn(y,{mode:\"hidden\",children:l.children}),l.subtreeFlags=y.subtreeFlags&65011712,A!==null?h=pn(A,h):(h=_a(h,i,n,null),h.flags|=2),h.return=t,l.return=t,l.sibling=h,t.child=l,ru(null,l),l=t.child,h=e.child.memoizedState,h===null?h=Os(n):(i=h.cachePool,i!==null?(y=We._currentValue,i=i.parent!==y?{parent:y,pool:y}:i):i=ph(),h={baseLanes:h.baseLanes|n,cachePool:i}),l.memoizedState=h,l.childLanes=As(e,f,n),t.memoizedState=Es,ru(e.child,l)):(Xn(t),n=e.child,e=n.sibling,n=pn(n,{mode:\"visible\",children:l.children}),n.return=t,n.sibling=null,e!==null&&(f=t.deletions,f===null?(t.deletions=[e],t.flags|=16):f.push(e)),t.child=n,t.memoizedState=null,n)}function Rs(e,t){return t=qi({mode:\"visible\",children:t},e.mode),t.return=e,e.child=t}function qi(e,t){return e=qt(22,e,null,t),e.lanes=0,e}function Ms(e,t,n){return Aa(t,e.child,null,n),e=Rs(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Mm(e,t,n){e.lanes|=t;var l=e.alternate;l!==null&&(l.lanes|=t),Gc(e.return,t,n)}function ws(e,t,n,l,i,s){var f=e.memoizedState;f===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:l,tail:n,tailMode:i,treeForkCount:s}:(f.isBackwards=t,f.rendering=null,f.renderingStartTime=0,f.last=l,f.tail=n,f.tailMode=i,f.treeForkCount=s)}function wm(e,t,n){var l=t.pendingProps,i=l.revealOrder,s=l.tail;l=l.children;var f=Je.current,h=(f&2)!==0;if(h?(f=f&1|2,t.flags|=128):f&=1,B(Je,f),rt(e,t,l,n),l=se?Wl:0,!h&&e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Mm(e,n,t);else if(e.tag===19)Mm(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}switch(i){case\"forwards\":for(n=t.child,i=null;n!==null;)e=n.alternate,e!==null&&Ti(e)===null&&(i=n),n=n.sibling;n=i,n===null?(i=t.child,t.child=null):(i=n.sibling,n.sibling=null),ws(t,!1,i,n,s,l);break;case\"backwards\":case\"unstable_legacy-backwards\":for(n=null,i=t.child,t.child=null;i!==null;){if(e=i.alternate,e!==null&&Ti(e)===null){t.child=i;break}e=i.sibling,i.sibling=n,n=i,i=e}ws(t,!0,n,null,s,l);break;case\"together\":ws(t,!1,null,null,void 0,l);break;default:t.memoizedState=null}return t.child}function Sn(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),Kn|=t.lanes,(n&t.childLanes)===0)if(e!==null){if(nl(e,t,n,!1),(n&t.childLanes)===0)return null}else return null;if(e!==null&&t.child!==e.child)throw Error(c(153));if(t.child!==null){for(e=t.child,n=pn(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=pn(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function Ns(e,t){return(e.lanes&t)!==0?!0:(e=e.dependencies,!!(e!==null&&pi(e)))}function Gz(e,t,n){switch(t.tag){case 3:gt(t,t.stateNode.containerInfo),Yn(t,We,e.memoizedState.cache),ba();break;case 27:case 5:xl(t);break;case 4:gt(t,t.stateNode.containerInfo);break;case 10:Yn(t,t.type,t.memoizedProps.value);break;case 31:if(t.memoizedState!==null)return t.flags|=128,ts(t),null;break;case 13:var l=t.memoizedState;if(l!==null)return l.dehydrated!==null?(Xn(t),t.flags|=128,null):(n&t.child.childLanes)!==0?Rm(e,t,n):(Xn(t),e=Sn(e,t,n),e!==null?e.sibling:null);Xn(t);break;case 19:var i=(e.flags&128)!==0;if(l=(n&t.childLanes)!==0,l||(nl(e,t,n,!1),l=(n&t.childLanes)!==0),i){if(l)return wm(e,t,n);t.flags|=128}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),B(Je,Je.current),l)break;return null;case 22:return t.lanes=0,Sm(e,t,n,t.pendingProps);case 24:Yn(t,We,e.memoizedState.cache)}return Sn(e,t,n)}function Nm(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps)Pe=!0;else{if(!Ns(e,n)&&(t.flags&128)===0)return Pe=!1,Gz(e,t,n);Pe=(e.flags&131072)!==0}else Pe=!1,se&&(t.flags&1048576)!==0&&ch(t,Wl,t.index);switch(t.lanes=0,t.tag){case 16:e:{var l=t.pendingProps;if(e=Ea(t.elementType),t.type=e,typeof e==\"function\")qc(e)?(l=Ma(e,l),t.tag=1,t=Om(null,t,e,l,n)):(t.tag=0,t=Ts(null,t,e,l,n));else{if(e!=null){var i=e.$$typeof;if(i===Ze){t.tag=11,t=ym(null,t,e,l,n);break e}else if(i===$){t.tag=14,t=_m(null,t,e,l,n);break e}}throw t=fn(e)||e,Error(c(306,t,\"\"))}}return t;case 0:return Ts(e,t,t.type,t.pendingProps,n);case 1:return l=t.type,i=Ma(l,t.pendingProps),Om(e,t,l,i,n);case 3:e:{if(gt(t,t.stateNode.containerInfo),e===null)throw Error(c(387));l=t.pendingProps;var s=t.memoizedState;i=s.element,Ic(e,t),uu(t,l,null,n);var f=t.memoizedState;if(l=f.cache,Yn(t,We,l),l!==s.cache&&Qc(t,[We],n,!0),lu(),l=f.element,s.isDehydrated)if(s={element:l,isDehydrated:!1,cache:f.cache},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){t=Am(e,t,l,n);break e}else if(l!==i){i=$t(Error(c(424)),t),Fl(i),t=Am(e,t,l,n);break e}else{switch(e=t.stateNode.containerInfo,e.nodeType){case 9:e=e.body;break;default:e=e.nodeName===\"HTML\"?e.ownerDocument.body:e}for(He=Ft(e.firstChild),ct=t,se=!0,jn=null,It=!0,n=Sh(t,null,l,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling}else{if(ba(),l===i){t=Sn(e,t,n);break e}rt(e,t,l,n)}t=t.child}return t;case 26:return Zi(e,t),e===null?(n=Yp(t.type,null,t.pendingProps,null))?t.memoizedState=n:se||(n=t.type,e=t.pendingProps,l=Wi(ae.current).createElement(n),l[ot]=t,l[St]=e,ft(l,n,e),nt(l),t.stateNode=l):t.memoizedState=Yp(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return xl(t),e===null&&se&&(l=t.stateNode=Hp(t.type,t.pendingProps,ae.current),ct=t,It=!0,i=He,ea(t.type)?(sr=i,He=Ft(l.firstChild)):He=i),rt(e,t,t.pendingProps.children,n),Zi(e,t),e===null&&(t.flags|=4194304),t.child;case 5:return e===null&&se&&((i=l=He)&&(l=_T(l,t.type,t.pendingProps,It),l!==null?(t.stateNode=l,ct=t,He=Ft(l.firstChild),It=!1,i=!0):i=!1),i||Bn(t)),xl(t),i=t.type,s=t.pendingProps,f=e!==null?e.memoizedProps:null,l=s.children,lr(i,s)?l=null:f!==null&&lr(i,f)&&(t.flags|=32),t.memoizedState!==null&&(i=as(e,t,Zz,null,null,n),Ou._currentValue=i),Zi(e,t),rt(e,t,l,n),t.child;case 6:return e===null&&se&&((e=n=He)&&(n=bT(n,t.pendingProps,It),n!==null?(t.stateNode=n,ct=t,He=null,e=!0):e=!1),e||Bn(t)),null;case 13:return Rm(e,t,n);case 4:return gt(t,t.stateNode.containerInfo),l=t.pendingProps,e===null?t.child=Aa(t,null,l,n):rt(e,t,l,n),t.child;case 11:return ym(e,t,t.type,t.pendingProps,n);case 7:return rt(e,t,t.pendingProps,n),t.child;case 8:return rt(e,t,t.pendingProps.children,n),t.child;case 12:return rt(e,t,t.pendingProps.children,n),t.child;case 10:return l=t.pendingProps,Yn(t,t.type,l.value),rt(e,t,l.children,n),t.child;case 9:return i=t.type._context,l=t.pendingProps.children,za(t),i=st(i),l=l(i),t.flags|=1,rt(e,t,l,n),t.child;case 14:return _m(e,t,t.type,t.pendingProps,n);case 15:return bm(e,t,t.type,t.pendingProps,n);case 19:return wm(e,t,n);case 31:return Lz(e,t,n);case 22:return Sm(e,t,n,t.pendingProps);case 24:return za(t),l=st(We),e===null?(i=$c(),i===null&&(i=De,s=Xc(),i.pooledCache=s,s.refCount++,s!==null&&(i.pooledCacheLanes|=n),i=s),t.memoizedState={parent:l,cache:i},Kc(t),Yn(t,We,i)):((e.lanes&n)!==0&&(Ic(e,t),uu(t,null,null,n),lu()),i=e.memoizedState,s=t.memoizedState,i.parent!==l?(i={parent:l,cache:l},t.memoizedState=i,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=i),Yn(t,We,l)):(l=s.cache,Yn(t,We,l),l!==i.cache&&Qc(t,[We],n,!0))),rt(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(c(156,t.tag))}function zn(e){e.flags|=4}function Cs(e,t,n,l,i){if((t=(e.mode&32)!==0)&&(t=!1),t){if(e.flags|=16777216,(i&335544128)===i)if(e.stateNode.complete)e.flags|=8192;else if(ap())e.flags|=8192;else throw Oa=_i,Jc}else e.flags&=-16777217}function Cm(e,t){if(t.type!==\"stylesheet\"||(t.state.loading&4)!==0)e.flags&=-16777217;else if(e.flags|=16777216,!Vp(t))if(ap())e.flags|=8192;else throw Oa=_i,Jc}function xi(e,t){t!==null&&(e.flags|=4),e.flags&16384&&(t=e.tag!==22?rd():536870912,e.lanes|=t,ml|=t)}function fu(e,t){if(!se)switch(e.tailMode){case\"hidden\":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case\"collapsed\":n=e.tail;for(var l=null;n!==null;)n.alternate!==null&&(l=n),n=n.sibling;l===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:l.sibling=null}}function je(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,l=0;if(t)for(var i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags&65011712,l|=i.flags&65011712,i.return=e,i=i.sibling;else for(i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags,l|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=l,e.childLanes=n,t}function Qz(e,t,n){var l=t.pendingProps;switch(jc(t),t.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return je(t),null;case 1:return je(t),null;case 3:return n=t.stateNode,l=null,e!==null&&(l=e.memoizedState.cache),t.memoizedState.cache!==l&&(t.flags|=2048),yn(We),$e(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(tl(t)?zn(t):e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Yc())),je(t),null;case 26:var i=t.type,s=t.memoizedState;return e===null?(zn(t),s!==null?(je(t),Cm(t,s)):(je(t),Cs(t,i,null,l,n))):s?s!==e.memoizedState?(zn(t),je(t),Cm(t,s)):(je(t),t.flags&=-16777217):(e=e.memoizedProps,e!==l&&zn(t),je(t),Cs(t,i,e,l,n)),null;case 27:if($u(t),n=ae.current,i=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==l&&zn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return je(t),null}e=Q.current,tl(t)?rh(t):(e=Hp(i,l,n),t.stateNode=e,zn(t))}return je(t),null;case 5:if($u(t),i=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==l&&zn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return je(t),null}if(s=Q.current,tl(t))rh(t);else{var f=Wi(ae.current);switch(s){case 1:s=f.createElementNS(\"http://www.w3.org/2000/svg\",i);break;case 2:s=f.createElementNS(\"http://www.w3.org/1998/Math/MathML\",i);break;default:switch(i){case\"svg\":s=f.createElementNS(\"http://www.w3.org/2000/svg\",i);break;case\"math\":s=f.createElementNS(\"http://www.w3.org/1998/Math/MathML\",i);break;case\"script\":s=f.createElement(\"div\"),s.innerHTML=\"<script><\\/script>\",s=s.removeChild(s.firstChild);break;case\"select\":s=typeof l.is==\"string\"?f.createElement(\"select\",{is:l.is}):f.createElement(\"select\"),l.multiple?s.multiple=!0:l.size&&(s.size=l.size);break;default:s=typeof l.is==\"string\"?f.createElement(i,{is:l.is}):f.createElement(i)}}s[ot]=t,s[St]=l;e:for(f=t.child;f!==null;){if(f.tag===5||f.tag===6)s.appendChild(f.stateNode);else if(f.tag!==4&&f.tag!==27&&f.child!==null){f.child.return=f,f=f.child;continue}if(f===t)break e;for(;f.sibling===null;){if(f.return===null||f.return===t)break e;f=f.return}f.sibling.return=f.return,f=f.sibling}t.stateNode=s;e:switch(ft(s,i,l),i){case\"button\":case\"input\":case\"select\":case\"textarea\":l=!!l.autoFocus;break e;case\"img\":l=!0;break e;default:l=!1}l&&zn(t)}}return je(t),Cs(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&zn(t);else{if(typeof l!=\"string\"&&t.stateNode===null)throw Error(c(166));if(e=ae.current,tl(t)){if(e=t.stateNode,n=t.memoizedProps,l=null,i=ct,i!==null)switch(i.tag){case 27:case 5:l=i.memoizedProps}e[ot]=t,e=!!(e.nodeValue===n||l!==null&&l.suppressHydrationWarning===!0||Rp(e.nodeValue,n)),e||Bn(t,!0)}else e=Wi(e).createTextNode(l),e[ot]=t,t.stateNode=e}return je(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(l=tl(t),n!==null){if(e===null){if(!l)throw Error(c(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(c(557));e[ot]=t}else ba(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;je(t),e=!1}else n=Yc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(kt(t),t):(kt(t),null);if((t.flags&128)!==0)throw Error(c(558))}return je(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=tl(t),l!==null&&l.dehydrated!==null){if(e===null){if(!i)throw Error(c(318));if(i=t.memoizedState,i=i!==null?i.dehydrated:null,!i)throw Error(c(317));i[ot]=t}else ba(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;je(t),i=!1}else i=Yc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(kt(t),t):(kt(t),null)}return kt(t),(t.flags&128)!==0?(t.lanes=n,t):(n=l!==null,e=e!==null&&e.memoizedState!==null,n&&(l=t.child,i=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(i=l.alternate.memoizedState.cachePool.pool),s=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(s=l.memoizedState.cachePool.pool),s!==i&&(l.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),xi(t,t.updateQueue),je(t),null);case 4:return $e(),e===null&&Ps(t.stateNode.containerInfo),je(t),null;case 10:return yn(t.type),je(t),null;case 19:if(x(Je),l=t.memoizedState,l===null)return je(t),null;if(i=(t.flags&128)!==0,s=l.rendering,s===null)if(i)fu(l,!1);else{if(Ve!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(s=Ti(e),s!==null){for(t.flags|=128,fu(l,!1),e=s.updateQueue,t.updateQueue=e,xi(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)uh(n,e),n=n.sibling;return B(Je,Je.current&1|2),se&&gn(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&Ct()>Yi&&(t.flags|=128,i=!0,fu(l,!1),t.lanes=4194304)}else{if(!i)if(e=Ti(s),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,xi(t,e),fu(l,!0),l.tail===null&&l.tailMode===\"hidden\"&&!s.alternate&&!se)return je(t),null}else 2*Ct()-l.renderingStartTime>Yi&&n!==536870912&&(t.flags|=128,i=!0,fu(l,!1),t.lanes=4194304);l.isBackwards?(s.sibling=t.child,t.child=s):(e=l.last,e!==null?e.sibling=s:t.child=s,l.last=s)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=Ct(),e.sibling=null,n=Je.current,B(Je,i?n&1|2:n&1),se&&gn(t,l.treeForkCount),e):(je(t),null);case 22:case 23:return kt(t),es(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(n&536870912)!==0&&(t.flags&128)===0&&(je(t),t.subtreeFlags&6&&(t.flags|=8192)):je(t),n=t.updateQueue,n!==null&&xi(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==n&&(t.flags|=2048),e!==null&&x(Ta),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),yn(We),je(t),null;case 25:return null;case 30:return null}throw Error(c(156,t.tag))}function Xz(e,t){switch(jc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return yn(We),$e(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return $u(t),null;case 31:if(t.memoizedState!==null){if(kt(t),t.alternate===null)throw Error(c(340));ba()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(kt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(c(340));ba()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return x(Je),null;case 4:return $e(),null;case 10:return yn(t.type),null;case 22:case 23:return kt(t),es(),e!==null&&x(Ta),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return yn(We),null;case 25:return null;default:return null}}function Dm(e,t){switch(jc(t),t.tag){case 3:yn(We),$e();break;case 26:case 27:case 5:$u(t);break;case 4:$e();break;case 31:t.memoizedState!==null&&kt(t);break;case 13:kt(t);break;case 19:x(Je);break;case 10:yn(t.type);break;case 22:case 23:kt(t),es(),e!==null&&x(Ta);break;case 24:yn(We)}}function du(e,t){try{var n=t.updateQueue,l=n!==null?n.lastEffect:null;if(l!==null){var i=l.next;n=i;do{if((n.tag&e)===e){l=void 0;var s=n.create,f=n.inst;l=s(),f.destroy=l}n=n.next}while(n!==i)}}catch(h){be(t,t.return,h)}}function $n(e,t,n){try{var l=t.updateQueue,i=l!==null?l.lastEffect:null;if(i!==null){var s=i.next;l=s;do{if((l.tag&e)===e){var f=l.inst,h=f.destroy;if(h!==void 0){f.destroy=void 0,i=t;var y=n,A=h;try{A()}catch(C){be(i,y,C)}}}l=l.next}while(l!==s)}}catch(C){be(t,t.return,C)}}function Um(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Th(t,n)}catch(l){be(e,e.return,l)}}}function Zm(e,t,n){n.props=Ma(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(l){be(e,t,l)}}function hu(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof n==\"function\"?e.refCleanup=n(l):n.current=l}}catch(i){be(e,t,i)}}function cn(e,t){var n=e.ref,l=e.refCleanup;if(n!==null)if(typeof l==\"function\")try{l()}catch(i){be(e,t,i)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==\"function\")try{n(null)}catch(i){be(e,t,i)}else n.current=null}function qm(e){var t=e.type,n=e.memoizedProps,l=e.stateNode;try{e:switch(t){case\"button\":case\"input\":case\"select\":case\"textarea\":n.autoFocus&&l.focus();break e;case\"img\":n.src?l.src=n.src:n.srcSet&&(l.srcset=n.srcSet)}}catch(i){be(e,e.return,i)}}function Ds(e,t,n){try{var l=e.stateNode;hT(l,e.type,n,t),l[St]=t}catch(i){be(e,e.return,i)}}function xm(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&ea(e.type)||e.tag===4}function Us(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||xm(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&ea(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Zs(e,t,n){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===\"HTML\"?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===\"HTML\"?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=hn));else if(l!==4&&(l===27&&ea(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Zs(e,t,n),e=e.sibling;e!==null;)Zs(e,t,n),e=e.sibling}function ki(e,t,n){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(l!==4&&(l===27&&ea(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(ki(e,t,n),e=e.sibling;e!==null;)ki(e,t,n),e=e.sibling}function km(e){var t=e.stateNode,n=e.memoizedProps;try{for(var l=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);ft(t,l,n),t[ot]=e,t[St]=n}catch(s){be(e,e.return,s)}}var Tn=!1,et=!1,qs=!1,Hm=typeof WeakSet==\"function\"?WeakSet:Set,at=null;function Vz(e,t){if(e=e.containerInfo,nr=lo,e=Id(e),Mc(e)){if(\"selectionStart\"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var l=n.getSelection&&n.getSelection();if(l&&l.rangeCount!==0){n=l.anchorNode;var i=l.anchorOffset,s=l.focusNode;l=l.focusOffset;try{n.nodeType,s.nodeType}catch{n=null;break e}var f=0,h=-1,y=-1,A=0,C=0,q=e,M=null;t:for(;;){for(var N;q!==n||i!==0&&q.nodeType!==3||(h=f+i),q!==s||l!==0&&q.nodeType!==3||(y=f+l),q.nodeType===3&&(f+=q.nodeValue.length),(N=q.firstChild)!==null;)M=q,q=N;for(;;){if(q===e)break t;if(M===n&&++A===i&&(h=f),M===s&&++C===l&&(y=f),(N=q.nextSibling)!==null)break;q=M,M=q.parentNode}q=N}n=h===-1||y===-1?null:{start:h,end:y}}else n=null}n=n||{start:0,end:0}}else n=null;for(ar={focusedElem:e,selectionRange:n},lo=!1,at=t;at!==null;)if(t=at,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,at=e;else for(;at!==null;){switch(t=at,s=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(n=0;n<e.length;n++)i=e[n],i.ref.impl=i.nextImpl;break;case 11:case 15:break;case 1:if((e&1024)!==0&&s!==null){e=void 0,n=t,i=s.memoizedProps,s=s.memoizedState,l=n.stateNode;try{var Y=Ma(n.type,i);e=l.getSnapshotBeforeUpdate(Y,s),l.__reactInternalSnapshotBeforeUpdate=e}catch(K){be(n,n.return,K)}}break;case 3:if((e&1024)!==0){if(e=t.stateNode.containerInfo,n=e.nodeType,n===9)ir(e);else if(n===1)switch(e.nodeName){case\"HEAD\":case\"HTML\":case\"BODY\":ir(e);break;default:e.textContent=\"\"}}break;case 5:case 26:case 27:case 6:case 4:case 17:break;default:if((e&1024)!==0)throw Error(c(163))}if(e=t.sibling,e!==null){e.return=t.return,at=e;break}at=t.return}}function jm(e,t,n){var l=n.flags;switch(n.tag){case 0:case 11:case 15:On(e,n),l&4&&du(5,n);break;case 1:if(On(e,n),l&4)if(e=n.stateNode,t===null)try{e.componentDidMount()}catch(f){be(n,n.return,f)}else{var i=Ma(n.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(i,t,e.__reactInternalSnapshotBeforeUpdate)}catch(f){be(n,n.return,f)}}l&64&&Um(n),l&512&&hu(n,n.return);break;case 3:if(On(e,n),l&64&&(e=n.updateQueue,e!==null)){if(t=null,n.child!==null)switch(n.child.tag){case 27:case 5:t=n.child.stateNode;break;case 1:t=n.child.stateNode}try{Th(e,t)}catch(f){be(n,n.return,f)}}break;case 27:t===null&&l&4&&km(n);case 26:case 5:On(e,n),t===null&&l&4&&qm(n),l&512&&hu(n,n.return);break;case 12:On(e,n);break;case 31:On(e,n),l&4&&Lm(e,n);break;case 13:On(e,n),l&4&&Gm(e,n),l&64&&(e=n.memoizedState,e!==null&&(e=e.dehydrated,e!==null&&(n=tT.bind(null,n),ST(e,n))));break;case 22:if(l=n.memoizedState!==null||Tn,!l){t=t!==null&&t.memoizedState!==null||et,i=Tn;var s=et;Tn=l,(et=t)&&!s?An(e,n,(n.subtreeFlags&8772)!==0):On(e,n),Tn=i,et=s}break;case 30:break;default:On(e,n)}}function Bm(e){var t=e.alternate;t!==null&&(e.alternate=null,Bm(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&fc(t)),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}var Ye=null,Tt=!1;function En(e,t,n){for(n=n.child;n!==null;)Ym(e,t,n),n=n.sibling}function Ym(e,t,n){if(Dt&&typeof Dt.onCommitFiberUnmount==\"function\")try{Dt.onCommitFiberUnmount(kl,n)}catch{}switch(n.tag){case 26:et||cn(n,t),En(e,t,n),n.memoizedState?n.memoizedState.count--:n.stateNode&&(n=n.stateNode,n.parentNode.removeChild(n));break;case 27:et||cn(n,t);var l=Ye,i=Tt;ea(n.type)&&(Ye=n.stateNode,Tt=!1),En(e,t,n),zu(n.stateNode),Ye=l,Tt=i;break;case 5:et||cn(n,t);case 6:if(l=Ye,i=Tt,Ye=null,En(e,t,n),Ye=l,Tt=i,Ye!==null)if(Tt)try{(Ye.nodeType===9?Ye.body:Ye.nodeName===\"HTML\"?Ye.ownerDocument.body:Ye).removeChild(n.stateNode)}catch(s){be(n,t,s)}else try{Ye.removeChild(n.stateNode)}catch(s){be(n,t,s)}break;case 18:Ye!==null&&(Tt?(e=Ye,Up(e.nodeType===9?e.body:e.nodeName===\"HTML\"?e.ownerDocument.body:e,n.stateNode),zl(e)):Up(Ye,n.stateNode));break;case 4:l=Ye,i=Tt,Ye=n.stateNode.containerInfo,Tt=!0,En(e,t,n),Ye=l,Tt=i;break;case 0:case 11:case 14:case 15:$n(2,n,t),et||$n(4,n,t),En(e,t,n);break;case 1:et||(cn(n,t),l=n.stateNode,typeof l.componentWillUnmount==\"function\"&&Zm(n,t,l)),En(e,t,n);break;case 21:En(e,t,n);break;case 22:et=(l=et)||n.memoizedState!==null,En(e,t,n),et=l;break;default:En(e,t,n)}}function Lm(e,t){if(t.memoizedState===null&&(e=t.alternate,e!==null&&(e=e.memoizedState,e!==null))){e=e.dehydrated;try{zl(e)}catch(n){be(t,t.return,n)}}}function Gm(e,t){if(t.memoizedState===null&&(e=t.alternate,e!==null&&(e=e.memoizedState,e!==null&&(e=e.dehydrated,e!==null))))try{zl(e)}catch(n){be(t,t.return,n)}}function $z(e){switch(e.tag){case 31:case 13:case 19:var t=e.stateNode;return t===null&&(t=e.stateNode=new Hm),t;case 22:return e=e.stateNode,t=e._retryCache,t===null&&(t=e._retryCache=new Hm),t;default:throw Error(c(435,e.tag))}}function Hi(e,t){var n=$z(e);t.forEach(function(l){if(!n.has(l)){n.add(l);var i=nT.bind(null,e,l);l.then(i,i)}})}function Et(e,t){var n=t.deletions;if(n!==null)for(var l=0;l<n.length;l++){var i=n[l],s=e,f=t,h=f;e:for(;h!==null;){switch(h.tag){case 27:if(ea(h.type)){Ye=h.stateNode,Tt=!1;break e}break;case 5:Ye=h.stateNode,Tt=!1;break e;case 3:case 4:Ye=h.stateNode.containerInfo,Tt=!0;break e}h=h.return}if(Ye===null)throw Error(c(160));Ym(s,f,i),Ye=null,Tt=!1,s=i.alternate,s!==null&&(s.return=null),i.return=null}if(t.subtreeFlags&13886)for(t=t.child;t!==null;)Qm(t,e),t=t.sibling}var nn=null;function Qm(e,t){var n=e.alternate,l=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:Et(t,e),Ot(e),l&4&&($n(3,e,e.return),du(3,e),$n(5,e,e.return));break;case 1:Et(t,e),Ot(e),l&512&&(et||n===null||cn(n,n.return)),l&64&&Tn&&(e=e.updateQueue,e!==null&&(l=e.callbacks,l!==null&&(n=e.shared.hiddenCallbacks,e.shared.hiddenCallbacks=n===null?l:n.concat(l))));break;case 26:var i=nn;if(Et(t,e),Ot(e),l&512&&(et||n===null||cn(n,n.return)),l&4){var s=n!==null?n.memoizedState:null;if(l=e.memoizedState,n===null)if(l===null)if(e.stateNode===null){e:{l=e.type,n=e.memoizedProps,i=i.ownerDocument||i;t:switch(l){case\"title\":s=i.getElementsByTagName(\"title\")[0],(!s||s[Bl]||s[ot]||s.namespaceURI===\"http://www.w3.org/2000/svg\"||s.hasAttribute(\"itemprop\"))&&(s=i.createElement(l),i.head.insertBefore(s,i.querySelector(\"head > title\"))),ft(s,l,n),s[ot]=e,nt(s),l=s;break e;case\"link\":var f=Qp(\"link\",\"href\",i).get(l+(n.href||\"\"));if(f){for(var h=0;h<f.length;h++)if(s=f[h],s.getAttribute(\"href\")===(n.href==null||n.href===\"\"?null:n.href)&&s.getAttribute(\"rel\")===(n.rel==null?null:n.rel)&&s.getAttribute(\"title\")===(n.title==null?null:n.title)&&s.getAttribute(\"crossorigin\")===(n.crossOrigin==null?null:n.crossOrigin)){f.splice(h,1);break t}}s=i.createElement(l),ft(s,l,n),i.head.appendChild(s);break;case\"meta\":if(f=Qp(\"meta\",\"content\",i).get(l+(n.content||\"\"))){for(h=0;h<f.length;h++)if(s=f[h],s.getAttribute(\"content\")===(n.content==null?null:\"\"+n.content)&&s.getAttribute(\"name\")===(n.name==null?null:n.name)&&s.getAttribute(\"property\")===(n.property==null?null:n.property)&&s.getAttribute(\"http-equiv\")===(n.httpEquiv==null?null:n.httpEquiv)&&s.getAttribute(\"charset\")===(n.charSet==null?null:n.charSet)){f.splice(h,1);break t}}s=i.createElement(l),ft(s,l,n),i.head.appendChild(s);break;default:throw Error(c(468,l))}s[ot]=e,nt(s),l=s}e.stateNode=l}else Xp(i,e.type,e.stateNode);else e.stateNode=Gp(i,l,e.memoizedProps);else s!==l?(s===null?n.stateNode!==null&&(n=n.stateNode,n.parentNode.removeChild(n)):s.count--,l===null?Xp(i,e.type,e.stateNode):Gp(i,l,e.memoizedProps)):l===null&&e.stateNode!==null&&Ds(e,e.memoizedProps,n.memoizedProps)}break;case 27:Et(t,e),Ot(e),l&512&&(et||n===null||cn(n,n.return)),n!==null&&l&4&&Ds(e,e.memoizedProps,n.memoizedProps);break;case 5:if(Et(t,e),Ot(e),l&512&&(et||n===null||cn(n,n.return)),e.flags&32){i=e.stateNode;try{Xa(i,\"\")}catch(Y){be(e,e.return,Y)}}l&4&&e.stateNode!=null&&(i=e.memoizedProps,Ds(e,i,n!==null?n.memoizedProps:i)),l&1024&&(qs=!0);break;case 6:if(Et(t,e),Ot(e),l&4){if(e.stateNode===null)throw Error(c(162));l=e.memoizedProps,n=e.stateNode;try{n.nodeValue=l}catch(Y){be(e,e.return,Y)}}break;case 3:if(eo=null,i=nn,nn=Fi(t.containerInfo),Et(t,e),nn=i,Ot(e),l&4&&n!==null&&n.memoizedState.isDehydrated)try{zl(t.containerInfo)}catch(Y){be(e,e.return,Y)}qs&&(qs=!1,Xm(e));break;case 4:l=nn,nn=Fi(e.stateNode.containerInfo),Et(t,e),Ot(e),nn=l;break;case 12:Et(t,e),Ot(e);break;case 31:Et(t,e),Ot(e),l&4&&(l=e.updateQueue,l!==null&&(e.updateQueue=null,Hi(e,l)));break;case 13:Et(t,e),Ot(e),e.child.flags&8192&&e.memoizedState!==null!=(n!==null&&n.memoizedState!==null)&&(Bi=Ct()),l&4&&(l=e.updateQueue,l!==null&&(e.updateQueue=null,Hi(e,l)));break;case 22:i=e.memoizedState!==null;var y=n!==null&&n.memoizedState!==null,A=Tn,C=et;if(Tn=A||i,et=C||y,Et(t,e),et=C,Tn=A,Ot(e),l&8192)e:for(t=e.stateNode,t._visibility=i?t._visibility&-2:t._visibility|1,i&&(n===null||y||Tn||et||wa(e)),n=null,t=e;;){if(t.tag===5||t.tag===26){if(n===null){y=n=t;try{if(s=y.stateNode,i)f=s.style,typeof f.setProperty==\"function\"?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\";else{h=y.stateNode;var q=y.memoizedProps.style,M=q!=null&&q.hasOwnProperty(\"display\")?q.display:null;h.style.display=M==null||typeof M==\"boolean\"?\"\":(\"\"+M).trim()}}catch(Y){be(y,y.return,Y)}}}else if(t.tag===6){if(n===null){y=t;try{y.stateNode.nodeValue=i?\"\":y.memoizedProps}catch(Y){be(y,y.return,Y)}}}else if(t.tag===18){if(n===null){y=t;try{var N=y.stateNode;i?Zp(N,!0):Zp(y.stateNode,!1)}catch(Y){be(y,y.return,Y)}}}else if((t.tag!==22&&t.tag!==23||t.memoizedState===null||t===e)&&t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break e;for(;t.sibling===null;){if(t.return===null||t.return===e)break e;n===t&&(n=null),t=t.return}n===t&&(n=null),t.sibling.return=t.return,t=t.sibling}l&4&&(l=e.updateQueue,l!==null&&(n=l.retryQueue,n!==null&&(l.retryQueue=null,Hi(e,n))));break;case 19:Et(t,e),Ot(e),l&4&&(l=e.updateQueue,l!==null&&(e.updateQueue=null,Hi(e,l)));break;case 30:break;case 21:break;default:Et(t,e),Ot(e)}}function Ot(e){var t=e.flags;if(t&2){try{for(var n,l=e.return;l!==null;){if(xm(l)){n=l;break}l=l.return}if(n==null)throw Error(c(160));switch(n.tag){case 27:var i=n.stateNode,s=Us(e);ki(e,s,i);break;case 5:var f=n.stateNode;n.flags&32&&(Xa(f,\"\"),n.flags&=-33);var h=Us(e);ki(e,h,f);break;case 3:case 4:var y=n.stateNode.containerInfo,A=Us(e);Zs(e,A,y);break;default:throw Error(c(161))}}catch(C){be(e,e.return,C)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function Xm(e){if(e.subtreeFlags&1024)for(e=e.child;e!==null;){var t=e;Xm(t),t.tag===5&&t.flags&1024&&t.stateNode.reset(),e=e.sibling}}function On(e,t){if(t.subtreeFlags&8772)for(t=t.child;t!==null;)jm(e,t.alternate,t),t=t.sibling}function wa(e){for(e=e.child;e!==null;){var t=e;switch(t.tag){case 0:case 11:case 14:case 15:$n(4,t,t.return),wa(t);break;case 1:cn(t,t.return);var n=t.stateNode;typeof n.componentWillUnmount==\"function\"&&Zm(t,t.return,n),wa(t);break;case 27:zu(t.stateNode);case 26:case 5:cn(t,t.return),wa(t);break;case 22:t.memoizedState===null&&wa(t);break;case 30:wa(t);break;default:wa(t)}e=e.sibling}}function An(e,t,n){for(n=n&&(t.subtreeFlags&8772)!==0,t=t.child;t!==null;){var l=t.alternate,i=e,s=t,f=s.flags;switch(s.tag){case 0:case 11:case 15:An(i,s,n),du(4,s);break;case 1:if(An(i,s,n),l=s,i=l.stateNode,typeof i.componentDidMount==\"function\")try{i.componentDidMount()}catch(A){be(l,l.return,A)}if(l=s,i=l.updateQueue,i!==null){var h=l.stateNode;try{var y=i.shared.hiddenCallbacks;if(y!==null)for(i.shared.hiddenCallbacks=null,i=0;i<y.length;i++)zh(y[i],h)}catch(A){be(l,l.return,A)}}n&&f&64&&Um(s),hu(s,s.return);break;case 27:km(s);case 26:case 5:An(i,s,n),n&&l===null&&f&4&&qm(s),hu(s,s.return);break;case 12:An(i,s,n);break;case 31:An(i,s,n),n&&f&4&&Lm(i,s);break;case 13:An(i,s,n),n&&f&4&&Gm(i,s);break;case 22:s.memoizedState===null&&An(i,s,n),hu(s,s.return);break;case 30:break;default:An(i,s,n)}t=t.sibling}}function xs(e,t){var n=null;e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),e=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(e=t.memoizedState.cachePool.pool),e!==n&&(e!=null&&e.refCount++,n!=null&&Pl(n))}function ks(e,t){e=null,t.alternate!==null&&(e=t.alternate.memoizedState.cache),t=t.memoizedState.cache,t!==e&&(t.refCount++,e!=null&&Pl(e))}function an(e,t,n,l){if(t.subtreeFlags&10256)for(t=t.child;t!==null;)Vm(e,t,n,l),t=t.sibling}function Vm(e,t,n,l){var i=t.flags;switch(t.tag){case 0:case 11:case 15:an(e,t,n,l),i&2048&&du(9,t);break;case 1:an(e,t,n,l);break;case 3:an(e,t,n,l),i&2048&&(e=null,t.alternate!==null&&(e=t.alternate.memoizedState.cache),t=t.memoizedState.cache,t!==e&&(t.refCount++,e!=null&&Pl(e)));break;case 12:if(i&2048){an(e,t,n,l),e=t.stateNode;try{var s=t.memoizedProps,f=s.id,h=s.onPostCommit;typeof h==\"function\"&&h(f,t.alternate===null?\"mount\":\"update\",e.passiveEffectDuration,-0)}catch(y){be(t,t.return,y)}}else an(e,t,n,l);break;case 31:an(e,t,n,l);break;case 13:an(e,t,n,l);break;case 23:break;case 22:s=t.stateNode,f=t.alternate,t.memoizedState!==null?s._visibility&2?an(e,t,n,l):mu(e,t):s._visibility&2?an(e,t,n,l):(s._visibility|=2,fl(e,t,n,l,(t.subtreeFlags&10256)!==0||!1)),i&2048&&xs(f,t);break;case 24:an(e,t,n,l),i&2048&&ks(t.alternate,t);break;default:an(e,t,n,l)}}function fl(e,t,n,l,i){for(i=i&&((t.subtreeFlags&10256)!==0||!1),t=t.child;t!==null;){var s=e,f=t,h=n,y=l,A=f.flags;switch(f.tag){case 0:case 11:case 15:fl(s,f,h,y,i),du(8,f);break;case 23:break;case 22:var C=f.stateNode;f.memoizedState!==null?C._visibility&2?fl(s,f,h,y,i):mu(s,f):(C._visibility|=2,fl(s,f,h,y,i)),i&&A&2048&&xs(f.alternate,f);break;case 24:fl(s,f,h,y,i),i&&A&2048&&ks(f.alternate,f);break;default:fl(s,f,h,y,i)}t=t.sibling}}function mu(e,t){if(t.subtreeFlags&10256)for(t=t.child;t!==null;){var n=e,l=t,i=l.flags;switch(l.tag){case 22:mu(n,l),i&2048&&xs(l.alternate,l);break;case 24:mu(n,l),i&2048&&ks(l.alternate,l);break;default:mu(n,l)}t=t.sibling}}var pu=8192;function dl(e,t,n){if(e.subtreeFlags&pu)for(e=e.child;e!==null;)$m(e,t,n),e=e.sibling}function $m(e,t,n){switch(e.tag){case 26:dl(e,t,n),e.flags&pu&&e.memoizedState!==null&&UT(n,nn,e.memoizedState,e.memoizedProps);break;case 5:dl(e,t,n);break;case 3:case 4:var l=nn;nn=Fi(e.stateNode.containerInfo),dl(e,t,n),nn=l;break;case 22:e.memoizedState===null&&(l=e.alternate,l!==null&&l.memoizedState!==null?(l=pu,pu=16777216,dl(e,t,n),pu=l):dl(e,t,n));break;default:dl(e,t,n)}}function Jm(e){var t=e.alternate;if(t!==null&&(e=t.child,e!==null)){t.child=null;do t=e.sibling,e.sibling=null,e=t;while(e!==null)}}function gu(e){var t=e.deletions;if((e.flags&16)!==0){if(t!==null)for(var n=0;n<t.length;n++){var l=t[n];at=l,Im(l,e)}Jm(e)}if(e.subtreeFlags&10256)for(e=e.child;e!==null;)Km(e),e=e.sibling}function Km(e){switch(e.tag){case 0:case 11:case 15:gu(e),e.flags&2048&&$n(9,e,e.return);break;case 3:gu(e);break;case 12:gu(e);break;case 22:var t=e.stateNode;e.memoizedState!==null&&t._visibility&2&&(e.return===null||e.return.tag!==13)?(t._visibility&=-3,ji(e)):gu(e);break;default:gu(e)}}function ji(e){var t=e.deletions;if((e.flags&16)!==0){if(t!==null)for(var n=0;n<t.length;n++){var l=t[n];at=l,Im(l,e)}Jm(e)}for(e=e.child;e!==null;){switch(t=e,t.tag){case 0:case 11:case 15:$n(8,t,t.return),ji(t);break;case 22:n=t.stateNode,n._visibility&2&&(n._visibility&=-3,ji(t));break;default:ji(t)}e=e.sibling}}function Im(e,t){for(;at!==null;){var n=at;switch(n.tag){case 0:case 11:case 15:$n(8,n,t);break;case 23:case 22:if(n.memoizedState!==null&&n.memoizedState.cachePool!==null){var l=n.memoizedState.cachePool.pool;l!=null&&l.refCount++}break;case 24:Pl(n.memoizedState.cache)}if(l=n.child,l!==null)l.return=n,at=l;else e:for(n=e;at!==null;){l=at;var i=l.sibling,s=l.return;if(Bm(l),l===n){at=null;break e}if(i!==null){i.return=s,at=i;break e}at=s}}}var Jz={getCacheForType:function(e){var t=st(We),n=t.data.get(e);return n===void 0&&(n=e(),t.data.set(e,n)),n},cacheSignal:function(){return st(We).controller.signal}},Kz=typeof WeakMap==\"function\"?WeakMap:Map,pe=0,De=null,le=null,oe=0,_e=0,Ht=null,Jn=!1,hl=!1,Hs=!1,Rn=0,Ve=0,Kn=0,Na=0,js=0,jt=0,ml=0,vu=null,At=null,Bs=!1,Bi=0,Wm=0,Yi=1/0,Li=null,In=null,tt=0,Wn=null,pl=null,Mn=0,Ys=0,Ls=null,Fm=null,yu=0,Gs=null;function Bt(){return(pe&2)!==0&&oe!==0?oe&-oe:U.T!==null?Ks():md()}function Pm(){if(jt===0)if((oe&536870912)===0||se){var e=Iu;Iu<<=1,(Iu&3932160)===0&&(Iu=262144),jt=e}else jt=536870912;return e=xt.current,e!==null&&(e.flags|=32),jt}function Rt(e,t,n){(e===De&&(_e===2||_e===9)||e.cancelPendingCommit!==null)&&(gl(e,0),Fn(e,oe,jt,!1)),jl(e,n),((pe&2)===0||e!==De)&&(e===De&&((pe&2)===0&&(Na|=n),Ve===4&&Fn(e,oe,jt,!1)),sn(e))}function ep(e,t,n){if((pe&6)!==0)throw Error(c(327));var l=!n&&(t&127)===0&&(t&e.expiredLanes)===0||Hl(e,t),i=l?Fz(e,t):Xs(e,t,!0),s=l;do{if(i===0){hl&&!l&&Fn(e,t,0,!1);break}else{if(n=e.current.alternate,s&&!Iz(n)){i=Xs(e,t,!1),s=!1;continue}if(i===2){if(s=t,e.errorRecoveryDisabledLanes&s)var f=0;else f=e.pendingLanes&-536870913,f=f!==0?f:f&536870912?536870912:0;if(f!==0){t=f;e:{var h=e;i=vu;var y=h.current.memoizedState.isDehydrated;if(y&&(gl(h,f).flags|=256),f=Xs(h,f,!1),f!==2){if(Hs&&!y){h.errorRecoveryDisabledLanes|=s,Na|=s,i=4;break e}s=At,At=i,s!==null&&(At===null?At=s:At.push.apply(At,s))}i=f}if(s=!1,i!==2)continue}}if(i===1){gl(e,0),Fn(e,t,0,!0);break}e:{switch(l=e,s=i,s){case 0:case 1:throw Error(c(345));case 4:if((t&4194048)!==t)break;case 6:Fn(l,t,jt,!Jn);break e;case 2:At=null;break;case 3:case 5:break;default:throw Error(c(329))}if((t&62914560)===t&&(i=Bi+300-Ct(),10<i)){if(Fn(l,t,jt,!Jn),Fu(l,0,!0)!==0)break e;Mn=t,l.timeoutHandle=Cp(tp.bind(null,l,n,At,Li,Bs,t,jt,Na,ml,Jn,s,\"Throttled\",-0,0),i);break e}tp(l,n,At,Li,Bs,t,jt,Na,ml,Jn,s,null,-0,0)}}break}while(!0);sn(e)}function tp(e,t,n,l,i,s,f,h,y,A,C,q,M,N){if(e.timeoutHandle=-1,q=t.subtreeFlags,q&8192||(q&16785408)===16785408){q={stylesheets:null,count:0,imgCount:0,imgBytes:0,suspenseyImages:[],waitingForImages:!0,waitingForViewTransition:!1,unsuspend:hn},$m(t,s,q);var Y=(s&62914560)===s?Bi-Ct():(s&4194048)===s?Wm-Ct():0;if(Y=ZT(q,Y),Y!==null){Mn=s,e.cancelPendingCommit=Y(sp.bind(null,e,t,s,n,l,i,f,h,y,C,q,null,M,N)),Fn(e,s,f,!A);return}}sp(e,t,s,n,l,i,f,h,y)}function Iz(e){for(var t=e;;){var n=t.tag;if((n===0||n===11||n===15)&&t.flags&16384&&(n=t.updateQueue,n!==null&&(n=n.stores,n!==null)))for(var l=0;l<n.length;l++){var i=n[l],s=i.getSnapshot;i=i.value;try{if(!Zt(s(),i))return!1}catch{return!1}}if(n=t.child,t.subtreeFlags&16384&&n!==null)n.return=t,t=n;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Fn(e,t,n,l){t&=~js,t&=~Na,e.suspendedLanes|=t,e.pingedLanes&=~t,l&&(e.warmLanes|=t),l=e.expirationTimes;for(var i=t;0<i;){var s=31-Ut(i),f=1<<s;l[s]=-1,i&=~f}n!==0&&fd(e,n,t)}function Gi(){return(pe&6)===0?(_u(0),!1):!0}function Qs(){if(le!==null){if(_e===0)var e=le.return;else e=le,vn=Sa=null,is(e),il=null,tu=0,e=le;for(;e!==null;)Dm(e.alternate,e),e=e.return;le=null}}function gl(e,t){var n=e.timeoutHandle;n!==-1&&(e.timeoutHandle=-1,gT(n)),n=e.cancelPendingCommit,n!==null&&(e.cancelPendingCommit=null,n()),Mn=0,Qs(),De=e,le=n=pn(e.current,null),oe=t,_e=0,Ht=null,Jn=!1,hl=Hl(e,t),Hs=!1,ml=jt=js=Na=Kn=Ve=0,At=vu=null,Bs=!1,(t&8)!==0&&(t|=t&32);var l=e.entangledLanes;if(l!==0)for(e=e.entanglements,l&=t;0<l;){var i=31-Ut(l),s=1<<i;t|=e[i],l&=~s}return Rn=t,ri(),n}function np(e,t){ee=null,U.H=su,t===ul||t===yi?(t=yh(),_e=3):t===Jc?(t=yh(),_e=4):_e=t===zs?8:t!==null&&typeof t==\"object\"&&typeof t.then==\"function\"?6:1,Ht=t,le===null&&(Ve=1,Di(e,$t(t,e.current)))}function ap(){var e=xt.current;return e===null?!0:(oe&4194048)===oe?Wt===null:(oe&62914560)===oe||(oe&536870912)!==0?e===Wt:!1}function lp(){var e=U.H;return U.H=su,e===null?su:e}function up(){var e=U.A;return U.A=Jz,e}function Qi(){Ve=4,Jn||(oe&4194048)!==oe&&xt.current!==null||(hl=!0),(Kn&134217727)===0&&(Na&134217727)===0||De===null||Fn(De,oe,jt,!1)}function Xs(e,t,n){var l=pe;pe|=2;var i=lp(),s=up();(De!==e||oe!==t)&&(Li=null,gl(e,t)),t=!1;var f=Ve;e:do try{if(_e!==0&&le!==null){var h=le,y=Ht;switch(_e){case 8:Qs(),f=6;break e;case 3:case 2:case 9:case 6:xt.current===null&&(t=!0);var A=_e;if(_e=0,Ht=null,vl(e,h,y,A),n&&hl){f=0;break e}break;default:A=_e,_e=0,Ht=null,vl(e,h,y,A)}}Wz(),f=Ve;break}catch(C){np(e,C)}while(!0);return t&&e.shellSuspendCounter++,vn=Sa=null,pe=l,U.H=i,U.A=s,le===null&&(De=null,oe=0,ri()),f}function Wz(){for(;le!==null;)ip(le)}function Fz(e,t){var n=pe;pe|=2;var l=lp(),i=up();De!==e||oe!==t?(Li=null,Yi=Ct()+500,gl(e,t)):hl=Hl(e,t);e:do try{if(_e!==0&&le!==null){t=le;var s=Ht;t:switch(_e){case 1:_e=0,Ht=null,vl(e,t,s,1);break;case 2:case 9:if(gh(s)){_e=0,Ht=null,op(t);break}t=function(){_e!==2&&_e!==9||De!==e||(_e=7),sn(e)},s.then(t,t);break e;case 3:_e=7;break e;case 4:_e=5;break e;case 7:gh(s)?(_e=0,Ht=null,op(t)):(_e=0,Ht=null,vl(e,t,s,7));break;case 5:var f=null;switch(le.tag){case 26:f=le.memoizedState;case 5:case 27:var h=le;if(f?Vp(f):h.stateNode.complete){_e=0,Ht=null;var y=h.sibling;if(y!==null)le=y;else{var A=h.return;A!==null?(le=A,Xi(A)):le=null}break t}}_e=0,Ht=null,vl(e,t,s,5);break;case 6:_e=0,Ht=null,vl(e,t,s,6);break;case 8:Qs(),Ve=6;break e;default:throw Error(c(462))}}Pz();break}catch(C){np(e,C)}while(!0);return vn=Sa=null,U.H=l,U.A=i,pe=n,le!==null?0:(De=null,oe=0,ri(),Ve)}function Pz(){for(;le!==null&&!z1();)ip(le)}function ip(e){var t=Nm(e.alternate,e,Rn);e.memoizedProps=e.pendingProps,t===null?Xi(e):le=t}function op(e){var t=e,n=t.alternate;switch(t.tag){case 15:case 0:t=Em(n,t,t.pendingProps,t.type,void 0,oe);break;case 11:t=Em(n,t,t.pendingProps,t.type.render,t.ref,oe);break;case 5:is(t);default:Dm(n,t),t=le=uh(t,Rn),t=Nm(n,t,Rn)}e.memoizedProps=e.pendingProps,t===null?Xi(e):le=t}function vl(e,t,n,l){vn=Sa=null,is(t),il=null,tu=0;var i=t.return;try{if(Yz(e,i,t,n,oe)){Ve=1,Di(e,$t(n,e.current)),le=null;return}}catch(s){if(i!==null)throw le=i,s;Ve=1,Di(e,$t(n,e.current)),le=null;return}t.flags&32768?(se||l===1?e=!0:hl||(oe&536870912)!==0?e=!1:(Jn=e=!0,(l===2||l===9||l===3||l===6)&&(l=xt.current,l!==null&&l.tag===13&&(l.flags|=16384))),cp(t,e)):Xi(t)}function Xi(e){var t=e;do{if((t.flags&32768)!==0){cp(t,Jn);return}e=t.return;var n=Qz(t.alternate,t,Rn);if(n!==null){le=n;return}if(t=t.sibling,t!==null){le=t;return}le=t=e}while(t!==null);Ve===0&&(Ve=5)}function cp(e,t){do{var n=Xz(e.alternate,e);if(n!==null){n.flags&=32767,le=n;return}if(n=e.return,n!==null&&(n.flags|=32768,n.subtreeFlags=0,n.deletions=null),!t&&(e=e.sibling,e!==null)){le=e;return}le=e=n}while(e!==null);Ve=6,le=null}function sp(e,t,n,l,i,s,f,h,y){e.cancelPendingCommit=null;do Vi();while(tt!==0);if((pe&6)!==0)throw Error(c(327));if(t!==null){if(t===e.current)throw Error(c(177));if(s=t.lanes|t.childLanes,s|=Uc,D1(e,n,s,f,h,y),e===De&&(le=De=null,oe=0),pl=t,Wn=e,Mn=n,Ys=s,Ls=i,Fm=l,(t.subtreeFlags&10256)!==0||(t.flags&10256)!==0?(e.callbackNode=null,e.callbackPriority=0,aT(Ju,function(){return mp(),null})):(e.callbackNode=null,e.callbackPriority=0),l=(t.flags&13878)!==0,(t.subtreeFlags&13878)!==0||l){l=U.T,U.T=null,i=j.p,j.p=2,f=pe,pe|=4;try{Vz(e,t,n)}finally{pe=f,j.p=i,U.T=l}}tt=1,rp(),fp(),dp()}}function rp(){if(tt===1){tt=0;var e=Wn,t=pl,n=(t.flags&13878)!==0;if((t.subtreeFlags&13878)!==0||n){n=U.T,U.T=null;var l=j.p;j.p=2;var i=pe;pe|=4;try{Qm(t,e);var s=ar,f=Id(e.containerInfo),h=s.focusedElem,y=s.selectionRange;if(f!==h&&h&&h.ownerDocument&&Kd(h.ownerDocument.documentElement,h)){if(y!==null&&Mc(h)){var A=y.start,C=y.end;if(C===void 0&&(C=A),\"selectionStart\"in h)h.selectionStart=A,h.selectionEnd=Math.min(C,h.value.length);else{var q=h.ownerDocument||document,M=q&&q.defaultView||window;if(M.getSelection){var N=M.getSelection(),Y=h.textContent.length,K=Math.min(y.start,Y),Re=y.end===void 0?K:Math.min(y.end,Y);!N.extend&&K>Re&&(f=Re,Re=K,K=f);var S=Jd(h,K),_=Jd(h,Re);if(S&&_&&(N.rangeCount!==1||N.anchorNode!==S.node||N.anchorOffset!==S.offset||N.focusNode!==_.node||N.focusOffset!==_.offset)){var O=q.createRange();O.setStart(S.node,S.offset),N.removeAllRanges(),K>Re?(N.addRange(O),N.extend(_.node,_.offset)):(O.setEnd(_.node,_.offset),N.addRange(O))}}}}for(q=[],N=h;N=N.parentNode;)N.nodeType===1&&q.push({element:N,left:N.scrollLeft,top:N.scrollTop});for(typeof h.focus==\"function\"&&h.focus(),h=0;h<q.length;h++){var Z=q[h];Z.element.scrollLeft=Z.left,Z.element.scrollTop=Z.top}}lo=!!nr,ar=nr=null}finally{pe=i,j.p=l,U.T=n}}e.current=t,tt=2}}function fp(){if(tt===2){tt=0;var e=Wn,t=pl,n=(t.flags&8772)!==0;if((t.subtreeFlags&8772)!==0||n){n=U.T,U.T=null;var l=j.p;j.p=2;var i=pe;pe|=4;try{jm(e,t.alternate,t)}finally{pe=i,j.p=l,U.T=n}}tt=3}}function dp(){if(tt===4||tt===3){tt=0,T1();var e=Wn,t=pl,n=Mn,l=Fm;(t.subtreeFlags&10256)!==0||(t.flags&10256)!==0?tt=5:(tt=0,pl=Wn=null,hp(e,e.pendingLanes));var i=e.pendingLanes;if(i===0&&(In=null),sc(n),t=t.stateNode,Dt&&typeof Dt.onCommitFiberRoot==\"function\")try{Dt.onCommitFiberRoot(kl,t,void 0,(t.current.flags&128)===128)}catch{}if(l!==null){t=U.T,i=j.p,j.p=2,U.T=null;try{for(var s=e.onRecoverableError,f=0;f<l.length;f++){var h=l[f];s(h.value,{componentStack:h.stack})}}finally{U.T=t,j.p=i}}(Mn&3)!==0&&Vi(),sn(e),i=e.pendingLanes,(n&261930)!==0&&(i&42)!==0?e===Gs?yu++:(yu=0,Gs=e):yu=0,_u(0)}}function hp(e,t){(e.pooledCacheLanes&=t)===0&&(t=e.pooledCache,t!=null&&(e.pooledCache=null,Pl(t)))}function Vi(){return rp(),fp(),dp(),mp()}function mp(){if(tt!==5)return!1;var e=Wn,t=Ys;Ys=0;var n=sc(Mn),l=U.T,i=j.p;try{j.p=32>n?32:n,U.T=null,n=Ls,Ls=null;var s=Wn,f=Mn;if(tt=0,pl=Wn=null,Mn=0,(pe&6)!==0)throw Error(c(331));var h=pe;if(pe|=4,Km(s.current),Vm(s,s.current,f,n),pe=h,_u(0,!1),Dt&&typeof Dt.onPostCommitFiberRoot==\"function\")try{Dt.onPostCommitFiberRoot(kl,s)}catch{}return!0}finally{j.p=i,U.T=l,hp(e,t)}}function pp(e,t,n){t=$t(n,t),t=Ss(e.stateNode,t,2),e=Qn(e,t,2),e!==null&&(jl(e,2),sn(e))}function be(e,t,n){if(e.tag===3)pp(e,e,n);else for(;t!==null;){if(t.tag===3){pp(t,e,n);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError==\"function\"||typeof l.componentDidCatch==\"function\"&&(In===null||!In.has(l))){e=$t(n,e),n=gm(2),l=Qn(t,n,2),l!==null&&(vm(n,l,t,e),jl(l,2),sn(l));break}}t=t.return}}function Vs(e,t,n){var l=e.pingCache;if(l===null){l=e.pingCache=new Kz;var i=new Set;l.set(t,i)}else i=l.get(t),i===void 0&&(i=new Set,l.set(t,i));i.has(n)||(Hs=!0,i.add(n),e=eT.bind(null,e,t,n),t.then(e,e))}function eT(e,t,n){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,De===e&&(oe&n)===n&&(Ve===4||Ve===3&&(oe&62914560)===oe&&300>Ct()-Bi?(pe&2)===0&&gl(e,0):js|=n,ml===oe&&(ml=0)),sn(e)}function gp(e,t){t===0&&(t=rd()),e=ya(e,t),e!==null&&(jl(e,t),sn(e))}function tT(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),gp(e,n)}function nT(e,t){var n=0;switch(e.tag){case 31:case 13:var l=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(c(314))}l!==null&&l.delete(t),gp(e,n)}function aT(e,t){return uc(e,t)}var $i=null,yl=null,$s=!1,Ji=!1,Js=!1,Pn=0;function sn(e){e!==yl&&e.next===null&&(yl===null?$i=yl=e:yl=yl.next=e),Ji=!0,$s||($s=!0,uT())}function _u(e,t){if(!Js&&Ji){Js=!0;do for(var n=!1,l=$i;l!==null;){if(e!==0){var i=l.pendingLanes;if(i===0)var s=0;else{var f=l.suspendedLanes,h=l.pingedLanes;s=(1<<31-Ut(42|e)+1)-1,s&=i&~(f&~h),s=s&201326741?s&201326741|1:s?s|2:0}s!==0&&(n=!0,bp(l,s))}else s=oe,s=Fu(l,l===De?s:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(s&3)===0||Hl(l,s)||(n=!0,bp(l,s));l=l.next}while(n);Js=!1}}function lT(){vp()}function vp(){Ji=$s=!1;var e=0;Pn!==0&&pT()&&(e=Pn);for(var t=Ct(),n=null,l=$i;l!==null;){var i=l.next,s=yp(l,t);s===0?(l.next=null,n===null?$i=i:n.next=i,i===null&&(yl=n)):(n=l,(e!==0||(s&3)!==0)&&(Ji=!0)),l=i}tt!==0&&tt!==5||_u(e),Pn!==0&&(Pn=0)}function yp(e,t){for(var n=e.suspendedLanes,l=e.pingedLanes,i=e.expirationTimes,s=e.pendingLanes&-62914561;0<s;){var f=31-Ut(s),h=1<<f,y=i[f];y===-1?((h&n)===0||(h&l)!==0)&&(i[f]=C1(h,t)):y<=t&&(e.expiredLanes|=h),s&=~h}if(t=De,n=oe,n=Fu(e,e===t?n:0,e.cancelPendingCommit!==null||e.timeoutHandle!==-1),l=e.callbackNode,n===0||e===t&&(_e===2||_e===9)||e.cancelPendingCommit!==null)return l!==null&&l!==null&&ic(l),e.callbackNode=null,e.callbackPriority=0;if((n&3)===0||Hl(e,n)){if(t=n&-n,t===e.callbackPriority)return t;switch(l!==null&&ic(l),sc(n)){case 2:case 8:n=cd;break;case 32:n=Ju;break;case 268435456:n=sd;break;default:n=Ju}return l=_p.bind(null,e),n=uc(n,l),e.callbackPriority=t,e.callbackNode=n,t}return l!==null&&l!==null&&ic(l),e.callbackPriority=2,e.callbackNode=null,2}function _p(e,t){if(tt!==0&&tt!==5)return e.callbackNode=null,e.callbackPriority=0,null;var n=e.callbackNode;if(Vi()&&e.callbackNode!==n)return null;var l=oe;return l=Fu(e,e===De?l:0,e.cancelPendingCommit!==null||e.timeoutHandle!==-1),l===0?null:(ep(e,l,t),yp(e,Ct()),e.callbackNode!=null&&e.callbackNode===n?_p.bind(null,e):null)}function bp(e,t){if(Vi())return null;ep(e,t,!0)}function uT(){vT(function(){(pe&6)!==0?uc(od,lT):vp()})}function Ks(){if(Pn===0){var e=al;e===0&&(e=Ku,Ku<<=1,(Ku&261888)===0&&(Ku=256)),Pn=e}return Pn}function Sp(e){return e==null||typeof e==\"symbol\"||typeof e==\"boolean\"?null:typeof e==\"function\"?e:ni(\"\"+e)}function zp(e,t){var n=t.ownerDocument.createElement(\"input\");return n.name=t.name,n.value=t.value,e.id&&n.setAttribute(\"form\",e.id),t.parentNode.insertBefore(n,t),e=new FormData(e),n.parentNode.removeChild(n),e}function iT(e,t,n,l,i){if(t===\"submit\"&&n&&n.stateNode===i){var s=Sp((i[St]||null).action),f=l.submitter;f&&(t=(t=f[St]||null)?Sp(t.formAction):f.getAttribute(\"formAction\"),t!==null&&(s=t,f=null));var h=new ii(\"action\",\"action\",null,l,i);e.push({event:h,listeners:[{instance:null,listener:function(){if(l.defaultPrevented){if(Pn!==0){var y=f?zp(i,f):new FormData(i);ps(n,{pending:!0,data:y,method:i.method,action:s},null,y)}}else typeof s==\"function\"&&(h.preventDefault(),y=f?zp(i,f):new FormData(i),ps(n,{pending:!0,data:y,method:i.method,action:s},s,y))},currentTarget:i}]})}}for(var Is=0;Is<Dc.length;Is++){var Ws=Dc[Is],oT=Ws.toLowerCase(),cT=Ws[0].toUpperCase()+Ws.slice(1);tn(oT,\"on\"+cT)}tn(Pd,\"onAnimationEnd\"),tn(eh,\"onAnimationIteration\"),tn(th,\"onAnimationStart\"),tn(\"dblclick\",\"onDoubleClick\"),tn(\"focusin\",\"onFocus\"),tn(\"focusout\",\"onBlur\"),tn(Ez,\"onTransitionRun\"),tn(Oz,\"onTransitionStart\"),tn(Az,\"onTransitionCancel\"),tn(nh,\"onTransitionEnd\"),Ga(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]),Ga(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]),Ga(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]),Ga(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]),ma(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \")),ma(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \")),ma(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]),ma(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \")),ma(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \")),ma(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var bu=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),sT=new Set(\"beforetoggle cancel close invalid load scroll scrollend toggle\".split(\" \").concat(bu));function Tp(e,t){t=(t&4)!==0;for(var n=0;n<e.length;n++){var l=e[n],i=l.event;l=l.listeners;e:{var s=void 0;if(t)for(var f=l.length-1;0<=f;f--){var h=l[f],y=h.instance,A=h.currentTarget;if(h=h.listener,y!==s&&i.isPropagationStopped())break e;s=h,i.currentTarget=A;try{s(i)}catch(C){si(C)}i.currentTarget=null,s=y}else for(f=0;f<l.length;f++){if(h=l[f],y=h.instance,A=h.currentTarget,h=h.listener,y!==s&&i.isPropagationStopped())break e;s=h,i.currentTarget=A;try{s(i)}catch(C){si(C)}i.currentTarget=null,s=y}}}}function ue(e,t){var n=t[rc];n===void 0&&(n=t[rc]=new Set);var l=e+\"__bubble\";n.has(l)||(Ep(t,e,2,!1),n.add(l))}function Fs(e,t,n){var l=0;t&&(l|=4),Ep(n,e,l,t)}var Ki=\"_reactListening\"+Math.random().toString(36).slice(2);function Ps(e){if(!e[Ki]){e[Ki]=!0,vd.forEach(function(n){n!==\"selectionchange\"&&(sT.has(n)||Fs(n,!1,e),Fs(n,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Ki]||(t[Ki]=!0,Fs(\"selectionchange\",!1,t))}}function Ep(e,t,n,l){switch(Pp(t)){case 2:var i=kT;break;case 8:i=HT;break;default:i=mr}n=i.bind(null,t,n,e),i=void 0,!_c||t!==\"touchstart\"&&t!==\"touchmove\"&&t!==\"wheel\"||(i=!0),l?i!==void 0?e.addEventListener(t,n,{capture:!0,passive:i}):e.addEventListener(t,n,!0):i!==void 0?e.addEventListener(t,n,{passive:i}):e.addEventListener(t,n,!1)}function er(e,t,n,l,i){var s=l;if((t&1)===0&&(t&2)===0&&l!==null)e:for(;;){if(l===null)return;var f=l.tag;if(f===3||f===4){var h=l.stateNode.containerInfo;if(h===i)break;if(f===4)for(f=l.return;f!==null;){var y=f.tag;if((y===3||y===4)&&f.stateNode.containerInfo===i)return;f=f.return}for(;h!==null;){if(f=Ba(h),f===null)return;if(y=f.tag,y===5||y===6||y===26||y===27){l=s=f;continue e}h=h.parentNode}}l=l.return}wd(function(){var A=s,C=vc(n),q=[];e:{var M=ah.get(e);if(M!==void 0){var N=ii,Y=e;switch(e){case\"keypress\":if(li(n)===0)break e;case\"keydown\":case\"keyup\":N=nz;break;case\"focusin\":Y=\"focus\",N=Tc;break;case\"focusout\":Y=\"blur\",N=Tc;break;case\"beforeblur\":case\"afterblur\":N=Tc;break;case\"click\":if(n.button===2)break e;case\"auxclick\":case\"dblclick\":case\"mousedown\":case\"mousemove\":case\"mouseup\":case\"mouseout\":case\"mouseover\":case\"contextmenu\":N=Dd;break;case\"drag\":case\"dragend\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"dragstart\":case\"drop\":N=Q1;break;case\"touchcancel\":case\"touchend\":case\"touchmove\":case\"touchstart\":N=uz;break;case Pd:case eh:case th:N=$1;break;case nh:N=oz;break;case\"scroll\":case\"scrollend\":N=L1;break;case\"wheel\":N=sz;break;case\"copy\":case\"cut\":case\"paste\":N=K1;break;case\"gotpointercapture\":case\"lostpointercapture\":case\"pointercancel\":case\"pointerdown\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"pointerup\":N=Zd;break;case\"toggle\":case\"beforetoggle\":N=fz}var K=(t&4)!==0,Re=!K&&(e===\"scroll\"||e===\"scrollend\"),S=K?M!==null?M+\"Capture\":null:M;K=[];for(var _=A,O;_!==null;){var Z=_;if(O=Z.stateNode,Z=Z.tag,Z!==5&&Z!==26&&Z!==27||O===null||S===null||(Z=Ll(_,S),Z!=null&&K.push(Su(_,Z,O))),Re)break;_=_.return}0<K.length&&(M=new N(M,Y,null,n,C),q.push({event:M,listeners:K}))}}if((t&7)===0){e:{if(M=e===\"mouseover\"||e===\"pointerover\",N=e===\"mouseout\"||e===\"pointerout\",M&&n!==gc&&(Y=n.relatedTarget||n.fromElement)&&(Ba(Y)||Y[ja]))break e;if((N||M)&&(M=C.window===C?C:(M=C.ownerDocument)?M.defaultView||M.parentWindow:window,N?(Y=n.relatedTarget||n.toElement,N=A,Y=Y?Ba(Y):null,Y!==null&&(Re=d(Y),K=Y.tag,Y!==Re||K!==5&&K!==27&&K!==6)&&(Y=null)):(N=null,Y=A),N!==Y)){if(K=Dd,Z=\"onMouseLeave\",S=\"onMouseEnter\",_=\"mouse\",(e===\"pointerout\"||e===\"pointerover\")&&(K=Zd,Z=\"onPointerLeave\",S=\"onPointerEnter\",_=\"pointer\"),Re=N==null?M:Yl(N),O=Y==null?M:Yl(Y),M=new K(Z,_+\"leave\",N,n,C),M.target=Re,M.relatedTarget=O,Z=null,Ba(C)===A&&(K=new K(S,_+\"enter\",Y,n,C),K.target=O,K.relatedTarget=Re,Z=K),Re=Z,N&&Y)t:{for(K=rT,S=N,_=Y,O=0,Z=S;Z;Z=K(Z))O++;Z=0;for(var J=_;J;J=K(J))Z++;for(;0<O-Z;)S=K(S),O--;for(;0<Z-O;)_=K(_),Z--;for(;O--;){if(S===_||_!==null&&S===_.alternate){K=S;break t}S=K(S),_=K(_)}K=null}else K=null;N!==null&&Op(q,M,N,K,!1),Y!==null&&Re!==null&&Op(q,Re,Y,K,!0)}}e:{if(M=A?Yl(A):window,N=M.nodeName&&M.nodeName.toLowerCase(),N===\"select\"||N===\"input\"&&M.type===\"file\")var he=Ld;else if(Bd(M))if(Gd)he=Sz;else{he=_z;var V=yz}else N=M.nodeName,!N||N.toLowerCase()!==\"input\"||M.type!==\"checkbox\"&&M.type!==\"radio\"?A&&pc(A.elementType)&&(he=Ld):he=bz;if(he&&(he=he(e,A))){Yd(q,he,n,C);break e}V&&V(e,M,A),e===\"focusout\"&&A&&M.type===\"number\"&&A.memoizedProps.value!=null&&mc(M,\"number\",M.value)}switch(V=A?Yl(A):window,e){case\"focusin\":(Bd(V)||V.contentEditable===\"true\")&&(Ka=V,wc=A,Il=null);break;case\"focusout\":Il=wc=Ka=null;break;case\"mousedown\":Nc=!0;break;case\"contextmenu\":case\"mouseup\":case\"dragend\":Nc=!1,Wd(q,n,C);break;case\"selectionchange\":if(Tz)break;case\"keydown\":case\"keyup\":Wd(q,n,C)}var te;if(Oc)e:{switch(e){case\"compositionstart\":var ce=\"onCompositionStart\";break e;case\"compositionend\":ce=\"onCompositionEnd\";break e;case\"compositionupdate\":ce=\"onCompositionUpdate\";break e}ce=void 0}else Ja?Hd(e,n)&&(ce=\"onCompositionEnd\"):e===\"keydown\"&&n.keyCode===229&&(ce=\"onCompositionStart\");ce&&(qd&&n.locale!==\"ko\"&&(Ja||ce!==\"onCompositionStart\"?ce===\"onCompositionEnd\"&&Ja&&(te=Nd()):(kn=C,bc=\"value\"in kn?kn.value:kn.textContent,Ja=!0)),V=Ii(A,ce),0<V.length&&(ce=new Ud(ce,e,null,n,C),q.push({event:ce,listeners:V}),te?ce.data=te:(te=jd(n),te!==null&&(ce.data=te)))),(te=hz?mz(e,n):pz(e,n))&&(ce=Ii(A,\"onBeforeInput\"),0<ce.length&&(V=new Ud(\"onBeforeInput\",\"beforeinput\",null,n,C),q.push({event:V,listeners:ce}),V.data=te)),iT(q,e,A,n,C)}Tp(q,t)})}function Su(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Ii(e,t){for(var n=t+\"Capture\",l=[];e!==null;){var i=e,s=i.stateNode;if(i=i.tag,i!==5&&i!==26&&i!==27||s===null||(i=Ll(e,n),i!=null&&l.unshift(Su(e,i,s)),i=Ll(e,t),i!=null&&l.push(Su(e,i,s))),e.tag===3)return l;e=e.return}return[]}function rT(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5&&e.tag!==27);return e||null}function Op(e,t,n,l,i){for(var s=t._reactName,f=[];n!==null&&n!==l;){var h=n,y=h.alternate,A=h.stateNode;if(h=h.tag,y!==null&&y===l)break;h!==5&&h!==26&&h!==27||A===null||(y=A,i?(A=Ll(n,s),A!=null&&f.unshift(Su(n,A,y))):i||(A=Ll(n,s),A!=null&&f.push(Su(n,A,y)))),n=n.return}f.length!==0&&e.push({event:t,listeners:f})}var fT=/\\r\\n?/g,dT=/\\u0000|\\uFFFD/g;function Ap(e){return(typeof e==\"string\"?e:\"\"+e).replace(fT,`\n`).replace(dT,\"\")}function Rp(e,t){return t=Ap(t),Ap(e)===t}function Ae(e,t,n,l,i,s){switch(n){case\"children\":typeof l==\"string\"?t===\"body\"||t===\"textarea\"&&l===\"\"||Xa(e,l):(typeof l==\"number\"||typeof l==\"bigint\")&&t!==\"body\"&&Xa(e,\"\"+l);break;case\"className\":ei(e,\"class\",l);break;case\"tabIndex\":ei(e,\"tabindex\",l);break;case\"dir\":case\"role\":case\"viewBox\":case\"width\":case\"height\":ei(e,n,l);break;case\"style\":Rd(e,l,s);break;case\"data\":if(t!==\"object\"){ei(e,\"data\",l);break}case\"src\":case\"href\":if(l===\"\"&&(t!==\"a\"||n!==\"href\")){e.removeAttribute(n);break}if(l==null||typeof l==\"function\"||typeof l==\"symbol\"||typeof l==\"boolean\"){e.removeAttribute(n);break}l=ni(\"\"+l),e.setAttribute(n,l);break;case\"action\":case\"formAction\":if(typeof l==\"function\"){e.setAttribute(n,\"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')\");break}else typeof s==\"function\"&&(n===\"formAction\"?(t!==\"input\"&&Ae(e,t,\"name\",i.name,i,null),Ae(e,t,\"formEncType\",i.formEncType,i,null),Ae(e,t,\"formMethod\",i.formMethod,i,null),Ae(e,t,\"formTarget\",i.formTarget,i,null)):(Ae(e,t,\"encType\",i.encType,i,null),Ae(e,t,\"method\",i.method,i,null),Ae(e,t,\"target\",i.target,i,null)));if(l==null||typeof l==\"symbol\"||typeof l==\"boolean\"){e.removeAttribute(n);break}l=ni(\"\"+l),e.setAttribute(n,l);break;case\"onClick\":l!=null&&(e.onclick=hn);break;case\"onScroll\":l!=null&&ue(\"scroll\",e);break;case\"onScrollEnd\":l!=null&&ue(\"scrollend\",e);break;case\"dangerouslySetInnerHTML\":if(l!=null){if(typeof l!=\"object\"||!(\"__html\"in l))throw Error(c(61));if(n=l.__html,n!=null){if(i.children!=null)throw Error(c(60));e.innerHTML=n}}break;case\"multiple\":e.multiple=l&&typeof l!=\"function\"&&typeof l!=\"symbol\";break;case\"muted\":e.muted=l&&typeof l!=\"function\"&&typeof l!=\"symbol\";break;case\"suppressContentEditableWarning\":case\"suppressHydrationWarning\":case\"defaultValue\":case\"defaultChecked\":case\"innerHTML\":case\"ref\":break;case\"autoFocus\":break;case\"xlinkHref\":if(l==null||typeof l==\"function\"||typeof l==\"boolean\"||typeof l==\"symbol\"){e.removeAttribute(\"xlink:href\");break}n=ni(\"\"+l),e.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"xlink:href\",n);break;case\"contentEditable\":case\"spellCheck\":case\"draggable\":case\"value\":case\"autoReverse\":case\"externalResourcesRequired\":case\"focusable\":case\"preserveAlpha\":l!=null&&typeof l!=\"function\"&&typeof l!=\"symbol\"?e.setAttribute(n,\"\"+l):e.removeAttribute(n);break;case\"inert\":case\"allowFullScreen\":case\"async\":case\"autoPlay\":case\"controls\":case\"default\":case\"defer\":case\"disabled\":case\"disablePictureInPicture\":case\"disableRemotePlayback\":case\"formNoValidate\":case\"hidden\":case\"loop\":case\"noModule\":case\"noValidate\":case\"open\":case\"playsInline\":case\"readOnly\":case\"required\":case\"reversed\":case\"scoped\":case\"seamless\":case\"itemScope\":l&&typeof l!=\"function\"&&typeof l!=\"symbol\"?e.setAttribute(n,\"\"):e.removeAttribute(n);break;case\"capture\":case\"download\":l===!0?e.setAttribute(n,\"\"):l!==!1&&l!=null&&typeof l!=\"function\"&&typeof l!=\"symbol\"?e.setAttribute(n,l):e.removeAttribute(n);break;case\"cols\":case\"rows\":case\"size\":case\"span\":l!=null&&typeof l!=\"function\"&&typeof l!=\"symbol\"&&!isNaN(l)&&1<=l?e.setAttribute(n,l):e.removeAttribute(n);break;case\"rowSpan\":case\"start\":l==null||typeof l==\"function\"||typeof l==\"symbol\"||isNaN(l)?e.removeAttribute(n):e.setAttribute(n,l);break;case\"popover\":ue(\"beforetoggle\",e),ue(\"toggle\",e),Pu(e,\"popover\",l);break;case\"xlinkActuate\":dn(e,\"http://www.w3.org/1999/xlink\",\"xlink:actuate\",l);break;case\"xlinkArcrole\":dn(e,\"http://www.w3.org/1999/xlink\",\"xlink:arcrole\",l);break;case\"xlinkRole\":dn(e,\"http://www.w3.org/1999/xlink\",\"xlink:role\",l);break;case\"xlinkShow\":dn(e,\"http://www.w3.org/1999/xlink\",\"xlink:show\",l);break;case\"xlinkTitle\":dn(e,\"http://www.w3.org/1999/xlink\",\"xlink:title\",l);break;case\"xlinkType\":dn(e,\"http://www.w3.org/1999/xlink\",\"xlink:type\",l);break;case\"xmlBase\":dn(e,\"http://www.w3.org/XML/1998/namespace\",\"xml:base\",l);break;case\"xmlLang\":dn(e,\"http://www.w3.org/XML/1998/namespace\",\"xml:lang\",l);break;case\"xmlSpace\":dn(e,\"http://www.w3.org/XML/1998/namespace\",\"xml:space\",l);break;case\"is\":Pu(e,\"is\",l);break;case\"innerText\":case\"textContent\":break;default:(!(2<n.length)||n[0]!==\"o\"&&n[0]!==\"O\"||n[1]!==\"n\"&&n[1]!==\"N\")&&(n=B1.get(n)||n,Pu(e,n,l))}}function tr(e,t,n,l,i,s){switch(n){case\"style\":Rd(e,l,s);break;case\"dangerouslySetInnerHTML\":if(l!=null){if(typeof l!=\"object\"||!(\"__html\"in l))throw Error(c(61));if(n=l.__html,n!=null){if(i.children!=null)throw Error(c(60));e.innerHTML=n}}break;case\"children\":typeof l==\"string\"?Xa(e,l):(typeof l==\"number\"||typeof l==\"bigint\")&&Xa(e,\"\"+l);break;case\"onScroll\":l!=null&&ue(\"scroll\",e);break;case\"onScrollEnd\":l!=null&&ue(\"scrollend\",e);break;case\"onClick\":l!=null&&(e.onclick=hn);break;case\"suppressContentEditableWarning\":case\"suppressHydrationWarning\":case\"innerHTML\":case\"ref\":break;case\"innerText\":case\"textContent\":break;default:if(!yd.hasOwnProperty(n))e:{if(n[0]===\"o\"&&n[1]===\"n\"&&(i=n.endsWith(\"Capture\"),t=n.slice(2,i?n.length-7:void 0),s=e[St]||null,s=s!=null?s[n]:null,typeof s==\"function\"&&e.removeEventListener(t,s,i),typeof l==\"function\")){typeof s!=\"function\"&&s!==null&&(n in e?e[n]=null:e.hasAttribute(n)&&e.removeAttribute(n)),e.addEventListener(t,l,i);break e}n in e?e[n]=l:l===!0?e.setAttribute(n,\"\"):Pu(e,n,l)}}}function ft(e,t,n){switch(t){case\"div\":case\"span\":case\"svg\":case\"path\":case\"a\":case\"g\":case\"p\":case\"li\":break;case\"img\":ue(\"error\",e),ue(\"load\",e);var l=!1,i=!1,s;for(s in n)if(n.hasOwnProperty(s)){var f=n[s];if(f!=null)switch(s){case\"src\":l=!0;break;case\"srcSet\":i=!0;break;case\"children\":case\"dangerouslySetInnerHTML\":throw Error(c(137,t));default:Ae(e,t,s,f,n,null)}}i&&Ae(e,t,\"srcSet\",n.srcSet,n,null),l&&Ae(e,t,\"src\",n.src,n,null);return;case\"input\":ue(\"invalid\",e);var h=s=f=i=null,y=null,A=null;for(l in n)if(n.hasOwnProperty(l)){var C=n[l];if(C!=null)switch(l){case\"name\":i=C;break;case\"type\":f=C;break;case\"checked\":y=C;break;case\"defaultChecked\":A=C;break;case\"value\":s=C;break;case\"defaultValue\":h=C;break;case\"children\":case\"dangerouslySetInnerHTML\":if(C!=null)throw Error(c(137,t));break;default:Ae(e,t,l,C,n,null)}}Td(e,s,h,y,A,f,i,!1);return;case\"select\":ue(\"invalid\",e),l=f=s=null;for(i in n)if(n.hasOwnProperty(i)&&(h=n[i],h!=null))switch(i){case\"value\":s=h;break;case\"defaultValue\":f=h;break;case\"multiple\":l=h;default:Ae(e,t,i,h,n,null)}t=s,n=f,e.multiple=!!l,t!=null?Qa(e,!!l,t,!1):n!=null&&Qa(e,!!l,n,!0);return;case\"textarea\":ue(\"invalid\",e),s=i=l=null;for(f in n)if(n.hasOwnProperty(f)&&(h=n[f],h!=null))switch(f){case\"value\":l=h;break;case\"defaultValue\":i=h;break;case\"children\":s=h;break;case\"dangerouslySetInnerHTML\":if(h!=null)throw Error(c(91));break;default:Ae(e,t,f,h,n,null)}Od(e,l,i,s);return;case\"option\":for(y in n)if(n.hasOwnProperty(y)&&(l=n[y],l!=null))switch(y){case\"selected\":e.selected=l&&typeof l!=\"function\"&&typeof l!=\"symbol\";break;default:Ae(e,t,y,l,n,null)}return;case\"dialog\":ue(\"beforetoggle\",e),ue(\"toggle\",e),ue(\"cancel\",e),ue(\"close\",e);break;case\"iframe\":case\"object\":ue(\"load\",e);break;case\"video\":case\"audio\":for(l=0;l<bu.length;l++)ue(bu[l],e);break;case\"image\":ue(\"error\",e),ue(\"load\",e);break;case\"details\":ue(\"toggle\",e);break;case\"embed\":case\"source\":case\"link\":ue(\"error\",e),ue(\"load\",e);case\"area\":case\"base\":case\"br\":case\"col\":case\"hr\":case\"keygen\":case\"meta\":case\"param\":case\"track\":case\"wbr\":case\"menuitem\":for(A in n)if(n.hasOwnProperty(A)&&(l=n[A],l!=null))switch(A){case\"children\":case\"dangerouslySetInnerHTML\":throw Error(c(137,t));default:Ae(e,t,A,l,n,null)}return;default:if(pc(t)){for(C in n)n.hasOwnProperty(C)&&(l=n[C],l!==void 0&&tr(e,t,C,l,n,void 0));return}}for(h in n)n.hasOwnProperty(h)&&(l=n[h],l!=null&&Ae(e,t,h,l,n,null))}function hT(e,t,n,l){switch(t){case\"div\":case\"span\":case\"svg\":case\"path\":case\"a\":case\"g\":case\"p\":case\"li\":break;case\"input\":var i=null,s=null,f=null,h=null,y=null,A=null,C=null;for(N in n){var q=n[N];if(n.hasOwnProperty(N)&&q!=null)switch(N){case\"checked\":break;case\"value\":break;case\"defaultValue\":y=q;default:l.hasOwnProperty(N)||Ae(e,t,N,null,l,q)}}for(var M in l){var N=l[M];if(q=n[M],l.hasOwnProperty(M)&&(N!=null||q!=null))switch(M){case\"type\":s=N;break;case\"name\":i=N;break;case\"checked\":A=N;break;case\"defaultChecked\":C=N;break;case\"value\":f=N;break;case\"defaultValue\":h=N;break;case\"children\":case\"dangerouslySetInnerHTML\":if(N!=null)throw Error(c(137,t));break;default:N!==q&&Ae(e,t,M,N,l,q)}}hc(e,f,h,y,A,C,s,i);return;case\"select\":N=f=h=M=null;for(s in n)if(y=n[s],n.hasOwnProperty(s)&&y!=null)switch(s){case\"value\":break;case\"multiple\":N=y;default:l.hasOwnProperty(s)||Ae(e,t,s,null,l,y)}for(i in l)if(s=l[i],y=n[i],l.hasOwnProperty(i)&&(s!=null||y!=null))switch(i){case\"value\":M=s;break;case\"defaultValue\":h=s;break;case\"multiple\":f=s;default:s!==y&&Ae(e,t,i,s,l,y)}t=h,n=f,l=N,M!=null?Qa(e,!!n,M,!1):!!l!=!!n&&(t!=null?Qa(e,!!n,t,!0):Qa(e,!!n,n?[]:\"\",!1));return;case\"textarea\":N=M=null;for(h in n)if(i=n[h],n.hasOwnProperty(h)&&i!=null&&!l.hasOwnProperty(h))switch(h){case\"value\":break;case\"children\":break;default:Ae(e,t,h,null,l,i)}for(f in l)if(i=l[f],s=n[f],l.hasOwnProperty(f)&&(i!=null||s!=null))switch(f){case\"value\":M=i;break;case\"defaultValue\":N=i;break;case\"children\":break;case\"dangerouslySetInnerHTML\":if(i!=null)throw Error(c(91));break;default:i!==s&&Ae(e,t,f,i,l,s)}Ed(e,M,N);return;case\"option\":for(var Y in n)if(M=n[Y],n.hasOwnProperty(Y)&&M!=null&&!l.hasOwnProperty(Y))switch(Y){case\"selected\":e.selected=!1;break;default:Ae(e,t,Y,null,l,M)}for(y in l)if(M=l[y],N=n[y],l.hasOwnProperty(y)&&M!==N&&(M!=null||N!=null))switch(y){case\"selected\":e.selected=M&&typeof M!=\"function\"&&typeof M!=\"symbol\";break;default:Ae(e,t,y,M,l,N)}return;case\"img\":case\"link\":case\"area\":case\"base\":case\"br\":case\"col\":case\"embed\":case\"hr\":case\"keygen\":case\"meta\":case\"param\":case\"source\":case\"track\":case\"wbr\":case\"menuitem\":for(var K in n)M=n[K],n.hasOwnProperty(K)&&M!=null&&!l.hasOwnProperty(K)&&Ae(e,t,K,null,l,M);for(A in l)if(M=l[A],N=n[A],l.hasOwnProperty(A)&&M!==N&&(M!=null||N!=null))switch(A){case\"children\":case\"dangerouslySetInnerHTML\":if(M!=null)throw Error(c(137,t));break;default:Ae(e,t,A,M,l,N)}return;default:if(pc(t)){for(var Re in n)M=n[Re],n.hasOwnProperty(Re)&&M!==void 0&&!l.hasOwnProperty(Re)&&tr(e,t,Re,void 0,l,M);for(C in l)M=l[C],N=n[C],!l.hasOwnProperty(C)||M===N||M===void 0&&N===void 0||tr(e,t,C,M,l,N);return}}for(var S in n)M=n[S],n.hasOwnProperty(S)&&M!=null&&!l.hasOwnProperty(S)&&Ae(e,t,S,null,l,M);for(q in l)M=l[q],N=n[q],!l.hasOwnProperty(q)||M===N||M==null&&N==null||Ae(e,t,q,M,l,N)}function Mp(e){switch(e){case\"css\":case\"script\":case\"font\":case\"img\":case\"image\":case\"input\":case\"link\":return!0;default:return!1}}function mT(){if(typeof performance.getEntriesByType==\"function\"){for(var e=0,t=0,n=performance.getEntriesByType(\"resource\"),l=0;l<n.length;l++){var i=n[l],s=i.transferSize,f=i.initiatorType,h=i.duration;if(s&&h&&Mp(f)){for(f=0,h=i.responseEnd,l+=1;l<n.length;l++){var y=n[l],A=y.startTime;if(A>h)break;var C=y.transferSize,q=y.initiatorType;C&&Mp(q)&&(y=y.responseEnd,f+=C*(y<h?1:(h-A)/(y-A)))}if(--l,t+=8*(s+f)/(i.duration/1e3),e++,10<e)break}}if(0<e)return t/e/1e6}return navigator.connection&&(e=navigator.connection.downlink,typeof e==\"number\")?e:5}var nr=null,ar=null;function Wi(e){return e.nodeType===9?e:e.ownerDocument}function wp(e){switch(e){case\"http://www.w3.org/2000/svg\":return 1;case\"http://www.w3.org/1998/Math/MathML\":return 2;default:return 0}}function Np(e,t){if(e===0)switch(t){case\"svg\":return 1;case\"math\":return 2;default:return 0}return e===1&&t===\"foreignObject\"?0:e}function lr(e,t){return e===\"textarea\"||e===\"noscript\"||typeof t.children==\"string\"||typeof t.children==\"number\"||typeof t.children==\"bigint\"||typeof t.dangerouslySetInnerHTML==\"object\"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var ur=null;function pT(){var e=window.event;return e&&e.type===\"popstate\"?e===ur?!1:(ur=e,!0):(ur=null,!1)}var Cp=typeof setTimeout==\"function\"?setTimeout:void 0,gT=typeof clearTimeout==\"function\"?clearTimeout:void 0,Dp=typeof Promise==\"function\"?Promise:void 0,vT=typeof queueMicrotask==\"function\"?queueMicrotask:typeof Dp<\"u\"?function(e){return Dp.resolve(null).then(e).catch(yT)}:Cp;function yT(e){setTimeout(function(){throw e})}function ea(e){return e===\"head\"}function Up(e,t){var n=t,l=0;do{var i=n.nextSibling;if(e.removeChild(n),i&&i.nodeType===8)if(n=i.data,n===\"/$\"||n===\"/&\"){if(l===0){e.removeChild(i),zl(t);return}l--}else if(n===\"$\"||n===\"$?\"||n===\"$~\"||n===\"$!\"||n===\"&\")l++;else if(n===\"html\")zu(e.ownerDocument.documentElement);else if(n===\"head\"){n=e.ownerDocument.head,zu(n);for(var s=n.firstChild;s;){var f=s.nextSibling,h=s.nodeName;s[Bl]||h===\"SCRIPT\"||h===\"STYLE\"||h===\"LINK\"&&s.rel.toLowerCase()===\"stylesheet\"||n.removeChild(s),s=f}}else n===\"body\"&&zu(e.ownerDocument.body);n=i}while(n);zl(t)}function Zp(e,t){var n=e;e=0;do{var l=n.nextSibling;if(n.nodeType===1?t?(n._stashedDisplay=n.style.display,n.style.display=\"none\"):(n.style.display=n._stashedDisplay||\"\",n.getAttribute(\"style\")===\"\"&&n.removeAttribute(\"style\")):n.nodeType===3&&(t?(n._stashedText=n.nodeValue,n.nodeValue=\"\"):n.nodeValue=n._stashedText||\"\"),l&&l.nodeType===8)if(n=l.data,n===\"/$\"){if(e===0)break;e--}else n!==\"$\"&&n!==\"$?\"&&n!==\"$~\"&&n!==\"$!\"||e++;n=l}while(n)}function ir(e){var t=e.firstChild;for(t&&t.nodeType===10&&(t=t.nextSibling);t;){var n=t;switch(t=t.nextSibling,n.nodeName){case\"HTML\":case\"HEAD\":case\"BODY\":ir(n),fc(n);continue;case\"SCRIPT\":case\"STYLE\":continue;case\"LINK\":if(n.rel.toLowerCase()===\"stylesheet\")continue}e.removeChild(n)}}function _T(e,t,n,l){for(;e.nodeType===1;){var i=n;if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!l&&(e.nodeName!==\"INPUT\"||e.type!==\"hidden\"))break}else if(l){if(!e[Bl])switch(t){case\"meta\":if(!e.hasAttribute(\"itemprop\"))break;return e;case\"link\":if(s=e.getAttribute(\"rel\"),s===\"stylesheet\"&&e.hasAttribute(\"data-precedence\"))break;if(s!==i.rel||e.getAttribute(\"href\")!==(i.href==null||i.href===\"\"?null:i.href)||e.getAttribute(\"crossorigin\")!==(i.crossOrigin==null?null:i.crossOrigin)||e.getAttribute(\"title\")!==(i.title==null?null:i.title))break;return e;case\"style\":if(e.hasAttribute(\"data-precedence\"))break;return e;case\"script\":if(s=e.getAttribute(\"src\"),(s!==(i.src==null?null:i.src)||e.getAttribute(\"type\")!==(i.type==null?null:i.type)||e.getAttribute(\"crossorigin\")!==(i.crossOrigin==null?null:i.crossOrigin))&&s&&e.hasAttribute(\"async\")&&!e.hasAttribute(\"itemprop\"))break;return e;default:return e}}else if(t===\"input\"&&e.type===\"hidden\"){var s=i.name==null?null:\"\"+i.name;if(i.type===\"hidden\"&&e.getAttribute(\"name\")===s)return e}else return e;if(e=Ft(e.nextSibling),e===null)break}return null}function bT(e,t,n){if(t===\"\")return null;for(;e.nodeType!==3;)if((e.nodeType!==1||e.nodeName!==\"INPUT\"||e.type!==\"hidden\")&&!n||(e=Ft(e.nextSibling),e===null))return null;return e}function qp(e,t){for(;e.nodeType!==8;)if((e.nodeType!==1||e.nodeName!==\"INPUT\"||e.type!==\"hidden\")&&!t||(e=Ft(e.nextSibling),e===null))return null;return e}function or(e){return e.data===\"$?\"||e.data===\"$~\"}function cr(e){return e.data===\"$!\"||e.data===\"$?\"&&e.ownerDocument.readyState!==\"loading\"}function ST(e,t){var n=e.ownerDocument;if(e.data===\"$~\")e._reactRetry=t;else if(e.data!==\"$?\"||n.readyState!==\"loading\")t();else{var l=function(){t(),n.removeEventListener(\"DOMContentLoaded\",l)};n.addEventListener(\"DOMContentLoaded\",l),e._reactRetry=l}}function Ft(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t===\"$\"||t===\"$!\"||t===\"$?\"||t===\"$~\"||t===\"&\"||t===\"F!\"||t===\"F\")break;if(t===\"/$\"||t===\"/&\")return null}}return e}var sr=null;function xp(e){e=e.nextSibling;for(var t=0;e;){if(e.nodeType===8){var n=e.data;if(n===\"/$\"||n===\"/&\"){if(t===0)return Ft(e.nextSibling);t--}else n!==\"$\"&&n!==\"$!\"&&n!==\"$?\"&&n!==\"$~\"&&n!==\"&\"||t++}e=e.nextSibling}return null}function kp(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var n=e.data;if(n===\"$\"||n===\"$!\"||n===\"$?\"||n===\"$~\"||n===\"&\"){if(t===0)return e;t--}else n!==\"/$\"&&n!==\"/&\"||t++}e=e.previousSibling}return null}function Hp(e,t,n){switch(t=Wi(n),e){case\"html\":if(e=t.documentElement,!e)throw Error(c(452));return e;case\"head\":if(e=t.head,!e)throw Error(c(453));return e;case\"body\":if(e=t.body,!e)throw Error(c(454));return e;default:throw Error(c(451))}}function zu(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[0]);fc(e)}var Pt=new Map,jp=new Set;function Fi(e){return typeof e.getRootNode==\"function\"?e.getRootNode():e.nodeType===9?e:e.ownerDocument}var wn=j.d;j.d={f:zT,r:TT,D:ET,C:OT,L:AT,m:RT,X:wT,S:MT,M:NT};function zT(){var e=wn.f(),t=Gi();return e||t}function TT(e){var t=Ya(e);t!==null&&t.tag===5&&t.type===\"form\"?nm(t):wn.r(e)}var _l=typeof document>\"u\"?null:document;function Bp(e,t,n){var l=_l;if(l&&typeof t==\"string\"&&t){var i=Xt(t);i='link[rel=\"'+e+'\"][href=\"'+i+'\"]',typeof n==\"string\"&&(i+='[crossorigin=\"'+n+'\"]'),jp.has(i)||(jp.add(i),e={rel:e,crossOrigin:n,href:t},l.querySelector(i)===null&&(t=l.createElement(\"link\"),ft(t,\"link\",e),nt(t),l.head.appendChild(t)))}}function ET(e){wn.D(e),Bp(\"dns-prefetch\",e,null)}function OT(e,t){wn.C(e,t),Bp(\"preconnect\",e,t)}function AT(e,t,n){wn.L(e,t,n);var l=_l;if(l&&e&&t){var i='link[rel=\"preload\"][as=\"'+Xt(t)+'\"]';t===\"image\"&&n&&n.imageSrcSet?(i+='[imagesrcset=\"'+Xt(n.imageSrcSet)+'\"]',typeof n.imageSizes==\"string\"&&(i+='[imagesizes=\"'+Xt(n.imageSizes)+'\"]')):i+='[href=\"'+Xt(e)+'\"]';var s=i;switch(t){case\"style\":s=bl(e);break;case\"script\":s=Sl(e)}Pt.has(s)||(e=T({rel:\"preload\",href:t===\"image\"&&n&&n.imageSrcSet?void 0:e,as:t},n),Pt.set(s,e),l.querySelector(i)!==null||t===\"style\"&&l.querySelector(Tu(s))||t===\"script\"&&l.querySelector(Eu(s))||(t=l.createElement(\"link\"),ft(t,\"link\",e),nt(t),l.head.appendChild(t)))}}function RT(e,t){wn.m(e,t);var n=_l;if(n&&e){var l=t&&typeof t.as==\"string\"?t.as:\"script\",i='link[rel=\"modulepreload\"][as=\"'+Xt(l)+'\"][href=\"'+Xt(e)+'\"]',s=i;switch(l){case\"audioworklet\":case\"paintworklet\":case\"serviceworker\":case\"sharedworker\":case\"worker\":case\"script\":s=Sl(e)}if(!Pt.has(s)&&(e=T({rel:\"modulepreload\",href:e},t),Pt.set(s,e),n.querySelector(i)===null)){switch(l){case\"audioworklet\":case\"paintworklet\":case\"serviceworker\":case\"sharedworker\":case\"worker\":case\"script\":if(n.querySelector(Eu(s)))return}l=n.createElement(\"link\"),ft(l,\"link\",e),nt(l),n.head.appendChild(l)}}}function MT(e,t,n){wn.S(e,t,n);var l=_l;if(l&&e){var i=La(l).hoistableStyles,s=bl(e);t=t||\"default\";var f=i.get(s);if(!f){var h={loading:0,preload:null};if(f=l.querySelector(Tu(s)))h.loading=5;else{e=T({rel:\"stylesheet\",href:e,\"data-precedence\":t},n),(n=Pt.get(s))&&rr(e,n);var y=f=l.createElement(\"link\");nt(y),ft(y,\"link\",e),y._p=new Promise(function(A,C){y.onload=A,y.onerror=C}),y.addEventListener(\"load\",function(){h.loading|=1}),y.addEventListener(\"error\",function(){h.loading|=2}),h.loading|=4,Pi(f,t,l)}f={type:\"stylesheet\",instance:f,count:1,state:h},i.set(s,f)}}}function wT(e,t){wn.X(e,t);var n=_l;if(n&&e){var l=La(n).hoistableScripts,i=Sl(e),s=l.get(i);s||(s=n.querySelector(Eu(i)),s||(e=T({src:e,async:!0},t),(t=Pt.get(i))&&fr(e,t),s=n.createElement(\"script\"),nt(s),ft(s,\"link\",e),n.head.appendChild(s)),s={type:\"script\",instance:s,count:1,state:null},l.set(i,s))}}function NT(e,t){wn.M(e,t);var n=_l;if(n&&e){var l=La(n).hoistableScripts,i=Sl(e),s=l.get(i);s||(s=n.querySelector(Eu(i)),s||(e=T({src:e,async:!0,type:\"module\"},t),(t=Pt.get(i))&&fr(e,t),s=n.createElement(\"script\"),nt(s),ft(s,\"link\",e),n.head.appendChild(s)),s={type:\"script\",instance:s,count:1,state:null},l.set(i,s))}}function Yp(e,t,n,l){var i=(i=ae.current)?Fi(i):null;if(!i)throw Error(c(446));switch(e){case\"meta\":case\"title\":return null;case\"style\":return typeof n.precedence==\"string\"&&typeof n.href==\"string\"?(t=bl(n.href),n=La(i).hoistableStyles,l=n.get(t),l||(l={type:\"style\",instance:null,count:0,state:null},n.set(t,l)),l):{type:\"void\",instance:null,count:0,state:null};case\"link\":if(n.rel===\"stylesheet\"&&typeof n.href==\"string\"&&typeof n.precedence==\"string\"){e=bl(n.href);var s=La(i).hoistableStyles,f=s.get(e);if(f||(i=i.ownerDocument||i,f={type:\"stylesheet\",instance:null,count:0,state:{loading:0,preload:null}},s.set(e,f),(s=i.querySelector(Tu(e)))&&!s._p&&(f.instance=s,f.state.loading=5),Pt.has(e)||(n={rel:\"preload\",as:\"style\",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},Pt.set(e,n),s||CT(i,e,n,f.state))),t&&l===null)throw Error(c(528,\"\"));return f}if(t&&l!==null)throw Error(c(529,\"\"));return null;case\"script\":return t=n.async,n=n.src,typeof n==\"string\"&&t&&typeof t!=\"function\"&&typeof t!=\"symbol\"?(t=Sl(n),n=La(i).hoistableScripts,l=n.get(t),l||(l={type:\"script\",instance:null,count:0,state:null},n.set(t,l)),l):{type:\"void\",instance:null,count:0,state:null};default:throw Error(c(444,e))}}function bl(e){return'href=\"'+Xt(e)+'\"'}function Tu(e){return'link[rel=\"stylesheet\"]['+e+\"]\"}function Lp(e){return T({},e,{\"data-precedence\":e.precedence,precedence:null})}function CT(e,t,n,l){e.querySelector('link[rel=\"preload\"][as=\"style\"]['+t+\"]\")?l.loading=1:(t=e.createElement(\"link\"),l.preload=t,t.addEventListener(\"load\",function(){return l.loading|=1}),t.addEventListener(\"error\",function(){return l.loading|=2}),ft(t,\"link\",n),nt(t),e.head.appendChild(t))}function Sl(e){return'[src=\"'+Xt(e)+'\"]'}function Eu(e){return\"script[async]\"+e}function Gp(e,t,n){if(t.count++,t.instance===null)switch(t.type){case\"style\":var l=e.querySelector('style[data-href~=\"'+Xt(n.href)+'\"]');if(l)return t.instance=l,nt(l),l;var i=T({},n,{\"data-href\":n.href,\"data-precedence\":n.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement(\"style\"),nt(l),ft(l,\"style\",i),Pi(l,n.precedence,e),t.instance=l;case\"stylesheet\":i=bl(n.href);var s=e.querySelector(Tu(i));if(s)return t.state.loading|=4,t.instance=s,nt(s),s;l=Lp(n),(i=Pt.get(i))&&rr(l,i),s=(e.ownerDocument||e).createElement(\"link\"),nt(s);var f=s;return f._p=new Promise(function(h,y){f.onload=h,f.onerror=y}),ft(s,\"link\",l),t.state.loading|=4,Pi(s,n.precedence,e),t.instance=s;case\"script\":return s=Sl(n.src),(i=e.querySelector(Eu(s)))?(t.instance=i,nt(i),i):(l=n,(i=Pt.get(s))&&(l=T({},n),fr(l,i)),e=e.ownerDocument||e,i=e.createElement(\"script\"),nt(i),ft(i,\"link\",l),e.head.appendChild(i),t.instance=i);case\"void\":return null;default:throw Error(c(443,t.type))}else t.type===\"stylesheet\"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,Pi(l,n.precedence,e));return t.instance}function Pi(e,t,n){for(var l=n.querySelectorAll('link[rel=\"stylesheet\"][data-precedence],style[data-precedence]'),i=l.length?l[l.length-1]:null,s=i,f=0;f<l.length;f++){var h=l[f];if(h.dataset.precedence===t)s=h;else if(s!==i)break}s?s.parentNode.insertBefore(e,s.nextSibling):(t=n.nodeType===9?n.head:n,t.insertBefore(e,t.firstChild))}function rr(e,t){e.crossOrigin==null&&(e.crossOrigin=t.crossOrigin),e.referrerPolicy==null&&(e.referrerPolicy=t.referrerPolicy),e.title==null&&(e.title=t.title)}function fr(e,t){e.crossOrigin==null&&(e.crossOrigin=t.crossOrigin),e.referrerPolicy==null&&(e.referrerPolicy=t.referrerPolicy),e.integrity==null&&(e.integrity=t.integrity)}var eo=null;function Qp(e,t,n){if(eo===null){var l=new Map,i=eo=new Map;i.set(n,l)}else i=eo,l=i.get(n),l||(l=new Map,i.set(n,l));if(l.has(e))return l;for(l.set(e,null),n=n.getElementsByTagName(e),i=0;i<n.length;i++){var s=n[i];if(!(s[Bl]||s[ot]||e===\"link\"&&s.getAttribute(\"rel\")===\"stylesheet\")&&s.namespaceURI!==\"http://www.w3.org/2000/svg\"){var f=s.getAttribute(t)||\"\";f=e+f;var h=l.get(f);h?h.push(s):l.set(f,[s])}}return l}function Xp(e,t,n){e=e.ownerDocument||e,e.head.insertBefore(n,t===\"title\"?e.querySelector(\"head > title\"):null)}function DT(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case\"meta\":case\"title\":return!0;case\"style\":if(typeof t.precedence!=\"string\"||typeof t.href!=\"string\"||t.href===\"\")break;return!0;case\"link\":if(typeof t.rel!=\"string\"||typeof t.href!=\"string\"||t.href===\"\"||t.onLoad||t.onError)break;switch(t.rel){case\"stylesheet\":return e=t.disabled,typeof t.precedence==\"string\"&&e==null;default:return!0}case\"script\":if(t.async&&typeof t.async!=\"function\"&&typeof t.async!=\"symbol\"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==\"string\")return!0}return!1}function Vp(e){return!(e.type===\"stylesheet\"&&(e.state.loading&3)===0)}function UT(e,t,n,l){if(n.type===\"stylesheet\"&&(typeof l.media!=\"string\"||matchMedia(l.media).matches!==!1)&&(n.state.loading&4)===0){if(n.instance===null){var i=bl(l.href),s=t.querySelector(Tu(i));if(s){t=s._p,t!==null&&typeof t==\"object\"&&typeof t.then==\"function\"&&(e.count++,e=to.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=s,nt(s);return}s=t.ownerDocument||t,l=Lp(l),(i=Pt.get(i))&&rr(l,i),s=s.createElement(\"link\"),nt(s);var f=s;f._p=new Promise(function(h,y){f.onload=h,f.onerror=y}),ft(s,\"link\",l),n.instance=s}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&(n.state.loading&3)===0&&(e.count++,n=to.bind(e),t.addEventListener(\"load\",n),t.addEventListener(\"error\",n))}}var dr=0;function ZT(e,t){return e.stylesheets&&e.count===0&&ao(e,e.stylesheets),0<e.count||0<e.imgCount?function(n){var l=setTimeout(function(){if(e.stylesheets&&ao(e,e.stylesheets),e.unsuspend){var s=e.unsuspend;e.unsuspend=null,s()}},6e4+t);0<e.imgBytes&&dr===0&&(dr=62500*mT());var i=setTimeout(function(){if(e.waitingForImages=!1,e.count===0&&(e.stylesheets&&ao(e,e.stylesheets),e.unsuspend)){var s=e.unsuspend;e.unsuspend=null,s()}},(e.imgBytes>dr?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(i)}}:null}function to(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)ao(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var no=null;function ao(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,no=new Map,t.forEach(qT,e),no=null,to.call(e))}function qT(e,t){if(!(t.state.loading&4)){var n=no.get(e);if(n)var l=n.get(null);else{n=new Map,no.set(e,n);for(var i=e.querySelectorAll(\"link[data-precedence],style[data-precedence]\"),s=0;s<i.length;s++){var f=i[s];(f.nodeName===\"LINK\"||f.getAttribute(\"media\")!==\"not all\")&&(n.set(f.dataset.precedence,f),l=f)}l&&n.set(null,l)}i=t.instance,f=i.getAttribute(\"data-precedence\"),s=n.get(f)||l,s===l&&n.set(null,i),n.set(f,i),this.count++,l=to.bind(this),i.addEventListener(\"load\",l),i.addEventListener(\"error\",l),s?s.parentNode.insertBefore(i,s.nextSibling):(e=e.nodeType===9?e.head:e,e.insertBefore(i,e.firstChild)),t.state.loading|=4}}var Ou={$$typeof:Ne,Provider:null,Consumer:null,_currentValue:I,_currentValue2:I,_threadCount:0};function xT(e,t,n,l,i,s,f,h,y){this.tag=1,this.containerInfo=e,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=oc(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=oc(0),this.hiddenUpdates=oc(null),this.identifierPrefix=l,this.onUncaughtError=i,this.onCaughtError=s,this.onRecoverableError=f,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=y,this.incompleteTransitions=new Map}function $p(e,t,n,l,i,s,f,h,y,A,C,q){return e=new xT(e,t,n,f,y,A,C,q,h),t=1,s===!0&&(t|=24),s=qt(3,null,null,t),e.current=s,s.stateNode=e,t=Xc(),t.refCount++,e.pooledCache=t,t.refCount++,s.memoizedState={element:l,isDehydrated:n,cache:t},Kc(s),e}function Jp(e){return e?(e=Fa,e):Fa}function Kp(e,t,n,l,i,s){i=Jp(i),l.context===null?l.context=i:l.pendingContext=i,l=Gn(t),l.payload={element:n},s=s===void 0?null:s,s!==null&&(l.callback=s),n=Qn(e,l,t),n!==null&&(Rt(n,e,t),au(n,e,t))}function Ip(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var n=e.retryLane;e.retryLane=n!==0&&n<t?n:t}}function hr(e,t){Ip(e,t),(e=e.alternate)&&Ip(e,t)}function Wp(e){if(e.tag===13||e.tag===31){var t=ya(e,67108864);t!==null&&Rt(t,e,67108864),hr(e,67108864)}}function Fp(e){if(e.tag===13||e.tag===31){var t=Bt();t=cc(t);var n=ya(e,t);n!==null&&Rt(n,e,t),hr(e,t)}}var lo=!0;function kT(e,t,n,l){var i=U.T;U.T=null;var s=j.p;try{j.p=2,mr(e,t,n,l)}finally{j.p=s,U.T=i}}function HT(e,t,n,l){var i=U.T;U.T=null;var s=j.p;try{j.p=8,mr(e,t,n,l)}finally{j.p=s,U.T=i}}function mr(e,t,n,l){if(lo){var i=pr(l);if(i===null)er(e,t,l,uo,n),eg(e,l);else if(BT(i,e,t,n,l))l.stopPropagation();else if(eg(e,l),t&4&&-1<jT.indexOf(e)){for(;i!==null;){var s=Ya(i);if(s!==null)switch(s.tag){case 3:if(s=s.stateNode,s.current.memoizedState.isDehydrated){var f=ha(s.pendingLanes);if(f!==0){var h=s;for(h.pendingLanes|=2,h.entangledLanes|=2;f;){var y=1<<31-Ut(f);h.entanglements[1]|=y,f&=~y}sn(s),(pe&6)===0&&(Yi=Ct()+500,_u(0))}}break;case 31:case 13:h=ya(s,2),h!==null&&Rt(h,s,2),Gi(),hr(s,2)}if(s=pr(l),s===null&&er(e,t,l,uo,n),s===i)break;i=s}i!==null&&l.stopPropagation()}else er(e,t,l,null,n)}}function pr(e){return e=vc(e),gr(e)}var uo=null;function gr(e){if(uo=null,e=Ba(e),e!==null){var t=d(e);if(t===null)e=null;else{var n=t.tag;if(n===13){if(e=m(t),e!==null)return e;e=null}else if(n===31){if(e=v(t),e!==null)return e;e=null}else if(n===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null)}}return uo=e,null}function Pp(e){switch(e){case\"beforetoggle\":case\"cancel\":case\"click\":case\"close\":case\"contextmenu\":case\"copy\":case\"cut\":case\"auxclick\":case\"dblclick\":case\"dragend\":case\"dragstart\":case\"drop\":case\"focusin\":case\"focusout\":case\"input\":case\"invalid\":case\"keydown\":case\"keypress\":case\"keyup\":case\"mousedown\":case\"mouseup\":case\"paste\":case\"pause\":case\"play\":case\"pointercancel\":case\"pointerdown\":case\"pointerup\":case\"ratechange\":case\"reset\":case\"resize\":case\"seeked\":case\"submit\":case\"toggle\":case\"touchcancel\":case\"touchend\":case\"touchstart\":case\"volumechange\":case\"change\":case\"selectionchange\":case\"textInput\":case\"compositionstart\":case\"compositionend\":case\"compositionupdate\":case\"beforeblur\":case\"afterblur\":case\"beforeinput\":case\"blur\":case\"fullscreenchange\":case\"focus\":case\"hashchange\":case\"popstate\":case\"select\":case\"selectstart\":return 2;case\"drag\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"mousemove\":case\"mouseout\":case\"mouseover\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"scroll\":case\"touchmove\":case\"wheel\":case\"mouseenter\":case\"mouseleave\":case\"pointerenter\":case\"pointerleave\":return 8;case\"message\":switch(E1()){case od:return 2;case cd:return 8;case Ju:case O1:return 32;case sd:return 268435456;default:return 32}default:return 32}}var vr=!1,ta=null,na=null,aa=null,Au=new Map,Ru=new Map,la=[],jT=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset\".split(\" \");function eg(e,t){switch(e){case\"focusin\":case\"focusout\":ta=null;break;case\"dragenter\":case\"dragleave\":na=null;break;case\"mouseover\":case\"mouseout\":aa=null;break;case\"pointerover\":case\"pointerout\":Au.delete(t.pointerId);break;case\"gotpointercapture\":case\"lostpointercapture\":Ru.delete(t.pointerId)}}function Mu(e,t,n,l,i,s){return e===null||e.nativeEvent!==s?(e={blockedOn:t,domEventName:n,eventSystemFlags:l,nativeEvent:s,targetContainers:[i]},t!==null&&(t=Ya(t),t!==null&&Wp(t)),e):(e.eventSystemFlags|=l,t=e.targetContainers,i!==null&&t.indexOf(i)===-1&&t.push(i),e)}function BT(e,t,n,l,i){switch(t){case\"focusin\":return ta=Mu(ta,e,t,n,l,i),!0;case\"dragenter\":return na=Mu(na,e,t,n,l,i),!0;case\"mouseover\":return aa=Mu(aa,e,t,n,l,i),!0;case\"pointerover\":var s=i.pointerId;return Au.set(s,Mu(Au.get(s)||null,e,t,n,l,i)),!0;case\"gotpointercapture\":return s=i.pointerId,Ru.set(s,Mu(Ru.get(s)||null,e,t,n,l,i)),!0}return!1}function tg(e){var t=Ba(e.target);if(t!==null){var n=d(t);if(n!==null){if(t=n.tag,t===13){if(t=m(n),t!==null){e.blockedOn=t,pd(e.priority,function(){Fp(n)});return}}else if(t===31){if(t=v(n),t!==null){e.blockedOn=t,pd(e.priority,function(){Fp(n)});return}}else if(t===3&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=n.tag===3?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function io(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var n=pr(e.nativeEvent);if(n===null){n=e.nativeEvent;var l=new n.constructor(n.type,n);gc=l,n.target.dispatchEvent(l),gc=null}else return t=Ya(n),t!==null&&Wp(t),e.blockedOn=n,!1;t.shift()}return!0}function ng(e,t,n){io(e)&&n.delete(t)}function YT(){vr=!1,ta!==null&&io(ta)&&(ta=null),na!==null&&io(na)&&(na=null),aa!==null&&io(aa)&&(aa=null),Au.forEach(ng),Ru.forEach(ng)}function oo(e,t){e.blockedOn===t&&(e.blockedOn=null,vr||(vr=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,YT)))}var co=null;function ag(e){co!==e&&(co=e,a.unstable_scheduleCallback(a.unstable_NormalPriority,function(){co===e&&(co=null);for(var t=0;t<e.length;t+=3){var n=e[t],l=e[t+1],i=e[t+2];if(typeof l!=\"function\"){if(gr(l||n)===null)continue;break}var s=Ya(n);s!==null&&(e.splice(t,3),t-=3,ps(s,{pending:!0,data:i,method:n.method,action:l},l,i))}}))}function zl(e){function t(y){return oo(y,e)}ta!==null&&oo(ta,e),na!==null&&oo(na,e),aa!==null&&oo(aa,e),Au.forEach(t),Ru.forEach(t);for(var n=0;n<la.length;n++){var l=la[n];l.blockedOn===e&&(l.blockedOn=null)}for(;0<la.length&&(n=la[0],n.blockedOn===null);)tg(n),n.blockedOn===null&&la.shift();if(n=(e.ownerDocument||e).$$reactFormReplay,n!=null)for(l=0;l<n.length;l+=3){var i=n[l],s=n[l+1],f=i[St]||null;if(typeof s==\"function\")f||ag(n);else if(f){var h=null;if(s&&s.hasAttribute(\"formAction\")){if(i=s,f=s[St]||null)h=f.formAction;else if(gr(i)!==null)continue}else h=f.action;typeof h==\"function\"?n[l+1]=h:(n.splice(l,3),l-=3),ag(n)}}}function lg(){function e(s){s.canIntercept&&s.info===\"react-transition\"&&s.intercept({handler:function(){return new Promise(function(f){return i=f})},focusReset:\"manual\",scroll:\"manual\"})}function t(){i!==null&&(i(),i=null),l||setTimeout(n,20)}function n(){if(!l&&!navigation.transition){var s=navigation.currentEntry;s&&s.url!=null&&navigation.navigate(s.url,{state:s.getState(),info:\"react-transition\",history:\"replace\"})}}if(typeof navigation==\"object\"){var l=!1,i=null;return navigation.addEventListener(\"navigate\",e),navigation.addEventListener(\"navigatesuccess\",t),navigation.addEventListener(\"navigateerror\",t),setTimeout(n,100),function(){l=!0,navigation.removeEventListener(\"navigate\",e),navigation.removeEventListener(\"navigatesuccess\",t),navigation.removeEventListener(\"navigateerror\",t),i!==null&&(i(),i=null)}}}function yr(e){this._internalRoot=e}so.prototype.render=yr.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(c(409));var n=t.current,l=Bt();Kp(n,l,e,t,null,null)},so.prototype.unmount=yr.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;Kp(e.current,2,null,e,null,null),Gi(),t[ja]=null}};function so(e){this._internalRoot=e}so.prototype.unstable_scheduleHydration=function(e){if(e){var t=md();e={blockedOn:null,target:e,priority:t};for(var n=0;n<la.length&&t!==0&&t<la[n].priority;n++);la.splice(n,0,e),n===0&&tg(e)}};var ug=u.version;if(ug!==\"19.2.3\")throw Error(c(527,ug,\"19.2.3\"));j.findDOMNode=function(e){var t=e._reactInternals;if(t===void 0)throw typeof e.render==\"function\"?Error(c(188)):(e=Object.keys(e).join(\",\"),Error(c(268,e)));return e=g(t),e=e!==null?z(e):null,e=e===null?null:e.stateNode,e};var LT={bundleType:0,version:\"19.2.3\",rendererPackageName:\"react-dom\",currentDispatcherRef:U,reconcilerVersion:\"19.2.3\"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<\"u\"){var ro=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ro.isDisabled&&ro.supportsFiber)try{kl=ro.inject(LT),Dt=ro}catch{}}return Tl.createRoot=function(e,t){if(!r(e))throw Error(c(299));var n=!1,l=\"\",i=dm,s=hm,f=mm;return t!=null&&(t.unstable_strictMode===!0&&(n=!0),t.identifierPrefix!==void 0&&(l=t.identifierPrefix),t.onUncaughtError!==void 0&&(i=t.onUncaughtError),t.onCaughtError!==void 0&&(s=t.onCaughtError),t.onRecoverableError!==void 0&&(f=t.onRecoverableError)),t=$p(e,1,!1,null,null,n,l,null,i,s,f,lg),e[ja]=t.current,Ps(e),new yr(t)},Tl.hydrateRoot=function(e,t,n){if(!r(e))throw Error(c(299));var l=!1,i=\"\",s=dm,f=hm,h=mm,y=null;return n!=null&&(n.unstable_strictMode===!0&&(l=!0),n.identifierPrefix!==void 0&&(i=n.identifierPrefix),n.onUncaughtError!==void 0&&(s=n.onUncaughtError),n.onCaughtError!==void 0&&(f=n.onCaughtError),n.onRecoverableError!==void 0&&(h=n.onRecoverableError),n.formState!==void 0&&(y=n.formState)),t=$p(e,1,!0,t,n??null,l,i,y,s,f,h,lg),t.context=Jp(null),n=t.current,l=Bt(),l=cc(l),i=Gn(l),i.callback=null,Qn(n,i,l),n=l,t.current.lanes=n,jl(t,n),sn(t),e[ja]=t.current,Ps(e),new so(t)},Tl.version=\"19.2.3\",Tl}var Rr;function mg(){if(Rr)return fo.exports;Rr=1;function a(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>\"u\"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=\"function\"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(u){console.error(u)}}return a(),fo.exports=hg(),fo.exports}var pg=mg(),yo=go();function D(a,u,o){function c(v,p){if(v._zod||Object.defineProperty(v,\"_zod\",{value:{def:p,constr:m,traits:new Set},enumerable:!1}),v._zod.traits.has(a))return;v._zod.traits.add(a),u(v,p);const g=m.prototype,z=Object.keys(g);for(let T=0;T<z.length;T++){const k=z[T];k in v||(v[k]=g[k].bind(v))}}const r=(o==null?void 0:o.Parent)??Object;class d extends r{}Object.defineProperty(d,\"name\",{value:a});function m(v){var p;const g=o!=null&&o.Parent?new d:this;c(g,v),(p=g._zod).deferred??(p.deferred=[]);for(const z of g._zod.deferred)z();return g}return Object.defineProperty(m,\"init\",{value:c}),Object.defineProperty(m,Symbol.hasInstance,{value:v=>{var p,g;return o!=null&&o.Parent&&v instanceof o.Parent?!0:(g=(p=v==null?void 0:v._zod)==null?void 0:p.traits)==null?void 0:g.has(a)}}),Object.defineProperty(m,\"name\",{value:a}),m}class Ca extends Error{constructor(){super(\"Encountered Promise during synchronous parse. Use .parseAsync() instead.\")}}class Mr extends Error{constructor(u){super(`Encountered unidirectional transform during encode: ${u}`),this.name=\"ZodEncodeError\"}}const wr={};function Nn(a){return wr}function Nr(a){const u=Object.values(a).filter(c=>typeof c==\"number\");return Object.entries(a).filter(([c,r])=>u.indexOf(+c)===-1).map(([c,r])=>r)}function _o(a,u){return typeof u==\"bigint\"?u.toString():u}function wu(a){return{get value(){{const u=a();return Object.defineProperty(this,\"value\",{value:u}),u}}}}function bo(a){return a==null}function So(a){const u=a.startsWith(\"^\")?1:0,o=a.endsWith(\"$\")?a.length-1:a.length;return a.slice(u,o)}function gg(a,u){const o=(a.toString().split(\".\")[1]||\"\").length,c=u.toString();let r=(c.split(\".\")[1]||\"\").length;if(r===0&&/\\d?e-\\d?/.test(c)){const p=c.match(/\\d?e-(\\d?)/);p!=null&&p[1]&&(r=Number.parseInt(p[1]))}const d=o>r?o:r,m=Number.parseInt(a.toFixed(d).replace(\".\",\"\")),v=Number.parseInt(u.toFixed(d).replace(\".\",\"\"));return m%v/10**d}const Cr=Symbol(\"evaluating\");function ge(a,u,o){let c;Object.defineProperty(a,u,{get(){if(c!==Cr)return c===void 0&&(c=Cr,c=o()),c},set(r){Object.defineProperty(a,u,{value:r})},configurable:!0})}function oa(a,u,o){Object.defineProperty(a,u,{value:o,writable:!0,enumerable:!0,configurable:!0})}function Cn(...a){const u={};for(const o of a){const c=Object.getOwnPropertyDescriptors(o);Object.assign(u,c)}return Object.defineProperties({},u)}function Dr(a){return JSON.stringify(a)}function vg(a){return a.toLowerCase().trim().replace(/[^\\w\\s-]/g,\"\").replace(/[\\s_-]+/g,\"-\").replace(/^-+|-+$/g,\"\")}const Ur=\"captureStackTrace\"in Error?Error.captureStackTrace:(...a)=>{};function El(a){return typeof a==\"object\"&&a!==null&&!Array.isArray(a)}const yg=wu(()=>{var a;if(typeof navigator<\"u\"&&((a=navigator==null?void 0:navigator.userAgent)!=null&&a.includes(\"Cloudflare\")))return!1;try{const u=Function;return new u(\"\"),!0}catch{return!1}});function Da(a){if(El(a)===!1)return!1;const u=a.constructor;if(u===void 0||typeof u!=\"function\")return!0;const o=u.prototype;return!(El(o)===!1||Object.prototype.hasOwnProperty.call(o,\"isPrototypeOf\")===!1)}function Zr(a){return Da(a)?{...a}:Array.isArray(a)?[...a]:a}const _g=new Set([\"string\",\"number\",\"symbol\"]);function Ua(a){return a.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function Dn(a,u,o){const c=new a._zod.constr(u??a._zod.def);return(!u||o!=null&&o.parent)&&(c._zod.parent=a),c}function X(a){const u=a;if(!u)return{};if(typeof u==\"string\")return{error:()=>u};if((u==null?void 0:u.message)!==void 0){if((u==null?void 0:u.error)!==void 0)throw new Error(\"Cannot specify both `message` and `error` params\");u.error=u.message}return delete u.message,typeof u.error==\"string\"?{...u,error:()=>u.error}:u}function bg(a){return Object.keys(a).filter(u=>a[u]._zod.optin===\"optional\"&&a[u]._zod.optout===\"optional\")}const Sg={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function zg(a,u){const o=a._zod.def,c=o.checks;if(c&&c.length>0)throw new Error(\".pick() cannot be used on object schemas containing refinements\");const d=Cn(a._zod.def,{get shape(){const m={};for(const v in u){if(!(v in o.shape))throw new Error(`Unrecognized key: \"${v}\"`);u[v]&&(m[v]=o.shape[v])}return oa(this,\"shape\",m),m},checks:[]});return Dn(a,d)}function Tg(a,u){const o=a._zod.def,c=o.checks;if(c&&c.length>0)throw new Error(\".omit() cannot be used on object schemas containing refinements\");const d=Cn(a._zod.def,{get shape(){const m={...a._zod.def.shape};for(const v in u){if(!(v in o.shape))throw new Error(`Unrecognized key: \"${v}\"`);u[v]&&delete m[v]}return oa(this,\"shape\",m),m},checks:[]});return Dn(a,d)}function Eg(a,u){if(!Da(u))throw new Error(\"Invalid input to extend: expected a plain object\");const o=a._zod.def.checks;if(o&&o.length>0){const d=a._zod.def.shape;for(const m in u)if(Object.getOwnPropertyDescriptor(d,m)!==void 0)throw new Error(\"Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.\")}const r=Cn(a._zod.def,{get shape(){const d={...a._zod.def.shape,...u};return oa(this,\"shape\",d),d}});return Dn(a,r)}function Og(a,u){if(!Da(u))throw new Error(\"Invalid input to safeExtend: expected a plain object\");const o=Cn(a._zod.def,{get shape(){const c={...a._zod.def.shape,...u};return oa(this,\"shape\",c),c}});return Dn(a,o)}function Ag(a,u){const o=Cn(a._zod.def,{get shape(){const c={...a._zod.def.shape,...u._zod.def.shape};return oa(this,\"shape\",c),c},get catchall(){return u._zod.def.catchall},checks:[]});return Dn(a,o)}function Rg(a,u,o){const r=u._zod.def.checks;if(r&&r.length>0)throw new Error(\".partial() cannot be used on object schemas containing refinements\");const m=Cn(u._zod.def,{get shape(){const v=u._zod.def.shape,p={...v};if(o)for(const g in o){if(!(g in v))throw new Error(`Unrecognized key: \"${g}\"`);o[g]&&(p[g]=a?new a({type:\"optional\",innerType:v[g]}):v[g])}else for(const g in v)p[g]=a?new a({type:\"optional\",innerType:v[g]}):v[g];return oa(this,\"shape\",p),p},checks:[]});return Dn(u,m)}function Mg(a,u,o){const c=Cn(u._zod.def,{get shape(){const r=u._zod.def.shape,d={...r};if(o)for(const m in o){if(!(m in d))throw new Error(`Unrecognized key: \"${m}\"`);o[m]&&(d[m]=new a({type:\"nonoptional\",innerType:r[m]}))}else for(const m in r)d[m]=new a({type:\"nonoptional\",innerType:r[m]});return oa(this,\"shape\",d),d}});return Dn(u,c)}function Za(a,u=0){var o;if(a.aborted===!0)return!0;for(let c=u;c<a.issues.length;c++)if(((o=a.issues[c])==null?void 0:o.continue)!==!0)return!0;return!1}function qa(a,u){return u.map(o=>{var c;return(c=o).path??(c.path=[]),o.path.unshift(a),o})}function Nu(a){return typeof a==\"string\"?a:a==null?void 0:a.message}function Un(a,u,o){var r,d,m,v,p,g;const c={...a,path:a.path??[]};if(!a.message){const z=Nu((m=(d=(r=a.inst)==null?void 0:r._zod.def)==null?void 0:d.error)==null?void 0:m.call(d,a))??Nu((v=u==null?void 0:u.error)==null?void 0:v.call(u,a))??Nu((p=o.customError)==null?void 0:p.call(o,a))??Nu((g=o.localeError)==null?void 0:g.call(o,a))??\"Invalid input\";c.message=z}return delete c.inst,delete c.continue,u!=null&&u.reportInput||delete c.input,c}function zo(a){return Array.isArray(a)?\"array\":typeof a==\"string\"?\"string\":\"unknown\"}function Ol(...a){const[u,o,c]=a;return typeof u==\"string\"?{message:u,code:\"custom\",input:o,inst:c}:{...u}}const qr=(a,u)=>{a.name=\"$ZodError\",Object.defineProperty(a,\"_zod\",{value:a._zod,enumerable:!1}),Object.defineProperty(a,\"issues\",{value:u,enumerable:!1}),a.message=JSON.stringify(u,_o,2),Object.defineProperty(a,\"toString\",{value:()=>a.message,enumerable:!1})},xr=D(\"$ZodError\",qr),kr=D(\"$ZodError\",qr,{Parent:Error});function wg(a,u=o=>o.message){const o={},c=[];for(const r of a.issues)r.path.length>0?(o[r.path[0]]=o[r.path[0]]||[],o[r.path[0]].push(u(r))):c.push(u(r));return{formErrors:c,fieldErrors:o}}function Ng(a,u=o=>o.message){const o={_errors:[]},c=r=>{for(const d of r.issues)if(d.code===\"invalid_union\"&&d.errors.length)d.errors.map(m=>c({issues:m}));else if(d.code===\"invalid_key\")c({issues:d.issues});else if(d.code===\"invalid_element\")c({issues:d.issues});else if(d.path.length===0)o._errors.push(u(d));else{let m=o,v=0;for(;v<d.path.length;){const p=d.path[v];v===d.path.length-1?(m[p]=m[p]||{_errors:[]},m[p]._errors.push(u(d))):m[p]=m[p]||{_errors:[]},m=m[p],v++}}};return c(a),o}const To=a=>(u,o,c,r)=>{const d=c?Object.assign(c,{async:!1}):{async:!1},m=u._zod.run({value:o,issues:[]},d);if(m instanceof Promise)throw new Ca;if(m.issues.length){const v=new((r==null?void 0:r.Err)??a)(m.issues.map(p=>Un(p,d,Nn())));throw Ur(v,r==null?void 0:r.callee),v}return m.value},Eo=a=>async(u,o,c,r)=>{const d=c?Object.assign(c,{async:!0}):{async:!0};let m=u._zod.run({value:o,issues:[]},d);if(m instanceof Promise&&(m=await m),m.issues.length){const v=new((r==null?void 0:r.Err)??a)(m.issues.map(p=>Un(p,d,Nn())));throw Ur(v,r==null?void 0:r.callee),v}return m.value},Cu=a=>(u,o,c)=>{const r=c?{...c,async:!1}:{async:!1},d=u._zod.run({value:o,issues:[]},r);if(d instanceof Promise)throw new Ca;return d.issues.length?{success:!1,error:new(a??xr)(d.issues.map(m=>Un(m,r,Nn())))}:{success:!0,data:d.value}},Hr=Cu(kr),Du=a=>async(u,o,c)=>{const r=c?Object.assign(c,{async:!0}):{async:!0};let d=u._zod.run({value:o,issues:[]},r);return d instanceof Promise&&(d=await d),d.issues.length?{success:!1,error:new a(d.issues.map(m=>Un(m,r,Nn())))}:{success:!0,data:d.value}},Cg=Du(kr),Dg=a=>(u,o,c)=>{const r=c?Object.assign(c,{direction:\"backward\"}):{direction:\"backward\"};return To(a)(u,o,r)},Ug=a=>(u,o,c)=>To(a)(u,o,c),Zg=a=>async(u,o,c)=>{const r=c?Object.assign(c,{direction:\"backward\"}):{direction:\"backward\"};return Eo(a)(u,o,r)},qg=a=>async(u,o,c)=>Eo(a)(u,o,c),xg=a=>(u,o,c)=>{const r=c?Object.assign(c,{direction:\"backward\"}):{direction:\"backward\"};return Cu(a)(u,o,r)},kg=a=>(u,o,c)=>Cu(a)(u,o,c),Hg=a=>async(u,o,c)=>{const r=c?Object.assign(c,{direction:\"backward\"}):{direction:\"backward\"};return Du(a)(u,o,r)},jg=a=>async(u,o,c)=>Du(a)(u,o,c),Bg=/^[cC][^\\s-]{8,}$/,Yg=/^[0-9a-z]+$/,Lg=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,Gg=/^[0-9a-vA-V]{20}$/,Qg=/^[A-Za-z0-9]{27}$/,Xg=/^[a-zA-Z0-9_-]{21}$/,Vg=/^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$/,$g=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,jr=a=>a?new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${a}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,Jg=/^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/,Kg=\"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\";function Ig(){return new RegExp(Kg,\"u\")}const Wg=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Fg=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,Pg=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$/,ev=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,tv=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,Br=/^[A-Za-z0-9_-]*$/,nv=/^\\+[1-9]\\d{6,14}$/,Yr=\"(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))\",av=new RegExp(`^${Yr}$`);function Lr(a){const u=\"(?:[01]\\\\d|2[0-3]):[0-5]\\\\d\";return typeof a.precision==\"number\"?a.precision===-1?`${u}`:a.precision===0?`${u}:[0-5]\\\\d`:`${u}:[0-5]\\\\d\\\\.\\\\d{${a.precision}}`:`${u}(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?`}function lv(a){return new RegExp(`^${Lr(a)}$`)}function uv(a){const u=Lr({precision:a.precision}),o=[\"Z\"];a.local&&o.push(\"\"),a.offset&&o.push(\"([+-](?:[01]\\\\d|2[0-3]):[0-5]\\\\d)\");const c=`${u}(?:${o.join(\"|\")})`;return new RegExp(`^${Yr}T(?:${c})$`)}const iv=a=>{const u=a?`[\\\\s\\\\S]{${(a==null?void 0:a.minimum)??0},${(a==null?void 0:a.maximum)??\"\"}}`:\"[\\\\s\\\\S]*\";return new RegExp(`^${u}$`)},ov=/^-?\\d+$/,Gr=/^-?\\d+(?:\\.\\d+)?$/,cv=/^(?:true|false)$/i,sv=/^null$/i,rv=/^undefined$/i,fv=/^[^A-Z]*$/,dv=/^[^a-z]*$/,yt=D(\"$ZodCheck\",(a,u)=>{var o;a._zod??(a._zod={}),a._zod.def=u,(o=a._zod).onattach??(o.onattach=[])}),Qr={number:\"number\",bigint:\"bigint\",object:\"date\"},Xr=D(\"$ZodCheckLessThan\",(a,u)=>{yt.init(a,u);const o=Qr[typeof u.value];a._zod.onattach.push(c=>{const r=c._zod.bag,d=(u.inclusive?r.maximum:r.exclusiveMaximum)??Number.POSITIVE_INFINITY;u.value<d&&(u.inclusive?r.maximum=u.value:r.exclusiveMaximum=u.value)}),a._zod.check=c=>{(u.inclusive?c.value<=u.value:c.value<u.value)||c.issues.push({origin:o,code:\"too_big\",maximum:typeof u.value==\"object\"?u.value.getTime():u.value,input:c.value,inclusive:u.inclusive,inst:a,continue:!u.abort})}}),Vr=D(\"$ZodCheckGreaterThan\",(a,u)=>{yt.init(a,u);const o=Qr[typeof u.value];a._zod.onattach.push(c=>{const r=c._zod.bag,d=(u.inclusive?r.minimum:r.exclusiveMinimum)??Number.NEGATIVE_INFINITY;u.value>d&&(u.inclusive?r.minimum=u.value:r.exclusiveMinimum=u.value)}),a._zod.check=c=>{(u.inclusive?c.value>=u.value:c.value>u.value)||c.issues.push({origin:o,code:\"too_small\",minimum:typeof u.value==\"object\"?u.value.getTime():u.value,input:c.value,inclusive:u.inclusive,inst:a,continue:!u.abort})}}),hv=D(\"$ZodCheckMultipleOf\",(a,u)=>{yt.init(a,u),a._zod.onattach.push(o=>{var c;(c=o._zod.bag).multipleOf??(c.multipleOf=u.value)}),a._zod.check=o=>{if(typeof o.value!=typeof u.value)throw new Error(\"Cannot mix number and bigint in multiple_of check.\");(typeof o.value==\"bigint\"?o.value%u.value===BigInt(0):gg(o.value,u.value)===0)||o.issues.push({origin:typeof o.value,code:\"not_multiple_of\",divisor:u.value,input:o.value,inst:a,continue:!u.abort})}}),mv=D(\"$ZodCheckNumberFormat\",(a,u)=>{var m;yt.init(a,u),u.format=u.format||\"float64\";const o=(m=u.format)==null?void 0:m.includes(\"int\"),c=o?\"int\":\"number\",[r,d]=Sg[u.format];a._zod.onattach.push(v=>{const p=v._zod.bag;p.format=u.format,p.minimum=r,p.maximum=d,o&&(p.pattern=ov)}),a._zod.check=v=>{const p=v.value;if(o){if(!Number.isInteger(p)){v.issues.push({expected:c,format:u.format,code:\"invalid_type\",continue:!1,input:p,inst:a});return}if(!Number.isSafeInteger(p)){p>0?v.issues.push({input:p,code:\"too_big\",maximum:Number.MAX_SAFE_INTEGER,note:\"Integers must be within the safe integer range.\",inst:a,origin:c,inclusive:!0,continue:!u.abort}):v.issues.push({input:p,code:\"too_small\",minimum:Number.MIN_SAFE_INTEGER,note:\"Integers must be within the safe integer range.\",inst:a,origin:c,inclusive:!0,continue:!u.abort});return}}p<r&&v.issues.push({origin:\"number\",input:p,code:\"too_small\",minimum:r,inclusive:!0,inst:a,continue:!u.abort}),p>d&&v.issues.push({origin:\"number\",input:p,code:\"too_big\",maximum:d,inclusive:!0,inst:a,continue:!u.abort})}}),pv=D(\"$ZodCheckMaxLength\",(a,u)=>{var o;yt.init(a,u),(o=a._zod.def).when??(o.when=c=>{const r=c.value;return!bo(r)&&r.length!==void 0}),a._zod.onattach.push(c=>{const r=c._zod.bag.maximum??Number.POSITIVE_INFINITY;u.maximum<r&&(c._zod.bag.maximum=u.maximum)}),a._zod.check=c=>{const r=c.value;if(r.length<=u.maximum)return;const m=zo(r);c.issues.push({origin:m,code:\"too_big\",maximum:u.maximum,inclusive:!0,input:r,inst:a,continue:!u.abort})}}),gv=D(\"$ZodCheckMinLength\",(a,u)=>{var o;yt.init(a,u),(o=a._zod.def).when??(o.when=c=>{const r=c.value;return!bo(r)&&r.length!==void 0}),a._zod.onattach.push(c=>{const r=c._zod.bag.minimum??Number.NEGATIVE_INFINITY;u.minimum>r&&(c._zod.bag.minimum=u.minimum)}),a._zod.check=c=>{const r=c.value;if(r.length>=u.minimum)return;const m=zo(r);c.issues.push({origin:m,code:\"too_small\",minimum:u.minimum,inclusive:!0,input:r,inst:a,continue:!u.abort})}}),vv=D(\"$ZodCheckLengthEquals\",(a,u)=>{var o;yt.init(a,u),(o=a._zod.def).when??(o.when=c=>{const r=c.value;return!bo(r)&&r.length!==void 0}),a._zod.onattach.push(c=>{const r=c._zod.bag;r.minimum=u.length,r.maximum=u.length,r.length=u.length}),a._zod.check=c=>{const r=c.value,d=r.length;if(d===u.length)return;const m=zo(r),v=d>u.length;c.issues.push({origin:m,...v?{code:\"too_big\",maximum:u.length}:{code:\"too_small\",minimum:u.length},inclusive:!0,exact:!0,input:c.value,inst:a,continue:!u.abort})}}),Uu=D(\"$ZodCheckStringFormat\",(a,u)=>{var o,c;yt.init(a,u),a._zod.onattach.push(r=>{const d=r._zod.bag;d.format=u.format,u.pattern&&(d.patterns??(d.patterns=new Set),d.patterns.add(u.pattern))}),u.pattern?(o=a._zod).check??(o.check=r=>{u.pattern.lastIndex=0,!u.pattern.test(r.value)&&r.issues.push({origin:\"string\",code:\"invalid_format\",format:u.format,input:r.value,...u.pattern?{pattern:u.pattern.toString()}:{},inst:a,continue:!u.abort})}):(c=a._zod).check??(c.check=()=>{})}),yv=D(\"$ZodCheckRegex\",(a,u)=>{Uu.init(a,u),a._zod.check=o=>{u.pattern.lastIndex=0,!u.pattern.test(o.value)&&o.issues.push({origin:\"string\",code:\"invalid_format\",format:\"regex\",input:o.value,pattern:u.pattern.toString(),inst:a,continue:!u.abort})}}),_v=D(\"$ZodCheckLowerCase\",(a,u)=>{u.pattern??(u.pattern=fv),Uu.init(a,u)}),bv=D(\"$ZodCheckUpperCase\",(a,u)=>{u.pattern??(u.pattern=dv),Uu.init(a,u)}),Sv=D(\"$ZodCheckIncludes\",(a,u)=>{yt.init(a,u);const o=Ua(u.includes),c=new RegExp(typeof u.position==\"number\"?`^.{${u.position}}${o}`:o);u.pattern=c,a._zod.onattach.push(r=>{const d=r._zod.bag;d.patterns??(d.patterns=new Set),d.patterns.add(c)}),a._zod.check=r=>{r.value.includes(u.includes,u.position)||r.issues.push({origin:\"string\",code:\"invalid_format\",format:\"includes\",includes:u.includes,input:r.value,inst:a,continue:!u.abort})}}),zv=D(\"$ZodCheckStartsWith\",(a,u)=>{yt.init(a,u);const o=new RegExp(`^${Ua(u.prefix)}.*`);u.pattern??(u.pattern=o),a._zod.onattach.push(c=>{const r=c._zod.bag;r.patterns??(r.patterns=new Set),r.patterns.add(o)}),a._zod.check=c=>{c.value.startsWith(u.prefix)||c.issues.push({origin:\"string\",code:\"invalid_format\",format:\"starts_with\",prefix:u.prefix,input:c.value,inst:a,continue:!u.abort})}}),Tv=D(\"$ZodCheckEndsWith\",(a,u)=>{yt.init(a,u);const o=new RegExp(`.*${Ua(u.suffix)}$`);u.pattern??(u.pattern=o),a._zod.onattach.push(c=>{const r=c._zod.bag;r.patterns??(r.patterns=new Set),r.patterns.add(o)}),a._zod.check=c=>{c.value.endsWith(u.suffix)||c.issues.push({origin:\"string\",code:\"invalid_format\",format:\"ends_with\",suffix:u.suffix,input:c.value,inst:a,continue:!u.abort})}}),Ev=D(\"$ZodCheckOverwrite\",(a,u)=>{yt.init(a,u),a._zod.check=o=>{o.value=u.tx(o.value)}});class Ov{constructor(u=[]){this.content=[],this.indent=0,this&&(this.args=u)}indented(u){this.indent+=1,u(this),this.indent-=1}write(u){if(typeof u==\"function\"){u(this,{execution:\"sync\"}),u(this,{execution:\"async\"});return}const c=u.split(`\n`).filter(m=>m),r=Math.min(...c.map(m=>m.length-m.trimStart().length)),d=c.map(m=>m.slice(r)).map(m=>\" \".repeat(this.indent*2)+m);for(const m of d)this.content.push(m)}compile(){const u=Function,o=this==null?void 0:this.args,r=[...((this==null?void 0:this.content)??[\"\"]).map(d=>`  ${d}`)];return new u(...o,r.join(`\n`))}}const Av={major:4,minor:3,patch:6},qe=D(\"$ZodType\",(a,u)=>{var r;var o;a??(a={}),a._zod.def=u,a._zod.bag=a._zod.bag||{},a._zod.version=Av;const c=[...a._zod.def.checks??[]];a._zod.traits.has(\"$ZodCheck\")&&c.unshift(a);for(const d of c)for(const m of d._zod.onattach)m(a);if(c.length===0)(o=a._zod).deferred??(o.deferred=[]),(r=a._zod.deferred)==null||r.push(()=>{a._zod.run=a._zod.parse});else{const d=(v,p,g)=>{let z=Za(v),T;for(const k of p){if(k._zod.def.when){if(!k._zod.def.when(v))continue}else if(z)continue;const H=v.issues.length,L=k._zod.check(v);if(L instanceof Promise&&(g==null?void 0:g.async)===!1)throw new Ca;if(T||L instanceof Promise)T=(T??Promise.resolve()).then(async()=>{await L,v.issues.length!==H&&(z||(z=Za(v,H)))});else{if(v.issues.length===H)continue;z||(z=Za(v,H))}}return T?T.then(()=>v):v},m=(v,p,g)=>{if(Za(v))return v.aborted=!0,v;const z=d(p,c,g);if(z instanceof Promise){if(g.async===!1)throw new Ca;return z.then(T=>a._zod.parse(T,g))}return a._zod.parse(z,g)};a._zod.run=(v,p)=>{if(p.skipChecks)return a._zod.parse(v,p);if(p.direction===\"backward\"){const z=a._zod.parse({value:v.value,issues:[]},{...p,skipChecks:!0});return z instanceof Promise?z.then(T=>m(T,v,p)):m(z,v,p)}const g=a._zod.parse(v,p);if(g instanceof Promise){if(p.async===!1)throw new Ca;return g.then(z=>d(z,c,p))}return d(g,c,p)}}ge(a,\"~standard\",()=>({validate:d=>{var m;try{const v=Hr(a,d);return v.success?{value:v.data}:{issues:(m=v.error)==null?void 0:m.issues}}catch{return Cg(a,d).then(p=>{var g;return p.success?{value:p.data}:{issues:(g=p.error)==null?void 0:g.issues}})}},vendor:\"zod\",version:1}))}),Oo=D(\"$ZodString\",(a,u)=>{var o;qe.init(a,u),a._zod.pattern=[...((o=a==null?void 0:a._zod.bag)==null?void 0:o.patterns)??[]].pop()??iv(a._zod.bag),a._zod.parse=(c,r)=>{if(u.coerce)try{c.value=String(c.value)}catch{}return typeof c.value==\"string\"||c.issues.push({expected:\"string\",code:\"invalid_type\",input:c.value,inst:a}),c}}),Be=D(\"$ZodStringFormat\",(a,u)=>{Uu.init(a,u),Oo.init(a,u)}),Rv=D(\"$ZodGUID\",(a,u)=>{u.pattern??(u.pattern=$g),Be.init(a,u)}),Mv=D(\"$ZodUUID\",(a,u)=>{if(u.version){const c={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[u.version];if(c===void 0)throw new Error(`Invalid UUID version: \"${u.version}\"`);u.pattern??(u.pattern=jr(c))}else u.pattern??(u.pattern=jr());Be.init(a,u)}),wv=D(\"$ZodEmail\",(a,u)=>{u.pattern??(u.pattern=Jg),Be.init(a,u)}),Nv=D(\"$ZodURL\",(a,u)=>{Be.init(a,u),a._zod.check=o=>{try{const c=o.value.trim(),r=new URL(c);u.hostname&&(u.hostname.lastIndex=0,u.hostname.test(r.hostname)||o.issues.push({code:\"invalid_format\",format:\"url\",note:\"Invalid hostname\",pattern:u.hostname.source,input:o.value,inst:a,continue:!u.abort})),u.protocol&&(u.protocol.lastIndex=0,u.protocol.test(r.protocol.endsWith(\":\")?r.protocol.slice(0,-1):r.protocol)||o.issues.push({code:\"invalid_format\",format:\"url\",note:\"Invalid protocol\",pattern:u.protocol.source,input:o.value,inst:a,continue:!u.abort})),u.normalize?o.value=r.href:o.value=c;return}catch{o.issues.push({code:\"invalid_format\",format:\"url\",input:o.value,inst:a,continue:!u.abort})}}}),Cv=D(\"$ZodEmoji\",(a,u)=>{u.pattern??(u.pattern=Ig()),Be.init(a,u)}),Dv=D(\"$ZodNanoID\",(a,u)=>{u.pattern??(u.pattern=Xg),Be.init(a,u)}),Uv=D(\"$ZodCUID\",(a,u)=>{u.pattern??(u.pattern=Bg),Be.init(a,u)}),Zv=D(\"$ZodCUID2\",(a,u)=>{u.pattern??(u.pattern=Yg),Be.init(a,u)}),qv=D(\"$ZodULID\",(a,u)=>{u.pattern??(u.pattern=Lg),Be.init(a,u)}),xv=D(\"$ZodXID\",(a,u)=>{u.pattern??(u.pattern=Gg),Be.init(a,u)}),kv=D(\"$ZodKSUID\",(a,u)=>{u.pattern??(u.pattern=Qg),Be.init(a,u)}),Hv=D(\"$ZodISODateTime\",(a,u)=>{u.pattern??(u.pattern=uv(u)),Be.init(a,u)}),jv=D(\"$ZodISODate\",(a,u)=>{u.pattern??(u.pattern=av),Be.init(a,u)}),Bv=D(\"$ZodISOTime\",(a,u)=>{u.pattern??(u.pattern=lv(u)),Be.init(a,u)}),Yv=D(\"$ZodISODuration\",(a,u)=>{u.pattern??(u.pattern=Vg),Be.init(a,u)}),Lv=D(\"$ZodIPv4\",(a,u)=>{u.pattern??(u.pattern=Wg),Be.init(a,u),a._zod.bag.format=\"ipv4\"}),Gv=D(\"$ZodIPv6\",(a,u)=>{u.pattern??(u.pattern=Fg),Be.init(a,u),a._zod.bag.format=\"ipv6\",a._zod.check=o=>{try{new URL(`http://[${o.value}]`)}catch{o.issues.push({code:\"invalid_format\",format:\"ipv6\",input:o.value,inst:a,continue:!u.abort})}}}),Qv=D(\"$ZodCIDRv4\",(a,u)=>{u.pattern??(u.pattern=Pg),Be.init(a,u)}),Xv=D(\"$ZodCIDRv6\",(a,u)=>{u.pattern??(u.pattern=ev),Be.init(a,u),a._zod.check=o=>{const c=o.value.split(\"/\");try{if(c.length!==2)throw new Error;const[r,d]=c;if(!d)throw new Error;const m=Number(d);if(`${m}`!==d)throw new Error;if(m<0||m>128)throw new Error;new URL(`http://[${r}]`)}catch{o.issues.push({code:\"invalid_format\",format:\"cidrv6\",input:o.value,inst:a,continue:!u.abort})}}});function $r(a){if(a===\"\")return!0;if(a.length%4!==0)return!1;try{return atob(a),!0}catch{return!1}}const Vv=D(\"$ZodBase64\",(a,u)=>{u.pattern??(u.pattern=tv),Be.init(a,u),a._zod.bag.contentEncoding=\"base64\",a._zod.check=o=>{$r(o.value)||o.issues.push({code:\"invalid_format\",format:\"base64\",input:o.value,inst:a,continue:!u.abort})}});function $v(a){if(!Br.test(a))return!1;const u=a.replace(/[-_]/g,c=>c===\"-\"?\"+\":\"/\"),o=u.padEnd(Math.ceil(u.length/4)*4,\"=\");return $r(o)}const Jv=D(\"$ZodBase64URL\",(a,u)=>{u.pattern??(u.pattern=Br),Be.init(a,u),a._zod.bag.contentEncoding=\"base64url\",a._zod.check=o=>{$v(o.value)||o.issues.push({code:\"invalid_format\",format:\"base64url\",input:o.value,inst:a,continue:!u.abort})}}),Kv=D(\"$ZodE164\",(a,u)=>{u.pattern??(u.pattern=nv),Be.init(a,u)});function Iv(a,u=null){try{const o=a.split(\".\");if(o.length!==3)return!1;const[c]=o;if(!c)return!1;const r=JSON.parse(atob(c));return!(\"typ\"in r&&(r==null?void 0:r.typ)!==\"JWT\"||!r.alg||u&&(!(\"alg\"in r)||r.alg!==u))}catch{return!1}}const Wv=D(\"$ZodJWT\",(a,u)=>{Be.init(a,u),a._zod.check=o=>{Iv(o.value,u.alg)||o.issues.push({code:\"invalid_format\",format:\"jwt\",input:o.value,inst:a,continue:!u.abort})}}),Jr=D(\"$ZodNumber\",(a,u)=>{qe.init(a,u),a._zod.pattern=a._zod.bag.pattern??Gr,a._zod.parse=(o,c)=>{if(u.coerce)try{o.value=Number(o.value)}catch{}const r=o.value;if(typeof r==\"number\"&&!Number.isNaN(r)&&Number.isFinite(r))return o;const d=typeof r==\"number\"?Number.isNaN(r)?\"NaN\":Number.isFinite(r)?void 0:\"Infinity\":void 0;return o.issues.push({expected:\"number\",code:\"invalid_type\",input:r,inst:a,...d?{received:d}:{}}),o}}),Fv=D(\"$ZodNumberFormat\",(a,u)=>{mv.init(a,u),Jr.init(a,u)}),Pv=D(\"$ZodBoolean\",(a,u)=>{qe.init(a,u),a._zod.pattern=cv,a._zod.parse=(o,c)=>{if(u.coerce)try{o.value=!!o.value}catch{}const r=o.value;return typeof r==\"boolean\"||o.issues.push({expected:\"boolean\",code:\"invalid_type\",input:r,inst:a}),o}}),ey=D(\"$ZodUndefined\",(a,u)=>{qe.init(a,u),a._zod.pattern=rv,a._zod.values=new Set([void 0]),a._zod.optin=\"optional\",a._zod.optout=\"optional\",a._zod.parse=(o,c)=>{const r=o.value;return typeof r>\"u\"||o.issues.push({expected:\"undefined\",code:\"invalid_type\",input:r,inst:a}),o}}),ty=D(\"$ZodNull\",(a,u)=>{qe.init(a,u),a._zod.pattern=sv,a._zod.values=new Set([null]),a._zod.parse=(o,c)=>{const r=o.value;return r===null||o.issues.push({expected:\"null\",code:\"invalid_type\",input:r,inst:a}),o}}),ny=D(\"$ZodUnknown\",(a,u)=>{qe.init(a,u),a._zod.parse=o=>o}),ay=D(\"$ZodNever\",(a,u)=>{qe.init(a,u),a._zod.parse=(o,c)=>(o.issues.push({expected:\"never\",code:\"invalid_type\",input:o.value,inst:a}),o)});function Kr(a,u,o){a.issues.length&&u.issues.push(...qa(o,a.issues)),u.value[o]=a.value}const ly=D(\"$ZodArray\",(a,u)=>{qe.init(a,u),a._zod.parse=(o,c)=>{const r=o.value;if(!Array.isArray(r))return o.issues.push({expected:\"array\",code:\"invalid_type\",input:r,inst:a}),o;o.value=Array(r.length);const d=[];for(let m=0;m<r.length;m++){const v=r[m],p=u.element._zod.run({value:v,issues:[]},c);p instanceof Promise?d.push(p.then(g=>Kr(g,o,m))):Kr(p,o,m)}return d.length?Promise.all(d).then(()=>o):o}});function Zu(a,u,o,c,r){if(a.issues.length){if(r&&!(o in c))return;u.issues.push(...qa(o,a.issues))}a.value===void 0?o in c&&(u.value[o]=void 0):u.value[o]=a.value}function Ir(a){var c,r,d,m;const u=Object.keys(a.shape);for(const v of u)if(!((m=(d=(r=(c=a.shape)==null?void 0:c[v])==null?void 0:r._zod)==null?void 0:d.traits)!=null&&m.has(\"$ZodType\")))throw new Error(`Invalid element at key \"${v}\": expected a Zod schema`);const o=bg(a.shape);return{...a,keys:u,keySet:new Set(u),numKeys:u.length,optionalKeys:new Set(o)}}function Wr(a,u,o,c,r,d){const m=[],v=r.keySet,p=r.catchall._zod,g=p.def.type,z=p.optout===\"optional\";for(const T in u){if(v.has(T))continue;if(g===\"never\"){m.push(T);continue}const k=p.run({value:u[T],issues:[]},c);k instanceof Promise?a.push(k.then(H=>Zu(H,o,T,u,z))):Zu(k,o,T,u,z)}return m.length&&o.issues.push({code:\"unrecognized_keys\",keys:m,input:u,inst:d}),a.length?Promise.all(a).then(()=>o):o}const uy=D(\"$ZodObject\",(a,u)=>{qe.init(a,u);const o=Object.getOwnPropertyDescriptor(u,\"shape\");if(!(o!=null&&o.get)){const v=u.shape;Object.defineProperty(u,\"shape\",{get:()=>{const p={...v};return Object.defineProperty(u,\"shape\",{value:p}),p}})}const c=wu(()=>Ir(u));ge(a._zod,\"propValues\",()=>{const v=u.shape,p={};for(const g in v){const z=v[g]._zod;if(z.values){p[g]??(p[g]=new Set);for(const T of z.values)p[g].add(T)}}return p});const r=El,d=u.catchall;let m;a._zod.parse=(v,p)=>{m??(m=c.value);const g=v.value;if(!r(g))return v.issues.push({expected:\"object\",code:\"invalid_type\",input:g,inst:a}),v;v.value={};const z=[],T=m.shape;for(const k of m.keys){const H=T[k],L=H._zod.optout===\"optional\",G=H._zod.run({value:g[k],issues:[]},p);G instanceof Promise?z.push(G.then(re=>Zu(re,v,k,g,L))):Zu(G,v,k,g,L)}return d?Wr(z,g,v,p,c.value,a):z.length?Promise.all(z).then(()=>v):v}}),iy=D(\"$ZodObjectJIT\",(a,u)=>{uy.init(a,u);const o=a._zod.parse,c=wu(()=>Ir(u)),r=k=>{var Ne;const H=new Ov([\"shape\",\"payload\",\"ctx\"]),L=c.value,G=Ze=>{const Te=Dr(Ze);return`shape[${Te}]._zod.run({ value: input[${Te}], issues: [] }, ctx)`};H.write(\"const input = payload.value;\");const re=Object.create(null);let we=0;for(const Ze of L.keys)re[Ze]=`key_${we++}`;H.write(\"const newResult = {};\");for(const Ze of L.keys){const Te=re[Ze],ye=Dr(Ze),$=k[Ze],ke=((Ne=$==null?void 0:$._zod)==null?void 0:Ne.optout)===\"optional\";H.write(`const ${Te} = ${G(Ze)};`),ke?H.write(`\n        if (${Te}.issues.length) {\n          if (${ye} in input) {\n            payload.issues = payload.issues.concat(${Te}.issues.map(iss => ({\n              ...iss,\n              path: iss.path ? [${ye}, ...iss.path] : [${ye}]\n            })));\n          }\n        }\n        \n        if (${Te}.value === undefined) {\n          if (${ye} in input) {\n            newResult[${ye}] = undefined;\n          }\n        } else {\n          newResult[${ye}] = ${Te}.value;\n        }\n        \n      `):H.write(`\n        if (${Te}.issues.length) {\n          payload.issues = payload.issues.concat(${Te}.issues.map(iss => ({\n            ...iss,\n            path: iss.path ? [${ye}, ...iss.path] : [${ye}]\n          })));\n        }\n        \n        if (${Te}.value === undefined) {\n          if (${ye} in input) {\n            newResult[${ye}] = undefined;\n          }\n        } else {\n          newResult[${ye}] = ${Te}.value;\n        }\n        \n      `)}H.write(\"payload.value = newResult;\"),H.write(\"return payload;\");const de=H.compile();return(Ze,Te)=>de(k,Ze,Te)};let d;const m=El,v=!wr.jitless,g=v&&yg.value,z=u.catchall;let T;a._zod.parse=(k,H)=>{T??(T=c.value);const L=k.value;return m(L)?v&&g&&(H==null?void 0:H.async)===!1&&H.jitless!==!0?(d||(d=r(u.shape)),k=d(k,H),z?Wr([],L,k,H,T,a):k):o(k,H):(k.issues.push({expected:\"object\",code:\"invalid_type\",input:L,inst:a}),k)}});function Fr(a,u,o,c){for(const d of a)if(d.issues.length===0)return u.value=d.value,u;const r=a.filter(d=>!Za(d));return r.length===1?(u.value=r[0].value,r[0]):(u.issues.push({code:\"invalid_union\",input:u.value,inst:o,errors:a.map(d=>d.issues.map(m=>Un(m,c,Nn())))}),u)}const Pr=D(\"$ZodUnion\",(a,u)=>{qe.init(a,u),ge(a._zod,\"optin\",()=>u.options.some(r=>r._zod.optin===\"optional\")?\"optional\":void 0),ge(a._zod,\"optout\",()=>u.options.some(r=>r._zod.optout===\"optional\")?\"optional\":void 0),ge(a._zod,\"values\",()=>{if(u.options.every(r=>r._zod.values))return new Set(u.options.flatMap(r=>Array.from(r._zod.values)))}),ge(a._zod,\"pattern\",()=>{if(u.options.every(r=>r._zod.pattern)){const r=u.options.map(d=>d._zod.pattern);return new RegExp(`^(${r.map(d=>So(d.source)).join(\"|\")})$`)}});const o=u.options.length===1,c=u.options[0]._zod.run;a._zod.parse=(r,d)=>{if(o)return c(r,d);let m=!1;const v=[];for(const p of u.options){const g=p._zod.run({value:r.value,issues:[]},d);if(g instanceof Promise)v.push(g),m=!0;else{if(g.issues.length===0)return g;v.push(g)}}return m?Promise.all(v).then(p=>Fr(p,r,a,d)):Fr(v,r,a,d)}}),oy=D(\"$ZodDiscriminatedUnion\",(a,u)=>{u.inclusive=!1,Pr.init(a,u);const o=a._zod.parse;ge(a._zod,\"propValues\",()=>{const r={};for(const d of u.options){const m=d._zod.propValues;if(!m||Object.keys(m).length===0)throw new Error(`Invalid discriminated union option at index \"${u.options.indexOf(d)}\"`);for(const[v,p]of Object.entries(m)){r[v]||(r[v]=new Set);for(const g of p)r[v].add(g)}}return r});const c=wu(()=>{var m;const r=u.options,d=new Map;for(const v of r){const p=(m=v._zod.propValues)==null?void 0:m[u.discriminator];if(!p||p.size===0)throw new Error(`Invalid discriminated union option at index \"${u.options.indexOf(v)}\"`);for(const g of p){if(d.has(g))throw new Error(`Duplicate discriminator value \"${String(g)}\"`);d.set(g,v)}}return d});a._zod.parse=(r,d)=>{const m=r.value;if(!El(m))return r.issues.push({code:\"invalid_type\",expected:\"object\",input:m,inst:a}),r;const v=c.value.get(m==null?void 0:m[u.discriminator]);return v?v._zod.run(r,d):u.unionFallback?o(r,d):(r.issues.push({code:\"invalid_union\",errors:[],note:\"No matching discriminator\",discriminator:u.discriminator,input:m,path:[u.discriminator],inst:a}),r)}}),cy=D(\"$ZodIntersection\",(a,u)=>{qe.init(a,u),a._zod.parse=(o,c)=>{const r=o.value,d=u.left._zod.run({value:r,issues:[]},c),m=u.right._zod.run({value:r,issues:[]},c);return d instanceof Promise||m instanceof Promise?Promise.all([d,m]).then(([p,g])=>ef(o,p,g)):ef(o,d,m)}});function Ao(a,u){if(a===u)return{valid:!0,data:a};if(a instanceof Date&&u instanceof Date&&+a==+u)return{valid:!0,data:a};if(Da(a)&&Da(u)){const o=Object.keys(u),c=Object.keys(a).filter(d=>o.indexOf(d)!==-1),r={...a,...u};for(const d of c){const m=Ao(a[d],u[d]);if(!m.valid)return{valid:!1,mergeErrorPath:[d,...m.mergeErrorPath]};r[d]=m.data}return{valid:!0,data:r}}if(Array.isArray(a)&&Array.isArray(u)){if(a.length!==u.length)return{valid:!1,mergeErrorPath:[]};const o=[];for(let c=0;c<a.length;c++){const r=a[c],d=u[c],m=Ao(r,d);if(!m.valid)return{valid:!1,mergeErrorPath:[c,...m.mergeErrorPath]};o.push(m.data)}return{valid:!0,data:o}}return{valid:!1,mergeErrorPath:[]}}function ef(a,u,o){const c=new Map;let r;for(const v of u.issues)if(v.code===\"unrecognized_keys\"){r??(r=v);for(const p of v.keys)c.has(p)||c.set(p,{}),c.get(p).l=!0}else a.issues.push(v);for(const v of o.issues)if(v.code===\"unrecognized_keys\")for(const p of v.keys)c.has(p)||c.set(p,{}),c.get(p).r=!0;else a.issues.push(v);const d=[...c].filter(([,v])=>v.l&&v.r).map(([v])=>v);if(d.length&&r&&a.issues.push({...r,keys:d}),Za(a))return a;const m=Ao(u.value,o.value);if(!m.valid)throw new Error(`Unmergable intersection. Error path: ${JSON.stringify(m.mergeErrorPath)}`);return a.value=m.data,a}const sy=D(\"$ZodRecord\",(a,u)=>{qe.init(a,u),a._zod.parse=(o,c)=>{const r=o.value;if(!Da(r))return o.issues.push({expected:\"record\",code:\"invalid_type\",input:r,inst:a}),o;const d=[],m=u.keyType._zod.values;if(m){o.value={};const v=new Set;for(const g of m)if(typeof g==\"string\"||typeof g==\"number\"||typeof g==\"symbol\"){v.add(typeof g==\"number\"?g.toString():g);const z=u.valueType._zod.run({value:r[g],issues:[]},c);z instanceof Promise?d.push(z.then(T=>{T.issues.length&&o.issues.push(...qa(g,T.issues)),o.value[g]=T.value})):(z.issues.length&&o.issues.push(...qa(g,z.issues)),o.value[g]=z.value)}let p;for(const g in r)v.has(g)||(p=p??[],p.push(g));p&&p.length>0&&o.issues.push({code:\"unrecognized_keys\",input:r,inst:a,keys:p})}else{o.value={};for(const v of Reflect.ownKeys(r)){if(v===\"__proto__\")continue;let p=u.keyType._zod.run({value:v,issues:[]},c);if(p instanceof Promise)throw new Error(\"Async schemas not supported in object keys currently\");if(typeof v==\"string\"&&Gr.test(v)&&p.issues.length){const T=u.keyType._zod.run({value:Number(v),issues:[]},c);if(T instanceof Promise)throw new Error(\"Async schemas not supported in object keys currently\");T.issues.length===0&&(p=T)}if(p.issues.length){u.mode===\"loose\"?o.value[v]=r[v]:o.issues.push({code:\"invalid_key\",origin:\"record\",issues:p.issues.map(T=>Un(T,c,Nn())),input:v,path:[v],inst:a});continue}const z=u.valueType._zod.run({value:r[v],issues:[]},c);z instanceof Promise?d.push(z.then(T=>{T.issues.length&&o.issues.push(...qa(v,T.issues)),o.value[p.value]=T.value})):(z.issues.length&&o.issues.push(...qa(v,z.issues)),o.value[p.value]=z.value)}}return d.length?Promise.all(d).then(()=>o):o}}),ry=D(\"$ZodEnum\",(a,u)=>{qe.init(a,u);const o=Nr(u.entries),c=new Set(o);a._zod.values=c,a._zod.pattern=new RegExp(`^(${o.filter(r=>_g.has(typeof r)).map(r=>typeof r==\"string\"?Ua(r):r.toString()).join(\"|\")})$`),a._zod.parse=(r,d)=>{const m=r.value;return c.has(m)||r.issues.push({code:\"invalid_value\",values:o,input:m,inst:a}),r}}),fy=D(\"$ZodLiteral\",(a,u)=>{if(qe.init(a,u),u.values.length===0)throw new Error(\"Cannot create literal schema with no valid values\");const o=new Set(u.values);a._zod.values=o,a._zod.pattern=new RegExp(`^(${u.values.map(c=>typeof c==\"string\"?Ua(c):c?Ua(c.toString()):String(c)).join(\"|\")})$`),a._zod.parse=(c,r)=>{const d=c.value;return o.has(d)||c.issues.push({code:\"invalid_value\",values:u.values,input:d,inst:a}),c}}),dy=D(\"$ZodTransform\",(a,u)=>{qe.init(a,u),a._zod.parse=(o,c)=>{if(c.direction===\"backward\")throw new Mr(a.constructor.name);const r=u.transform(o.value,o);if(c.async)return(r instanceof Promise?r:Promise.resolve(r)).then(m=>(o.value=m,o));if(r instanceof Promise)throw new Ca;return o.value=r,o}});function tf(a,u){return a.issues.length&&u===void 0?{issues:[],value:void 0}:a}const nf=D(\"$ZodOptional\",(a,u)=>{qe.init(a,u),a._zod.optin=\"optional\",a._zod.optout=\"optional\",ge(a._zod,\"values\",()=>u.innerType._zod.values?new Set([...u.innerType._zod.values,void 0]):void 0),ge(a._zod,\"pattern\",()=>{const o=u.innerType._zod.pattern;return o?new RegExp(`^(${So(o.source)})?$`):void 0}),a._zod.parse=(o,c)=>{if(u.innerType._zod.optin===\"optional\"){const r=u.innerType._zod.run(o,c);return r instanceof Promise?r.then(d=>tf(d,o.value)):tf(r,o.value)}return o.value===void 0?o:u.innerType._zod.run(o,c)}}),hy=D(\"$ZodExactOptional\",(a,u)=>{nf.init(a,u),ge(a._zod,\"values\",()=>u.innerType._zod.values),ge(a._zod,\"pattern\",()=>u.innerType._zod.pattern),a._zod.parse=(o,c)=>u.innerType._zod.run(o,c)}),my=D(\"$ZodNullable\",(a,u)=>{qe.init(a,u),ge(a._zod,\"optin\",()=>u.innerType._zod.optin),ge(a._zod,\"optout\",()=>u.innerType._zod.optout),ge(a._zod,\"pattern\",()=>{const o=u.innerType._zod.pattern;return o?new RegExp(`^(${So(o.source)}|null)$`):void 0}),ge(a._zod,\"values\",()=>u.innerType._zod.values?new Set([...u.innerType._zod.values,null]):void 0),a._zod.parse=(o,c)=>o.value===null?o:u.innerType._zod.run(o,c)}),py=D(\"$ZodDefault\",(a,u)=>{qe.init(a,u),a._zod.optin=\"optional\",ge(a._zod,\"values\",()=>u.innerType._zod.values),a._zod.parse=(o,c)=>{if(c.direction===\"backward\")return u.innerType._zod.run(o,c);if(o.value===void 0)return o.value=u.defaultValue,o;const r=u.innerType._zod.run(o,c);return r instanceof Promise?r.then(d=>af(d,u)):af(r,u)}});function af(a,u){return a.value===void 0&&(a.value=u.defaultValue),a}const gy=D(\"$ZodPrefault\",(a,u)=>{qe.init(a,u),a._zod.optin=\"optional\",ge(a._zod,\"values\",()=>u.innerType._zod.values),a._zod.parse=(o,c)=>(c.direction===\"backward\"||o.value===void 0&&(o.value=u.defaultValue),u.innerType._zod.run(o,c))}),vy=D(\"$ZodNonOptional\",(a,u)=>{qe.init(a,u),ge(a._zod,\"values\",()=>{const o=u.innerType._zod.values;return o?new Set([...o].filter(c=>c!==void 0)):void 0}),a._zod.parse=(o,c)=>{const r=u.innerType._zod.run(o,c);return r instanceof Promise?r.then(d=>lf(d,a)):lf(r,a)}});function lf(a,u){return!a.issues.length&&a.value===void 0&&a.issues.push({code:\"invalid_type\",expected:\"nonoptional\",input:a.value,inst:u}),a}const yy=D(\"$ZodCatch\",(a,u)=>{qe.init(a,u),ge(a._zod,\"optin\",()=>u.innerType._zod.optin),ge(a._zod,\"optout\",()=>u.innerType._zod.optout),ge(a._zod,\"values\",()=>u.innerType._zod.values),a._zod.parse=(o,c)=>{if(c.direction===\"backward\")return u.innerType._zod.run(o,c);const r=u.innerType._zod.run(o,c);return r instanceof Promise?r.then(d=>(o.value=d.value,d.issues.length&&(o.value=u.catchValue({...o,error:{issues:d.issues.map(m=>Un(m,c,Nn()))},input:o.value}),o.issues=[]),o)):(o.value=r.value,r.issues.length&&(o.value=u.catchValue({...o,error:{issues:r.issues.map(d=>Un(d,c,Nn()))},input:o.value}),o.issues=[]),o)}}),_y=D(\"$ZodPipe\",(a,u)=>{qe.init(a,u),ge(a._zod,\"values\",()=>u.in._zod.values),ge(a._zod,\"optin\",()=>u.in._zod.optin),ge(a._zod,\"optout\",()=>u.out._zod.optout),ge(a._zod,\"propValues\",()=>u.in._zod.propValues),a._zod.parse=(o,c)=>{if(c.direction===\"backward\"){const d=u.out._zod.run(o,c);return d instanceof Promise?d.then(m=>qu(m,u.in,c)):qu(d,u.in,c)}const r=u.in._zod.run(o,c);return r instanceof Promise?r.then(d=>qu(d,u.out,c)):qu(r,u.out,c)}});function qu(a,u,o){return a.issues.length?(a.aborted=!0,a):u._zod.run({value:a.value,issues:a.issues},o)}const by=D(\"$ZodReadonly\",(a,u)=>{qe.init(a,u),ge(a._zod,\"propValues\",()=>u.innerType._zod.propValues),ge(a._zod,\"values\",()=>u.innerType._zod.values),ge(a._zod,\"optin\",()=>{var o,c;return(c=(o=u.innerType)==null?void 0:o._zod)==null?void 0:c.optin}),ge(a._zod,\"optout\",()=>{var o,c;return(c=(o=u.innerType)==null?void 0:o._zod)==null?void 0:c.optout}),a._zod.parse=(o,c)=>{if(c.direction===\"backward\")return u.innerType._zod.run(o,c);const r=u.innerType._zod.run(o,c);return r instanceof Promise?r.then(uf):uf(r)}});function uf(a){return a.value=Object.freeze(a.value),a}const Sy=D(\"$ZodCustom\",(a,u)=>{yt.init(a,u),qe.init(a,u),a._zod.parse=(o,c)=>o,a._zod.check=o=>{const c=o.value,r=u.fn(c);if(r instanceof Promise)return r.then(d=>of(d,o,c,a));of(r,o,c,a)}});function of(a,u,o,c){if(!a){const r={code:\"custom\",input:o,inst:c,path:[...c._zod.def.path??[]],continue:!c._zod.def.abort};c._zod.def.params&&(r.params=c._zod.def.params),u.issues.push(Ol(r))}}var cf;class zy{constructor(){this._map=new WeakMap,this._idmap=new Map}add(u,...o){const c=o[0];return this._map.set(u,c),c&&typeof c==\"object\"&&\"id\"in c&&this._idmap.set(c.id,u),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(u){const o=this._map.get(u);return o&&typeof o==\"object\"&&\"id\"in o&&this._idmap.delete(o.id),this._map.delete(u),this}get(u){const o=u._zod.parent;if(o){const c={...this.get(o)??{}};delete c.id;const r={...c,...this._map.get(u)};return Object.keys(r).length?r:void 0}return this._map.get(u)}has(u){return this._map.has(u)}}function Ty(){return new zy}(cf=globalThis).__zod_globalRegistry??(cf.__zod_globalRegistry=Ty());const Al=globalThis.__zod_globalRegistry;function Ey(a,u){return new a({type:\"string\",...X(u)})}function Oy(a,u){return new a({type:\"string\",format:\"email\",check:\"string_format\",abort:!1,...X(u)})}function sf(a,u){return new a({type:\"string\",format:\"guid\",check:\"string_format\",abort:!1,...X(u)})}function Ay(a,u){return new a({type:\"string\",format:\"uuid\",check:\"string_format\",abort:!1,...X(u)})}function Ry(a,u){return new a({type:\"string\",format:\"uuid\",check:\"string_format\",abort:!1,version:\"v4\",...X(u)})}function My(a,u){return new a({type:\"string\",format:\"uuid\",check:\"string_format\",abort:!1,version:\"v6\",...X(u)})}function wy(a,u){return new a({type:\"string\",format:\"uuid\",check:\"string_format\",abort:!1,version:\"v7\",...X(u)})}function Ny(a,u){return new a({type:\"string\",format:\"url\",check:\"string_format\",abort:!1,...X(u)})}function Cy(a,u){return new a({type:\"string\",format:\"emoji\",check:\"string_format\",abort:!1,...X(u)})}function Dy(a,u){return new a({type:\"string\",format:\"nanoid\",check:\"string_format\",abort:!1,...X(u)})}function Uy(a,u){return new a({type:\"string\",format:\"cuid\",check:\"string_format\",abort:!1,...X(u)})}function Zy(a,u){return new a({type:\"string\",format:\"cuid2\",check:\"string_format\",abort:!1,...X(u)})}function qy(a,u){return new a({type:\"string\",format:\"ulid\",check:\"string_format\",abort:!1,...X(u)})}function xy(a,u){return new a({type:\"string\",format:\"xid\",check:\"string_format\",abort:!1,...X(u)})}function ky(a,u){return new a({type:\"string\",format:\"ksuid\",check:\"string_format\",abort:!1,...X(u)})}function Hy(a,u){return new a({type:\"string\",format:\"ipv4\",check:\"string_format\",abort:!1,...X(u)})}function jy(a,u){return new a({type:\"string\",format:\"ipv6\",check:\"string_format\",abort:!1,...X(u)})}function By(a,u){return new a({type:\"string\",format:\"cidrv4\",check:\"string_format\",abort:!1,...X(u)})}function Yy(a,u){return new a({type:\"string\",format:\"cidrv6\",check:\"string_format\",abort:!1,...X(u)})}function Ly(a,u){return new a({type:\"string\",format:\"base64\",check:\"string_format\",abort:!1,...X(u)})}function Gy(a,u){return new a({type:\"string\",format:\"base64url\",check:\"string_format\",abort:!1,...X(u)})}function Qy(a,u){return new a({type:\"string\",format:\"e164\",check:\"string_format\",abort:!1,...X(u)})}function Xy(a,u){return new a({type:\"string\",format:\"jwt\",check:\"string_format\",abort:!1,...X(u)})}function Vy(a,u){return new a({type:\"string\",format:\"datetime\",check:\"string_format\",offset:!1,local:!1,precision:null,...X(u)})}function $y(a,u){return new a({type:\"string\",format:\"date\",check:\"string_format\",...X(u)})}function Jy(a,u){return new a({type:\"string\",format:\"time\",check:\"string_format\",precision:null,...X(u)})}function Ky(a,u){return new a({type:\"string\",format:\"duration\",check:\"string_format\",...X(u)})}function Iy(a,u){return new a({type:\"number\",checks:[],...X(u)})}function Wy(a,u){return new a({type:\"number\",check:\"number_format\",abort:!1,format:\"safeint\",...X(u)})}function Fy(a,u){return new a({type:\"boolean\",...X(u)})}function Py(a,u){return new a({type:\"undefined\",...X(u)})}function e0(a,u){return new a({type:\"null\",...X(u)})}function t0(a){return new a({type:\"unknown\"})}function n0(a,u){return new a({type:\"never\",...X(u)})}function rf(a,u){return new Xr({check:\"less_than\",...X(u),value:a,inclusive:!1})}function Ro(a,u){return new Xr({check:\"less_than\",...X(u),value:a,inclusive:!0})}function ff(a,u){return new Vr({check:\"greater_than\",...X(u),value:a,inclusive:!1})}function Mo(a,u){return new Vr({check:\"greater_than\",...X(u),value:a,inclusive:!0})}function df(a,u){return new hv({check:\"multiple_of\",...X(u),value:a})}function hf(a,u){return new pv({check:\"max_length\",...X(u),maximum:a})}function xu(a,u){return new gv({check:\"min_length\",...X(u),minimum:a})}function mf(a,u){return new vv({check:\"length_equals\",...X(u),length:a})}function a0(a,u){return new yv({check:\"string_format\",format:\"regex\",...X(u),pattern:a})}function l0(a){return new _v({check:\"string_format\",format:\"lowercase\",...X(a)})}function u0(a){return new bv({check:\"string_format\",format:\"uppercase\",...X(a)})}function i0(a,u){return new Sv({check:\"string_format\",format:\"includes\",...X(u),includes:a})}function o0(a,u){return new zv({check:\"string_format\",format:\"starts_with\",...X(u),prefix:a})}function c0(a,u){return new Tv({check:\"string_format\",format:\"ends_with\",...X(u),suffix:a})}function xa(a){return new Ev({check:\"overwrite\",tx:a})}function s0(a){return xa(u=>u.normalize(a))}function r0(){return xa(a=>a.trim())}function f0(){return xa(a=>a.toLowerCase())}function d0(){return xa(a=>a.toUpperCase())}function h0(){return xa(a=>vg(a))}function m0(a,u,o){return new a({type:\"array\",element:u,...X(o)})}function p0(a,u,o){const c=X(o);return c.abort??(c.abort=!0),new a({type:\"custom\",check:\"custom\",fn:u,...c})}function g0(a,u,o){return new a({type:\"custom\",check:\"custom\",fn:u,...X(o)})}function v0(a){const u=y0(o=>(o.addIssue=c=>{if(typeof c==\"string\")o.issues.push(Ol(c,o.value,u._zod.def));else{const r=c;r.fatal&&(r.continue=!1),r.code??(r.code=\"custom\"),r.input??(r.input=o.value),r.inst??(r.inst=u),r.continue??(r.continue=!u._zod.def.abort),o.issues.push(Ol(r))}},a(o.value,o)));return u}function y0(a,u){const o=new yt({check:\"custom\",...X(u)});return o._zod.check=a,o}function pf(a){let u=(a==null?void 0:a.target)??\"draft-2020-12\";return u===\"draft-4\"&&(u=\"draft-04\"),u===\"draft-7\"&&(u=\"draft-07\"),{processors:a.processors??{},metadataRegistry:(a==null?void 0:a.metadata)??Al,target:u,unrepresentable:(a==null?void 0:a.unrepresentable)??\"throw\",override:(a==null?void 0:a.override)??(()=>{}),io:(a==null?void 0:a.io)??\"output\",counter:0,seen:new Map,cycles:(a==null?void 0:a.cycles)??\"ref\",reused:(a==null?void 0:a.reused)??\"inline\",external:(a==null?void 0:a.external)??void 0}}function Ie(a,u,o={path:[],schemaPath:[]}){var z,T;var c;const r=a._zod.def,d=u.seen.get(a);if(d)return d.count++,o.schemaPath.includes(a)&&(d.cycle=o.path),d.schema;const m={schema:{},count:1,cycle:void 0,path:o.path};u.seen.set(a,m);const v=(T=(z=a._zod).toJSONSchema)==null?void 0:T.call(z);if(v)m.schema=v;else{const k={...o,schemaPath:[...o.schemaPath,a],path:o.path};if(a._zod.processJSONSchema)a._zod.processJSONSchema(u,m.schema,k);else{const L=m.schema,G=u.processors[r.type];if(!G)throw new Error(`[toJSONSchema]: Non-representable type encountered: ${r.type}`);G(a,u,L,k)}const H=a._zod.parent;H&&(m.ref||(m.ref=H),Ie(H,u,k),u.seen.get(H).isParent=!0)}const p=u.metadataRegistry.get(a);return p&&Object.assign(m.schema,p),u.io===\"input\"&&pt(a)&&(delete m.schema.examples,delete m.schema.default),u.io===\"input\"&&m.schema._prefault&&((c=m.schema).default??(c.default=m.schema._prefault)),delete m.schema._prefault,u.seen.get(a).schema}function gf(a,u){var m,v,p,g;const o=a.seen.get(u);if(!o)throw new Error(\"Unprocessed schema. This is a bug in Zod.\");const c=new Map;for(const z of a.seen.entries()){const T=(m=a.metadataRegistry.get(z[0]))==null?void 0:m.id;if(T){const k=c.get(T);if(k&&k!==z[0])throw new Error(`Duplicate schema id \"${T}\" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);c.set(T,z[0])}}const r=z=>{var G;const T=a.target===\"draft-2020-12\"?\"$defs\":\"definitions\";if(a.external){const re=(G=a.external.registry.get(z[0]))==null?void 0:G.id,we=a.external.uri??(Ne=>Ne);if(re)return{ref:we(re)};const de=z[1].defId??z[1].schema.id??`schema${a.counter++}`;return z[1].defId=de,{defId:de,ref:`${we(\"__shared\")}#/${T}/${de}`}}if(z[1]===o)return{ref:\"#\"};const H=`#/${T}/`,L=z[1].schema.id??`__schema${a.counter++}`;return{defId:L,ref:H+L}},d=z=>{if(z[1].schema.$ref)return;const T=z[1],{ref:k,defId:H}=r(z);T.def={...T.schema},H&&(T.defId=H);const L=T.schema;for(const G in L)delete L[G];L.$ref=k};if(a.cycles===\"throw\")for(const z of a.seen.entries()){const T=z[1];if(T.cycle)throw new Error(`Cycle detected: #/${(v=T.cycle)==null?void 0:v.join(\"/\")}/<root>\n\nSet the \\`cycles\\` parameter to \\`\"ref\"\\` to resolve cyclical schemas with defs.`)}for(const z of a.seen.entries()){const T=z[1];if(u===z[0]){d(z);continue}if(a.external){const H=(p=a.external.registry.get(z[0]))==null?void 0:p.id;if(u!==z[0]&&H){d(z);continue}}if((g=a.metadataRegistry.get(z[0]))==null?void 0:g.id){d(z);continue}if(T.cycle){d(z);continue}if(T.count>1&&a.reused===\"ref\"){d(z);continue}}}function vf(a,u){var m,v,p;const o=a.seen.get(u);if(!o)throw new Error(\"Unprocessed schema. This is a bug in Zod.\");const c=g=>{const z=a.seen.get(g);if(z.ref===null)return;const T=z.def??z.schema,k={...T},H=z.ref;if(z.ref=null,H){c(H);const G=a.seen.get(H),re=G.schema;if(re.$ref&&(a.target===\"draft-07\"||a.target===\"draft-04\"||a.target===\"openapi-3.0\")?(T.allOf=T.allOf??[],T.allOf.push(re)):Object.assign(T,re),Object.assign(T,k),g._zod.parent===H)for(const de in T)de===\"$ref\"||de===\"allOf\"||de in k||delete T[de];if(re.$ref&&G.def)for(const de in T)de===\"$ref\"||de===\"allOf\"||de in G.def&&JSON.stringify(T[de])===JSON.stringify(G.def[de])&&delete T[de]}const L=g._zod.parent;if(L&&L!==H){c(L);const G=a.seen.get(L);if(G!=null&&G.schema.$ref&&(T.$ref=G.schema.$ref,G.def))for(const re in T)re===\"$ref\"||re===\"allOf\"||re in G.def&&JSON.stringify(T[re])===JSON.stringify(G.def[re])&&delete T[re]}a.override({zodSchema:g,jsonSchema:T,path:z.path??[]})};for(const g of[...a.seen.entries()].reverse())c(g[0]);const r={};if(a.target===\"draft-2020-12\"?r.$schema=\"https://json-schema.org/draft/2020-12/schema\":a.target===\"draft-07\"?r.$schema=\"http://json-schema.org/draft-07/schema#\":a.target===\"draft-04\"?r.$schema=\"http://json-schema.org/draft-04/schema#\":a.target,(m=a.external)!=null&&m.uri){const g=(v=a.external.registry.get(u))==null?void 0:v.id;if(!g)throw new Error(\"Schema is missing an `id` property\");r.$id=a.external.uri(g)}Object.assign(r,o.def??o.schema);const d=((p=a.external)==null?void 0:p.defs)??{};for(const g of a.seen.entries()){const z=g[1];z.def&&z.defId&&(d[z.defId]=z.def)}a.external||Object.keys(d).length>0&&(a.target===\"draft-2020-12\"?r.$defs=d:r.definitions=d);try{const g=JSON.parse(JSON.stringify(r));return Object.defineProperty(g,\"~standard\",{value:{...u[\"~standard\"],jsonSchema:{input:ku(u,\"input\",a.processors),output:ku(u,\"output\",a.processors)}},enumerable:!1,writable:!1}),g}catch{throw new Error(\"Error converting schema to JSON.\")}}function pt(a,u){const o=u??{seen:new Set};if(o.seen.has(a))return!1;o.seen.add(a);const c=a._zod.def;if(c.type===\"transform\")return!0;if(c.type===\"array\")return pt(c.element,o);if(c.type===\"set\")return pt(c.valueType,o);if(c.type===\"lazy\")return pt(c.getter(),o);if(c.type===\"promise\"||c.type===\"optional\"||c.type===\"nonoptional\"||c.type===\"nullable\"||c.type===\"readonly\"||c.type===\"default\"||c.type===\"prefault\")return pt(c.innerType,o);if(c.type===\"intersection\")return pt(c.left,o)||pt(c.right,o);if(c.type===\"record\"||c.type===\"map\")return pt(c.keyType,o)||pt(c.valueType,o);if(c.type===\"pipe\")return pt(c.in,o)||pt(c.out,o);if(c.type===\"object\"){for(const r in c.shape)if(pt(c.shape[r],o))return!0;return!1}if(c.type===\"union\"){for(const r of c.options)if(pt(r,o))return!0;return!1}if(c.type===\"tuple\"){for(const r of c.items)if(pt(r,o))return!0;return!!(c.rest&&pt(c.rest,o))}return!1}const _0=(a,u={})=>o=>{const c=pf({...o,processors:u});return Ie(a,c),gf(c,a),vf(c,a)},ku=(a,u,o={})=>c=>{const{libraryOptions:r,target:d}=c??{},m=pf({...r??{},target:d,io:u,processors:o});return Ie(a,m),gf(m,a),vf(m,a)},b0={guid:\"uuid\",url:\"uri\",datetime:\"date-time\",json_string:\"json-string\",regex:\"\"},S0=(a,u,o,c)=>{const r=o;r.type=\"string\";const{minimum:d,maximum:m,format:v,patterns:p,contentEncoding:g}=a._zod.bag;if(typeof d==\"number\"&&(r.minLength=d),typeof m==\"number\"&&(r.maxLength=m),v&&(r.format=b0[v]??v,r.format===\"\"&&delete r.format,v===\"time\"&&delete r.format),g&&(r.contentEncoding=g),p&&p.size>0){const z=[...p];z.length===1?r.pattern=z[0].source:z.length>1&&(r.allOf=[...z.map(T=>({...u.target===\"draft-07\"||u.target===\"draft-04\"||u.target===\"openapi-3.0\"?{type:\"string\"}:{},pattern:T.source}))])}},z0=(a,u,o,c)=>{const r=o,{minimum:d,maximum:m,format:v,multipleOf:p,exclusiveMaximum:g,exclusiveMinimum:z}=a._zod.bag;typeof v==\"string\"&&v.includes(\"int\")?r.type=\"integer\":r.type=\"number\",typeof z==\"number\"&&(u.target===\"draft-04\"||u.target===\"openapi-3.0\"?(r.minimum=z,r.exclusiveMinimum=!0):r.exclusiveMinimum=z),typeof d==\"number\"&&(r.minimum=d,typeof z==\"number\"&&u.target!==\"draft-04\"&&(z>=d?delete r.minimum:delete r.exclusiveMinimum)),typeof g==\"number\"&&(u.target===\"draft-04\"||u.target===\"openapi-3.0\"?(r.maximum=g,r.exclusiveMaximum=!0):r.exclusiveMaximum=g),typeof m==\"number\"&&(r.maximum=m,typeof g==\"number\"&&u.target!==\"draft-04\"&&(g<=m?delete r.maximum:delete r.exclusiveMaximum)),typeof p==\"number\"&&(r.multipleOf=p)},T0=(a,u,o,c)=>{o.type=\"boolean\"},E0=(a,u,o,c)=>{u.target===\"openapi-3.0\"?(o.type=\"string\",o.nullable=!0,o.enum=[null]):o.type=\"null\"},O0=(a,u,o,c)=>{if(u.unrepresentable===\"throw\")throw new Error(\"Undefined cannot be represented in JSON Schema\")},A0=(a,u,o,c)=>{o.not={}},R0=(a,u,o,c)=>{},M0=(a,u,o,c)=>{const r=a._zod.def,d=Nr(r.entries);d.every(m=>typeof m==\"number\")&&(o.type=\"number\"),d.every(m=>typeof m==\"string\")&&(o.type=\"string\"),o.enum=d},w0=(a,u,o,c)=>{const r=a._zod.def,d=[];for(const m of r.values)if(m===void 0){if(u.unrepresentable===\"throw\")throw new Error(\"Literal `undefined` cannot be represented in JSON Schema\")}else if(typeof m==\"bigint\"){if(u.unrepresentable===\"throw\")throw new Error(\"BigInt literals cannot be represented in JSON Schema\");d.push(Number(m))}else d.push(m);if(d.length!==0)if(d.length===1){const m=d[0];o.type=m===null?\"null\":typeof m,u.target===\"draft-04\"||u.target===\"openapi-3.0\"?o.enum=[m]:o.const=m}else d.every(m=>typeof m==\"number\")&&(o.type=\"number\"),d.every(m=>typeof m==\"string\")&&(o.type=\"string\"),d.every(m=>typeof m==\"boolean\")&&(o.type=\"boolean\"),d.every(m=>m===null)&&(o.type=\"null\"),o.enum=d},N0=(a,u,o,c)=>{if(u.unrepresentable===\"throw\")throw new Error(\"Custom types cannot be represented in JSON Schema\")},C0=(a,u,o,c)=>{if(u.unrepresentable===\"throw\")throw new Error(\"Transforms cannot be represented in JSON Schema\")},D0=(a,u,o,c)=>{const r=o,d=a._zod.def,{minimum:m,maximum:v}=a._zod.bag;typeof m==\"number\"&&(r.minItems=m),typeof v==\"number\"&&(r.maxItems=v),r.type=\"array\",r.items=Ie(d.element,u,{...c,path:[...c.path,\"items\"]})},U0=(a,u,o,c)=>{var g;const r=o,d=a._zod.def;r.type=\"object\",r.properties={};const m=d.shape;for(const z in m)r.properties[z]=Ie(m[z],u,{...c,path:[...c.path,\"properties\",z]});const v=new Set(Object.keys(m)),p=new Set([...v].filter(z=>{const T=d.shape[z]._zod;return u.io===\"input\"?T.optin===void 0:T.optout===void 0}));p.size>0&&(r.required=Array.from(p)),((g=d.catchall)==null?void 0:g._zod.def.type)===\"never\"?r.additionalProperties=!1:d.catchall?d.catchall&&(r.additionalProperties=Ie(d.catchall,u,{...c,path:[...c.path,\"additionalProperties\"]})):u.io===\"output\"&&(r.additionalProperties=!1)},Z0=(a,u,o,c)=>{const r=a._zod.def,d=r.inclusive===!1,m=r.options.map((v,p)=>Ie(v,u,{...c,path:[...c.path,d?\"oneOf\":\"anyOf\",p]}));d?o.oneOf=m:o.anyOf=m},q0=(a,u,o,c)=>{const r=a._zod.def,d=Ie(r.left,u,{...c,path:[...c.path,\"allOf\",0]}),m=Ie(r.right,u,{...c,path:[...c.path,\"allOf\",1]}),v=g=>\"allOf\"in g&&Object.keys(g).length===1,p=[...v(d)?d.allOf:[d],...v(m)?m.allOf:[m]];o.allOf=p},x0=(a,u,o,c)=>{const r=o,d=a._zod.def;r.type=\"object\";const m=d.keyType,v=m._zod.bag,p=v==null?void 0:v.patterns;if(d.mode===\"loose\"&&p&&p.size>0){const z=Ie(d.valueType,u,{...c,path:[...c.path,\"patternProperties\",\"*\"]});r.patternProperties={};for(const T of p)r.patternProperties[T.source]=z}else(u.target===\"draft-07\"||u.target===\"draft-2020-12\")&&(r.propertyNames=Ie(d.keyType,u,{...c,path:[...c.path,\"propertyNames\"]})),r.additionalProperties=Ie(d.valueType,u,{...c,path:[...c.path,\"additionalProperties\"]});const g=m._zod.values;if(g){const z=[...g].filter(T=>typeof T==\"string\"||typeof T==\"number\");z.length>0&&(r.required=z)}},k0=(a,u,o,c)=>{const r=a._zod.def,d=Ie(r.innerType,u,c),m=u.seen.get(a);u.target===\"openapi-3.0\"?(m.ref=r.innerType,o.nullable=!0):o.anyOf=[d,{type:\"null\"}]},H0=(a,u,o,c)=>{const r=a._zod.def;Ie(r.innerType,u,c);const d=u.seen.get(a);d.ref=r.innerType},j0=(a,u,o,c)=>{const r=a._zod.def;Ie(r.innerType,u,c);const d=u.seen.get(a);d.ref=r.innerType,o.default=JSON.parse(JSON.stringify(r.defaultValue))},B0=(a,u,o,c)=>{const r=a._zod.def;Ie(r.innerType,u,c);const d=u.seen.get(a);d.ref=r.innerType,u.io===\"input\"&&(o._prefault=JSON.parse(JSON.stringify(r.defaultValue)))},Y0=(a,u,o,c)=>{const r=a._zod.def;Ie(r.innerType,u,c);const d=u.seen.get(a);d.ref=r.innerType;let m;try{m=r.catchValue(void 0)}catch{throw new Error(\"Dynamic catch values are not supported in JSON Schema\")}o.default=m},L0=(a,u,o,c)=>{const r=a._zod.def,d=u.io===\"input\"?r.in._zod.def.type===\"transform\"?r.out:r.in:r.out;Ie(d,u,c);const m=u.seen.get(a);m.ref=d},G0=(a,u,o,c)=>{const r=a._zod.def;Ie(r.innerType,u,c);const d=u.seen.get(a);d.ref=r.innerType,o.readOnly=!0},yf=(a,u,o,c)=>{const r=a._zod.def;Ie(r.innerType,u,c);const d=u.seen.get(a);d.ref=r.innerType};function wo(a){return!!a._zod}function _f(a,u){return wo(a)?Hr(a,u):a.safeParse(u)}function Q0(a){var o,c;if(!a)return;let u;if(wo(a)?u=(c=(o=a._zod)==null?void 0:o.def)==null?void 0:c.shape:u=a.shape,!!u){if(typeof u==\"function\")try{return u()}catch{return}return u}}function X0(a){var r;if(wo(a)){const m=(r=a._zod)==null?void 0:r.def;if(m){if(m.value!==void 0)return m.value;if(Array.isArray(m.values)&&m.values.length>0)return m.values[0]}}const o=a._def;if(o){if(o.value!==void 0)return o.value;if(Array.isArray(o.values)&&o.values.length>0)return o.values[0]}const c=a.value;if(c!==void 0)return c}const V0=D(\"ZodISODateTime\",(a,u)=>{Hv.init(a,u),Le.init(a,u)});function bf(a){return Vy(V0,a)}const $0=D(\"ZodISODate\",(a,u)=>{jv.init(a,u),Le.init(a,u)});function J0(a){return $y($0,a)}const K0=D(\"ZodISOTime\",(a,u)=>{Bv.init(a,u),Le.init(a,u)});function I0(a){return Jy(K0,a)}const W0=D(\"ZodISODuration\",(a,u)=>{Yv.init(a,u),Le.init(a,u)});function F0(a){return Ky(W0,a)}const Yt=D(\"ZodError\",(a,u)=>{xr.init(a,u),a.name=\"ZodError\",Object.defineProperties(a,{format:{value:o=>Ng(a,o)},flatten:{value:o=>wg(a,o)},addIssue:{value:o=>{a.issues.push(o),a.message=JSON.stringify(a.issues,_o,2)}},addIssues:{value:o=>{a.issues.push(...o),a.message=JSON.stringify(a.issues,_o,2)}},isEmpty:{get(){return a.issues.length===0}}})},{Parent:Error}),P0=To(Yt),e_=Eo(Yt),t_=Cu(Yt),n_=Du(Yt),a_=Dg(Yt),l_=Ug(Yt),u_=Zg(Yt),i_=qg(Yt),o_=xg(Yt),c_=kg(Yt),s_=Hg(Yt),r_=jg(Yt),xe=D(\"ZodType\",(a,u)=>(qe.init(a,u),Object.assign(a[\"~standard\"],{jsonSchema:{input:ku(a,\"input\"),output:ku(a,\"output\")}}),a.toJSONSchema=_0(a,{}),a.def=u,a.type=u.type,Object.defineProperty(a,\"_def\",{value:u}),a.check=(...o)=>a.clone(Cn(u,{checks:[...u.checks??[],...o.map(c=>typeof c==\"function\"?{_zod:{check:c,def:{check:\"custom\"},onattach:[]}}:c)]}),{parent:!0}),a.with=a.check,a.clone=(o,c)=>Dn(a,o,c),a.brand=()=>a,a.register=((o,c)=>(o.add(a,c),a)),a.parse=(o,c)=>P0(a,o,c,{callee:a.parse}),a.safeParse=(o,c)=>t_(a,o,c),a.parseAsync=async(o,c)=>e_(a,o,c,{callee:a.parseAsync}),a.safeParseAsync=async(o,c)=>n_(a,o,c),a.spa=a.safeParseAsync,a.encode=(o,c)=>a_(a,o,c),a.decode=(o,c)=>l_(a,o,c),a.encodeAsync=async(o,c)=>u_(a,o,c),a.decodeAsync=async(o,c)=>i_(a,o,c),a.safeEncode=(o,c)=>o_(a,o,c),a.safeDecode=(o,c)=>c_(a,o,c),a.safeEncodeAsync=async(o,c)=>s_(a,o,c),a.safeDecodeAsync=async(o,c)=>r_(a,o,c),a.refine=(o,c)=>a.check(nb(o,c)),a.superRefine=o=>a.check(ab(o)),a.overwrite=o=>a.check(xa(o)),a.optional=()=>Ge(a),a.exactOptional=()=>G_(a),a.nullable=()=>Cf(a),a.nullish=()=>Ge(Cf(a)),a.nonoptional=o=>K_(a,o),a.array=()=>W(a),a.or=o=>ie([a,o]),a.and=o=>Co(a,o),a.transform=o=>Uo(a,wf(o)),a.default=o=>V_(a,o),a.prefault=o=>J_(a,o),a.catch=o=>W_(a,o),a.pipe=o=>Uo(a,o),a.readonly=()=>eb(a),a.describe=o=>{const c=a.clone();return Al.add(c,{description:o}),c},Object.defineProperty(a,\"description\",{get(){var o;return(o=Al.get(a))==null?void 0:o.description},configurable:!0}),a.meta=(...o)=>{if(o.length===0)return Al.get(a);const c=a.clone();return Al.add(c,o[0]),c},a.isOptional=()=>a.safeParse(void 0).success,a.isNullable=()=>a.safeParse(null).success,a.apply=o=>o(a),a)),Sf=D(\"_ZodString\",(a,u)=>{Oo.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(c,r,d)=>S0(a,c,r);const o=a._zod.bag;a.format=o.format??null,a.minLength=o.minimum??null,a.maxLength=o.maximum??null,a.regex=(...c)=>a.check(a0(...c)),a.includes=(...c)=>a.check(i0(...c)),a.startsWith=(...c)=>a.check(o0(...c)),a.endsWith=(...c)=>a.check(c0(...c)),a.min=(...c)=>a.check(xu(...c)),a.max=(...c)=>a.check(hf(...c)),a.length=(...c)=>a.check(mf(...c)),a.nonempty=(...c)=>a.check(xu(1,...c)),a.lowercase=c=>a.check(l0(c)),a.uppercase=c=>a.check(u0(c)),a.trim=()=>a.check(r0()),a.normalize=(...c)=>a.check(s0(...c)),a.toLowerCase=()=>a.check(f0()),a.toUpperCase=()=>a.check(d0()),a.slugify=()=>a.check(h0())}),f_=D(\"ZodString\",(a,u)=>{Oo.init(a,u),Sf.init(a,u),a.email=o=>a.check(Oy(d_,o)),a.url=o=>a.check(Ny(h_,o)),a.jwt=o=>a.check(Xy(M_,o)),a.emoji=o=>a.check(Cy(m_,o)),a.guid=o=>a.check(sf(zf,o)),a.uuid=o=>a.check(Ay(Hu,o)),a.uuidv4=o=>a.check(Ry(Hu,o)),a.uuidv6=o=>a.check(My(Hu,o)),a.uuidv7=o=>a.check(wy(Hu,o)),a.nanoid=o=>a.check(Dy(p_,o)),a.guid=o=>a.check(sf(zf,o)),a.cuid=o=>a.check(Uy(g_,o)),a.cuid2=o=>a.check(Zy(v_,o)),a.ulid=o=>a.check(qy(y_,o)),a.base64=o=>a.check(Ly(O_,o)),a.base64url=o=>a.check(Gy(A_,o)),a.xid=o=>a.check(xy(__,o)),a.ksuid=o=>a.check(ky(b_,o)),a.ipv4=o=>a.check(Hy(S_,o)),a.ipv6=o=>a.check(jy(z_,o)),a.cidrv4=o=>a.check(By(T_,o)),a.cidrv6=o=>a.check(Yy(E_,o)),a.e164=o=>a.check(Qy(R_,o)),a.datetime=o=>a.check(bf(o)),a.date=o=>a.check(J0(o)),a.time=o=>a.check(I0(o)),a.duration=o=>a.check(F0(o))});function R(a){return Ey(f_,a)}const Le=D(\"ZodStringFormat\",(a,u)=>{Be.init(a,u),Sf.init(a,u)}),d_=D(\"ZodEmail\",(a,u)=>{wv.init(a,u),Le.init(a,u)}),zf=D(\"ZodGUID\",(a,u)=>{Rv.init(a,u),Le.init(a,u)}),Hu=D(\"ZodUUID\",(a,u)=>{Mv.init(a,u),Le.init(a,u)}),h_=D(\"ZodURL\",(a,u)=>{Nv.init(a,u),Le.init(a,u)}),m_=D(\"ZodEmoji\",(a,u)=>{Cv.init(a,u),Le.init(a,u)}),p_=D(\"ZodNanoID\",(a,u)=>{Dv.init(a,u),Le.init(a,u)}),g_=D(\"ZodCUID\",(a,u)=>{Uv.init(a,u),Le.init(a,u)}),v_=D(\"ZodCUID2\",(a,u)=>{Zv.init(a,u),Le.init(a,u)}),y_=D(\"ZodULID\",(a,u)=>{qv.init(a,u),Le.init(a,u)}),__=D(\"ZodXID\",(a,u)=>{xv.init(a,u),Le.init(a,u)}),b_=D(\"ZodKSUID\",(a,u)=>{kv.init(a,u),Le.init(a,u)}),S_=D(\"ZodIPv4\",(a,u)=>{Lv.init(a,u),Le.init(a,u)}),z_=D(\"ZodIPv6\",(a,u)=>{Gv.init(a,u),Le.init(a,u)}),T_=D(\"ZodCIDRv4\",(a,u)=>{Qv.init(a,u),Le.init(a,u)}),E_=D(\"ZodCIDRv6\",(a,u)=>{Xv.init(a,u),Le.init(a,u)}),O_=D(\"ZodBase64\",(a,u)=>{Vv.init(a,u),Le.init(a,u)}),A_=D(\"ZodBase64URL\",(a,u)=>{Jv.init(a,u),Le.init(a,u)}),R_=D(\"ZodE164\",(a,u)=>{Kv.init(a,u),Le.init(a,u)}),M_=D(\"ZodJWT\",(a,u)=>{Wv.init(a,u),Le.init(a,u)}),Tf=D(\"ZodNumber\",(a,u)=>{Jr.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(c,r,d)=>z0(a,c,r),a.gt=(c,r)=>a.check(ff(c,r)),a.gte=(c,r)=>a.check(Mo(c,r)),a.min=(c,r)=>a.check(Mo(c,r)),a.lt=(c,r)=>a.check(rf(c,r)),a.lte=(c,r)=>a.check(Ro(c,r)),a.max=(c,r)=>a.check(Ro(c,r)),a.int=c=>a.check(Ef(c)),a.safe=c=>a.check(Ef(c)),a.positive=c=>a.check(ff(0,c)),a.nonnegative=c=>a.check(Mo(0,c)),a.negative=c=>a.check(rf(0,c)),a.nonpositive=c=>a.check(Ro(0,c)),a.multipleOf=(c,r)=>a.check(df(c,r)),a.step=(c,r)=>a.check(df(c,r)),a.finite=()=>a;const o=a._zod.bag;a.minValue=Math.max(o.minimum??Number.NEGATIVE_INFINITY,o.exclusiveMinimum??Number.NEGATIVE_INFINITY)??null,a.maxValue=Math.min(o.maximum??Number.POSITIVE_INFINITY,o.exclusiveMaximum??Number.POSITIVE_INFINITY)??null,a.isInt=(o.format??\"\").includes(\"int\")||Number.isSafeInteger(o.multipleOf??.5),a.isFinite=!0,a.format=o.format??null});function ne(a){return Iy(Tf,a)}const w_=D(\"ZodNumberFormat\",(a,u)=>{Fv.init(a,u),Tf.init(a,u)});function Ef(a){return Wy(w_,a)}const N_=D(\"ZodBoolean\",(a,u)=>{Pv.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>T0(a,o,c)});function Ue(a){return Fy(N_,a)}const C_=D(\"ZodUndefined\",(a,u)=>{ey.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>O0(a,o)});function No(a){return Py(C_,a)}const D_=D(\"ZodNull\",(a,u)=>{ty.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>E0(a,o,c)});function Of(a){return e0(D_,a)}const U_=D(\"ZodUnknown\",(a,u)=>{ny.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>R0()});function Me(){return t0(U_)}const Z_=D(\"ZodNever\",(a,u)=>{ay.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>A0(a,o,c)});function q_(a){return n0(Z_,a)}const x_=D(\"ZodArray\",(a,u)=>{ly.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>D0(a,o,c,r),a.element=u.element,a.min=(o,c)=>a.check(xu(o,c)),a.nonempty=o=>a.check(xu(1,o)),a.max=(o,c)=>a.check(hf(o,c)),a.length=(o,c)=>a.check(mf(o,c)),a.unwrap=()=>a.element});function W(a,u){return m0(x_,a,u)}const Af=D(\"ZodObject\",(a,u)=>{iy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>U0(a,o,c,r),ge(a,\"shape\",()=>u.shape),a.keyof=()=>wt(Object.keys(a._zod.def.shape)),a.catchall=o=>a.clone({...a._zod.def,catchall:o}),a.passthrough=()=>a.clone({...a._zod.def,catchall:Me()}),a.loose=()=>a.clone({...a._zod.def,catchall:Me()}),a.strict=()=>a.clone({...a._zod.def,catchall:q_()}),a.strip=()=>a.clone({...a._zod.def,catchall:void 0}),a.extend=o=>Eg(a,o),a.safeExtend=o=>Og(a,o),a.merge=o=>Ag(a,o),a.pick=o=>zg(a,o),a.omit=o=>Tg(a,o),a.partial=(...o)=>Rg(Nf,a,o[0]),a.required=(...o)=>Mg(Df,a,o[0])});function w(a,u){const o={type:\"object\",shape:a??{},...X(u)};return new Af(o)}function _t(a,u){return new Af({type:\"object\",shape:a,catchall:Me(),...X(u)})}const Rf=D(\"ZodUnion\",(a,u)=>{Pr.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>Z0(a,o,c,r),a.options=u.options});function ie(a,u){return new Rf({type:\"union\",options:a,...X(u)})}const k_=D(\"ZodDiscriminatedUnion\",(a,u)=>{Rf.init(a,u),oy.init(a,u)});function Mf(a,u,o){return new k_({type:\"union\",options:u,discriminator:a,...X(o)})}const H_=D(\"ZodIntersection\",(a,u)=>{cy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>q0(a,o,c,r)});function Co(a,u){return new H_({type:\"intersection\",left:a,right:u})}const j_=D(\"ZodRecord\",(a,u)=>{sy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>x0(a,o,c,r),a.keyType=u.keyType,a.valueType=u.valueType});function Se(a,u,o){return new j_({type:\"record\",keyType:a,valueType:u,...X(o)})}const Do=D(\"ZodEnum\",(a,u)=>{ry.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(c,r,d)=>M0(a,c,r),a.enum=u.entries,a.options=Object.values(u.entries);const o=new Set(Object.keys(u.entries));a.extract=(c,r)=>{const d={};for(const m of c)if(o.has(m))d[m]=u.entries[m];else throw new Error(`Key ${m} not found in enum`);return new Do({...u,checks:[],...X(r),entries:d})},a.exclude=(c,r)=>{const d={...u.entries};for(const m of c)if(o.has(m))delete d[m];else throw new Error(`Key ${m} not found in enum`);return new Do({...u,checks:[],...X(r),entries:d})}});function wt(a,u){const o=Array.isArray(a)?Object.fromEntries(a.map(c=>[c,c])):a;return new Do({type:\"enum\",entries:o,...X(u)})}const B_=D(\"ZodLiteral\",(a,u)=>{fy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>w0(a,o,c),a.values=new Set(u.values),Object.defineProperty(a,\"value\",{get(){if(u.values.length>1)throw new Error(\"This schema contains multiple valid literal values. Use `.values` instead.\");return u.values[0]}})});function E(a,u){return new B_({type:\"literal\",values:Array.isArray(a)?a:[a],...X(u)})}const Y_=D(\"ZodTransform\",(a,u)=>{dy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>C0(a,o),a._zod.parse=(o,c)=>{if(c.direction===\"backward\")throw new Mr(a.constructor.name);o.addIssue=d=>{if(typeof d==\"string\")o.issues.push(Ol(d,o.value,u));else{const m=d;m.fatal&&(m.continue=!1),m.code??(m.code=\"custom\"),m.input??(m.input=o.value),m.inst??(m.inst=a),o.issues.push(Ol(m))}};const r=u.transform(o.value,o);return r instanceof Promise?r.then(d=>(o.value=d,o)):(o.value=r,o)}});function wf(a){return new Y_({type:\"transform\",transform:a})}const Nf=D(\"ZodOptional\",(a,u)=>{nf.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>yf(a,o,c,r),a.unwrap=()=>a._zod.def.innerType});function Ge(a){return new Nf({type:\"optional\",innerType:a})}const L_=D(\"ZodExactOptional\",(a,u)=>{hy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>yf(a,o,c,r),a.unwrap=()=>a._zod.def.innerType});function G_(a){return new L_({type:\"optional\",innerType:a})}const Q_=D(\"ZodNullable\",(a,u)=>{my.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>k0(a,o,c,r),a.unwrap=()=>a._zod.def.innerType});function Cf(a){return new Q_({type:\"nullable\",innerType:a})}const X_=D(\"ZodDefault\",(a,u)=>{py.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>j0(a,o,c,r),a.unwrap=()=>a._zod.def.innerType,a.removeDefault=a.unwrap});function V_(a,u){return new X_({type:\"default\",innerType:a,get defaultValue(){return typeof u==\"function\"?u():Zr(u)}})}const $_=D(\"ZodPrefault\",(a,u)=>{gy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>B0(a,o,c,r),a.unwrap=()=>a._zod.def.innerType});function J_(a,u){return new $_({type:\"prefault\",innerType:a,get defaultValue(){return typeof u==\"function\"?u():Zr(u)}})}const Df=D(\"ZodNonOptional\",(a,u)=>{vy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>H0(a,o,c,r),a.unwrap=()=>a._zod.def.innerType});function K_(a,u){return new Df({type:\"nonoptional\",innerType:a,...X(u)})}const I_=D(\"ZodCatch\",(a,u)=>{yy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>Y0(a,o,c,r),a.unwrap=()=>a._zod.def.innerType,a.removeCatch=a.unwrap});function W_(a,u){return new I_({type:\"catch\",innerType:a,catchValue:typeof u==\"function\"?u:()=>u})}const F_=D(\"ZodPipe\",(a,u)=>{_y.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>L0(a,o,c,r),a.in=u.in,a.out=u.out});function Uo(a,u){return new F_({type:\"pipe\",in:a,out:u})}const P_=D(\"ZodReadonly\",(a,u)=>{by.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>G0(a,o,c,r),a.unwrap=()=>a._zod.def.innerType});function eb(a){return new P_({type:\"readonly\",innerType:a})}const Uf=D(\"ZodCustom\",(a,u)=>{Sy.init(a,u),xe.init(a,u),a._zod.processJSONSchema=(o,c,r)=>N0(a,o)});function tb(a,u){return p0(Uf,a??(()=>!0),u)}function nb(a,u={}){return g0(Uf,a,u)}function ab(a){return v0(a)}function Zf(a,u){return Uo(wf(a),u)}const ca=\"io.modelcontextprotocol/related-task\",ju=\"2.0\",lt=tb(a=>a!==null&&(typeof a==\"object\"||typeof a==\"function\")),qf=ie([R(),ne().int()]),xf=R();_t({ttl:ie([ne(),Of()]).optional(),pollInterval:ne().optional()});const lb=w({ttl:ne().optional()}),ub=w({taskId:R()}),Zo=_t({progressToken:qf.optional(),[ca]:ub.optional()}),Nt=w({_meta:Zo.optional()}),Rl=Nt.extend({task:lb.optional()}),ib=a=>Rl.safeParse(a).success,ut=w({method:R(),params:Nt.loose().optional()}),Lt=w({_meta:Zo.optional()}),Gt=w({method:R(),params:Lt.loose().optional()}),it=_t({_meta:Zo.optional()}),Ml=ie([R(),ne().int()]),kf=w({jsonrpc:E(ju),id:Ml,...ut.shape}).strict(),Hf=a=>kf.safeParse(a).success,jf=w({jsonrpc:E(ju),...Gt.shape}).strict(),ob=a=>jf.safeParse(a).success,qo=w({jsonrpc:E(ju),id:Ml,result:it}).strict(),Bu=a=>qo.safeParse(a).success;var ze;(function(a){a[a.ConnectionClosed=-32e3]=\"ConnectionClosed\",a[a.RequestTimeout=-32001]=\"RequestTimeout\",a[a.ParseError=-32700]=\"ParseError\",a[a.InvalidRequest=-32600]=\"InvalidRequest\",a[a.MethodNotFound=-32601]=\"MethodNotFound\",a[a.InvalidParams=-32602]=\"InvalidParams\",a[a.InternalError=-32603]=\"InternalError\",a[a.UrlElicitationRequired=-32042]=\"UrlElicitationRequired\"})(ze||(ze={}));const xo=w({jsonrpc:E(ju),id:Ml.optional(),error:w({code:ne().int(),message:R(),data:Me().optional()})}).strict(),cb=a=>xo.safeParse(a).success,sb=ie([kf,jf,qo,xo]);ie([qo,xo]);const ko=it.strict(),rb=Lt.extend({requestId:Ml.optional(),reason:R().optional()}),Ho=Gt.extend({method:E(\"notifications/cancelled\"),params:rb}),fb=w({src:R(),mimeType:R().optional(),sizes:W(R()).optional(),theme:wt([\"light\",\"dark\"]).optional()}),wl=w({icons:W(fb).optional()}),ka=w({name:R(),title:R().optional()}),Yu=ka.extend({...ka.shape,...wl.shape,version:R(),websiteUrl:R().optional(),description:R().optional()}),db=Co(w({applyDefaults:Ue().optional()}),Se(R(),Me())),hb=Zf(a=>a&&typeof a==\"object\"&&!Array.isArray(a)&&Object.keys(a).length===0?{form:{}}:a,Co(w({form:db.optional(),url:lt.optional()}),Se(R(),Me()).optional())),mb=_t({list:lt.optional(),cancel:lt.optional(),requests:_t({sampling:_t({createMessage:lt.optional()}).optional(),elicitation:_t({create:lt.optional()}).optional()}).optional()}),pb=_t({list:lt.optional(),cancel:lt.optional(),requests:_t({tools:_t({call:lt.optional()}).optional()}).optional()}),gb=w({experimental:Se(R(),lt).optional(),sampling:w({context:lt.optional(),tools:lt.optional()}).optional(),elicitation:hb.optional(),roots:w({listChanged:Ue().optional()}).optional(),tasks:mb.optional()}),vb=Nt.extend({protocolVersion:R(),capabilities:gb,clientInfo:Yu}),yb=ut.extend({method:E(\"initialize\"),params:vb}),_b=w({experimental:Se(R(),lt).optional(),logging:lt.optional(),completions:lt.optional(),prompts:w({listChanged:Ue().optional()}).optional(),resources:w({subscribe:Ue().optional(),listChanged:Ue().optional()}).optional(),tools:w({listChanged:Ue().optional()}).optional(),tasks:pb.optional()}),bb=it.extend({protocolVersion:R(),capabilities:_b,serverInfo:Yu,instructions:R().optional()}),Sb=Gt.extend({method:E(\"notifications/initialized\"),params:Lt.optional()}),Lu=ut.extend({method:E(\"ping\"),params:Nt.optional()}),zb=w({progress:ne(),total:Ge(ne()),message:Ge(R())}),Tb=w({...Lt.shape,...zb.shape,progressToken:qf}),jo=Gt.extend({method:E(\"notifications/progress\"),params:Tb}),Eb=Nt.extend({cursor:xf.optional()}),Nl=ut.extend({params:Eb.optional()}),Cl=it.extend({nextCursor:xf.optional()}),Ob=wt([\"working\",\"input_required\",\"completed\",\"failed\",\"cancelled\"]),Dl=w({taskId:R(),status:Ob,ttl:ie([ne(),Of()]),createdAt:R(),lastUpdatedAt:R(),pollInterval:Ge(ne()),statusMessage:Ge(R())}),Bo=it.extend({task:Dl}),Ab=Lt.merge(Dl),Gu=Gt.extend({method:E(\"notifications/tasks/status\"),params:Ab}),Yo=ut.extend({method:E(\"tasks/get\"),params:Nt.extend({taskId:R()})}),Lo=it.merge(Dl),Go=ut.extend({method:E(\"tasks/result\"),params:Nt.extend({taskId:R()})});it.loose();const Qo=Nl.extend({method:E(\"tasks/list\")}),Xo=Cl.extend({tasks:W(Dl)}),Vo=ut.extend({method:E(\"tasks/cancel\"),params:Nt.extend({taskId:R()})}),Rb=it.merge(Dl),Bf=w({uri:R(),mimeType:Ge(R()),_meta:Se(R(),Me()).optional()}),Yf=Bf.extend({text:R()}),$o=R().refine(a=>{try{return atob(a),!0}catch{return!1}},{message:\"Invalid Base64 string\"}),Lf=Bf.extend({blob:$o}),Ul=wt([\"user\",\"assistant\"]),Ha=w({audience:W(Ul).optional(),priority:ne().min(0).max(1).optional(),lastModified:bf({offset:!0}).optional()}),Gf=w({...ka.shape,...wl.shape,uri:R(),description:Ge(R()),mimeType:Ge(R()),annotations:Ha.optional(),_meta:Ge(_t({}))}),Mb=w({...ka.shape,...wl.shape,uriTemplate:R(),description:Ge(R()),mimeType:Ge(R()),annotations:Ha.optional(),_meta:Ge(_t({}))}),wb=Nl.extend({method:E(\"resources/list\")}),Qf=Cl.extend({resources:W(Gf)}),Nb=Nl.extend({method:E(\"resources/templates/list\")}),Cb=Cl.extend({resourceTemplates:W(Mb)}),Jo=Nt.extend({uri:R()}),Db=Jo,Ub=ut.extend({method:E(\"resources/read\"),params:Db}),Xf=it.extend({contents:W(ie([Yf,Lf]))}),Zb=Gt.extend({method:E(\"notifications/resources/list_changed\"),params:Lt.optional()}),qb=Jo,xb=ut.extend({method:E(\"resources/subscribe\"),params:qb}),kb=Jo,Hb=ut.extend({method:E(\"resources/unsubscribe\"),params:kb}),jb=Lt.extend({uri:R()}),Bb=Gt.extend({method:E(\"notifications/resources/updated\"),params:jb}),Yb=w({name:R(),description:Ge(R()),required:Ge(Ue())}),Lb=w({...ka.shape,...wl.shape,description:Ge(R()),arguments:Ge(W(Yb)),_meta:Ge(_t({}))}),Gb=Nl.extend({method:E(\"prompts/list\")}),Qb=Cl.extend({prompts:W(Lb)}),Xb=Nt.extend({name:R(),arguments:Se(R(),R()).optional()}),Vb=ut.extend({method:E(\"prompts/get\"),params:Xb}),Ko=w({type:E(\"text\"),text:R(),annotations:Ha.optional(),_meta:Se(R(),Me()).optional()}),Io=w({type:E(\"image\"),data:$o,mimeType:R(),annotations:Ha.optional(),_meta:Se(R(),Me()).optional()}),Wo=w({type:E(\"audio\"),data:$o,mimeType:R(),annotations:Ha.optional(),_meta:Se(R(),Me()).optional()}),$b=w({type:E(\"tool_use\"),name:R(),id:R(),input:Se(R(),Me()),_meta:Se(R(),Me()).optional()}),Vf=w({type:E(\"resource\"),resource:ie([Yf,Lf]),annotations:Ha.optional(),_meta:Se(R(),Me()).optional()}),$f=Gf.extend({type:E(\"resource_link\")}),Zl=ie([Ko,Io,Wo,$f,Vf]),Jb=w({role:Ul,content:Zl}),Kb=it.extend({description:R().optional(),messages:W(Jb)}),Ib=Gt.extend({method:E(\"notifications/prompts/list_changed\"),params:Lt.optional()}),Wb=w({title:R().optional(),readOnlyHint:Ue().optional(),destructiveHint:Ue().optional(),idempotentHint:Ue().optional(),openWorldHint:Ue().optional()}),Fb=w({taskSupport:wt([\"required\",\"optional\",\"forbidden\"]).optional()}),Fo=w({...ka.shape,...wl.shape,description:R().optional(),inputSchema:w({type:E(\"object\"),properties:Se(R(),lt).optional(),required:W(R()).optional()}).catchall(Me()),outputSchema:w({type:E(\"object\"),properties:Se(R(),lt).optional(),required:W(R()).optional()}).catchall(Me()).optional(),annotations:Wb.optional(),execution:Fb.optional(),_meta:Se(R(),Me()).optional()}),Jf=Nl.extend({method:E(\"tools/list\")}),Pb=Cl.extend({tools:W(Fo)}),Qu=it.extend({content:W(Zl).default([]),structuredContent:Se(R(),Me()).optional(),isError:Ue().optional()});Qu.or(it.extend({toolResult:Me()}));const eS=Rl.extend({name:R(),arguments:Se(R(),Me()).optional()}),Kf=ut.extend({method:E(\"tools/call\"),params:eS}),tS=Gt.extend({method:E(\"notifications/tools/list_changed\"),params:Lt.optional()});w({autoRefresh:Ue().default(!0),debounceMs:ne().int().nonnegative().default(300)});const If=wt([\"debug\",\"info\",\"notice\",\"warning\",\"error\",\"critical\",\"alert\",\"emergency\"]),nS=Nt.extend({level:If}),aS=ut.extend({method:E(\"logging/setLevel\"),params:nS}),lS=Lt.extend({level:If,logger:R().optional(),data:Me()}),uS=Gt.extend({method:E(\"notifications/message\"),params:lS}),iS=w({name:R().optional()}),oS=w({hints:W(iS).optional(),costPriority:ne().min(0).max(1).optional(),speedPriority:ne().min(0).max(1).optional(),intelligencePriority:ne().min(0).max(1).optional()}),cS=w({mode:wt([\"auto\",\"required\",\"none\"]).optional()}),sS=w({type:E(\"tool_result\"),toolUseId:R().describe(\"The unique identifier for the corresponding tool call.\"),content:W(Zl).default([]),structuredContent:w({}).loose().optional(),isError:Ue().optional(),_meta:Se(R(),Me()).optional()}),rS=Mf(\"type\",[Ko,Io,Wo]),Xu=Mf(\"type\",[Ko,Io,Wo,$b,sS]),fS=w({role:Ul,content:ie([Xu,W(Xu)]),_meta:Se(R(),Me()).optional()}),dS=Rl.extend({messages:W(fS),modelPreferences:oS.optional(),systemPrompt:R().optional(),includeContext:wt([\"none\",\"thisServer\",\"allServers\"]).optional(),temperature:ne().optional(),maxTokens:ne().int(),stopSequences:W(R()).optional(),metadata:lt.optional(),tools:W(Fo).optional(),toolChoice:cS.optional()}),hS=ut.extend({method:E(\"sampling/createMessage\"),params:dS}),mS=it.extend({model:R(),stopReason:Ge(wt([\"endTurn\",\"stopSequence\",\"maxTokens\"]).or(R())),role:Ul,content:rS}),pS=it.extend({model:R(),stopReason:Ge(wt([\"endTurn\",\"stopSequence\",\"maxTokens\",\"toolUse\"]).or(R())),role:Ul,content:ie([Xu,W(Xu)])}),gS=w({type:E(\"boolean\"),title:R().optional(),description:R().optional(),default:Ue().optional()}),vS=w({type:E(\"string\"),title:R().optional(),description:R().optional(),minLength:ne().optional(),maxLength:ne().optional(),format:wt([\"email\",\"uri\",\"date\",\"date-time\"]).optional(),default:R().optional()}),yS=w({type:wt([\"number\",\"integer\"]),title:R().optional(),description:R().optional(),minimum:ne().optional(),maximum:ne().optional(),default:ne().optional()}),_S=w({type:E(\"string\"),title:R().optional(),description:R().optional(),enum:W(R()),default:R().optional()}),bS=w({type:E(\"string\"),title:R().optional(),description:R().optional(),oneOf:W(w({const:R(),title:R()})),default:R().optional()}),SS=w({type:E(\"string\"),title:R().optional(),description:R().optional(),enum:W(R()),enumNames:W(R()).optional(),default:R().optional()}),zS=ie([_S,bS]),TS=w({type:E(\"array\"),title:R().optional(),description:R().optional(),minItems:ne().optional(),maxItems:ne().optional(),items:w({type:E(\"string\"),enum:W(R())}),default:W(R()).optional()}),ES=w({type:E(\"array\"),title:R().optional(),description:R().optional(),minItems:ne().optional(),maxItems:ne().optional(),items:w({anyOf:W(w({const:R(),title:R()}))}),default:W(R()).optional()}),OS=ie([TS,ES]),AS=ie([SS,zS,OS]),RS=ie([AS,gS,vS,yS]),MS=Rl.extend({mode:E(\"form\").optional(),message:R(),requestedSchema:w({type:E(\"object\"),properties:Se(R(),RS),required:W(R()).optional()})}),wS=Rl.extend({mode:E(\"url\"),message:R(),elicitationId:R(),url:R().url()}),NS=ie([MS,wS]),CS=ut.extend({method:E(\"elicitation/create\"),params:NS}),DS=Lt.extend({elicitationId:R()}),US=Gt.extend({method:E(\"notifications/elicitation/complete\"),params:DS}),ZS=it.extend({action:wt([\"accept\",\"decline\",\"cancel\"]),content:Zf(a=>a===null?void 0:a,Se(R(),ie([R(),ne(),Ue(),W(R())])).optional())}),qS=w({type:E(\"ref/resource\"),uri:R()}),xS=w({type:E(\"ref/prompt\"),name:R()}),kS=Nt.extend({ref:ie([xS,qS]),argument:w({name:R(),value:R()}),context:w({arguments:Se(R(),R()).optional()}).optional()}),HS=ut.extend({method:E(\"completion/complete\"),params:kS}),jS=it.extend({completion:_t({values:W(R()).max(100),total:Ge(ne().int()),hasMore:Ge(Ue())})}),BS=w({uri:R().startsWith(\"file://\"),name:R().optional(),_meta:Se(R(),Me()).optional()}),YS=ut.extend({method:E(\"roots/list\"),params:Nt.optional()}),LS=it.extend({roots:W(BS)}),GS=Gt.extend({method:E(\"notifications/roots/list_changed\"),params:Lt.optional()});ie([Lu,yb,HS,aS,Vb,Gb,wb,Nb,Ub,xb,Hb,Kf,Jf,Yo,Go,Qo,Vo]),ie([Ho,jo,Sb,GS,Gu]),ie([ko,mS,pS,ZS,LS,Lo,Xo,Bo]),ie([Lu,hS,CS,YS,Yo,Go,Qo,Vo]),ie([Ho,jo,uS,Bb,Zb,tS,Ib,Gu,US]),ie([ko,bb,jS,Kb,Qb,Qf,Cb,Xf,Qu,Pb,Lo,Xo,Bo]);class fe extends Error{constructor(u,o,c){super(`MCP error ${u}: ${o}`),this.code=u,this.data=c,this.name=\"McpError\"}static fromError(u,o,c){if(u===ze.UrlElicitationRequired&&c){const r=c;if(r.elicitations)return new QS(r.elicitations,o)}return new fe(u,o,c)}}class QS extends fe{constructor(u,o=`URL elicitation${u.length>1?\"s\":\"\"} required`){super(ze.UrlElicitationRequired,o,{elicitations:u})}get elicitations(){var u;return((u=this.data)==null?void 0:u.elicitations)??[]}}function sa(a){return a===\"completed\"||a===\"failed\"||a===\"cancelled\"}new Set(\"ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789\");function Wf(a){const u=Q0(a),o=u==null?void 0:u.method;if(!o)throw new Error(\"Schema is missing a method literal\");const c=X0(o);if(typeof c!=\"string\")throw new Error(\"Schema method literal must be a string\");return c}function Ff(a,u){const o=_f(a,u);if(!o.success)throw o.error;return o.data}const XS=6e4;class VS{constructor(u){this._options=u,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(Ho,o=>{this._oncancel(o)}),this.setNotificationHandler(jo,o=>{this._onprogress(o)}),this.setRequestHandler(Lu,o=>({})),this._taskStore=u==null?void 0:u.taskStore,this._taskMessageQueue=u==null?void 0:u.taskMessageQueue,this._taskStore&&(this.setRequestHandler(Yo,async(o,c)=>{const r=await this._taskStore.getTask(o.params.taskId,c.sessionId);if(!r)throw new fe(ze.InvalidParams,\"Failed to retrieve task: Task not found\");return{...r}}),this.setRequestHandler(Go,async(o,c)=>{const r=async()=>{var v;const d=o.params.taskId;if(this._taskMessageQueue){let p;for(;p=await this._taskMessageQueue.dequeue(d,c.sessionId);){if(p.type===\"response\"||p.type===\"error\"){const g=p.message,z=g.id,T=this._requestResolvers.get(z);if(T)if(this._requestResolvers.delete(z),p.type===\"response\")T(g);else{const k=g,H=new fe(k.error.code,k.error.message,k.error.data);T(H)}else{const k=p.type===\"response\"?\"Response\":\"Error\";this._onerror(new Error(`${k} handler missing for request ${z}`))}continue}await((v=this._transport)==null?void 0:v.send(p.message,{relatedRequestId:c.requestId}))}}const m=await this._taskStore.getTask(d,c.sessionId);if(!m)throw new fe(ze.InvalidParams,`Task not found: ${d}`);if(!sa(m.status))return await this._waitForTaskUpdate(d,c.signal),await r();if(sa(m.status)){const p=await this._taskStore.getTaskResult(d,c.sessionId);return this._clearTaskQueue(d),{...p,_meta:{...p._meta,[ca]:{taskId:d}}}}return await r()};return await r()}),this.setRequestHandler(Qo,async(o,c)=>{var r;try{const{tasks:d,nextCursor:m}=await this._taskStore.listTasks((r=o.params)==null?void 0:r.cursor,c.sessionId);return{tasks:d,nextCursor:m,_meta:{}}}catch(d){throw new fe(ze.InvalidParams,`Failed to list tasks: ${d instanceof Error?d.message:String(d)}`)}}),this.setRequestHandler(Vo,async(o,c)=>{try{const r=await this._taskStore.getTask(o.params.taskId,c.sessionId);if(!r)throw new fe(ze.InvalidParams,`Task not found: ${o.params.taskId}`);if(sa(r.status))throw new fe(ze.InvalidParams,`Cannot cancel task in terminal status: ${r.status}`);await this._taskStore.updateTaskStatus(o.params.taskId,\"cancelled\",\"Client cancelled task execution.\",c.sessionId),this._clearTaskQueue(o.params.taskId);const d=await this._taskStore.getTask(o.params.taskId,c.sessionId);if(!d)throw new fe(ze.InvalidParams,`Task not found after cancellation: ${o.params.taskId}`);return{_meta:{},...d}}catch(r){throw r instanceof fe?r:new fe(ze.InvalidRequest,`Failed to cancel task: ${r instanceof Error?r.message:String(r)}`)}}))}async _oncancel(u){if(!u.params.requestId)return;const o=this._requestHandlerAbortControllers.get(u.params.requestId);o==null||o.abort(u.params.reason)}_setupTimeout(u,o,c,r,d=!1){this._timeoutInfo.set(u,{timeoutId:setTimeout(r,o),startTime:Date.now(),timeout:o,maxTotalTimeout:c,resetTimeoutOnProgress:d,onTimeout:r})}_resetTimeout(u){const o=this._timeoutInfo.get(u);if(!o)return!1;const c=Date.now()-o.startTime;if(o.maxTotalTimeout&&c>=o.maxTotalTimeout)throw this._timeoutInfo.delete(u),fe.fromError(ze.RequestTimeout,\"Maximum total timeout exceeded\",{maxTotalTimeout:o.maxTotalTimeout,totalElapsed:c});return clearTimeout(o.timeoutId),o.timeoutId=setTimeout(o.onTimeout,o.timeout),!0}_cleanupTimeout(u){const o=this._timeoutInfo.get(u);o&&(clearTimeout(o.timeoutId),this._timeoutInfo.delete(u))}async connect(u){var d,m,v;this._transport=u;const o=(d=this.transport)==null?void 0:d.onclose;this._transport.onclose=()=>{o==null||o(),this._onclose()};const c=(m=this.transport)==null?void 0:m.onerror;this._transport.onerror=p=>{c==null||c(p),this._onerror(p)};const r=(v=this._transport)==null?void 0:v.onmessage;this._transport.onmessage=(p,g)=>{r==null||r(p,g),Bu(p)||cb(p)?this._onresponse(p):Hf(p)?this._onrequest(p,g):ob(p)?this._onnotification(p):this._onerror(new Error(`Unknown message type: ${JSON.stringify(p)}`))},await this._transport.start()}_onclose(){var c;const u=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();const o=fe.fromError(ze.ConnectionClosed,\"Connection closed\");this._transport=void 0,(c=this.onclose)==null||c.call(this);for(const r of u.values())r(o)}_onerror(u){var o;(o=this.onerror)==null||o.call(this,u)}_onnotification(u){const o=this._notificationHandlers.get(u.method)??this.fallbackNotificationHandler;o!==void 0&&Promise.resolve().then(()=>o(u)).catch(c=>this._onerror(new Error(`Uncaught error in notification handler: ${c}`)))}_onrequest(u,o){var z,T,k,H;const c=this._requestHandlers.get(u.method)??this.fallbackRequestHandler,r=this._transport,d=(k=(T=(z=u.params)==null?void 0:z._meta)==null?void 0:T[ca])==null?void 0:k.taskId;if(c===void 0){const L={jsonrpc:\"2.0\",id:u.id,error:{code:ze.MethodNotFound,message:\"Method not found\"}};d&&this._taskMessageQueue?this._enqueueTaskMessage(d,{type:\"error\",message:L,timestamp:Date.now()},r==null?void 0:r.sessionId).catch(G=>this._onerror(new Error(`Failed to enqueue error response: ${G}`))):r==null||r.send(L).catch(G=>this._onerror(new Error(`Failed to send an error response: ${G}`)));return}const m=new AbortController;this._requestHandlerAbortControllers.set(u.id,m);const v=ib(u.params)?u.params.task:void 0,p=this._taskStore?this.requestTaskStore(u,r==null?void 0:r.sessionId):void 0,g={signal:m.signal,sessionId:r==null?void 0:r.sessionId,_meta:(H=u.params)==null?void 0:H._meta,sendNotification:async L=>{const G={relatedRequestId:u.id};d&&(G.relatedTask={taskId:d}),await this.notification(L,G)},sendRequest:async(L,G,re)=>{var Ne;const we={...re,relatedRequestId:u.id};d&&!we.relatedTask&&(we.relatedTask={taskId:d});const de=((Ne=we.relatedTask)==null?void 0:Ne.taskId)??d;return de&&p&&await p.updateTaskStatus(de,\"input_required\"),await this.request(L,G,we)},authInfo:o==null?void 0:o.authInfo,requestId:u.id,requestInfo:o==null?void 0:o.requestInfo,taskId:d,taskStore:p,taskRequestedTtl:v==null?void 0:v.ttl,closeSSEStream:o==null?void 0:o.closeSSEStream,closeStandaloneSSEStream:o==null?void 0:o.closeStandaloneSSEStream};Promise.resolve().then(()=>{v&&this.assertTaskHandlerCapability(u.method)}).then(()=>c(u,g)).then(async L=>{if(m.signal.aborted)return;const G={result:L,jsonrpc:\"2.0\",id:u.id};d&&this._taskMessageQueue?await this._enqueueTaskMessage(d,{type:\"response\",message:G,timestamp:Date.now()},r==null?void 0:r.sessionId):await(r==null?void 0:r.send(G))},async L=>{if(m.signal.aborted)return;const G={jsonrpc:\"2.0\",id:u.id,error:{code:Number.isSafeInteger(L.code)?L.code:ze.InternalError,message:L.message??\"Internal error\",...L.data!==void 0&&{data:L.data}}};d&&this._taskMessageQueue?await this._enqueueTaskMessage(d,{type:\"error\",message:G,timestamp:Date.now()},r==null?void 0:r.sessionId):await(r==null?void 0:r.send(G))}).catch(L=>this._onerror(new Error(`Failed to send response: ${L}`))).finally(()=>{this._requestHandlerAbortControllers.delete(u.id)})}_onprogress(u){const{progressToken:o,...c}=u.params,r=Number(o),d=this._progressHandlers.get(r);if(!d){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(u)}`));return}const m=this._responseHandlers.get(r),v=this._timeoutInfo.get(r);if(v&&m&&v.resetTimeoutOnProgress)try{this._resetTimeout(r)}catch(p){this._responseHandlers.delete(r),this._progressHandlers.delete(r),this._cleanupTimeout(r),m(p);return}d(c)}_onresponse(u){const o=Number(u.id),c=this._requestResolvers.get(o);if(c){if(this._requestResolvers.delete(o),Bu(u))c(u);else{const m=new fe(u.error.code,u.error.message,u.error.data);c(m)}return}const r=this._responseHandlers.get(o);if(r===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(u)}`));return}this._responseHandlers.delete(o),this._cleanupTimeout(o);let d=!1;if(Bu(u)&&u.result&&typeof u.result==\"object\"){const m=u.result;if(m.task&&typeof m.task==\"object\"){const v=m.task;typeof v.taskId==\"string\"&&(d=!0,this._taskProgressTokens.set(v.taskId,o))}}if(d||this._progressHandlers.delete(o),Bu(u))r(u);else{const m=fe.fromError(u.error.code,u.error.message,u.error.data);r(m)}}get transport(){return this._transport}async close(){var u;await((u=this._transport)==null?void 0:u.close())}async*requestStream(u,o,c){var m,v;const{task:r}=c??{};if(!r){try{yield{type:\"result\",result:await this.request(u,o,c)}}catch(p){yield{type:\"error\",error:p instanceof fe?p:new fe(ze.InternalError,String(p))}}return}let d;try{const p=await this.request(u,Bo,c);if(p.task)d=p.task.taskId,yield{type:\"taskCreated\",task:p.task};else throw new fe(ze.InternalError,\"Task creation did not return a task\");for(;;){const g=await this.getTask({taskId:d},c);if(yield{type:\"taskStatus\",task:g},sa(g.status)){g.status===\"completed\"?yield{type:\"result\",result:await this.getTaskResult({taskId:d},o,c)}:g.status===\"failed\"?yield{type:\"error\",error:new fe(ze.InternalError,`Task ${d} failed`)}:g.status===\"cancelled\"&&(yield{type:\"error\",error:new fe(ze.InternalError,`Task ${d} was cancelled`)});return}if(g.status===\"input_required\"){yield{type:\"result\",result:await this.getTaskResult({taskId:d},o,c)};return}const z=g.pollInterval??((m=this._options)==null?void 0:m.defaultTaskPollInterval)??1e3;await new Promise(T=>setTimeout(T,z)),(v=c==null?void 0:c.signal)==null||v.throwIfAborted()}}catch(p){yield{type:\"error\",error:p instanceof fe?p:new fe(ze.InternalError,String(p))}}}request(u,o,c){const{relatedRequestId:r,resumptionToken:d,onresumptiontoken:m,task:v,relatedTask:p}=c??{};return new Promise((g,z)=>{var de,Ne,Ze,Te,ye;const T=$=>{z($)};if(!this._transport){T(new Error(\"Not connected\"));return}if(((de=this._options)==null?void 0:de.enforceStrictCapabilities)===!0)try{this.assertCapabilityForMethod(u.method),v&&this.assertTaskCapability(u.method)}catch($){T($);return}(Ne=c==null?void 0:c.signal)==null||Ne.throwIfAborted();const k=this._requestMessageId++,H={...u,jsonrpc:\"2.0\",id:k};c!=null&&c.onprogress&&(this._progressHandlers.set(k,c.onprogress),H.params={...u.params,_meta:{...((Ze=u.params)==null?void 0:Ze._meta)||{},progressToken:k}}),v&&(H.params={...H.params,task:v}),p&&(H.params={...H.params,_meta:{...((Te=H.params)==null?void 0:Te._meta)||{},[ca]:p}});const L=$=>{var Qe;this._responseHandlers.delete(k),this._progressHandlers.delete(k),this._cleanupTimeout(k),(Qe=this._transport)==null||Qe.send({jsonrpc:\"2.0\",method:\"notifications/cancelled\",params:{requestId:k,reason:String($)}},{relatedRequestId:r,resumptionToken:d,onresumptiontoken:m}).catch(Zn=>this._onerror(new Error(`Failed to send cancellation: ${Zn}`)));const ke=$ instanceof fe?$:new fe(ze.RequestTimeout,String($));z(ke)};this._responseHandlers.set(k,$=>{var ke;if(!((ke=c==null?void 0:c.signal)!=null&&ke.aborted)){if($ instanceof Error)return z($);try{const Qe=_f(o,$.result);Qe.success?g(Qe.data):z(Qe.error)}catch(Qe){z(Qe)}}}),(ye=c==null?void 0:c.signal)==null||ye.addEventListener(\"abort\",()=>{var $;L(($=c==null?void 0:c.signal)==null?void 0:$.reason)});const G=(c==null?void 0:c.timeout)??XS,re=()=>L(fe.fromError(ze.RequestTimeout,\"Request timed out\",{timeout:G}));this._setupTimeout(k,G,c==null?void 0:c.maxTotalTimeout,re,(c==null?void 0:c.resetTimeoutOnProgress)??!1);const we=p==null?void 0:p.taskId;if(we){const $=ke=>{const Qe=this._responseHandlers.get(k);Qe?Qe(ke):this._onerror(new Error(`Response handler missing for side-channeled request ${k}`))};this._requestResolvers.set(k,$),this._enqueueTaskMessage(we,{type:\"request\",message:H,timestamp:Date.now()}).catch(ke=>{this._cleanupTimeout(k),z(ke)})}else this._transport.send(H,{relatedRequestId:r,resumptionToken:d,onresumptiontoken:m}).catch($=>{this._cleanupTimeout(k),z($)})})}async getTask(u,o){return this.request({method:\"tasks/get\",params:u},Lo,o)}async getTaskResult(u,o,c){return this.request({method:\"tasks/result\",params:u},o,c)}async listTasks(u,o){return this.request({method:\"tasks/list\",params:u},Xo,o)}async cancelTask(u,o){return this.request({method:\"tasks/cancel\",params:u},Rb,o)}async notification(u,o){var v,p,g,z;if(!this._transport)throw new Error(\"Not connected\");this.assertNotificationCapability(u.method);const c=(v=o==null?void 0:o.relatedTask)==null?void 0:v.taskId;if(c){const T={...u,jsonrpc:\"2.0\",params:{...u.params,_meta:{...((p=u.params)==null?void 0:p._meta)||{},[ca]:o.relatedTask}}};await this._enqueueTaskMessage(c,{type:\"notification\",message:T,timestamp:Date.now()});return}if((((g=this._options)==null?void 0:g.debouncedNotificationMethods)??[]).includes(u.method)&&!u.params&&!(o!=null&&o.relatedRequestId)&&!(o!=null&&o.relatedTask)){if(this._pendingDebouncedNotifications.has(u.method))return;this._pendingDebouncedNotifications.add(u.method),Promise.resolve().then(()=>{var k,H;if(this._pendingDebouncedNotifications.delete(u.method),!this._transport)return;let T={...u,jsonrpc:\"2.0\"};o!=null&&o.relatedTask&&(T={...T,params:{...T.params,_meta:{...((k=T.params)==null?void 0:k._meta)||{},[ca]:o.relatedTask}}}),(H=this._transport)==null||H.send(T,o).catch(L=>this._onerror(L))});return}let m={...u,jsonrpc:\"2.0\"};o!=null&&o.relatedTask&&(m={...m,params:{...m.params,_meta:{...((z=m.params)==null?void 0:z._meta)||{},[ca]:o.relatedTask}}}),await this._transport.send(m,o)}setRequestHandler(u,o){const c=Wf(u);this.assertRequestHandlerCapability(c),this._requestHandlers.set(c,(r,d)=>{const m=Ff(u,r);return Promise.resolve(o(m,d))})}removeRequestHandler(u){this._requestHandlers.delete(u)}assertCanSetRequestHandler(u){if(this._requestHandlers.has(u))throw new Error(`A request handler for ${u} already exists, which would be overridden`)}setNotificationHandler(u,o){const c=Wf(u);this._notificationHandlers.set(c,r=>{const d=Ff(u,r);return Promise.resolve(o(d))})}removeNotificationHandler(u){this._notificationHandlers.delete(u)}_cleanupTaskProgressHandler(u){const o=this._taskProgressTokens.get(u);o!==void 0&&(this._progressHandlers.delete(o),this._taskProgressTokens.delete(u))}async _enqueueTaskMessage(u,o,c){var d;if(!this._taskStore||!this._taskMessageQueue)throw new Error(\"Cannot enqueue task message: taskStore and taskMessageQueue are not configured\");const r=(d=this._options)==null?void 0:d.maxTaskQueueSize;await this._taskMessageQueue.enqueue(u,o,c,r)}async _clearTaskQueue(u,o){if(this._taskMessageQueue){const c=await this._taskMessageQueue.dequeueAll(u,o);for(const r of c)if(r.type===\"request\"&&Hf(r.message)){const d=r.message.id,m=this._requestResolvers.get(d);m?(m(new fe(ze.InternalError,\"Task cancelled or completed\")),this._requestResolvers.delete(d)):this._onerror(new Error(`Resolver missing for request ${d} during task ${u} cleanup`))}}}async _waitForTaskUpdate(u,o){var r,d;let c=((r=this._options)==null?void 0:r.defaultTaskPollInterval)??1e3;try{const m=await((d=this._taskStore)==null?void 0:d.getTask(u));m!=null&&m.pollInterval&&(c=m.pollInterval)}catch{}return new Promise((m,v)=>{if(o.aborted){v(new fe(ze.InvalidRequest,\"Request cancelled\"));return}const p=setTimeout(m,c);o.addEventListener(\"abort\",()=>{clearTimeout(p),v(new fe(ze.InvalidRequest,\"Request cancelled\"))},{once:!0})})}requestTaskStore(u,o){const c=this._taskStore;if(!c)throw new Error(\"No task store configured\");return{createTask:async r=>{if(!u)throw new Error(\"No request provided\");return await c.createTask(r,u.id,{method:u.method,params:u.params},o)},getTask:async r=>{const d=await c.getTask(r,o);if(!d)throw new fe(ze.InvalidParams,\"Failed to retrieve task: Task not found\");return d},storeTaskResult:async(r,d,m)=>{await c.storeTaskResult(r,d,m,o);const v=await c.getTask(r,o);if(v){const p=Gu.parse({method:\"notifications/tasks/status\",params:v});await this.notification(p),sa(v.status)&&this._cleanupTaskProgressHandler(r)}},getTaskResult:r=>c.getTaskResult(r,o),updateTaskStatus:async(r,d,m)=>{const v=await c.getTask(r,o);if(!v)throw new fe(ze.InvalidParams,`Task \"${r}\" not found - it may have been cleaned up`);if(sa(v.status))throw new fe(ze.InvalidParams,`Cannot update task \"${r}\" from terminal status \"${v.status}\" to \"${d}\". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await c.updateTaskStatus(r,d,m,o);const p=await c.getTask(r,o);if(p){const g=Gu.parse({method:\"notifications/tasks/status\",params:p});await this.notification(g),sa(p.status)&&this._cleanupTaskProgressHandler(r)}},listTasks:r=>c.listTasks(r,o)}}}var $S=\"2026-01-26\",JS=\"ui/notifications/tool-input-partial\";class KS{constructor(u=window.parent,o){mt(this,\"eventTarget\");mt(this,\"eventSource\");mt(this,\"messageListener\");mt(this,\"onclose\");mt(this,\"onerror\");mt(this,\"onmessage\");mt(this,\"sessionId\");mt(this,\"setProtocolVersion\");this.eventTarget=u,this.eventSource=o,this.messageListener=c=>{var d,m,v;if(o&&c.source!==this.eventSource){console.debug(\"Ignoring message from unknown source\",c);return}let r=sb.safeParse(c.data);r.success?(console.debug(\"Parsed message\",r.data),(d=this.onmessage)==null||d.call(this,r.data)):((m=c.data)==null?void 0:m.jsonrpc)!==\"2.0\"?console.debug(\"Ignoring non-JSON-RPC message\",r.error.message,c):(console.error(\"Failed to parse message\",r.error.message,c),(v=this.onerror)==null||v.call(this,Error(\"Invalid JSON-RPC message received: \"+r.error.message)))}}async start(){window.addEventListener(\"message\",this.messageListener)}async send(u,o){u.method!==JS&&console.debug(\"Sending message\",u),this.eventTarget.postMessage(u,\"*\")}async close(){var u;window.removeEventListener(\"message\",this.messageListener),(u=this.onclose)==null||u.call(this)}}var IS=ie([E(\"light\"),E(\"dark\")]).describe(\"Color theme preference for the host environment.\"),ql=ie([E(\"inline\"),E(\"fullscreen\"),E(\"pip\")]).describe(\"Display mode for UI presentation.\"),WS=ie([E(\"--color-background-primary\"),E(\"--color-background-secondary\"),E(\"--color-background-tertiary\"),E(\"--color-background-inverse\"),E(\"--color-background-ghost\"),E(\"--color-background-info\"),E(\"--color-background-danger\"),E(\"--color-background-success\"),E(\"--color-background-warning\"),E(\"--color-background-disabled\"),E(\"--color-text-primary\"),E(\"--color-text-secondary\"),E(\"--color-text-tertiary\"),E(\"--color-text-inverse\"),E(\"--color-text-ghost\"),E(\"--color-text-info\"),E(\"--color-text-danger\"),E(\"--color-text-success\"),E(\"--color-text-warning\"),E(\"--color-text-disabled\"),E(\"--color-border-primary\"),E(\"--color-border-secondary\"),E(\"--color-border-tertiary\"),E(\"--color-border-inverse\"),E(\"--color-border-ghost\"),E(\"--color-border-info\"),E(\"--color-border-danger\"),E(\"--color-border-success\"),E(\"--color-border-warning\"),E(\"--color-border-disabled\"),E(\"--color-ring-primary\"),E(\"--color-ring-secondary\"),E(\"--color-ring-inverse\"),E(\"--color-ring-info\"),E(\"--color-ring-danger\"),E(\"--color-ring-success\"),E(\"--color-ring-warning\"),E(\"--font-sans\"),E(\"--font-mono\"),E(\"--font-weight-normal\"),E(\"--font-weight-medium\"),E(\"--font-weight-semibold\"),E(\"--font-weight-bold\"),E(\"--font-text-xs-size\"),E(\"--font-text-sm-size\"),E(\"--font-text-md-size\"),E(\"--font-text-lg-size\"),E(\"--font-heading-xs-size\"),E(\"--font-heading-sm-size\"),E(\"--font-heading-md-size\"),E(\"--font-heading-lg-size\"),E(\"--font-heading-xl-size\"),E(\"--font-heading-2xl-size\"),E(\"--font-heading-3xl-size\"),E(\"--font-text-xs-line-height\"),E(\"--font-text-sm-line-height\"),E(\"--font-text-md-line-height\"),E(\"--font-text-lg-line-height\"),E(\"--font-heading-xs-line-height\"),E(\"--font-heading-sm-line-height\"),E(\"--font-heading-md-line-height\"),E(\"--font-heading-lg-line-height\"),E(\"--font-heading-xl-line-height\"),E(\"--font-heading-2xl-line-height\"),E(\"--font-heading-3xl-line-height\"),E(\"--border-radius-xs\"),E(\"--border-radius-sm\"),E(\"--border-radius-md\"),E(\"--border-radius-lg\"),E(\"--border-radius-xl\"),E(\"--border-radius-full\"),E(\"--border-width-regular\"),E(\"--shadow-hairline\"),E(\"--shadow-sm\"),E(\"--shadow-md\"),E(\"--shadow-lg\")]).describe(\"CSS variable keys available to MCP apps for theming.\"),FS=Se(WS.describe(`Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses \\`Record<K, string | undefined>\\` rather than \\`Partial<Record<K, string>>\\`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.`),ie([R(),No()]).describe(`Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses \\`Record<K, string | undefined>\\` rather than \\`Partial<Record<K, string>>\\`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.`)).describe(`Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses \\`Record<K, string | undefined>\\` rather than \\`Partial<Record<K, string>>\\`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.`);w({method:E(\"ui/open-link\"),params:w({url:R().describe(\"URL to open in the host's browser\")})});var PS=w({isError:Ue().optional().describe(\"True if the host failed to open the URL (e.g., due to security policy).\")}).passthrough(),e1=w({isError:Ue().optional().describe(\"True if the download failed (e.g., user cancelled or host denied).\")}).passthrough(),t1=w({isError:Ue().optional().describe(\"True if the host rejected or failed to deliver the message.\")}).passthrough();w({method:E(\"ui/notifications/sandbox-proxy-ready\"),params:w({})});var Po=w({connectDomains:W(R()).optional().describe(`Origins for network requests (fetch/XHR/WebSocket).\n\n- Maps to CSP \\`connect-src\\` directive\n- Empty or omitted \u2192 no network connections (secure default)`),resourceDomains:W(R()).optional().describe(\"Origins for static resources (images, scripts, stylesheets, fonts, media).\\n\\n- Maps to CSP `img-src`, `script-src`, `style-src`, `font-src`, `media-src` directives\\n- Wildcard subdomains supported: `https://*.example.com`\\n- Empty or omitted \u2192 no network resources (secure default)\"),frameDomains:W(R()).optional().describe(\"Origins for nested iframes.\\n\\n- Maps to CSP `frame-src` directive\\n- Empty or omitted \u2192 no nested iframes allowed (`frame-src 'none'`)\"),baseUriDomains:W(R()).optional().describe(\"Allowed base URIs for the document.\\n\\n- Maps to CSP `base-uri` directive\\n- Empty or omitted \u2192 only same origin allowed (`base-uri 'self'`)\")}),ec=w({camera:w({}).optional().describe(\"Request camera access.\\n\\nMaps to Permission Policy `camera` feature.\"),microphone:w({}).optional().describe(\"Request microphone access.\\n\\nMaps to Permission Policy `microphone` feature.\"),geolocation:w({}).optional().describe(\"Request geolocation access.\\n\\nMaps to Permission Policy `geolocation` feature.\"),clipboardWrite:w({}).optional().describe(\"Request clipboard write access.\\n\\nMaps to Permission Policy `clipboard-write` feature.\")});w({method:E(\"ui/notifications/size-changed\"),params:w({width:ne().optional().describe(\"New width in pixels.\"),height:ne().optional().describe(\"New height in pixels.\")})});var n1=w({method:E(\"ui/notifications/tool-input\"),params:w({arguments:Se(R(),Me().describe(\"Complete tool call arguments as key-value pairs.\")).optional().describe(\"Complete tool call arguments as key-value pairs.\")})}),a1=w({method:E(\"ui/notifications/tool-input-partial\"),params:w({arguments:Se(R(),Me().describe(\"Partial tool call arguments (incomplete, may change).\")).optional().describe(\"Partial tool call arguments (incomplete, may change).\")})}),l1=w({method:E(\"ui/notifications/tool-cancelled\"),params:w({reason:R().optional().describe('Optional reason for the cancellation (e.g., \"user action\", \"timeout\").')})}),u1=w({fonts:R().optional()}),i1=w({variables:FS.optional().describe(\"CSS variables for theming the app.\"),css:u1.optional().describe(\"CSS blocks that apps can inject.\")}),o1=w({method:E(\"ui/resource-teardown\"),params:w({})});Se(R(),Me());var Pf=w({text:w({}).optional().describe(\"Host supports text content blocks.\"),image:w({}).optional().describe(\"Host supports image content blocks.\"),audio:w({}).optional().describe(\"Host supports audio content blocks.\"),resource:w({}).optional().describe(\"Host supports resource content blocks.\"),resourceLink:w({}).optional().describe(\"Host supports resource link content blocks.\"),structuredContent:w({}).optional().describe(\"Host supports structured content.\")});w({method:E(\"ui/notifications/request-teardown\"),params:w({}).optional()});var c1=w({experimental:w({}).optional().describe(\"Experimental features (structure TBD).\"),openLinks:w({}).optional().describe(\"Host supports opening external URLs.\"),downloadFile:w({}).optional().describe(\"Host supports file downloads via ui/download-file.\"),serverTools:w({listChanged:Ue().optional().describe(\"Host supports tools/list_changed notifications.\")}).optional().describe(\"Host can proxy tool calls to the MCP server.\"),serverResources:w({listChanged:Ue().optional().describe(\"Host supports resources/list_changed notifications.\")}).optional().describe(\"Host can proxy resource reads to the MCP server.\"),logging:w({}).optional().describe(\"Host accepts log messages.\"),sandbox:w({permissions:ec.optional().describe(\"Permissions granted by the host (camera, microphone, geolocation).\"),csp:Po.optional().describe(\"CSP domains approved by the host.\")}).optional().describe(\"Sandbox configuration applied by the host.\"),updateModelContext:Pf.optional().describe(\"Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns.\"),message:Pf.optional().describe(\"Host supports receiving content messages (ui/message) from the view.\")}),s1=w({experimental:w({}).optional().describe(\"Experimental features (structure TBD).\"),tools:w({listChanged:Ue().optional().describe(\"App supports tools/list_changed notifications.\")}).optional().describe(\"App exposes MCP-style tools that the host can call.\"),availableDisplayModes:W(ql).optional().describe(\"Display modes the app supports.\")});w({method:E(\"ui/notifications/initialized\"),params:w({}).optional()}),w({csp:Po.optional().describe(\"Content Security Policy configuration for UI resources.\"),permissions:ec.optional().describe(\"Sandbox permissions requested by the UI resource.\"),domain:R().optional().describe(`Dedicated origin for view sandbox.\n\nUseful when views need stable, dedicated origins for OAuth callbacks, CORS policies, or API key allowlists.\n\n**Host-dependent:** The format and validation rules for this field are determined by each host. Servers MUST consult host-specific documentation for the expected domain format. Common patterns include:\n- Hash-based subdomains (e.g., \\`{hash}.claudemcpcontent.com\\`)\n- URL-derived subdomains (e.g., \\`www-example-com.oaiusercontent.com\\`)\n\nIf omitted, host uses default sandbox origin (typically per-conversation).`),prefersBorder:Ue().optional().describe(`Visual boundary preference - true if view prefers a visible border.\n\nBoolean requesting whether a visible border and background is provided by the host. Specifying an explicit value for this is recommended because hosts' defaults may vary.\n\n- \\`true\\`: request visible border + background\n- \\`false\\`: request no visible border + background\n- omitted: host decides border`)}),w({method:E(\"ui/request-display-mode\"),params:w({mode:ql.describe(\"The display mode being requested.\")})});var r1=w({mode:ql.describe(\"The display mode that was actually set. May differ from requested if not supported.\")}).passthrough(),f1=ie([E(\"model\"),E(\"app\")]).describe(\"Tool visibility scope - who can access the tool.\");w({resourceUri:R().optional(),visibility:W(f1).optional().describe(`Who can access this tool. Default: [\"model\", \"app\"]\n- \"model\": Tool visible to and callable by the agent\n- \"app\": Tool callable by the app from this server only`)}),w({mimeTypes:W(R()).optional().describe('Array of supported MIME types for UI resources.\\nMust include `\"text/html;profile=mcp-app\"` for MCP Apps support.')}),w({method:E(\"ui/download-file\"),params:w({contents:W(ie([Vf,$f])).describe(\"Resource contents to download \u2014 embedded (inline data) or linked (host fetches). Uses standard MCP resource types.\")})}),w({method:E(\"ui/message\"),params:w({role:E(\"user\").describe('Message role, currently only \"user\" is supported.'),content:W(Zl).describe(\"Message content blocks (text, image, etc.).\")})}),w({method:E(\"ui/notifications/sandbox-resource-ready\"),params:w({html:R().describe(\"HTML content to load into the inner iframe.\"),sandbox:R().optional().describe(\"Optional override for the inner iframe's sandbox attribute.\"),csp:Po.optional().describe(\"CSP configuration from resource metadata.\"),permissions:ec.optional().describe(\"Sandbox permissions from resource metadata.\")})});var d1=w({method:E(\"ui/notifications/tool-result\"),params:Qu.describe(\"Standard MCP tool execution result.\")}),ed=w({toolInfo:w({id:Ml.optional().describe(\"JSON-RPC id of the tools/call request.\"),tool:Fo.describe(\"Tool definition including name, inputSchema, etc.\")}).optional().describe(\"Metadata of the tool call that instantiated this App.\"),theme:IS.optional().describe(\"Current color theme preference.\"),styles:i1.optional().describe(\"Style configuration for theming the app.\"),displayMode:ql.optional().describe(\"How the UI is currently displayed.\"),availableDisplayModes:W(ql).optional().describe(\"Display modes the host supports.\"),containerDimensions:ie([w({height:ne().describe(\"Fixed container height in pixels.\")}),w({maxHeight:ie([ne(),No()]).optional().describe(\"Maximum container height in pixels.\")})]).and(ie([w({width:ne().describe(\"Fixed container width in pixels.\")}),w({maxWidth:ie([ne(),No()]).optional().describe(\"Maximum container width in pixels.\")})])).optional().describe(`Container dimensions. Represents the dimensions of the iframe or other\ncontainer holding the app. Specify either width or maxWidth, and either height or maxHeight.`),locale:R().optional().describe(\"User's language and region preference in BCP 47 format.\"),timeZone:R().optional().describe(\"User's timezone in IANA format.\"),userAgent:R().optional().describe(\"Host application identifier.\"),platform:ie([E(\"web\"),E(\"desktop\"),E(\"mobile\")]).optional().describe(\"Platform type for responsive design decisions.\"),deviceCapabilities:w({touch:Ue().optional().describe(\"Whether the device supports touch input.\"),hover:Ue().optional().describe(\"Whether the device supports hover interactions.\")}).optional().describe(\"Device input capabilities.\"),safeAreaInsets:w({top:ne().describe(\"Top safe area inset in pixels.\"),right:ne().describe(\"Right safe area inset in pixels.\"),bottom:ne().describe(\"Bottom safe area inset in pixels.\"),left:ne().describe(\"Left safe area inset in pixels.\")}).optional().describe(\"Mobile safe area boundaries in pixels.\")}).passthrough(),h1=w({method:E(\"ui/notifications/host-context-changed\"),params:ed.describe(\"Partial context update containing only changed fields.\")});w({method:E(\"ui/update-model-context\"),params:w({content:W(Zl).optional().describe(\"Context content blocks (text, image, etc.).\"),structuredContent:Se(R(),Me().describe(\"Structured content for machine-readable context data.\")).optional().describe(\"Structured content for machine-readable context data.\")})}),w({method:E(\"ui/initialize\"),params:w({appInfo:Yu.describe(\"App identification (name and version).\"),appCapabilities:s1.describe(\"Features and capabilities this app provides.\"),protocolVersion:R().describe(\"Protocol version this app supports.\")})});var m1=w({protocolVersion:R().describe('Negotiated protocol version string (e.g., \"2025-11-21\").'),hostInfo:Yu.describe(\"Host application identification and version.\"),hostCapabilities:c1.describe(\"Features and capabilities provided by the host.\"),hostContext:ed.describe(\"Rich context about the host environment.\")}).passthrough();class p1 extends VS{constructor(o,c={},r={autoResize:!0}){super(r);mt(this,\"_appInfo\");mt(this,\"_capabilities\");mt(this,\"options\");mt(this,\"_hostCapabilities\");mt(this,\"_hostInfo\");mt(this,\"_hostContext\");mt(this,\"sendOpenLink\",this.openLink);this._appInfo=o,this._capabilities=c,this.options=r,this.setRequestHandler(Lu,d=>(console.log(\"Received ping:\",d.params),{})),this.onhostcontextchanged=()=>{}}getHostCapabilities(){return this._hostCapabilities}getHostVersion(){return this._hostInfo}getHostContext(){return this._hostContext}set ontoolinput(o){this.setNotificationHandler(n1,c=>o(c.params))}set ontoolinputpartial(o){this.setNotificationHandler(a1,c=>o(c.params))}set ontoolresult(o){this.setNotificationHandler(d1,c=>o(c.params))}set ontoolcancelled(o){this.setNotificationHandler(l1,c=>o(c.params))}set onhostcontextchanged(o){this.setNotificationHandler(h1,c=>{this._hostContext={...this._hostContext,...c.params},o(c.params)})}set onteardown(o){this.setRequestHandler(o1,(c,r)=>o(c.params,r))}set oncalltool(o){this.setRequestHandler(Kf,(c,r)=>o(c.params,r))}set onlisttools(o){this.setRequestHandler(Jf,(c,r)=>o(c.params,r))}assertCapabilityForMethod(o){}assertRequestHandlerCapability(o){switch(o){case\"tools/call\":case\"tools/list\":if(!this._capabilities.tools)throw Error(`Client does not support tool capability (required for ${o})`);return;case\"ping\":case\"ui/resource-teardown\":return;default:throw Error(`No handler for method ${o} registered`)}}assertNotificationCapability(o){}assertTaskCapability(o){throw Error(\"Tasks are not supported in MCP Apps\")}assertTaskHandlerCapability(o){throw Error(\"Task handlers are not supported in MCP Apps\")}async callServerTool(o,c){if(typeof o==\"string\")throw Error(`callServerTool() expects an object as its first argument, but received a string (\"${o}\"). Did you mean: callServerTool({ name: \"${o}\", arguments: { ... } })?`);return await this.request({method:\"tools/call\",params:o},Qu,c)}async readServerResource(o,c){return await this.request({method:\"resources/read\",params:o},Xf,c)}async listServerResources(o,c){return await this.request({method:\"resources/list\",params:o},Qf,c)}sendMessage(o,c){return this.request({method:\"ui/message\",params:o},t1,c)}sendLog(o){return this.notification({method:\"notifications/message\",params:o})}updateModelContext(o,c){return this.request({method:\"ui/update-model-context\",params:o},ko,c)}openLink(o,c){return this.request({method:\"ui/open-link\",params:o},PS,c)}downloadFile(o,c){return this.request({method:\"ui/download-file\",params:o},e1,c)}requestTeardown(o={}){return this.notification({method:\"ui/notifications/request-teardown\",params:o})}requestDisplayMode(o,c){return this.request({method:\"ui/request-display-mode\",params:o},r1,c)}sendSizeChanged(o){return this.notification({method:\"ui/notifications/size-changed\",params:o})}setupSizeChangedNotifications(){let o=!1,c=0,r=0,d=()=>{o||(o=!0,requestAnimationFrame(()=>{o=!1;let v=document.documentElement,p=v.style.height;v.style.height=\"max-content\";let g=Math.ceil(v.getBoundingClientRect().height);v.style.height=p;let z=Math.ceil(window.innerWidth);(z!==c||g!==r)&&(c=z,r=g,this.sendSizeChanged({width:z,height:g}))}))};d();let m=new ResizeObserver(d);return m.observe(document.documentElement),m.observe(document.body),()=>m.disconnect()}async connect(o=new KS(window.parent,window.parent),c){var r;if(this.transport)throw Error(\"App is already connected. Call close() before connecting again.\");await super.connect(o);try{let d=await this.request({method:\"ui/initialize\",params:{appCapabilities:this._capabilities,appInfo:this._appInfo,protocolVersion:$S}},m1,c);if(d===void 0)throw Error(`Server sent invalid initialize result: ${d}`);this._hostCapabilities=d.hostCapabilities,this._hostInfo=d.hostInfo,this._hostContext=d.hostContext,await this.notification({method:\"ui/notifications/initialized\"}),(r=this.options)!=null&&r.autoResize&&this.setupSizeChangedNotifications()}catch(d){throw this.close(),d}}}let Vu=null;function td(){return Vu||(Vu=new p1({name:\"ForexGPT Widget\",version:\"1.0.0\"},{}),window.__mcpApp=Vu),Vu}async function nd(){if(window.__mcpAppInitialized)return;window.__mcpAppInitialized=!0,console.log(\"[MCP Adapter] Initializing MCP Apps SDK connection...\");const a=td();a.ontoolinput=u=>{console.log(\"[MCP Adapter] Received tool input:\",u),ra(\"toolInput\",u.arguments)},a.ontoolresult=u=>{console.log(\"[MCP Adapter] Received tool result:\",u);let o=u.structuredContent;if(!o&&u.content){const c=u.content.find(r=>r.type===\"text\");if(c&&\"text\"in c)try{o=JSON.parse(c.text)}catch{o=c.text}}ra(\"toolOutput\",o),window.dispatchEvent(new Event(\"openai:set_globals\")),window.dispatchEvent(new CustomEvent(\"mcp:tool-result\",{detail:o}))},a.onhostcontextchanged=u=>{console.log(\"[MCP Adapter] Host context changed:\",u),u.theme&&ra(\"theme\",u.theme),u.locale&&ra(\"locale\",u.locale),window.dispatchEvent(new Event(\"openai:set_globals\"))},window.addEventListener(\"message\",u=>{const o=u.data;(o==null?void 0:o.type)===\"SET_WIDGET_DATA\"&&o.toolOutput&&(console.log(\"[MCP Adapter] Received SET_WIDGET_DATA:\",o.toolOutput),ra(\"toolOutput\",o.toolOutput),window.dispatchEvent(new Event(\"openai:set_globals\")),window.dispatchEvent(new CustomEvent(\"mcp:tool-result\",{detail:o.toolOutput})))});try{await a.connect(),console.log(\"[MCP Adapter] Connected successfully\");const u=a.getHostContext();u&&(console.log(\"[MCP Adapter] Initial host context:\",u),u.theme&&ra(\"theme\",u.theme),u.locale&&ra(\"locale\",u.locale))}catch(u){console.warn(\"[MCP Adapter] Connection failed, falling back to OpenAI mode:\",u)}}function ra(a,u){window.openai||(window.openai={}),window.openai[a]=u}function g1(a){var o;if((o=window.openai)!=null&&o.notifyIntrinsicHeight){window.openai.notifyIntrinsicHeight(a);return}const u=td();u&&u.sendSizeChanged({width:window.innerWidth,height:a})}const v1=Object.freeze(Object.defineProperty({__proto__:null,initMcpApp:nd,notifyIntrinsicHeight:g1},Symbol.toStringTag,{value:\"Module\"}));typeof window<\"u\"&&nd().catch(a=>{console.warn(\"[useOpenAiGlobal] MCP init error (may be in OpenAI mode):\",a)});function y1(a){const[u,o]=yo.useState(()=>{var c;return(c=window.openai)==null?void 0:c[a]});return yo.useEffect(()=>{const c=()=>{var v;const m=(v=window.openai)==null?void 0:v[a];o(p=>p===m||typeof p==\"object\"&&typeof m==\"object\"&&JSON.stringify(p)===JSON.stringify(m)?p:m)};c();const r=()=>{c()},d=()=>{c()};return window.addEventListener(\"openai:set_globals\",r),window.addEventListener(\"mcp:tool-result\",d),()=>{window.removeEventListener(\"openai:set_globals\",r),window.removeEventListener(\"mcp:tool-result\",d)}},[a]),u}function _1(){return b1(),y1(\"toolOutput\")??null}function b1(){yo.useLayoutEffect(()=>{const a=()=>{Promise.resolve().then(()=>v1).then(({notifyIntrinsicHeight:o})=>{var r;const c=((r=document.body.firstElementChild)==null?void 0:r.scrollHeight)||document.body.scrollHeight;o(Math.ceil(c))})};a();const u=new ResizeObserver(()=>{a()});return document.body&&u.observe(document.body),window.addEventListener(\"load\",a),()=>{u.disconnect(),window.removeEventListener(\"load\",a)}},[])}function ad(){const a=_1();if(!a)return dt.jsx(\"div\",{style:{padding:\"20px\",color:\"#888\"},children:\"Loading spread data...\"});const u=a,o=(u.asset??\"Unknown\").replace(\"_\",\"/\"),c=(u.status??\"\").toLowerCase().includes(\"normal\"),r=c?\"#22c55e\":\"#ef4444\",d={padding:\"16px 20px\",fontFamily:\"system-ui, -apple-system, sans-serif\"},m={display:\"flex\",alignItems:\"center\",justifyContent:\"space-between\",marginBottom:\"16px\"},v={fontSize:\"18px\",fontWeight:600,color:\"#fff\",margin:0},p={padding:\"4px 10px\",backgroundColor:c?\"rgba(34, 197, 94, 0.2)\":\"rgba(239, 68, 68, 0.2)\",borderRadius:\"6px\",fontSize:\"12px\",fontWeight:500,color:r},g={display:\"flex\",justifyContent:\"space-between\",alignItems:\"center\",padding:\"12px 0\",borderBottom:\"1px solid #374151\"},z={fontSize:\"14px\",color:\"#9ca3af\"},T={fontSize:\"14px\",fontFamily:\"monospace\",fontWeight:500,color:\"#fff\"};return dt.jsxs(\"div\",{style:d,children:[dt.jsxs(\"div\",{style:m,children:[dt.jsxs(\"h2\",{style:v,children:[o,\" Spread\"]}),dt.jsx(\"span\",{style:p,children:u.status||\"Unknown\"})]}),dt.jsxs(\"div\",{children:[dt.jsxs(\"div\",{style:g,children:[dt.jsx(\"span\",{style:z,children:\"Current Spread\"}),dt.jsxs(\"span\",{style:T,children:[u.current_spread_pips??\"\u2014\",\" pips\"]})]}),dt.jsxs(\"div\",{style:g,children:[dt.jsx(\"span\",{style:z,children:\"Average Spread\"}),dt.jsxs(\"span\",{style:T,children:[u.avg_spread_pips??\"\u2014\",\" pips\"]})]}),dt.jsxs(\"div\",{style:{...g,borderBottom:\"none\"},children:[dt.jsx(\"span\",{style:z,children:\"Cost (bps)\"}),dt.jsx(\"span\",{style:T,children:u.cost_bps??\"\u2014\"})]})]})]})}const ld=document.getElementById(\"root\");return ld&&pg.createRoot(ld).render(dt.jsx(ad,{})),ad})();\n\n})();\n</script>\n  <script>\n    (function() {\n      var notify = function() {\n         var height = document.body.scrollHeight;\n         var h = Math.ceil(height);\n         if (window.openai && window.openai.notifyIntrinsicHeight) {\n            window.openai.notifyIntrinsicHeight(h);\n            return;\n         }\n         window.parent.postMessage({\n            jsonrpc: \"2.0\",\n            method: \"ui/notifications/size-changed\",\n            params: { height: h }\n         }, \"*\");\n      };\n      window.addEventListener('load', notify);\n      window.addEventListener('resize', notify);\n      if (window.ResizeObserver) {\n        new ResizeObserver(notify).observe(document.body);\n      }\n      setInterval(notify, 1000);\n    })();\n  </script>\n</body>\n</html>",
                "uri": "ui://widget/spread-card.html"
              }
            ]
          }
        },
        "resource_uri": "ui://widget/spread-card.html",
        "url": "https://mcp.forex-gpt.ai/mcp"
      },
      "latency_ms": 37.09,
      "status": "ok"
    },
    "resources_list": {
      "details": {
        "headers": {
          "content-type": "application/json; charset=utf-8"
        },
        "http_status": 200,
        "payload": {
          "id": 5,
          "jsonrpc": "2.0",
          "result": {
            "resources": [
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "spread-card Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/spread-card.html",
                "uri": "ui://widget/spread-card.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "market-scanner Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-scanner.html",
                "uri": "ui://widget/market-scanner.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "analysis-card Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-card.html",
                "uri": "ui://widget/analysis-card.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "chart-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/chart-widget.html",
                "uri": "ui://widget/chart-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "heatmap-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/heatmap-widget.html",
                "uri": "ui://widget/heatmap-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "order-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                "uri": "ui://widget/order-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "portfolio-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/portfolio-widget.html",
                "uri": "ui://widget/portfolio-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "positions-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/positions-widget.html",
                "uri": "ui://widget/positions-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "trade-details-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/trade-details-widget.html",
                "uri": "ui://widget/trade-details-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "modify-trade-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/modify-trade-widget.html",
                "uri": "ui://widget/modify-trade-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "close-position-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html",
                "uri": "ui://widget/close-position-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "pending-orders-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html",
                "uri": "ui://widget/pending-orders-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "watchlist-card Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                "uri": "ui://widget/watchlist-card.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "watchlist-analysis-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-analysis-widget.html",
                "uri": "ui://widget/watchlist-analysis-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "multi-analysis-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/multi-analysis-widget.html",
                "uri": "ui://widget/multi-analysis-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "analysis-viewer-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-viewer-widget.html",
                "uri": "ui://widget/analysis-viewer-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "search-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/search-widget.html",
                "uri": "ui://widget/search-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "asset-list-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/asset-list-widget.html",
                "uri": "ui://widget/asset-list-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "account-summary-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html",
                "uri": "ui://widget/account-summary-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "profile-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/profile-widget.html",
                "uri": "ui://widget/profile-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "credentials-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html",
                "uri": "ui://widget/credentials-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "calendar-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/calendar-widget.html",
                "uri": "ui://widget/calendar-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "history-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/history-widget.html",
                "uri": "ui://widget/history-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "news-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/news-widget.html",
                "uri": "ui://widget/news-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "market-status-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                "uri": "ui://widget/market-status-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "system-status-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                "uri": "ui://widget/system-status-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "instrument-specs-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/instrument-specs-widget.html",
                "uri": "ui://widget/instrument-specs-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "help-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/help-widget.html",
                "uri": "ui://widget/help-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "challenge-profiles-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/challenge-profiles-widget.html",
                "uri": "ui://widget/challenge-profiles-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "challenge-calculator-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/challenge-calculator-widget.html",
                "uri": "ui://widget/challenge-calculator-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "challenge-tracker-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/challenge-tracker-widget.html",
                "uri": "ui://widget/challenge-tracker-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "challenge-compare-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/challenge-compare-widget.html",
                "uri": "ui://widget/challenge-compare-widget.html"
              },
              {
                "_meta": {
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  }
                },
                "mimeType": "text/html;profile=mcp-app",
                "name": "challenge-rules-widget Widget",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/challenge-rules-widget.html",
                "uri": "ui://widget/challenge-rules-widget.html"
              }
            ]
          }
        },
        "url": "https://mcp.forex-gpt.ai/mcp"
      },
      "latency_ms": 29.9,
      "status": "ok"
    },
    "server_card": {
      "details": {
        "error": "Client error '404 ' for url 'https://mcp.forex-gpt.ai/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
        "url": "https://mcp.forex-gpt.ai/.well-known/mcp/server-card.json"
      },
      "latency_ms": 111.78,
      "status": "error"
    },
    "session_resume_probe": {
      "details": {
        "headers": {
          "content-type": "application/json; charset=utf-8",
          "mcp-session-id": "80bd6123-4ca4-4cb4-b5dc-7e5d32a14785"
        },
        "http_status": 200,
        "payload": {
          "id": 301,
          "jsonrpc": "2.0",
          "result": {
            "capabilities": {
              "extensions": {
                "io.modelcontextprotocol/ui": {
                  "mimeTypes": [
                    "text/html;profile=mcp-app"
                  ]
                }
              },
              "resources": {
                "listChanged": false
              },
              "tools": {
                "listChanged": false
              }
            },
            "protocolVersion": "2024-11-05",
            "serverInfo": {
              "name": "forex-gpt-mcp",
              "version": "2.0.0"
            },
            "tools": [
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/credentials-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Save your OANDA API Key and Account ID securely.\n    These are required before you can trade.\n    ",
                "inputSchema": {
                  "properties": {
                    "account_id": {
                      "title": "Account Id",
                      "type": "string"
                    },
                    "api_key": {
                      "title": "Api Key",
                      "type": "string"
                    }
                  },
                  "required": [
                    "api_key",
                    "account_id"
                  ],
                  "title": "save_oanda_credentialsArguments",
                  "type": "object"
                },
                "name": "save_oanda_credentials",
                "title": "Save OANDA Credentials"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/credentials-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Remove/Delete your stored OANDA API Key and Account ID.\n    Use this if you want to clear your credentials or switch accounts.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "delete_oanda_credentialsArguments",
                  "type": "object"
                },
                "name": "delete_oanda_credentials",
                "title": "Delete OANDA Credentials"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/modify-trade-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/modify-trade-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/modify-trade-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Modify an existing trade's Stop Loss and Take Profit.\n    You can use absolute prices OR relative distances.\n    Only provided fields will be updated.\n    \n    Args:\n        trade_id: The ID of the open trade to modify.\n        take_profit: New ABSOLUTE price.\n        stop_loss: New ABSOLUTE price.\n        take_profit_distance: New RELATIVE distance (e.g. 0.0050).\n        stop_loss_distance: New RELATIVE distance (e.g. 0.0020).\n    ",
                "inputSchema": {
                  "properties": {
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trade_id": {
                      "title": "Trade Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "trade_id"
                  ],
                  "title": "trade_modify_tradeArguments",
                  "type": "object"
                },
                "name": "trade_modify_trade",
                "title": "Modify Trade"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Place a Market Order.\n    units: Positive for Buy, Negative for Sell\n    take_profit: ABSOLUTE PRICE (e.g. 1.1250).\n    stop_loss: ABSOLUTE PRICE (e.g. 1.1100).\n    take_profit_distance: RELATIVE PIPS (e.g. 0.0050). Use this OR absolute price.\n    stop_loss_distance: RELATIVE PIPS (e.g. 0.0020). Use this OR absolute price.\n    trailing_stop_distance: RELATIVE DISTANCE for trailing stop (e.g. 0.0020).\n    guaranteed_stop_loss: True to use GSLO (Premium, requires specific SL distance rule).\n    ",
                "inputSchema": {
                  "properties": {
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "instrument",
                    "units"
                  ],
                  "title": "trade_market_orderArguments",
                  "type": "object"
                },
                "name": "trade_market_order",
                "title": "Trade Market Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Place a Limit Order.\n    price: The limit price to trigger the order.\n    take_profit: ABSOLUTE PRICE (e.g. 1.1250).\n    stop_loss: ABSOLUTE PRICE (e.g. 1.1100).\n    take_profit_distance: RELATIVE PIPS (e.g. 0.0050).\n    stop_loss_distance: RELATIVE PIPS (e.g. 0.0020).\n    trailing_stop_distance: RELATIVE DISTANCE for trailing stop.\n    guaranteed_stop_loss: True for GSLO.\n    expiry: ISO 8601 string (e.g. \"2023-12-31T23:59:00Z\"). Defaults to GTC if omitted.\n    ",
                "inputSchema": {
                  "properties": {
                    "expiry": {
                      "default": null,
                      "title": "Expiry",
                      "type": "string"
                    },
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "price": {
                      "title": "Price",
                      "type": "number"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "instrument",
                    "units",
                    "price"
                  ],
                  "title": "trade_limit_orderArguments",
                  "type": "object"
                },
                "name": "trade_limit_order",
                "title": "Trade Limit Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Place a Stop Order (Momentum/Breakout Entry).\n    Use this to Buy ABOVE market price or Sell BELOW market price.\n    \n    Args:\n        instrument: Asset symbol (e.g. 'EUR_USD')\n        units: Positive for Buy, Negative for Sell\n        price: The STOP price to trigger the order.\n        expiry: ISO 8601 string (e.g. \"2023-12-31T23:59:00Z\"). Defaults to GTC if omitted.\n        take_profit: ABSOLUTE PRICE.\n        stop_loss: ABSOLUTE PRICE.\n        take_profit_distance: RELATIVE DISTANCE (e.g. 0.0050).\n        stop_loss_distance: RELATIVE DISTANCE (e.g. 0.0020).\n        trailing_stop_distance: RELATIVE DISTANCE for trailing stop.\n        guaranteed_stop_loss: True for GSLO.\n    ",
                "inputSchema": {
                  "properties": {
                    "expiry": {
                      "default": null,
                      "title": "Expiry",
                      "type": "string"
                    },
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "price": {
                      "title": "Price",
                      "type": "number"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "instrument",
                    "units",
                    "price"
                  ],
                  "title": "trade_stop_orderArguments",
                  "type": "object"
                },
                "name": "trade_stop_order",
                "title": "Trade Stop Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/pending-orders-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Cancel a pending (unfilled) Limit or Stop order.\n    Args:\n        order_id: The OANDA ID of the order to cancel.\n    ",
                "inputSchema": {
                  "properties": {
                    "order_id": {
                      "title": "Order Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "order_id"
                  ],
                  "title": "cancel_pending_orderArguments",
                  "type": "object"
                },
                "name": "cancel_pending_order",
                "title": "Cancel Pending Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Replace (Modify) an existing pending order.\n    Basically cancels the old one and places a new one atomically.\n    Args:\n        order_id: ID of the order to replace.\n        type: 'LIMIT' or 'STOP'.\n        (All other args same as placement tools)\n    ",
                "inputSchema": {
                  "properties": {
                    "expiry": {
                      "default": null,
                      "title": "Expiry",
                      "type": "string"
                    },
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "order_id": {
                      "title": "Order Id",
                      "type": "string"
                    },
                    "price": {
                      "title": "Price",
                      "type": "number"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "type": {
                      "default": "LIMIT",
                      "title": "Type",
                      "type": "string"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "order_id",
                    "instrument",
                    "units",
                    "price"
                  ],
                  "title": "replace_pending_orderArguments",
                  "type": "object"
                },
                "name": "replace_pending_order",
                "title": "Replace Pending Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/positions-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/positions-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/positions-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "List open trades.",
                "inputSchema": {
                  "properties": {},
                  "title": "get_open_tradesArguments",
                  "type": "object"
                },
                "name": "get_open_trades",
                "title": "Get Open Trades"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/positions-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/positions-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/positions-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    List open positions (Net Exposure per instrument).\n    Useful to see total Long/Short units and P&L per pair.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_open_positionsArguments",
                  "type": "object"
                },
                "name": "get_open_positions",
                "title": "Get Open Positions"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/history-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/history-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/history-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get account transaction history (e.g. closed trades, order fills).\n    Useful for finding past trades, reporting, or auditing.\n    Args:\n        from_time: Start time (RFC3339 format, e.g. \"2023-05-01T00:00:00Z\").\n        to_time: End time (RFC3339).\n        type_filter: Comma-separated types (e.g. \"ORDER_FILL,TRADE_CLOSE\"). To see closed trades, use \"TRADE_CLOSE\".\n    ",
                "inputSchema": {
                  "properties": {
                    "from_time": {
                      "default": null,
                      "title": "From Time",
                      "type": "string"
                    },
                    "to_time": {
                      "default": null,
                      "title": "To Time",
                      "type": "string"
                    },
                    "type_filter": {
                      "default": null,
                      "title": "Type Filter",
                      "type": "string"
                    }
                  },
                  "title": "get_account_historyArguments",
                  "type": "object"
                },
                "name": "get_account_history",
                "title": "Get Account History"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/trade-details-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/trade-details-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/trade-details-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get full details of a specific trade (Open or Closed).\n    Useful to investigate a trade that disappeared or to see its full history.\n    ",
                "inputSchema": {
                  "properties": {
                    "trade_id": {
                      "title": "Trade Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "trade_id"
                  ],
                  "title": "get_trade_detailsArguments",
                  "type": "object"
                },
                "name": "get_trade_details",
                "title": "Get Trade Details"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/history-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/history-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/history-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get OANDA order history (FILLED, CANCELLED, TRIGGERED, etc.).\n    state: \"ALL\", \"PENDING\", \"FILLED\", \"TRIGGERED\", \"CANCELLED\".\n    count: Max 500.\n    ",
                "inputSchema": {
                  "properties": {
                    "count": {
                      "default": 50,
                      "title": "Count",
                      "type": "integer"
                    },
                    "state": {
                      "default": "ALL",
                      "title": "State",
                      "type": "string"
                    }
                  },
                  "title": "get_order_historyArguments",
                  "type": "object"
                },
                "name": "get_order_history",
                "title": "Get Order History"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/pending-orders-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    List all PENDING orders (Limits, Stops, Entry Orders).\n    These are orders waiting to be filled.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_pending_ordersArguments",
                  "type": "object"
                },
                "name": "get_pending_orders",
                "title": "Get Pending Orders"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/account-summary-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "Get trading account summary (balance, margin).",
                "inputSchema": {
                  "properties": {},
                  "title": "get_trading_accountArguments",
                  "type": "object"
                },
                "name": "get_trading_account",
                "title": "Get Trading Account"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/close-position-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "Close a specific trade (fully or partially).",
                "inputSchema": {
                  "properties": {
                    "trade_id": {
                      "title": "Trade Id",
                      "type": "string"
                    },
                    "units": {
                      "default": "ALL",
                      "title": "Units",
                      "type": "string"
                    }
                  },
                  "required": [
                    "trade_id"
                  ],
                  "title": "close_tradeArguments",
                  "type": "object"
                },
                "name": "close_trade",
                "title": "Close Trade"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/close-position-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "Close position for an instrument.",
                "inputSchema": {
                  "properties": {
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "long_units": {
                      "default": "ALL",
                      "title": "Long Units",
                      "type": "string"
                    },
                    "short_units": {
                      "default": "ALL",
                      "title": "Short Units",
                      "type": "string"
                    }
                  },
                  "required": [
                    "instrument"
                  ],
                  "title": "close_positionArguments",
                  "type": "object"
                },
                "name": "close_position",
                "title": "Close Position"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get trading hours for instruments. Use for session planning or bulk data fetch.\n    \n    Args:\n        instrument: Specific instrument (e.g., \"EUR_USD\", \"US30_USD\"). If None, returns all.\n        category: Filter by category (e.g., \"Forex CFDs\", \"Index CFDs\", \"Commodity CFDs\", \"Metals CFDs\", \"Bonds CFDs\").\n        include_status: Include current open/closed status (default True).\n    \n    Returns:\n        For each instrument:\n        - timezone: IANA timezone (e.g., \"America/New_York\")\n        - windows: Array of {days, open, close} in LOCAL time\n        - windows_utc: Same windows converted to UTC\n        - category: Asset category\n        - is_open: Current status (if include_status=True)\n        - displayName: Human-readable name\n    \n    Examples:\n        - get_market_hours(instrument=\"EUR_USD\") - Single instrument\n        - get_market_hours(category=\"Index CFDs\") - All indices\n        - get_market_hours(include_status=False) - All instruments, no status check\n    ",
                "inputSchema": {
                  "properties": {
                    "category": {
                      "default": null,
                      "title": "Category",
                      "type": "string"
                    },
                    "include_status": {
                      "default": true,
                      "title": "Include Status",
                      "type": "boolean"
                    },
                    "instrument": {
                      "default": null,
                      "title": "Instrument",
                      "type": "string"
                    }
                  },
                  "title": "get_market_hoursArguments",
                  "type": "object"
                },
                "name": "get_market_hours",
                "title": "Get Market Hours"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Check if a specific market is currently open for trading.\n    \n    Args:\n        instrument: The OANDA instrument name (e.g., \"EUR_USD\", \"US30_USD\", \"XAU_USD\").\n        at_time: Optional ISO8601 datetime to check (e.g., \"2024-01-15T14:30:00Z\").\n                 Defaults to current time if not provided.\n    \n    Returns:\n        - instrument: The queried instrument\n        - is_open: Boolean - True if market is open\n        - checked_at_utc: When the check was made (UTC)\n        - checked_at_local: Same time in instrument's local timezone\n        - timezone: The instrument's native timezone\n        - category: Asset category (Forex CFDs, Index CFDs, etc.)\n        - displayName: Human-readable name\n        - reason: Why the market is open/closed\n        - schedule: Schedule type if available (e.g., \"24/5\", \"24/7\")\n        - dstAffected: Whether DST affects trading hours\n    \n    Example:\n        is_market_open(instrument=\"US30_USD\")\n        is_market_open(instrument=\"SUGAR_USD\", at_time=\"2024-01-15T10:00:00-05:00\")\n    ",
                "inputSchema": {
                  "properties": {
                    "at_time": {
                      "default": null,
                      "title": "At Time",
                      "type": "string"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    }
                  },
                  "required": [
                    "instrument"
                  ],
                  "title": "is_market_openArguments",
                  "type": "object"
                },
                "name": "is_market_open",
                "title": "Is Market Open"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/search-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/search-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/search-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Get all available market categories and instrument counts.\n    Useful for understanding what categories can be queried with get_market_hours.\n    \n    Returns:\n        List of categories with counts and sample instruments.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_market_categoriesArguments",
                  "type": "object"
                },
                "name": "get_market_categories",
                "title": "Get Market Categories"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/instrument-specs-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/instrument-specs-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/instrument-specs-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get instrument specifications (precision, limits, margin, financing rates).\n    \n    Args:\n        instrument: Specific instrument (e.g., \"EUR_USD\"). If None, returns all or filtered by type.\n        type_filter: Filter by type: \"CURRENCY\", \"METAL\", \"CFD\". If None, returns all.\n        include: List of field groups to include. Options: \n                 [\"precision\", \"limits\", \"margin\", \"financing\", \"gslo\", \"trailing\"]\n                 If None, includes all fields.\n    \n    Returns:\n        For each instrument:\n        - displayName: Human-readable name\n        - type: CURRENCY, METAL, CFD\n        - precision: pip location, display precision, trade units precision\n        - limits: min trade size, max order units, max position size\n        - margin: rate and calculated leverage (e.g., \"30:1\")\n        - financing: longRate, shortRate, tripleSwapDay\n        - gslo: guaranteed stop loss mode, min distance, premium\n        - trailingStop: min/max distance\n        - meta: cache age, staleness status\n    \n    Examples:\n        - get_instrument_specs(instrument=\"EUR_USD\") - Single instrument\n        - get_instrument_specs(type_filter=\"METAL\") - All metals\n        - get_instrument_specs(instrument=\"XAU_USD\", include=[\"precision\", \"margin\"]) - Specific fields\n    ",
                "inputSchema": {
                  "properties": {
                    "include": {
                      "default": null,
                      "items": {
                        "type": "string"
                      },
                      "title": "Include",
                      "type": "array"
                    },
                    "instrument": {
                      "default": null,
                      "title": "Instrument",
                      "type": "string"
                    },
                    "type_filter": {
                      "default": null,
                      "title": "Type Filter",
                      "type": "string"
                    }
                  },
                  "title": "get_instrument_specsArguments",
                  "type": "object"
                },
                "name": "get_instrument_specs",
                "title": "Get Instrument Specs"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Manually refresh instrument data from OANDA API.\n    Updates financing rates, margin requirements, and other parameters.\n    \n    Requires: User must have saved OANDA credentials via save_oanda_credentials.\n    \n    Returns:\n        - success: Boolean indicating if refresh succeeded\n        - message: Status message\n        - count: Number of instruments refreshed\n        - refreshedAt: Timestamp of refresh\n    \n    Note: This fetches fresh data from OANDA's practice environment.\n    The cache is automatically refreshed on server startup if data is >24 hours old.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "refresh_instrument_dataArguments",
                  "type": "object"
                },
                "name": "refresh_instrument_data",
                "title": "Refresh Instrument Data"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/system-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Check the status of the instrument data cache.\n    \n    Returns:\n        - ageHours: How old the cached data is\n        - isStale: True if data is older than 24 hours\n        - lastRefreshed: When the cache was last updated\n        - instrumentCount: Number of instruments in cache\n        - recommendation: Whether refresh is recommended\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_instrument_cache_statusArguments",
                  "type": "object"
                },
                "name": "get_instrument_cache_status",
                "title": "Get Instrument Cache Status"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/account-summary-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Return the current user's token balances from Auth0 app_metadata.\n\n    Uses _safe_profile() so that the same values shown inside AI analysis\n    (token_quota, purchased_tokens, total_token_usage, last_reset, email, user_id)\n    are returned in a simple JSON structure.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_token_balancesArguments",
                  "type": "object"
                },
                "name": "get_token_balances",
                "title": "Get Token Balances"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/asset-list-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/asset-list-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/asset-list-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Return supported asset symbols from config.OANDA_UNIVERSE.\n    Optional:\n      \u2022 filter: substring (case-insensitive) to narrow the list\n      \u2022 asset: specific symbol to test membership\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "default": "",
                      "title": "Asset",
                      "type": "string"
                    },
                    "filter": {
                      "default": "",
                      "title": "Filter",
                      "type": "string"
                    }
                  },
                  "title": "list_assetsArguments",
                  "type": "object"
                },
                "name": "list_assets",
                "title": "List Assets"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/analysis-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/analysis-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Run a one-shot technical analysis for a single asset/timeframe.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD, XAU_USD)\n        timeframe: Timeframe for analysis (D, H4, H1, etc.)\n        priceType: Price type - B (bid), A (ask), or M (mid)\n        timeoutSec: Timeout in seconds (5-120)\n    \n    Returns:\n        Analysis results with status, signals, and recommendations\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "priceType": {
                      "default": "B",
                      "title": "Pricetype",
                      "type": "string"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    },
                    "timeoutSec": {
                      "default": 45,
                      "title": "Timeoutsec",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "analyze_assetArguments",
                  "type": "object"
                },
                "name": "analyze_asset",
                "title": "Analyze Asset"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    View the current assets in your saved watchlist.\n    \n    Returns:\n        List of saved assets and count.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_watchlistArguments",
                  "type": "object"
                },
                "name": "get_watchlist",
                "title": "Get Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Add a new asset to your persistent watchlist.\n    \n    Args:\n        asset: Asset symbol (e.g. 'EUR_USD', 'BTC_USD')\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "add_to_watchlistArguments",
                  "type": "object"
                },
                "name": "add_to_watchlist",
                "title": "Add to Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Remove an asset from your persistent watchlist.\n    \n    Args:\n        asset: Asset symbol to remove\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "remove_from_watchlistArguments",
                  "type": "object"
                },
                "name": "remove_from_watchlist",
                "title": "Remove from Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-analysis-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-analysis-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-analysis-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Analyze multiple assets from the user's SAVED watchlist in parallel.\n    \n    Args:\n        timeframe: Timeframe (D, H4, H1, etc.)\n        priceType: B (bid), A (ask), or M (mid)\n        timeoutSec: Overall timeout in seconds (30-300)\n        (optional) timeframes: list of timeframes (timeframes mode) \u2013 if provided, supersedes timeframe\n        (optional) max_assets: limit how many watchlist assets to analyze (default: all)\n    \n    Returns:\n        Results for all watchlist assets with analysis data\n    ",
                "inputSchema": {
                  "properties": {
                    "max_assets": {
                      "default": null,
                      "title": "Max Assets",
                      "type": "integer"
                    },
                    "priceType": {
                      "default": "B",
                      "title": "Pricetype",
                      "type": "string"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    },
                    "timeframes": {
                      "default": null,
                      "items": {
                        "type": "string"
                      },
                      "title": "Timeframes",
                      "type": "array"
                    },
                    "timeoutSec": {
                      "default": 120,
                      "title": "Timeoutsec",
                      "type": "integer"
                    }
                  },
                  "title": "analyze_watchlistArguments",
                  "type": "object"
                },
                "name": "analyze_watchlist",
                "title": "Analyze Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/multi-analysis-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/multi-analysis-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/multi-analysis-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Analyze a single asset across multiple timeframes simultaneously.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD)\n        timeframes: List of timeframes (e.g., [\"D\", \"H4\", \"H1\"])\n        priceType: B (bid), A (ask), or M (mid)\n        timeoutSec: Overall timeout in seconds (30-300)\n    \n    Returns:\n        Multi-timeframe analysis results\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "priceType": {
                      "default": "B",
                      "title": "Pricetype",
                      "type": "string"
                    },
                    "timeframes": {
                      "items": {
                        "type": "string"
                      },
                      "title": "Timeframes",
                      "type": "array"
                    },
                    "timeoutSec": {
                      "default": 90,
                      "title": "Timeoutsec",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "asset",
                    "timeframes"
                  ],
                  "title": "analyze_timeframesArguments",
                  "type": "object"
                },
                "name": "analyze_timeframes",
                "title": "Analyze Timeframes"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/calendar-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/calendar-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/calendar-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Fetch upcoming economic events via the TradingView proxy source.\n    \n    Args:\n        fromDays: Start of date range (days from now, 0-90)\n        toDays: End of date range (days from now, 0-90)\n    \n    Returns:\n        List of economic events with importance, country, and timing\n    ",
                "inputSchema": {
                  "properties": {
                    "fromDays": {
                      "default": 0,
                      "title": "Fromdays",
                      "type": "integer"
                    },
                    "toDays": {
                      "default": 7,
                      "title": "Todays",
                      "type": "integer"
                    }
                  },
                  "title": "economic_eventsArguments",
                  "type": "object"
                },
                "name": "economic_events",
                "title": "Economic Events"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/news-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/news-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/news-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get recent articles from the Forex-GPT blog feed.\n    \n    Args:\n        max_results: Maximum number of articles to return (1-50, default: 10)\n    \n    Returns:\n        List of recent blog articles with titles, URLs, summaries, images, and publication dates\n    ",
                "inputSchema": {
                  "properties": {
                    "max_results": {
                      "default": 10,
                      "title": "Max Results",
                      "type": "integer"
                    }
                  },
                  "title": "get_blog_articlesArguments",
                  "type": "object"
                },
                "name": "get_blog_articles",
                "title": "Get Blog Articles"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/system-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Comprehensive health and status check including optional upstream dependencies.\n    \n    Args:\n        checkOpenAI: Verify OpenAI API connectivity\n        checkTradingView: Verify TradingView API connectivity\n        checkOANDA: Verify OANDA API connectivity\n    \n    Returns:\n        Health status with environment info and dependency checks\n    ",
                "inputSchema": {
                  "properties": {
                    "checkOANDA": {
                      "default": false,
                      "title": "Checkoanda",
                      "type": "boolean"
                    },
                    "checkOpenAI": {
                      "default": false,
                      "title": "Checkopenai",
                      "type": "boolean"
                    },
                    "checkTradingView": {
                      "default": false,
                      "title": "Checktradingview",
                      "type": "boolean"
                    }
                  },
                  "title": "healthArguments",
                  "type": "object"
                },
                "name": "health",
                "title": "Health Check"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/chart-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/chart-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/chart-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Retrieve OHLC (candlestick) data for charting.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD)\n        timeframe: Timeframe (D, H4, H1, etc.)\n        count: Number of candles (50-5000)\n    \n    Returns:\n        Candlestick data with timestamps, open, high, low, close prices\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "count": {
                      "default": 460,
                      "title": "Count",
                      "type": "integer"
                    },
                    "price": {
                      "default": "M",
                      "title": "Price",
                      "type": "string"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "get_chart_dataArguments",
                  "type": "object"
                },
                "name": "get_chart_data",
                "title": "Get Chart Data"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/heatmap-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/heatmap-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/heatmap-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Generates a real-time Sentiment Heatmap snapshot.\n    \n    Behavior:\n    1. If 'assets' are provided, scans those specific assets.\n    2. If 'assets' not provided, scans the user's saved Watchlist.\n    3. If Watchlist is empty, scans a default list of popular global assets.\n    \n    Args:\n        assets: Optional list of symbols.\n        timeframe: Granularity (e.g. 'H1', 'D').\n    ",
                "inputSchema": {
                  "properties": {
                    "assets": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Assets"
                    },
                    "count": {
                      "default": 460,
                      "title": "Count",
                      "type": "integer"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    }
                  },
                  "title": "get_live_heatmapArguments",
                  "type": "object"
                },
                "name": "get_live_heatmap",
                "title": "Live Heatmap"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/search-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/search-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/search-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Search forex analysis results by asset name, timeframe, or keywords.\n    Returns a list of available analyses matching the search criteria.\n    \n    Args:\n        query: Search query (e.g., \"EUR_USD\", \"daily analysis\", \"gold\", \"bitcoin\")\n    \n    Returns:\n        Search results with IDs for fetching full analysis\n    ",
                "inputSchema": {
                  "properties": {
                    "query": {
                      "title": "Query",
                      "type": "string"
                    }
                  },
                  "required": [
                    "query"
                  ],
                  "title": "searchArguments",
                  "type": "object"
                },
                "name": "search",
                "title": "Search"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/analysis-viewer-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/analysis-viewer-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-viewer-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Retrieve complete forex analysis by ID.\n    \n    Args:\n        id: Analysis ID in format \"ASSET_TIMEFRAME\" (e.g., \"EUR_USD_D\", \"XAU_USD_H4\")\n    \n    Returns:\n        Full analysis document with technical indicators, signals, and recommendations\n    ",
                "inputSchema": {
                  "properties": {
                    "id": {
                      "title": "Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "id"
                  ],
                  "title": "fetchArguments",
                  "type": "object"
                },
                "name": "fetch",
                "title": "Fetch Analysis"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-scanner.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-scanner.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-scanner.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Scans the entire market universe (Forex, Crypto, Metals, Indices) to find the strongest trading opportunities.\n    \n    Args:\n        timeframes: List of timeframes to scan (e.g. [\"H1\", \"H4\", \"D\"]). Default is [\"H8\"].\n        min_score: Minimum absolute sentiment score (0-100) to include. Default 80 (Bullish/Bearish).\n        limit: Maximum number of results to return. Default 6.\n        \n    Returns:\n        A list of the top opportunities ranked by sentiment strength.\n    ",
                "inputSchema": {
                  "properties": {
                    "limit": {
                      "default": 6,
                      "title": "Limit",
                      "type": "integer"
                    },
                    "minAbs": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Minabs"
                    },
                    "min_score": {
                      "default": 80.0,
                      "title": "Min Score",
                      "type": "number"
                    },
                    "perSide": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Perside"
                    },
                    "sentiment": {
                      "default": null,
                      "title": "Sentiment",
                      "type": "string"
                    },
                    "timeframes": {
                      "default": [
                        "H8"
                      ],
                      "items": {
                        "type": "string"
                      },
                      "title": "Timeframes",
                      "type": "array"
                    }
                  },
                  "title": "scan_marketArguments",
                  "type": "object"
                },
                "name": "scan_market",
                "title": "Scan Market"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/spread-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/spread-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/spread-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Checks the current liquidity and trading cost (spread) for an asset.\n    Useful for checking if a market is too expensive to trade right now.\n    \n    Args:\n        asset: The asset symbol (e.g., \"EUR_USD\", \"XAU_USD\")\n        \n    Returns:\n        Current spread, average spread, and cost in basis points.\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "count": {
                      "default": 100,
                      "title": "Count",
                      "type": "integer"
                    },
                    "granularity": {
                      "default": "M1",
                      "title": "Granularity",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "get_spreadsArguments",
                  "type": "object"
                },
                "name": "get_spreads",
                "title": "Get Spreads"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/system-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Return the server's current UTC timestamp (ISO 8601).\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_server_timeArguments",
                  "type": "object"
                },
                "name": "get_server_time",
                "title": "Get Server Time"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/help-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/help-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/help-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Master tutorial for MCP tools: usage tips, key parameters, and suggested flows.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "help_tutorialArguments",
                  "type": "object"
                },
                "name": "help_tutorial",
                "title": "Help Tutorial"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/chart-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/chart-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/chart-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Return a short-lived URL for the raw price stream (SSE) for given instruments.\n    The URL expires after ~10 minutes.\n    ",
                "inputSchema": {
                  "properties": {
                    "instruments": {
                      "items": {
                        "type": "string"
                      },
                      "title": "Instruments",
                      "type": "array"
                    }
                  },
                  "required": [
                    "instruments"
                  ],
                  "title": "get_price_stream_urlArguments",
                  "type": "object"
                },
                "name": "get_price_stream_url",
                "title": "Get Price Stream URL"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Return a short-lived URL for the sentiment stream (SSE) for given instruments and granularity.\n    The URL expires after ~10 minutes.\n    ",
                "inputSchema": {
                  "properties": {
                    "granularity": {
                      "default": "D",
                      "title": "Granularity",
                      "type": "string"
                    },
                    "instruments": {
                      "items": {
                        "type": "string"
                      },
                      "title": "Instruments",
                      "type": "array"
                    }
                  },
                  "required": [
                    "instruments"
                  ],
                  "title": "get_sentiment_stream_urlArguments",
                  "type": "object"
                },
                "name": "get_sentiment_stream_url",
                "title": "Get Sentiment Stream URL"
              },
              {
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Proxy to the Flask /api/chart-chat endpoint using the caller's bearer token.\n    Keeps token accounting/auth consistent with the web app while exposing chat via MCP.\n    ",
                "inputSchema": {
                  "properties": {
                    "chart_id": {
                      "default": "",
                      "title": "Chart Id",
                      "type": "string"
                    },
                    "chat_session_id": {
                      "default": "",
                      "title": "Chat Session Id",
                      "type": "string"
                    },
                    "granularity": {
                      "default": "",
                      "title": "Granularity",
                      "type": "string"
                    },
                    "instrument": {
                      "default": "",
                      "title": "Instrument",
                      "type": "string"
                    },
                    "max_tokens": {
                      "default": null,
                      "title": "Max Tokens",
                      "type": "integer"
                    },
                    "message": {
                      "title": "Message",
                      "type": "string"
                    },
                    "price_type": {
                      "default": "B",
                      "title": "Price Type",
                      "type": "string"
                    }
                  },
                  "required": [
                    "message"
                  ],
                  "title": "chart_chat_proxyArguments",
                  "type": "object"
                },
                "name": "chart_chat_proxy",
                "title": "Chart Chat Proxy"
              }
            ]
          }
        },
        "requested_protocol_version": "2024-11-05",
        "resumed": true,
        "session_id_present": true,
        "transport": "sse",
        "url": "https://mcp.forex-gpt.ai/mcp"
      },
      "latency_ms": 89.71,
      "status": "ok"
    },
    "step_up_auth_probe": {
      "details": {
        "auth_required_checks": [],
        "broad_scopes": [],
        "challenge_headers": [],
        "minimal_scope_documented": false,
        "oauth_present": true,
        "scope_specificity_ratio": 0.2,
        "step_up_signals": [],
        "supported_scopes": [
          "email",
          "offline_access",
          "openid",
          "profile"
        ]
      },
      "latency_ms": null,
      "status": "warning"
    },
    "tool_snapshot_probe": {
      "details": {
        "added": [],
        "changed_outputs": [],
        "current_tool_count": 45,
        "previous_tool_count": 45,
        "removed": [],
        "similarity": 1.0
      },
      "latency_ms": null,
      "status": "ok"
    },
    "tools_list": {
      "details": {
        "headers": {
          "content-type": "application/json; charset=utf-8"
        },
        "http_status": 200,
        "payload": {
          "id": 2,
          "jsonrpc": "2.0",
          "result": {
            "capabilities": {
              "extensions": {
                "io.modelcontextprotocol/ui": {
                  "mimeTypes": [
                    "text/html;profile=mcp-app"
                  ]
                }
              },
              "resources": {
                "listChanged": false
              },
              "tools": {
                "listChanged": false
              }
            },
            "protocolVersion": "2024-11-05",
            "serverInfo": {
              "name": "forex-gpt-mcp",
              "version": "2.0.0"
            },
            "tools": [
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/credentials-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Save your OANDA API Key and Account ID securely.\n    These are required before you can trade.\n    ",
                "inputSchema": {
                  "properties": {
                    "account_id": {
                      "title": "Account Id",
                      "type": "string"
                    },
                    "api_key": {
                      "title": "Api Key",
                      "type": "string"
                    }
                  },
                  "required": [
                    "api_key",
                    "account_id"
                  ],
                  "title": "save_oanda_credentialsArguments",
                  "type": "object"
                },
                "name": "save_oanda_credentials",
                "title": "Save OANDA Credentials"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/credentials-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Remove/Delete your stored OANDA API Key and Account ID.\n    Use this if you want to clear your credentials or switch accounts.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "delete_oanda_credentialsArguments",
                  "type": "object"
                },
                "name": "delete_oanda_credentials",
                "title": "Delete OANDA Credentials"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/modify-trade-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/modify-trade-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/modify-trade-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Modify an existing trade's Stop Loss and Take Profit.\n    You can use absolute prices OR relative distances.\n    Only provided fields will be updated.\n    \n    Args:\n        trade_id: The ID of the open trade to modify.\n        take_profit: New ABSOLUTE price.\n        stop_loss: New ABSOLUTE price.\n        take_profit_distance: New RELATIVE distance (e.g. 0.0050).\n        stop_loss_distance: New RELATIVE distance (e.g. 0.0020).\n    ",
                "inputSchema": {
                  "properties": {
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trade_id": {
                      "title": "Trade Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "trade_id"
                  ],
                  "title": "trade_modify_tradeArguments",
                  "type": "object"
                },
                "name": "trade_modify_trade",
                "title": "Modify Trade"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Place a Market Order.\n    units: Positive for Buy, Negative for Sell\n    take_profit: ABSOLUTE PRICE (e.g. 1.1250).\n    stop_loss: ABSOLUTE PRICE (e.g. 1.1100).\n    take_profit_distance: RELATIVE PIPS (e.g. 0.0050). Use this OR absolute price.\n    stop_loss_distance: RELATIVE PIPS (e.g. 0.0020). Use this OR absolute price.\n    trailing_stop_distance: RELATIVE DISTANCE for trailing stop (e.g. 0.0020).\n    guaranteed_stop_loss: True to use GSLO (Premium, requires specific SL distance rule).\n    ",
                "inputSchema": {
                  "properties": {
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "instrument",
                    "units"
                  ],
                  "title": "trade_market_orderArguments",
                  "type": "object"
                },
                "name": "trade_market_order",
                "title": "Trade Market Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Place a Limit Order.\n    price: The limit price to trigger the order.\n    take_profit: ABSOLUTE PRICE (e.g. 1.1250).\n    stop_loss: ABSOLUTE PRICE (e.g. 1.1100).\n    take_profit_distance: RELATIVE PIPS (e.g. 0.0050).\n    stop_loss_distance: RELATIVE PIPS (e.g. 0.0020).\n    trailing_stop_distance: RELATIVE DISTANCE for trailing stop.\n    guaranteed_stop_loss: True for GSLO.\n    expiry: ISO 8601 string (e.g. \"2023-12-31T23:59:00Z\"). Defaults to GTC if omitted.\n    ",
                "inputSchema": {
                  "properties": {
                    "expiry": {
                      "default": null,
                      "title": "Expiry",
                      "type": "string"
                    },
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "price": {
                      "title": "Price",
                      "type": "number"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "instrument",
                    "units",
                    "price"
                  ],
                  "title": "trade_limit_orderArguments",
                  "type": "object"
                },
                "name": "trade_limit_order",
                "title": "Trade Limit Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Place a Stop Order (Momentum/Breakout Entry).\n    Use this to Buy ABOVE market price or Sell BELOW market price.\n    \n    Args:\n        instrument: Asset symbol (e.g. 'EUR_USD')\n        units: Positive for Buy, Negative for Sell\n        price: The STOP price to trigger the order.\n        expiry: ISO 8601 string (e.g. \"2023-12-31T23:59:00Z\"). Defaults to GTC if omitted.\n        take_profit: ABSOLUTE PRICE.\n        stop_loss: ABSOLUTE PRICE.\n        take_profit_distance: RELATIVE DISTANCE (e.g. 0.0050).\n        stop_loss_distance: RELATIVE DISTANCE (e.g. 0.0020).\n        trailing_stop_distance: RELATIVE DISTANCE for trailing stop.\n        guaranteed_stop_loss: True for GSLO.\n    ",
                "inputSchema": {
                  "properties": {
                    "expiry": {
                      "default": null,
                      "title": "Expiry",
                      "type": "string"
                    },
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "price": {
                      "title": "Price",
                      "type": "number"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "instrument",
                    "units",
                    "price"
                  ],
                  "title": "trade_stop_orderArguments",
                  "type": "object"
                },
                "name": "trade_stop_order",
                "title": "Trade Stop Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/pending-orders-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Cancel a pending (unfilled) Limit or Stop order.\n    Args:\n        order_id: The OANDA ID of the order to cancel.\n    ",
                "inputSchema": {
                  "properties": {
                    "order_id": {
                      "title": "Order Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "order_id"
                  ],
                  "title": "cancel_pending_orderArguments",
                  "type": "object"
                },
                "name": "cancel_pending_order",
                "title": "Cancel Pending Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Replace (Modify) an existing pending order.\n    Basically cancels the old one and places a new one atomically.\n    Args:\n        order_id: ID of the order to replace.\n        type: 'LIMIT' or 'STOP'.\n        (All other args same as placement tools)\n    ",
                "inputSchema": {
                  "properties": {
                    "expiry": {
                      "default": null,
                      "title": "Expiry",
                      "type": "string"
                    },
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "order_id": {
                      "title": "Order Id",
                      "type": "string"
                    },
                    "price": {
                      "title": "Price",
                      "type": "number"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "type": {
                      "default": "LIMIT",
                      "title": "Type",
                      "type": "string"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "order_id",
                    "instrument",
                    "units",
                    "price"
                  ],
                  "title": "replace_pending_orderArguments",
                  "type": "object"
                },
                "name": "replace_pending_order",
                "title": "Replace Pending Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/positions-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/positions-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/positions-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "List open trades.",
                "inputSchema": {
                  "properties": {},
                  "title": "get_open_tradesArguments",
                  "type": "object"
                },
                "name": "get_open_trades",
                "title": "Get Open Trades"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/positions-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/positions-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/positions-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    List open positions (Net Exposure per instrument).\n    Useful to see total Long/Short units and P&L per pair.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_open_positionsArguments",
                  "type": "object"
                },
                "name": "get_open_positions",
                "title": "Get Open Positions"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/history-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/history-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/history-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get account transaction history (e.g. closed trades, order fills).\n    Useful for finding past trades, reporting, or auditing.\n    Args:\n        from_time: Start time (RFC3339 format, e.g. \"2023-05-01T00:00:00Z\").\n        to_time: End time (RFC3339).\n        type_filter: Comma-separated types (e.g. \"ORDER_FILL,TRADE_CLOSE\"). To see closed trades, use \"TRADE_CLOSE\".\n    ",
                "inputSchema": {
                  "properties": {
                    "from_time": {
                      "default": null,
                      "title": "From Time",
                      "type": "string"
                    },
                    "to_time": {
                      "default": null,
                      "title": "To Time",
                      "type": "string"
                    },
                    "type_filter": {
                      "default": null,
                      "title": "Type Filter",
                      "type": "string"
                    }
                  },
                  "title": "get_account_historyArguments",
                  "type": "object"
                },
                "name": "get_account_history",
                "title": "Get Account History"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/trade-details-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/trade-details-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/trade-details-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get full details of a specific trade (Open or Closed).\n    Useful to investigate a trade that disappeared or to see its full history.\n    ",
                "inputSchema": {
                  "properties": {
                    "trade_id": {
                      "title": "Trade Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "trade_id"
                  ],
                  "title": "get_trade_detailsArguments",
                  "type": "object"
                },
                "name": "get_trade_details",
                "title": "Get Trade Details"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/history-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/history-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/history-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get OANDA order history (FILLED, CANCELLED, TRIGGERED, etc.).\n    state: \"ALL\", \"PENDING\", \"FILLED\", \"TRIGGERED\", \"CANCELLED\".\n    count: Max 500.\n    ",
                "inputSchema": {
                  "properties": {
                    "count": {
                      "default": 50,
                      "title": "Count",
                      "type": "integer"
                    },
                    "state": {
                      "default": "ALL",
                      "title": "State",
                      "type": "string"
                    }
                  },
                  "title": "get_order_historyArguments",
                  "type": "object"
                },
                "name": "get_order_history",
                "title": "Get Order History"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/pending-orders-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    List all PENDING orders (Limits, Stops, Entry Orders).\n    These are orders waiting to be filled.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_pending_ordersArguments",
                  "type": "object"
                },
                "name": "get_pending_orders",
                "title": "Get Pending Orders"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/account-summary-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "Get trading account summary (balance, margin).",
                "inputSchema": {
                  "properties": {},
                  "title": "get_trading_accountArguments",
                  "type": "object"
                },
                "name": "get_trading_account",
                "title": "Get Trading Account"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/close-position-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "Close a specific trade (fully or partially).",
                "inputSchema": {
                  "properties": {
                    "trade_id": {
                      "title": "Trade Id",
                      "type": "string"
                    },
                    "units": {
                      "default": "ALL",
                      "title": "Units",
                      "type": "string"
                    }
                  },
                  "required": [
                    "trade_id"
                  ],
                  "title": "close_tradeArguments",
                  "type": "object"
                },
                "name": "close_trade",
                "title": "Close Trade"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/close-position-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "Close position for an instrument.",
                "inputSchema": {
                  "properties": {
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "long_units": {
                      "default": "ALL",
                      "title": "Long Units",
                      "type": "string"
                    },
                    "short_units": {
                      "default": "ALL",
                      "title": "Short Units",
                      "type": "string"
                    }
                  },
                  "required": [
                    "instrument"
                  ],
                  "title": "close_positionArguments",
                  "type": "object"
                },
                "name": "close_position",
                "title": "Close Position"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get trading hours for instruments. Use for session planning or bulk data fetch.\n    \n    Args:\n        instrument: Specific instrument (e.g., \"EUR_USD\", \"US30_USD\"). If None, returns all.\n        category: Filter by category (e.g., \"Forex CFDs\", \"Index CFDs\", \"Commodity CFDs\", \"Metals CFDs\", \"Bonds CFDs\").\n        include_status: Include current open/closed status (default True).\n    \n    Returns:\n        For each instrument:\n        - timezone: IANA timezone (e.g., \"America/New_York\")\n        - windows: Array of {days, open, close} in LOCAL time\n        - windows_utc: Same windows converted to UTC\n        - category: Asset category\n        - is_open: Current status (if include_status=True)\n        - displayName: Human-readable name\n    \n    Examples:\n        - get_market_hours(instrument=\"EUR_USD\") - Single instrument\n        - get_market_hours(category=\"Index CFDs\") - All indices\n        - get_market_hours(include_status=False) - All instruments, no status check\n    ",
                "inputSchema": {
                  "properties": {
                    "category": {
                      "default": null,
                      "title": "Category",
                      "type": "string"
                    },
                    "include_status": {
                      "default": true,
                      "title": "Include Status",
                      "type": "boolean"
                    },
                    "instrument": {
                      "default": null,
                      "title": "Instrument",
                      "type": "string"
                    }
                  },
                  "title": "get_market_hoursArguments",
                  "type": "object"
                },
                "name": "get_market_hours",
                "title": "Get Market Hours"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Check if a specific market is currently open for trading.\n    \n    Args:\n        instrument: The OANDA instrument name (e.g., \"EUR_USD\", \"US30_USD\", \"XAU_USD\").\n        at_time: Optional ISO8601 datetime to check (e.g., \"2024-01-15T14:30:00Z\").\n                 Defaults to current time if not provided.\n    \n    Returns:\n        - instrument: The queried instrument\n        - is_open: Boolean - True if market is open\n        - checked_at_utc: When the check was made (UTC)\n        - checked_at_local: Same time in instrument's local timezone\n        - timezone: The instrument's native timezone\n        - category: Asset category (Forex CFDs, Index CFDs, etc.)\n        - displayName: Human-readable name\n        - reason: Why the market is open/closed\n        - schedule: Schedule type if available (e.g., \"24/5\", \"24/7\")\n        - dstAffected: Whether DST affects trading hours\n    \n    Example:\n        is_market_open(instrument=\"US30_USD\")\n        is_market_open(instrument=\"SUGAR_USD\", at_time=\"2024-01-15T10:00:00-05:00\")\n    ",
                "inputSchema": {
                  "properties": {
                    "at_time": {
                      "default": null,
                      "title": "At Time",
                      "type": "string"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    }
                  },
                  "required": [
                    "instrument"
                  ],
                  "title": "is_market_openArguments",
                  "type": "object"
                },
                "name": "is_market_open",
                "title": "Is Market Open"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/search-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/search-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/search-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Get all available market categories and instrument counts.\n    Useful for understanding what categories can be queried with get_market_hours.\n    \n    Returns:\n        List of categories with counts and sample instruments.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_market_categoriesArguments",
                  "type": "object"
                },
                "name": "get_market_categories",
                "title": "Get Market Categories"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/instrument-specs-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/instrument-specs-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/instrument-specs-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get instrument specifications (precision, limits, margin, financing rates).\n    \n    Args:\n        instrument: Specific instrument (e.g., \"EUR_USD\"). If None, returns all or filtered by type.\n        type_filter: Filter by type: \"CURRENCY\", \"METAL\", \"CFD\". If None, returns all.\n        include: List of field groups to include. Options: \n                 [\"precision\", \"limits\", \"margin\", \"financing\", \"gslo\", \"trailing\"]\n                 If None, includes all fields.\n    \n    Returns:\n        For each instrument:\n        - displayName: Human-readable name\n        - type: CURRENCY, METAL, CFD\n        - precision: pip location, display precision, trade units precision\n        - limits: min trade size, max order units, max position size\n        - margin: rate and calculated leverage (e.g., \"30:1\")\n        - financing: longRate, shortRate, tripleSwapDay\n        - gslo: guaranteed stop loss mode, min distance, premium\n        - trailingStop: min/max distance\n        - meta: cache age, staleness status\n    \n    Examples:\n        - get_instrument_specs(instrument=\"EUR_USD\") - Single instrument\n        - get_instrument_specs(type_filter=\"METAL\") - All metals\n        - get_instrument_specs(instrument=\"XAU_USD\", include=[\"precision\", \"margin\"]) - Specific fields\n    ",
                "inputSchema": {
                  "properties": {
                    "include": {
                      "default": null,
                      "items": {
                        "type": "string"
                      },
                      "title": "Include",
                      "type": "array"
                    },
                    "instrument": {
                      "default": null,
                      "title": "Instrument",
                      "type": "string"
                    },
                    "type_filter": {
                      "default": null,
                      "title": "Type Filter",
                      "type": "string"
                    }
                  },
                  "title": "get_instrument_specsArguments",
                  "type": "object"
                },
                "name": "get_instrument_specs",
                "title": "Get Instrument Specs"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Manually refresh instrument data from OANDA API.\n    Updates financing rates, margin requirements, and other parameters.\n    \n    Requires: User must have saved OANDA credentials via save_oanda_credentials.\n    \n    Returns:\n        - success: Boolean indicating if refresh succeeded\n        - message: Status message\n        - count: Number of instruments refreshed\n        - refreshedAt: Timestamp of refresh\n    \n    Note: This fetches fresh data from OANDA's practice environment.\n    The cache is automatically refreshed on server startup if data is >24 hours old.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "refresh_instrument_dataArguments",
                  "type": "object"
                },
                "name": "refresh_instrument_data",
                "title": "Refresh Instrument Data"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/system-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Check the status of the instrument data cache.\n    \n    Returns:\n        - ageHours: How old the cached data is\n        - isStale: True if data is older than 24 hours\n        - lastRefreshed: When the cache was last updated\n        - instrumentCount: Number of instruments in cache\n        - recommendation: Whether refresh is recommended\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_instrument_cache_statusArguments",
                  "type": "object"
                },
                "name": "get_instrument_cache_status",
                "title": "Get Instrument Cache Status"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/account-summary-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Return the current user's token balances from Auth0 app_metadata.\n\n    Uses _safe_profile() so that the same values shown inside AI analysis\n    (token_quota, purchased_tokens, total_token_usage, last_reset, email, user_id)\n    are returned in a simple JSON structure.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_token_balancesArguments",
                  "type": "object"
                },
                "name": "get_token_balances",
                "title": "Get Token Balances"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/asset-list-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/asset-list-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/asset-list-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Return supported asset symbols from config.OANDA_UNIVERSE.\n    Optional:\n      \u2022 filter: substring (case-insensitive) to narrow the list\n      \u2022 asset: specific symbol to test membership\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "default": "",
                      "title": "Asset",
                      "type": "string"
                    },
                    "filter": {
                      "default": "",
                      "title": "Filter",
                      "type": "string"
                    }
                  },
                  "title": "list_assetsArguments",
                  "type": "object"
                },
                "name": "list_assets",
                "title": "List Assets"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/analysis-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/analysis-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Run a one-shot technical analysis for a single asset/timeframe.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD, XAU_USD)\n        timeframe: Timeframe for analysis (D, H4, H1, etc.)\n        priceType: Price type - B (bid), A (ask), or M (mid)\n        timeoutSec: Timeout in seconds (5-120)\n    \n    Returns:\n        Analysis results with status, signals, and recommendations\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "priceType": {
                      "default": "B",
                      "title": "Pricetype",
                      "type": "string"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    },
                    "timeoutSec": {
                      "default": 45,
                      "title": "Timeoutsec",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "analyze_assetArguments",
                  "type": "object"
                },
                "name": "analyze_asset",
                "title": "Analyze Asset"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    View the current assets in your saved watchlist.\n    \n    Returns:\n        List of saved assets and count.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_watchlistArguments",
                  "type": "object"
                },
                "name": "get_watchlist",
                "title": "Get Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Add a new asset to your persistent watchlist.\n    \n    Args:\n        asset: Asset symbol (e.g. 'EUR_USD', 'BTC_USD')\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "add_to_watchlistArguments",
                  "type": "object"
                },
                "name": "add_to_watchlist",
                "title": "Add to Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Remove an asset from your persistent watchlist.\n    \n    Args:\n        asset: Asset symbol to remove\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "remove_from_watchlistArguments",
                  "type": "object"
                },
                "name": "remove_from_watchlist",
                "title": "Remove from Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-analysis-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-analysis-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-analysis-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Analyze multiple assets from the user's SAVED watchlist in parallel.\n    \n    Args:\n        timeframe: Timeframe (D, H4, H1, etc.)\n        priceType: B (bid), A (ask), or M (mid)\n        timeoutSec: Overall timeout in seconds (30-300)\n        (optional) timeframes: list of timeframes (timeframes mode) \u2013 if provided, supersedes timeframe\n        (optional) max_assets: limit how many watchlist assets to analyze (default: all)\n    \n    Returns:\n        Results for all watchlist assets with analysis data\n    ",
                "inputSchema": {
                  "properties": {
                    "max_assets": {
                      "default": null,
                      "title": "Max Assets",
                      "type": "integer"
                    },
                    "priceType": {
                      "default": "B",
                      "title": "Pricetype",
                      "type": "string"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    },
                    "timeframes": {
                      "default": null,
                      "items": {
                        "type": "string"
                      },
                      "title": "Timeframes",
                      "type": "array"
                    },
                    "timeoutSec": {
                      "default": 120,
                      "title": "Timeoutsec",
                      "type": "integer"
                    }
                  },
                  "title": "analyze_watchlistArguments",
                  "type": "object"
                },
                "name": "analyze_watchlist",
                "title": "Analyze Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/multi-analysis-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/multi-analysis-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/multi-analysis-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Analyze a single asset across multiple timeframes simultaneously.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD)\n        timeframes: List of timeframes (e.g., [\"D\", \"H4\", \"H1\"])\n        priceType: B (bid), A (ask), or M (mid)\n        timeoutSec: Overall timeout in seconds (30-300)\n    \n    Returns:\n        Multi-timeframe analysis results\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "priceType": {
                      "default": "B",
                      "title": "Pricetype",
                      "type": "string"
                    },
                    "timeframes": {
                      "items": {
                        "type": "string"
                      },
                      "title": "Timeframes",
                      "type": "array"
                    },
                    "timeoutSec": {
                      "default": 90,
                      "title": "Timeoutsec",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "asset",
                    "timeframes"
                  ],
                  "title": "analyze_timeframesArguments",
                  "type": "object"
                },
                "name": "analyze_timeframes",
                "title": "Analyze Timeframes"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/calendar-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/calendar-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/calendar-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Fetch upcoming economic events via the TradingView proxy source.\n    \n    Args:\n        fromDays: Start of date range (days from now, 0-90)\n        toDays: End of date range (days from now, 0-90)\n    \n    Returns:\n        List of economic events with importance, country, and timing\n    ",
                "inputSchema": {
                  "properties": {
                    "fromDays": {
                      "default": 0,
                      "title": "Fromdays",
                      "type": "integer"
                    },
                    "toDays": {
                      "default": 7,
                      "title": "Todays",
                      "type": "integer"
                    }
                  },
                  "title": "economic_eventsArguments",
                  "type": "object"
                },
                "name": "economic_events",
                "title": "Economic Events"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/news-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/news-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/news-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get recent articles from the Forex-GPT blog feed.\n    \n    Args:\n        max_results: Maximum number of articles to return (1-50, default: 10)\n    \n    Returns:\n        List of recent blog articles with titles, URLs, summaries, images, and publication dates\n    ",
                "inputSchema": {
                  "properties": {
                    "max_results": {
                      "default": 10,
                      "title": "Max Results",
                      "type": "integer"
                    }
                  },
                  "title": "get_blog_articlesArguments",
                  "type": "object"
                },
                "name": "get_blog_articles",
                "title": "Get Blog Articles"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/system-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Comprehensive health and status check including optional upstream dependencies.\n    \n    Args:\n        checkOpenAI: Verify OpenAI API connectivity\n        checkTradingView: Verify TradingView API connectivity\n        checkOANDA: Verify OANDA API connectivity\n    \n    Returns:\n        Health status with environment info and dependency checks\n    ",
                "inputSchema": {
                  "properties": {
                    "checkOANDA": {
                      "default": false,
                      "title": "Checkoanda",
                      "type": "boolean"
                    },
                    "checkOpenAI": {
                      "default": false,
                      "title": "Checkopenai",
                      "type": "boolean"
                    },
                    "checkTradingView": {
                      "default": false,
                      "title": "Checktradingview",
                      "type": "boolean"
                    }
                  },
                  "title": "healthArguments",
                  "type": "object"
                },
                "name": "health",
                "title": "Health Check"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/chart-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/chart-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/chart-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Retrieve OHLC (candlestick) data for charting.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD)\n        timeframe: Timeframe (D, H4, H1, etc.)\n        count: Number of candles (50-5000)\n    \n    Returns:\n        Candlestick data with timestamps, open, high, low, close prices\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "count": {
                      "default": 460,
                      "title": "Count",
                      "type": "integer"
                    },
                    "price": {
                      "default": "M",
                      "title": "Price",
                      "type": "string"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "get_chart_dataArguments",
                  "type": "object"
                },
                "name": "get_chart_data",
                "title": "Get Chart Data"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/heatmap-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/heatmap-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/heatmap-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Generates a real-time Sentiment Heatmap snapshot.\n    \n    Behavior:\n    1. If 'assets' are provided, scans those specific assets.\n    2. If 'assets' not provided, scans the user's saved Watchlist.\n    3. If Watchlist is empty, scans a default list of popular global assets.\n    \n    Args:\n        assets: Optional list of symbols.\n        timeframe: Granularity (e.g. 'H1', 'D').\n    ",
                "inputSchema": {
                  "properties": {
                    "assets": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Assets"
                    },
                    "count": {
                      "default": 460,
                      "title": "Count",
                      "type": "integer"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    }
                  },
                  "title": "get_live_heatmapArguments",
                  "type": "object"
                },
                "name": "get_live_heatmap",
                "title": "Live Heatmap"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/search-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/search-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/search-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Search forex analysis results by asset name, timeframe, or keywords.\n    Returns a list of available analyses matching the search criteria.\n    \n    Args:\n        query: Search query (e.g., \"EUR_USD\", \"daily analysis\", \"gold\", \"bitcoin\")\n    \n    Returns:\n        Search results with IDs for fetching full analysis\n    ",
                "inputSchema": {
                  "properties": {
                    "query": {
                      "title": "Query",
                      "type": "string"
                    }
                  },
                  "required": [
                    "query"
                  ],
                  "title": "searchArguments",
                  "type": "object"
                },
                "name": "search",
                "title": "Search"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/analysis-viewer-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/analysis-viewer-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-viewer-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Retrieve complete forex analysis by ID.\n    \n    Args:\n        id: Analysis ID in format \"ASSET_TIMEFRAME\" (e.g., \"EUR_USD_D\", \"XAU_USD_H4\")\n    \n    Returns:\n        Full analysis document with technical indicators, signals, and recommendations\n    ",
                "inputSchema": {
                  "properties": {
                    "id": {
                      "title": "Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "id"
                  ],
                  "title": "fetchArguments",
                  "type": "object"
                },
                "name": "fetch",
                "title": "Fetch Analysis"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-scanner.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-scanner.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-scanner.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Scans the entire market universe (Forex, Crypto, Metals, Indices) to find the strongest trading opportunities.\n    \n    Args:\n        timeframes: List of timeframes to scan (e.g. [\"H1\", \"H4\", \"D\"]). Default is [\"H8\"].\n        min_score: Minimum absolute sentiment score (0-100) to include. Default 80 (Bullish/Bearish).\n        limit: Maximum number of results to return. Default 6.\n        \n    Returns:\n        A list of the top opportunities ranked by sentiment strength.\n    ",
                "inputSchema": {
                  "properties": {
                    "limit": {
                      "default": 6,
                      "title": "Limit",
                      "type": "integer"
                    },
                    "minAbs": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Minabs"
                    },
                    "min_score": {
                      "default": 80.0,
                      "title": "Min Score",
                      "type": "number"
                    },
                    "perSide": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Perside"
                    },
                    "sentiment": {
                      "default": null,
                      "title": "Sentiment",
                      "type": "string"
                    },
                    "timeframes": {
                      "default": [
                        "H8"
                      ],
                      "items": {
                        "type": "string"
                      },
                      "title": "Timeframes",
                      "type": "array"
                    }
                  },
                  "title": "scan_marketArguments",
                  "type": "object"
                },
                "name": "scan_market",
                "title": "Scan Market"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/spread-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/spread-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/spread-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Checks the current liquidity and trading cost (spread) for an asset.\n    Useful for checking if a market is too expensive to trade right now.\n    \n    Args:\n        asset: The asset symbol (e.g., \"EUR_USD\", \"XAU_USD\")\n        \n    Returns:\n        Current spread, average spread, and cost in basis points.\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "count": {
                      "default": 100,
                      "title": "Count",
                      "type": "integer"
                    },
                    "granularity": {
                      "default": "M1",
                      "title": "Granularity",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "get_spreadsArguments",
                  "type": "object"
                },
                "name": "get_spreads",
                "title": "Get Spreads"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/system-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Return the server's current UTC timestamp (ISO 8601).\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_server_timeArguments",
                  "type": "object"
                },
                "name": "get_server_time",
                "title": "Get Server Time"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/help-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/help-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/help-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Master tutorial for MCP tools: usage tips, key parameters, and suggested flows.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "help_tutorialArguments",
                  "type": "object"
                },
                "name": "help_tutorial",
                "title": "Help Tutorial"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/chart-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/chart-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/chart-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Return a short-lived URL for the raw price stream (SSE) for given instruments.\n    The URL expires after ~10 minutes.\n    ",
                "inputSchema": {
                  "properties": {
                    "instruments": {
                      "items": {
                        "type": "string"
                      },
                      "title": "Instruments",
                      "type": "array"
                    }
                  },
                  "required": [
                    "instruments"
                  ],
                  "title": "get_price_stream_urlArguments",
                  "type": "object"
                },
                "name": "get_price_stream_url",
                "title": "Get Price Stream URL"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Return a short-lived URL for the sentiment stream (SSE) for given instruments and granularity.\n    The URL expires after ~10 minutes.\n    ",
                "inputSchema": {
                  "properties": {
                    "granularity": {
                      "default": "D",
                      "title": "Granularity",
                      "type": "string"
                    },
                    "instruments": {
                      "items": {
                        "type": "string"
                      },
                      "title": "Instruments",
                      "type": "array"
                    }
                  },
                  "required": [
                    "instruments"
                  ],
                  "title": "get_sentiment_stream_urlArguments",
                  "type": "object"
                },
                "name": "get_sentiment_stream_url",
                "title": "Get Sentiment Stream URL"
              },
              {
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Proxy to the Flask /api/chart-chat endpoint using the caller's bearer token.\n    Keeps token accounting/auth consistent with the web app while exposing chat via MCP.\n    ",
                "inputSchema": {
                  "properties": {
                    "chart_id": {
                      "default": "",
                      "title": "Chart Id",
                      "type": "string"
                    },
                    "chat_session_id": {
                      "default": "",
                      "title": "Chat Session Id",
                      "type": "string"
                    },
                    "granularity": {
                      "default": "",
                      "title": "Granularity",
                      "type": "string"
                    },
                    "instrument": {
                      "default": "",
                      "title": "Instrument",
                      "type": "string"
                    },
                    "max_tokens": {
                      "default": null,
                      "title": "Max Tokens",
                      "type": "integer"
                    },
                    "message": {
                      "title": "Message",
                      "type": "string"
                    },
                    "price_type": {
                      "default": "B",
                      "title": "Price Type",
                      "type": "string"
                    }
                  },
                  "required": [
                    "message"
                  ],
                  "title": "chart_chat_proxyArguments",
                  "type": "object"
                },
                "name": "chart_chat_proxy",
                "title": "Chart Chat Proxy"
              }
            ]
          }
        },
        "url": "https://mcp.forex-gpt.ai/mcp"
      },
      "latency_ms": 23.56,
      "status": "ok"
    },
    "transport_compliance_probe": {
      "details": {
        "bad_protocol_error": null,
        "bad_protocol_headers": {
          "content-type": "application/json; charset=utf-8",
          "mcp-session-id": "80bd6123-4ca4-4cb4-b5dc-7e5d32a14785"
        },
        "bad_protocol_payload": {
          "id": 410,
          "jsonrpc": "2.0",
          "result": {
            "capabilities": {
              "extensions": {
                "io.modelcontextprotocol/ui": {
                  "mimeTypes": [
                    "text/html;profile=mcp-app"
                  ]
                }
              },
              "resources": {
                "listChanged": false
              },
              "tools": {
                "listChanged": false
              }
            },
            "protocolVersion": "2024-11-05",
            "serverInfo": {
              "name": "forex-gpt-mcp",
              "version": "2.0.0"
            },
            "tools": [
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/credentials-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Save your OANDA API Key and Account ID securely.\n    These are required before you can trade.\n    ",
                "inputSchema": {
                  "properties": {
                    "account_id": {
                      "title": "Account Id",
                      "type": "string"
                    },
                    "api_key": {
                      "title": "Api Key",
                      "type": "string"
                    }
                  },
                  "required": [
                    "api_key",
                    "account_id"
                  ],
                  "title": "save_oanda_credentialsArguments",
                  "type": "object"
                },
                "name": "save_oanda_credentials",
                "title": "Save OANDA Credentials"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/credentials-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Remove/Delete your stored OANDA API Key and Account ID.\n    Use this if you want to clear your credentials or switch accounts.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "delete_oanda_credentialsArguments",
                  "type": "object"
                },
                "name": "delete_oanda_credentials",
                "title": "Delete OANDA Credentials"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/modify-trade-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/modify-trade-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/modify-trade-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Modify an existing trade's Stop Loss and Take Profit.\n    You can use absolute prices OR relative distances.\n    Only provided fields will be updated.\n    \n    Args:\n        trade_id: The ID of the open trade to modify.\n        take_profit: New ABSOLUTE price.\n        stop_loss: New ABSOLUTE price.\n        take_profit_distance: New RELATIVE distance (e.g. 0.0050).\n        stop_loss_distance: New RELATIVE distance (e.g. 0.0020).\n    ",
                "inputSchema": {
                  "properties": {
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trade_id": {
                      "title": "Trade Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "trade_id"
                  ],
                  "title": "trade_modify_tradeArguments",
                  "type": "object"
                },
                "name": "trade_modify_trade",
                "title": "Modify Trade"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Place a Market Order.\n    units: Positive for Buy, Negative for Sell\n    take_profit: ABSOLUTE PRICE (e.g. 1.1250).\n    stop_loss: ABSOLUTE PRICE (e.g. 1.1100).\n    take_profit_distance: RELATIVE PIPS (e.g. 0.0050). Use this OR absolute price.\n    stop_loss_distance: RELATIVE PIPS (e.g. 0.0020). Use this OR absolute price.\n    trailing_stop_distance: RELATIVE DISTANCE for trailing stop (e.g. 0.0020).\n    guaranteed_stop_loss: True to use GSLO (Premium, requires specific SL distance rule).\n    ",
                "inputSchema": {
                  "properties": {
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "instrument",
                    "units"
                  ],
                  "title": "trade_market_orderArguments",
                  "type": "object"
                },
                "name": "trade_market_order",
                "title": "Trade Market Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Place a Limit Order.\n    price: The limit price to trigger the order.\n    take_profit: ABSOLUTE PRICE (e.g. 1.1250).\n    stop_loss: ABSOLUTE PRICE (e.g. 1.1100).\n    take_profit_distance: RELATIVE PIPS (e.g. 0.0050).\n    stop_loss_distance: RELATIVE PIPS (e.g. 0.0020).\n    trailing_stop_distance: RELATIVE DISTANCE for trailing stop.\n    guaranteed_stop_loss: True for GSLO.\n    expiry: ISO 8601 string (e.g. \"2023-12-31T23:59:00Z\"). Defaults to GTC if omitted.\n    ",
                "inputSchema": {
                  "properties": {
                    "expiry": {
                      "default": null,
                      "title": "Expiry",
                      "type": "string"
                    },
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "price": {
                      "title": "Price",
                      "type": "number"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "instrument",
                    "units",
                    "price"
                  ],
                  "title": "trade_limit_orderArguments",
                  "type": "object"
                },
                "name": "trade_limit_order",
                "title": "Trade Limit Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Place a Stop Order (Momentum/Breakout Entry).\n    Use this to Buy ABOVE market price or Sell BELOW market price.\n    \n    Args:\n        instrument: Asset symbol (e.g. 'EUR_USD')\n        units: Positive for Buy, Negative for Sell\n        price: The STOP price to trigger the order.\n        expiry: ISO 8601 string (e.g. \"2023-12-31T23:59:00Z\"). Defaults to GTC if omitted.\n        take_profit: ABSOLUTE PRICE.\n        stop_loss: ABSOLUTE PRICE.\n        take_profit_distance: RELATIVE DISTANCE (e.g. 0.0050).\n        stop_loss_distance: RELATIVE DISTANCE (e.g. 0.0020).\n        trailing_stop_distance: RELATIVE DISTANCE for trailing stop.\n        guaranteed_stop_loss: True for GSLO.\n    ",
                "inputSchema": {
                  "properties": {
                    "expiry": {
                      "default": null,
                      "title": "Expiry",
                      "type": "string"
                    },
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "price": {
                      "title": "Price",
                      "type": "number"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "instrument",
                    "units",
                    "price"
                  ],
                  "title": "trade_stop_orderArguments",
                  "type": "object"
                },
                "name": "trade_stop_order",
                "title": "Trade Stop Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/pending-orders-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Cancel a pending (unfilled) Limit or Stop order.\n    Args:\n        order_id: The OANDA ID of the order to cancel.\n    ",
                "inputSchema": {
                  "properties": {
                    "order_id": {
                      "title": "Order Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "order_id"
                  ],
                  "title": "cancel_pending_orderArguments",
                  "type": "object"
                },
                "name": "cancel_pending_order",
                "title": "Cancel Pending Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/order-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Replace (Modify) an existing pending order.\n    Basically cancels the old one and places a new one atomically.\n    Args:\n        order_id: ID of the order to replace.\n        type: 'LIMIT' or 'STOP'.\n        (All other args same as placement tools)\n    ",
                "inputSchema": {
                  "properties": {
                    "expiry": {
                      "default": null,
                      "title": "Expiry",
                      "type": "string"
                    },
                    "guaranteed_stop_loss": {
                      "default": false,
                      "title": "Guaranteed Stop Loss",
                      "type": "boolean"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "order_id": {
                      "title": "Order Id",
                      "type": "string"
                    },
                    "price": {
                      "title": "Price",
                      "type": "number"
                    },
                    "stop_loss": {
                      "default": null,
                      "title": "Stop Loss",
                      "type": "number"
                    },
                    "stop_loss_distance": {
                      "default": null,
                      "title": "Stop Loss Distance",
                      "type": "number"
                    },
                    "take_profit": {
                      "default": null,
                      "title": "Take Profit",
                      "type": "number"
                    },
                    "take_profit_distance": {
                      "default": null,
                      "title": "Take Profit Distance",
                      "type": "number"
                    },
                    "trailing_stop_distance": {
                      "default": null,
                      "title": "Trailing Stop Distance",
                      "type": "number"
                    },
                    "type": {
                      "default": "LIMIT",
                      "title": "Type",
                      "type": "string"
                    },
                    "units": {
                      "title": "Units",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "order_id",
                    "instrument",
                    "units",
                    "price"
                  ],
                  "title": "replace_pending_orderArguments",
                  "type": "object"
                },
                "name": "replace_pending_order",
                "title": "Replace Pending Order"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/positions-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/positions-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/positions-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "List open trades.",
                "inputSchema": {
                  "properties": {},
                  "title": "get_open_tradesArguments",
                  "type": "object"
                },
                "name": "get_open_trades",
                "title": "Get Open Trades"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/positions-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/positions-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/positions-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    List open positions (Net Exposure per instrument).\n    Useful to see total Long/Short units and P&L per pair.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_open_positionsArguments",
                  "type": "object"
                },
                "name": "get_open_positions",
                "title": "Get Open Positions"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/history-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/history-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/history-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get account transaction history (e.g. closed trades, order fills).\n    Useful for finding past trades, reporting, or auditing.\n    Args:\n        from_time: Start time (RFC3339 format, e.g. \"2023-05-01T00:00:00Z\").\n        to_time: End time (RFC3339).\n        type_filter: Comma-separated types (e.g. \"ORDER_FILL,TRADE_CLOSE\"). To see closed trades, use \"TRADE_CLOSE\".\n    ",
                "inputSchema": {
                  "properties": {
                    "from_time": {
                      "default": null,
                      "title": "From Time",
                      "type": "string"
                    },
                    "to_time": {
                      "default": null,
                      "title": "To Time",
                      "type": "string"
                    },
                    "type_filter": {
                      "default": null,
                      "title": "Type Filter",
                      "type": "string"
                    }
                  },
                  "title": "get_account_historyArguments",
                  "type": "object"
                },
                "name": "get_account_history",
                "title": "Get Account History"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/trade-details-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/trade-details-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/trade-details-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get full details of a specific trade (Open or Closed).\n    Useful to investigate a trade that disappeared or to see its full history.\n    ",
                "inputSchema": {
                  "properties": {
                    "trade_id": {
                      "title": "Trade Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "trade_id"
                  ],
                  "title": "get_trade_detailsArguments",
                  "type": "object"
                },
                "name": "get_trade_details",
                "title": "Get Trade Details"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/history-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/history-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/history-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get OANDA order history (FILLED, CANCELLED, TRIGGERED, etc.).\n    state: \"ALL\", \"PENDING\", \"FILLED\", \"TRIGGERED\", \"CANCELLED\".\n    count: Max 500.\n    ",
                "inputSchema": {
                  "properties": {
                    "count": {
                      "default": 50,
                      "title": "Count",
                      "type": "integer"
                    },
                    "state": {
                      "default": "ALL",
                      "title": "State",
                      "type": "string"
                    }
                  },
                  "title": "get_order_historyArguments",
                  "type": "object"
                },
                "name": "get_order_history",
                "title": "Get Order History"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/pending-orders-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    List all PENDING orders (Limits, Stops, Entry Orders).\n    These are orders waiting to be filled.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_pending_ordersArguments",
                  "type": "object"
                },
                "name": "get_pending_orders",
                "title": "Get Pending Orders"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/account-summary-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "Get trading account summary (balance, margin).",
                "inputSchema": {
                  "properties": {},
                  "title": "get_trading_accountArguments",
                  "type": "object"
                },
                "name": "get_trading_account",
                "title": "Get Trading Account"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/close-position-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "Close a specific trade (fully or partially).",
                "inputSchema": {
                  "properties": {
                    "trade_id": {
                      "title": "Trade Id",
                      "type": "string"
                    },
                    "units": {
                      "default": "ALL",
                      "title": "Units",
                      "type": "string"
                    }
                  },
                  "required": [
                    "trade_id"
                  ],
                  "title": "close_tradeArguments",
                  "type": "object"
                },
                "name": "close_trade",
                "title": "Close Trade"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/close-position-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html"
                },
                "annotations": {
                  "destructiveHint": true,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "Close position for an instrument.",
                "inputSchema": {
                  "properties": {
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    },
                    "long_units": {
                      "default": "ALL",
                      "title": "Long Units",
                      "type": "string"
                    },
                    "short_units": {
                      "default": "ALL",
                      "title": "Short Units",
                      "type": "string"
                    }
                  },
                  "required": [
                    "instrument"
                  ],
                  "title": "close_positionArguments",
                  "type": "object"
                },
                "name": "close_position",
                "title": "Close Position"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get trading hours for instruments. Use for session planning or bulk data fetch.\n    \n    Args:\n        instrument: Specific instrument (e.g., \"EUR_USD\", \"US30_USD\"). If None, returns all.\n        category: Filter by category (e.g., \"Forex CFDs\", \"Index CFDs\", \"Commodity CFDs\", \"Metals CFDs\", \"Bonds CFDs\").\n        include_status: Include current open/closed status (default True).\n    \n    Returns:\n        For each instrument:\n        - timezone: IANA timezone (e.g., \"America/New_York\")\n        - windows: Array of {days, open, close} in LOCAL time\n        - windows_utc: Same windows converted to UTC\n        - category: Asset category\n        - is_open: Current status (if include_status=True)\n        - displayName: Human-readable name\n    \n    Examples:\n        - get_market_hours(instrument=\"EUR_USD\") - Single instrument\n        - get_market_hours(category=\"Index CFDs\") - All indices\n        - get_market_hours(include_status=False) - All instruments, no status check\n    ",
                "inputSchema": {
                  "properties": {
                    "category": {
                      "default": null,
                      "title": "Category",
                      "type": "string"
                    },
                    "include_status": {
                      "default": true,
                      "title": "Include Status",
                      "type": "boolean"
                    },
                    "instrument": {
                      "default": null,
                      "title": "Instrument",
                      "type": "string"
                    }
                  },
                  "title": "get_market_hoursArguments",
                  "type": "object"
                },
                "name": "get_market_hours",
                "title": "Get Market Hours"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Check if a specific market is currently open for trading.\n    \n    Args:\n        instrument: The OANDA instrument name (e.g., \"EUR_USD\", \"US30_USD\", \"XAU_USD\").\n        at_time: Optional ISO8601 datetime to check (e.g., \"2024-01-15T14:30:00Z\").\n                 Defaults to current time if not provided.\n    \n    Returns:\n        - instrument: The queried instrument\n        - is_open: Boolean - True if market is open\n        - checked_at_utc: When the check was made (UTC)\n        - checked_at_local: Same time in instrument's local timezone\n        - timezone: The instrument's native timezone\n        - category: Asset category (Forex CFDs, Index CFDs, etc.)\n        - displayName: Human-readable name\n        - reason: Why the market is open/closed\n        - schedule: Schedule type if available (e.g., \"24/5\", \"24/7\")\n        - dstAffected: Whether DST affects trading hours\n    \n    Example:\n        is_market_open(instrument=\"US30_USD\")\n        is_market_open(instrument=\"SUGAR_USD\", at_time=\"2024-01-15T10:00:00-05:00\")\n    ",
                "inputSchema": {
                  "properties": {
                    "at_time": {
                      "default": null,
                      "title": "At Time",
                      "type": "string"
                    },
                    "instrument": {
                      "title": "Instrument",
                      "type": "string"
                    }
                  },
                  "required": [
                    "instrument"
                  ],
                  "title": "is_market_openArguments",
                  "type": "object"
                },
                "name": "is_market_open",
                "title": "Is Market Open"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/search-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/search-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/search-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Get all available market categories and instrument counts.\n    Useful for understanding what categories can be queried with get_market_hours.\n    \n    Returns:\n        List of categories with counts and sample instruments.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_market_categoriesArguments",
                  "type": "object"
                },
                "name": "get_market_categories",
                "title": "Get Market Categories"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/instrument-specs-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/instrument-specs-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/instrument-specs-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get instrument specifications (precision, limits, margin, financing rates).\n    \n    Args:\n        instrument: Specific instrument (e.g., \"EUR_USD\"). If None, returns all or filtered by type.\n        type_filter: Filter by type: \"CURRENCY\", \"METAL\", \"CFD\". If None, returns all.\n        include: List of field groups to include. Options: \n                 [\"precision\", \"limits\", \"margin\", \"financing\", \"gslo\", \"trailing\"]\n                 If None, includes all fields.\n    \n    Returns:\n        For each instrument:\n        - displayName: Human-readable name\n        - type: CURRENCY, METAL, CFD\n        - precision: pip location, display precision, trade units precision\n        - limits: min trade size, max order units, max position size\n        - margin: rate and calculated leverage (e.g., \"30:1\")\n        - financing: longRate, shortRate, tripleSwapDay\n        - gslo: guaranteed stop loss mode, min distance, premium\n        - trailingStop: min/max distance\n        - meta: cache age, staleness status\n    \n    Examples:\n        - get_instrument_specs(instrument=\"EUR_USD\") - Single instrument\n        - get_instrument_specs(type_filter=\"METAL\") - All metals\n        - get_instrument_specs(instrument=\"XAU_USD\", include=[\"precision\", \"margin\"]) - Specific fields\n    ",
                "inputSchema": {
                  "properties": {
                    "include": {
                      "default": null,
                      "items": {
                        "type": "string"
                      },
                      "title": "Include",
                      "type": "array"
                    },
                    "instrument": {
                      "default": null,
                      "title": "Instrument",
                      "type": "string"
                    },
                    "type_filter": {
                      "default": null,
                      "title": "Type Filter",
                      "type": "string"
                    }
                  },
                  "title": "get_instrument_specsArguments",
                  "type": "object"
                },
                "name": "get_instrument_specs",
                "title": "Get Instrument Specs"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": false
                },
                "description": "\n    Manually refresh instrument data from OANDA API.\n    Updates financing rates, margin requirements, and other parameters.\n    \n    Requires: User must have saved OANDA credentials via save_oanda_credentials.\n    \n    Returns:\n        - success: Boolean indicating if refresh succeeded\n        - message: Status message\n        - count: Number of instruments refreshed\n        - refreshedAt: Timestamp of refresh\n    \n    Note: This fetches fresh data from OANDA's practice environment.\n    The cache is automatically refreshed on server startup if data is >24 hours old.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "refresh_instrument_dataArguments",
                  "type": "object"
                },
                "name": "refresh_instrument_data",
                "title": "Refresh Instrument Data"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/system-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Check the status of the instrument data cache.\n    \n    Returns:\n        - ageHours: How old the cached data is\n        - isStale: True if data is older than 24 hours\n        - lastRefreshed: When the cache was last updated\n        - instrumentCount: Number of instruments in cache\n        - recommendation: Whether refresh is recommended\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_instrument_cache_statusArguments",
                  "type": "object"
                },
                "name": "get_instrument_cache_status",
                "title": "Get Instrument Cache Status"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/account-summary-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Return the current user's token balances from Auth0 app_metadata.\n\n    Uses _safe_profile() so that the same values shown inside AI analysis\n    (token_quota, purchased_tokens, total_token_usage, last_reset, email, user_id)\n    are returned in a simple JSON structure.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_token_balancesArguments",
                  "type": "object"
                },
                "name": "get_token_balances",
                "title": "Get Token Balances"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/asset-list-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/asset-list-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/asset-list-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Return supported asset symbols from config.OANDA_UNIVERSE.\n    Optional:\n      \u2022 filter: substring (case-insensitive) to narrow the list\n      \u2022 asset: specific symbol to test membership\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "default": "",
                      "title": "Asset",
                      "type": "string"
                    },
                    "filter": {
                      "default": "",
                      "title": "Filter",
                      "type": "string"
                    }
                  },
                  "title": "list_assetsArguments",
                  "type": "object"
                },
                "name": "list_assets",
                "title": "List Assets"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/analysis-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/analysis-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Run a one-shot technical analysis for a single asset/timeframe.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD, XAU_USD)\n        timeframe: Timeframe for analysis (D, H4, H1, etc.)\n        priceType: Price type - B (bid), A (ask), or M (mid)\n        timeoutSec: Timeout in seconds (5-120)\n    \n    Returns:\n        Analysis results with status, signals, and recommendations\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "priceType": {
                      "default": "B",
                      "title": "Pricetype",
                      "type": "string"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    },
                    "timeoutSec": {
                      "default": 45,
                      "title": "Timeoutsec",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "analyze_assetArguments",
                  "type": "object"
                },
                "name": "analyze_asset",
                "title": "Analyze Asset"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    View the current assets in your saved watchlist.\n    \n    Returns:\n        List of saved assets and count.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_watchlistArguments",
                  "type": "object"
                },
                "name": "get_watchlist",
                "title": "Get Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Add a new asset to your persistent watchlist.\n    \n    Args:\n        asset: Asset symbol (e.g. 'EUR_USD', 'BTC_USD')\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "add_to_watchlistArguments",
                  "type": "object"
                },
                "name": "add_to_watchlist",
                "title": "Add to Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": false
                },
                "description": "\n    Remove an asset from your persistent watchlist.\n    \n    Args:\n        asset: Asset symbol to remove\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "remove_from_watchlistArguments",
                  "type": "object"
                },
                "name": "remove_from_watchlist",
                "title": "Remove from Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-analysis-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/watchlist-analysis-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-analysis-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Analyze multiple assets from the user's SAVED watchlist in parallel.\n    \n    Args:\n        timeframe: Timeframe (D, H4, H1, etc.)\n        priceType: B (bid), A (ask), or M (mid)\n        timeoutSec: Overall timeout in seconds (30-300)\n        (optional) timeframes: list of timeframes (timeframes mode) \u2013 if provided, supersedes timeframe\n        (optional) max_assets: limit how many watchlist assets to analyze (default: all)\n    \n    Returns:\n        Results for all watchlist assets with analysis data\n    ",
                "inputSchema": {
                  "properties": {
                    "max_assets": {
                      "default": null,
                      "title": "Max Assets",
                      "type": "integer"
                    },
                    "priceType": {
                      "default": "B",
                      "title": "Pricetype",
                      "type": "string"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    },
                    "timeframes": {
                      "default": null,
                      "items": {
                        "type": "string"
                      },
                      "title": "Timeframes",
                      "type": "array"
                    },
                    "timeoutSec": {
                      "default": 120,
                      "title": "Timeoutsec",
                      "type": "integer"
                    }
                  },
                  "title": "analyze_watchlistArguments",
                  "type": "object"
                },
                "name": "analyze_watchlist",
                "title": "Analyze Watchlist"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/multi-analysis-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/multi-analysis-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/multi-analysis-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Analyze a single asset across multiple timeframes simultaneously.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD)\n        timeframes: List of timeframes (e.g., [\"D\", \"H4\", \"H1\"])\n        priceType: B (bid), A (ask), or M (mid)\n        timeoutSec: Overall timeout in seconds (30-300)\n    \n    Returns:\n        Multi-timeframe analysis results\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "priceType": {
                      "default": "B",
                      "title": "Pricetype",
                      "type": "string"
                    },
                    "timeframes": {
                      "items": {
                        "type": "string"
                      },
                      "title": "Timeframes",
                      "type": "array"
                    },
                    "timeoutSec": {
                      "default": 90,
                      "title": "Timeoutsec",
                      "type": "integer"
                    }
                  },
                  "required": [
                    "asset",
                    "timeframes"
                  ],
                  "title": "analyze_timeframesArguments",
                  "type": "object"
                },
                "name": "analyze_timeframes",
                "title": "Analyze Timeframes"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/calendar-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/calendar-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/calendar-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Fetch upcoming economic events via the TradingView proxy source.\n    \n    Args:\n        fromDays: Start of date range (days from now, 0-90)\n        toDays: End of date range (days from now, 0-90)\n    \n    Returns:\n        List of economic events with importance, country, and timing\n    ",
                "inputSchema": {
                  "properties": {
                    "fromDays": {
                      "default": 0,
                      "title": "Fromdays",
                      "type": "integer"
                    },
                    "toDays": {
                      "default": 7,
                      "title": "Todays",
                      "type": "integer"
                    }
                  },
                  "title": "economic_eventsArguments",
                  "type": "object"
                },
                "name": "economic_events",
                "title": "Economic Events"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/news-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/news-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/news-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Get recent articles from the Forex-GPT blog feed.\n    \n    Args:\n        max_results: Maximum number of articles to return (1-50, default: 10)\n    \n    Returns:\n        List of recent blog articles with titles, URLs, summaries, images, and publication dates\n    ",
                "inputSchema": {
                  "properties": {
                    "max_results": {
                      "default": 10,
                      "title": "Max Results",
                      "type": "integer"
                    }
                  },
                  "title": "get_blog_articlesArguments",
                  "type": "object"
                },
                "name": "get_blog_articles",
                "title": "Get Blog Articles"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/system-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Comprehensive health and status check including optional upstream dependencies.\n    \n    Args:\n        checkOpenAI: Verify OpenAI API connectivity\n        checkTradingView: Verify TradingView API connectivity\n        checkOANDA: Verify OANDA API connectivity\n    \n    Returns:\n        Health status with environment info and dependency checks\n    ",
                "inputSchema": {
                  "properties": {
                    "checkOANDA": {
                      "default": false,
                      "title": "Checkoanda",
                      "type": "boolean"
                    },
                    "checkOpenAI": {
                      "default": false,
                      "title": "Checkopenai",
                      "type": "boolean"
                    },
                    "checkTradingView": {
                      "default": false,
                      "title": "Checktradingview",
                      "type": "boolean"
                    }
                  },
                  "title": "healthArguments",
                  "type": "object"
                },
                "name": "health",
                "title": "Health Check"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/chart-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/chart-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/chart-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Retrieve OHLC (candlestick) data for charting.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD)\n        timeframe: Timeframe (D, H4, H1, etc.)\n        count: Number of candles (50-5000)\n    \n    Returns:\n        Candlestick data with timestamps, open, high, low, close prices\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "count": {
                      "default": 460,
                      "title": "Count",
                      "type": "integer"
                    },
                    "price": {
                      "default": "M",
                      "title": "Price",
                      "type": "string"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "get_chart_dataArguments",
                  "type": "object"
                },
                "name": "get_chart_data",
                "title": "Get Chart Data"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/heatmap-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/heatmap-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/heatmap-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Generates a real-time Sentiment Heatmap snapshot.\n    \n    Behavior:\n    1. If 'assets' are provided, scans those specific assets.\n    2. If 'assets' not provided, scans the user's saved Watchlist.\n    3. If Watchlist is empty, scans a default list of popular global assets.\n    \n    Args:\n        assets: Optional list of symbols.\n        timeframe: Granularity (e.g. 'H1', 'D').\n    ",
                "inputSchema": {
                  "properties": {
                    "assets": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Assets"
                    },
                    "count": {
                      "default": 460,
                      "title": "Count",
                      "type": "integer"
                    },
                    "timeframe": {
                      "default": "D",
                      "title": "Timeframe",
                      "type": "string"
                    }
                  },
                  "title": "get_live_heatmapArguments",
                  "type": "object"
                },
                "name": "get_live_heatmap",
                "title": "Live Heatmap"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/search-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/search-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/search-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Search forex analysis results by asset name, timeframe, or keywords.\n    Returns a list of available analyses matching the search criteria.\n    \n    Args:\n        query: Search query (e.g., \"EUR_USD\", \"daily analysis\", \"gold\", \"bitcoin\")\n    \n    Returns:\n        Search results with IDs for fetching full analysis\n    ",
                "inputSchema": {
                  "properties": {
                    "query": {
                      "title": "Query",
                      "type": "string"
                    }
                  },
                  "required": [
                    "query"
                  ],
                  "title": "searchArguments",
                  "type": "object"
                },
                "name": "search",
                "title": "Search"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/analysis-viewer-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/analysis-viewer-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-viewer-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Retrieve complete forex analysis by ID.\n    \n    Args:\n        id: Analysis ID in format \"ASSET_TIMEFRAME\" (e.g., \"EUR_USD_D\", \"XAU_USD_H4\")\n    \n    Returns:\n        Full analysis document with technical indicators, signals, and recommendations\n    ",
                "inputSchema": {
                  "properties": {
                    "id": {
                      "title": "Id",
                      "type": "string"
                    }
                  },
                  "required": [
                    "id"
                  ],
                  "title": "fetchArguments",
                  "type": "object"
                },
                "name": "fetch",
                "title": "Fetch Analysis"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-scanner.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-scanner.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-scanner.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Scans the entire market universe (Forex, Crypto, Metals, Indices) to find the strongest trading opportunities.\n    \n    Args:\n        timeframes: List of timeframes to scan (e.g. [\"H1\", \"H4\", \"D\"]). Default is [\"H8\"].\n        min_score: Minimum absolute sentiment score (0-100) to include. Default 80 (Bullish/Bearish).\n        limit: Maximum number of results to return. Default 6.\n        \n    Returns:\n        A list of the top opportunities ranked by sentiment strength.\n    ",
                "inputSchema": {
                  "properties": {
                    "limit": {
                      "default": 6,
                      "title": "Limit",
                      "type": "integer"
                    },
                    "minAbs": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Minabs"
                    },
                    "min_score": {
                      "default": 80.0,
                      "title": "Min Score",
                      "type": "number"
                    },
                    "perSide": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Perside"
                    },
                    "sentiment": {
                      "default": null,
                      "title": "Sentiment",
                      "type": "string"
                    },
                    "timeframes": {
                      "default": [
                        "H8"
                      ],
                      "items": {
                        "type": "string"
                      },
                      "title": "Timeframes",
                      "type": "array"
                    }
                  },
                  "title": "scan_marketArguments",
                  "type": "object"
                },
                "name": "scan_market",
                "title": "Scan Market"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/spread-card.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/spread-card.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/spread-card.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Checks the current liquidity and trading cost (spread) for an asset.\n    Useful for checking if a market is too expensive to trade right now.\n    \n    Args:\n        asset: The asset symbol (e.g., \"EUR_USD\", \"XAU_USD\")\n        \n    Returns:\n        Current spread, average spread, and cost in basis points.\n    ",
                "inputSchema": {
                  "properties": {
                    "asset": {
                      "title": "Asset",
                      "type": "string"
                    },
                    "count": {
                      "default": 100,
                      "title": "Count",
                      "type": "integer"
                    },
                    "granularity": {
                      "default": "M1",
                      "title": "Granularity",
                      "type": "string"
                    }
                  },
                  "required": [
                    "asset"
                  ],
                  "title": "get_spreadsArguments",
                  "type": "object"
                },
                "name": "get_spreads",
                "title": "Get Spreads"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/system-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Return the server's current UTC timestamp (ISO 8601).\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "get_server_timeArguments",
                  "type": "object"
                },
                "name": "get_server_time",
                "title": "Get Server Time"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/help-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/help-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/help-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": false,
                  "readOnlyHint": true
                },
                "description": "\n    Master tutorial for MCP tools: usage tips, key parameters, and suggested flows.\n    ",
                "inputSchema": {
                  "properties": {},
                  "title": "help_tutorialArguments",
                  "type": "object"
                },
                "name": "help_tutorial",
                "title": "Help Tutorial"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/chart-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/chart-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/chart-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Return a short-lived URL for the raw price stream (SSE) for given instruments.\n    The URL expires after ~10 minutes.\n    ",
                "inputSchema": {
                  "properties": {
                    "instruments": {
                      "items": {
                        "type": "string"
                      },
                      "title": "Instruments",
                      "type": "array"
                    }
                  },
                  "required": [
                    "instruments"
                  ],
                  "title": "get_price_stream_urlArguments",
                  "type": "object"
                },
                "name": "get_price_stream_url",
                "title": "Get Price Stream URL"
              },
              {
                "_meta": {
                  "mimeType": "text/html;profile=mcp-app",
                  "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                  "openai/domain": "mcp.forex-gpt.ai",
                  "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                  "openai/widgetAccessible": true,
                  "ui": {
                    "csp": {
                      "connectDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://*.oanda.com"
                      ],
                      "frameDomains": [],
                      "resourceDomains": [
                        "https://mcp.forex-gpt.ai",
                        "https://fonts.googleapis.com",
                        "https://fonts.gstatic.com"
                      ]
                    },
                    "domain": "https://mcp.forex-gpt.ai",
                    "resourceUri": "ui://widget/market-status-widget.html",
                    "visibility": [
                      "app",
                      "model"
                    ]
                  },
                  "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
                },
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": true,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Return a short-lived URL for the sentiment stream (SSE) for given instruments and granularity.\n    The URL expires after ~10 minutes.\n    ",
                "inputSchema": {
                  "properties": {
                    "granularity": {
                      "default": "D",
                      "title": "Granularity",
                      "type": "string"
                    },
                    "instruments": {
                      "items": {
                        "type": "string"
                      },
                      "title": "Instruments",
                      "type": "array"
                    }
                  },
                  "required": [
                    "instruments"
                  ],
                  "title": "get_sentiment_stream_urlArguments",
                  "type": "object"
                },
                "name": "get_sentiment_stream_url",
                "title": "Get Sentiment Stream URL"
              },
              {
                "annotations": {
                  "destructiveHint": false,
                  "idempotentHint": false,
                  "openWorldHint": true,
                  "readOnlyHint": true
                },
                "description": "\n    Proxy to the Flask /api/chart-chat endpoint using the caller's bearer token.\n    Keeps token accounting/auth consistent with the web app while exposing chat via MCP.\n    ",
                "inputSchema": {
                  "properties": {
                    "chart_id": {
                      "default": "",
                      "title": "Chart Id",
                      "type": "string"
                    },
                    "chat_session_id": {
                      "default": "",
                      "title": "Chat Session Id",
                      "type": "string"
                    },
                    "granularity": {
                      "default": "",
                      "title": "Granularity",
                      "type": "string"
                    },
                    "instrument": {
                      "default": "",
                      "title": "Instrument",
                      "type": "string"
                    },
                    "max_tokens": {
                      "default": null,
                      "title": "Max Tokens",
                      "type": "integer"
                    },
                    "message": {
                      "title": "Message",
                      "type": "string"
                    },
                    "price_type": {
                      "default": "B",
                      "title": "Price Type",
                      "type": "string"
                    }
                  },
                  "required": [
                    "message"
                  ],
                  "title": "chart_chat_proxyArguments",
                  "type": "object"
                },
                "name": "chart_chat_proxy",
                "title": "Chart Chat Proxy"
              }
            ]
          }
        },
        "bad_protocol_status_code": 200,
        "delete_error": null,
        "delete_status_code": 405,
        "expired_session_error": null,
        "expired_session_status_code": 200,
        "issues": [
          "missing_protocol_header",
          "bad_protocol_not_rejected",
          "delete_session_unexpected",
          "expired_session_not_404"
        ],
        "last_event_id_visible": false,
        "protocol_header_present": false,
        "requested_protocol_version": "2024-11-05",
        "session_id_present": true,
        "transport": "sse"
      },
      "latency_ms": 73.61,
      "status": "error"
    },
    "utility_coverage_probe": {
      "details": {
        "completions": {
          "advertised": false,
          "live_probe": "not_executed",
          "sample_target": {
            "type": "resource",
            "uri": "ui://widget/spread-card.html"
          }
        },
        "initialize_capability_keys": [
          "extensions",
          "resources",
          "tools"
        ],
        "pagination": {
          "metadata_signal": false,
          "next_cursor_methods": [],
          "supported": false
        },
        "tasks": {
          "advertised": false,
          "http_status": 404,
          "probe_status": "missing"
        }
      },
      "latency_ms": 18.65,
      "status": "missing"
    }
  },
  "failures": {
    "server_card": {
      "error": "Client error '404 ' for url 'https://mcp.forex-gpt.ai/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
      "url": "https://mcp.forex-gpt.ai/.well-known/mcp/server-card.json"
    },
    "transport_compliance_probe": {
      "bad_protocol_error": null,
      "bad_protocol_headers": {
        "content-type": "application/json; charset=utf-8",
        "mcp-session-id": "80bd6123-4ca4-4cb4-b5dc-7e5d32a14785"
      },
      "bad_protocol_payload": {
        "id": 410,
        "jsonrpc": "2.0",
        "result": {
          "capabilities": {
            "extensions": {
              "io.modelcontextprotocol/ui": {
                "mimeTypes": [
                  "text/html;profile=mcp-app"
                ]
              }
            },
            "resources": {
              "listChanged": false
            },
            "tools": {
              "listChanged": false
            }
          },
          "protocolVersion": "2024-11-05",
          "serverInfo": {
            "name": "forex-gpt-mcp",
            "version": "2.0.0"
          },
          "tools": [
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/credentials-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": false
              },
              "description": "\n    Save your OANDA API Key and Account ID securely.\n    These are required before you can trade.\n    ",
              "inputSchema": {
                "properties": {
                  "account_id": {
                    "title": "Account Id",
                    "type": "string"
                  },
                  "api_key": {
                    "title": "Api Key",
                    "type": "string"
                  }
                },
                "required": [
                  "api_key",
                  "account_id"
                ],
                "title": "save_oanda_credentialsArguments",
                "type": "object"
              },
              "name": "save_oanda_credentials",
              "title": "Save OANDA Credentials"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/credentials-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/credentials-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": false
              },
              "description": "\n    Remove/Delete your stored OANDA API Key and Account ID.\n    Use this if you want to clear your credentials or switch accounts.\n    ",
              "inputSchema": {
                "properties": {},
                "title": "delete_oanda_credentialsArguments",
                "type": "object"
              },
              "name": "delete_oanda_credentials",
              "title": "Delete OANDA Credentials"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/modify-trade-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/modify-trade-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/modify-trade-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": false,
                "openWorldHint": true,
                "readOnlyHint": false
              },
              "description": "\n    Modify an existing trade's Stop Loss and Take Profit.\n    You can use absolute prices OR relative distances.\n    Only provided fields will be updated.\n    \n    Args:\n        trade_id: The ID of the open trade to modify.\n        take_profit: New ABSOLUTE price.\n        stop_loss: New ABSOLUTE price.\n        take_profit_distance: New RELATIVE distance (e.g. 0.0050).\n        stop_loss_distance: New RELATIVE distance (e.g. 0.0020).\n    ",
              "inputSchema": {
                "properties": {
                  "stop_loss": {
                    "default": null,
                    "title": "Stop Loss",
                    "type": "number"
                  },
                  "stop_loss_distance": {
                    "default": null,
                    "title": "Stop Loss Distance",
                    "type": "number"
                  },
                  "take_profit": {
                    "default": null,
                    "title": "Take Profit",
                    "type": "number"
                  },
                  "take_profit_distance": {
                    "default": null,
                    "title": "Take Profit Distance",
                    "type": "number"
                  },
                  "trade_id": {
                    "title": "Trade Id",
                    "type": "string"
                  }
                },
                "required": [
                  "trade_id"
                ],
                "title": "trade_modify_tradeArguments",
                "type": "object"
              },
              "name": "trade_modify_trade",
              "title": "Modify Trade"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/order-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": false,
                "openWorldHint": true,
                "readOnlyHint": false
              },
              "description": "\n    Place a Market Order.\n    units: Positive for Buy, Negative for Sell\n    take_profit: ABSOLUTE PRICE (e.g. 1.1250).\n    stop_loss: ABSOLUTE PRICE (e.g. 1.1100).\n    take_profit_distance: RELATIVE PIPS (e.g. 0.0050). Use this OR absolute price.\n    stop_loss_distance: RELATIVE PIPS (e.g. 0.0020). Use this OR absolute price.\n    trailing_stop_distance: RELATIVE DISTANCE for trailing stop (e.g. 0.0020).\n    guaranteed_stop_loss: True to use GSLO (Premium, requires specific SL distance rule).\n    ",
              "inputSchema": {
                "properties": {
                  "guaranteed_stop_loss": {
                    "default": false,
                    "title": "Guaranteed Stop Loss",
                    "type": "boolean"
                  },
                  "instrument": {
                    "title": "Instrument",
                    "type": "string"
                  },
                  "stop_loss": {
                    "default": null,
                    "title": "Stop Loss",
                    "type": "number"
                  },
                  "stop_loss_distance": {
                    "default": null,
                    "title": "Stop Loss Distance",
                    "type": "number"
                  },
                  "take_profit": {
                    "default": null,
                    "title": "Take Profit",
                    "type": "number"
                  },
                  "take_profit_distance": {
                    "default": null,
                    "title": "Take Profit Distance",
                    "type": "number"
                  },
                  "trailing_stop_distance": {
                    "default": null,
                    "title": "Trailing Stop Distance",
                    "type": "number"
                  },
                  "units": {
                    "title": "Units",
                    "type": "integer"
                  }
                },
                "required": [
                  "instrument",
                  "units"
                ],
                "title": "trade_market_orderArguments",
                "type": "object"
              },
              "name": "trade_market_order",
              "title": "Trade Market Order"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/order-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": false,
                "openWorldHint": true,
                "readOnlyHint": false
              },
              "description": "\n    Place a Limit Order.\n    price: The limit price to trigger the order.\n    take_profit: ABSOLUTE PRICE (e.g. 1.1250).\n    stop_loss: ABSOLUTE PRICE (e.g. 1.1100).\n    take_profit_distance: RELATIVE PIPS (e.g. 0.0050).\n    stop_loss_distance: RELATIVE PIPS (e.g. 0.0020).\n    trailing_stop_distance: RELATIVE DISTANCE for trailing stop.\n    guaranteed_stop_loss: True for GSLO.\n    expiry: ISO 8601 string (e.g. \"2023-12-31T23:59:00Z\"). Defaults to GTC if omitted.\n    ",
              "inputSchema": {
                "properties": {
                  "expiry": {
                    "default": null,
                    "title": "Expiry",
                    "type": "string"
                  },
                  "guaranteed_stop_loss": {
                    "default": false,
                    "title": "Guaranteed Stop Loss",
                    "type": "boolean"
                  },
                  "instrument": {
                    "title": "Instrument",
                    "type": "string"
                  },
                  "price": {
                    "title": "Price",
                    "type": "number"
                  },
                  "stop_loss": {
                    "default": null,
                    "title": "Stop Loss",
                    "type": "number"
                  },
                  "stop_loss_distance": {
                    "default": null,
                    "title": "Stop Loss Distance",
                    "type": "number"
                  },
                  "take_profit": {
                    "default": null,
                    "title": "Take Profit",
                    "type": "number"
                  },
                  "take_profit_distance": {
                    "default": null,
                    "title": "Take Profit Distance",
                    "type": "number"
                  },
                  "trailing_stop_distance": {
                    "default": null,
                    "title": "Trailing Stop Distance",
                    "type": "number"
                  },
                  "units": {
                    "title": "Units",
                    "type": "integer"
                  }
                },
                "required": [
                  "instrument",
                  "units",
                  "price"
                ],
                "title": "trade_limit_orderArguments",
                "type": "object"
              },
              "name": "trade_limit_order",
              "title": "Trade Limit Order"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/order-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": false,
                "openWorldHint": true,
                "readOnlyHint": false
              },
              "description": "\n    Place a Stop Order (Momentum/Breakout Entry).\n    Use this to Buy ABOVE market price or Sell BELOW market price.\n    \n    Args:\n        instrument: Asset symbol (e.g. 'EUR_USD')\n        units: Positive for Buy, Negative for Sell\n        price: The STOP price to trigger the order.\n        expiry: ISO 8601 string (e.g. \"2023-12-31T23:59:00Z\"). Defaults to GTC if omitted.\n        take_profit: ABSOLUTE PRICE.\n        stop_loss: ABSOLUTE PRICE.\n        take_profit_distance: RELATIVE DISTANCE (e.g. 0.0050).\n        stop_loss_distance: RELATIVE DISTANCE (e.g. 0.0020).\n        trailing_stop_distance: RELATIVE DISTANCE for trailing stop.\n        guaranteed_stop_loss: True for GSLO.\n    ",
              "inputSchema": {
                "properties": {
                  "expiry": {
                    "default": null,
                    "title": "Expiry",
                    "type": "string"
                  },
                  "guaranteed_stop_loss": {
                    "default": false,
                    "title": "Guaranteed Stop Loss",
                    "type": "boolean"
                  },
                  "instrument": {
                    "title": "Instrument",
                    "type": "string"
                  },
                  "price": {
                    "title": "Price",
                    "type": "number"
                  },
                  "stop_loss": {
                    "default": null,
                    "title": "Stop Loss",
                    "type": "number"
                  },
                  "stop_loss_distance": {
                    "default": null,
                    "title": "Stop Loss Distance",
                    "type": "number"
                  },
                  "take_profit": {
                    "default": null,
                    "title": "Take Profit",
                    "type": "number"
                  },
                  "take_profit_distance": {
                    "default": null,
                    "title": "Take Profit Distance",
                    "type": "number"
                  },
                  "trailing_stop_distance": {
                    "default": null,
                    "title": "Trailing Stop Distance",
                    "type": "number"
                  },
                  "units": {
                    "title": "Units",
                    "type": "integer"
                  }
                },
                "required": [
                  "instrument",
                  "units",
                  "price"
                ],
                "title": "trade_stop_orderArguments",
                "type": "object"
              },
              "name": "trade_stop_order",
              "title": "Trade Stop Order"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/pending-orders-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": false
              },
              "description": "\n    Cancel a pending (unfilled) Limit or Stop order.\n    Args:\n        order_id: The OANDA ID of the order to cancel.\n    ",
              "inputSchema": {
                "properties": {
                  "order_id": {
                    "title": "Order Id",
                    "type": "string"
                  }
                },
                "required": [
                  "order_id"
                ],
                "title": "cancel_pending_orderArguments",
                "type": "object"
              },
              "name": "cancel_pending_order",
              "title": "Cancel Pending Order"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/order-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/order-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/order-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": false,
                "openWorldHint": true,
                "readOnlyHint": false
              },
              "description": "\n    Replace (Modify) an existing pending order.\n    Basically cancels the old one and places a new one atomically.\n    Args:\n        order_id: ID of the order to replace.\n        type: 'LIMIT' or 'STOP'.\n        (All other args same as placement tools)\n    ",
              "inputSchema": {
                "properties": {
                  "expiry": {
                    "default": null,
                    "title": "Expiry",
                    "type": "string"
                  },
                  "guaranteed_stop_loss": {
                    "default": false,
                    "title": "Guaranteed Stop Loss",
                    "type": "boolean"
                  },
                  "instrument": {
                    "title": "Instrument",
                    "type": "string"
                  },
                  "order_id": {
                    "title": "Order Id",
                    "type": "string"
                  },
                  "price": {
                    "title": "Price",
                    "type": "number"
                  },
                  "stop_loss": {
                    "default": null,
                    "title": "Stop Loss",
                    "type": "number"
                  },
                  "stop_loss_distance": {
                    "default": null,
                    "title": "Stop Loss Distance",
                    "type": "number"
                  },
                  "take_profit": {
                    "default": null,
                    "title": "Take Profit",
                    "type": "number"
                  },
                  "take_profit_distance": {
                    "default": null,
                    "title": "Take Profit Distance",
                    "type": "number"
                  },
                  "trailing_stop_distance": {
                    "default": null,
                    "title": "Trailing Stop Distance",
                    "type": "number"
                  },
                  "type": {
                    "default": "LIMIT",
                    "title": "Type",
                    "type": "string"
                  },
                  "units": {
                    "title": "Units",
                    "type": "integer"
                  }
                },
                "required": [
                  "order_id",
                  "instrument",
                  "units",
                  "price"
                ],
                "title": "replace_pending_orderArguments",
                "type": "object"
              },
              "name": "replace_pending_order",
              "title": "Replace Pending Order"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/positions-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/positions-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/positions-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "List open trades.",
              "inputSchema": {
                "properties": {},
                "title": "get_open_tradesArguments",
                "type": "object"
              },
              "name": "get_open_trades",
              "title": "Get Open Trades"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/positions-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/positions-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/positions-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    List open positions (Net Exposure per instrument).\n    Useful to see total Long/Short units and P&L per pair.\n    ",
              "inputSchema": {
                "properties": {},
                "title": "get_open_positionsArguments",
                "type": "object"
              },
              "name": "get_open_positions",
              "title": "Get Open Positions"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/history-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/history-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/history-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Get account transaction history (e.g. closed trades, order fills).\n    Useful for finding past trades, reporting, or auditing.\n    Args:\n        from_time: Start time (RFC3339 format, e.g. \"2023-05-01T00:00:00Z\").\n        to_time: End time (RFC3339).\n        type_filter: Comma-separated types (e.g. \"ORDER_FILL,TRADE_CLOSE\"). To see closed trades, use \"TRADE_CLOSE\".\n    ",
              "inputSchema": {
                "properties": {
                  "from_time": {
                    "default": null,
                    "title": "From Time",
                    "type": "string"
                  },
                  "to_time": {
                    "default": null,
                    "title": "To Time",
                    "type": "string"
                  },
                  "type_filter": {
                    "default": null,
                    "title": "Type Filter",
                    "type": "string"
                  }
                },
                "title": "get_account_historyArguments",
                "type": "object"
              },
              "name": "get_account_history",
              "title": "Get Account History"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/trade-details-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/trade-details-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/trade-details-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Get full details of a specific trade (Open or Closed).\n    Useful to investigate a trade that disappeared or to see its full history.\n    ",
              "inputSchema": {
                "properties": {
                  "trade_id": {
                    "title": "Trade Id",
                    "type": "string"
                  }
                },
                "required": [
                  "trade_id"
                ],
                "title": "get_trade_detailsArguments",
                "type": "object"
              },
              "name": "get_trade_details",
              "title": "Get Trade Details"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/history-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/history-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/history-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Get OANDA order history (FILLED, CANCELLED, TRIGGERED, etc.).\n    state: \"ALL\", \"PENDING\", \"FILLED\", \"TRIGGERED\", \"CANCELLED\".\n    count: Max 500.\n    ",
              "inputSchema": {
                "properties": {
                  "count": {
                    "default": 50,
                    "title": "Count",
                    "type": "integer"
                  },
                  "state": {
                    "default": "ALL",
                    "title": "State",
                    "type": "string"
                  }
                },
                "title": "get_order_historyArguments",
                "type": "object"
              },
              "name": "get_order_history",
              "title": "Get Order History"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/pending-orders-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/pending-orders-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    List all PENDING orders (Limits, Stops, Entry Orders).\n    These are orders waiting to be filled.\n    ",
              "inputSchema": {
                "properties": {},
                "title": "get_pending_ordersArguments",
                "type": "object"
              },
              "name": "get_pending_orders",
              "title": "Get Pending Orders"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/account-summary-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "Get trading account summary (balance, margin).",
              "inputSchema": {
                "properties": {},
                "title": "get_trading_accountArguments",
                "type": "object"
              },
              "name": "get_trading_account",
              "title": "Get Trading Account"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/close-position-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": false
              },
              "description": "Close a specific trade (fully or partially).",
              "inputSchema": {
                "properties": {
                  "trade_id": {
                    "title": "Trade Id",
                    "type": "string"
                  },
                  "units": {
                    "default": "ALL",
                    "title": "Units",
                    "type": "string"
                  }
                },
                "required": [
                  "trade_id"
                ],
                "title": "close_tradeArguments",
                "type": "object"
              },
              "name": "close_trade",
              "title": "Close Trade"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/close-position-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/close-position-widget.html"
              },
              "annotations": {
                "destructiveHint": true,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": false
              },
              "description": "Close position for an instrument.",
              "inputSchema": {
                "properties": {
                  "instrument": {
                    "title": "Instrument",
                    "type": "string"
                  },
                  "long_units": {
                    "default": "ALL",
                    "title": "Long Units",
                    "type": "string"
                  },
                  "short_units": {
                    "default": "ALL",
                    "title": "Short Units",
                    "type": "string"
                  }
                },
                "required": [
                  "instrument"
                ],
                "title": "close_positionArguments",
                "type": "object"
              },
              "name": "close_position",
              "title": "Close Position"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/market-status-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Get trading hours for instruments. Use for session planning or bulk data fetch.\n    \n    Args:\n        instrument: Specific instrument (e.g., \"EUR_USD\", \"US30_USD\"). If None, returns all.\n        category: Filter by category (e.g., \"Forex CFDs\", \"Index CFDs\", \"Commodity CFDs\", \"Metals CFDs\", \"Bonds CFDs\").\n        include_status: Include current open/closed status (default True).\n    \n    Returns:\n        For each instrument:\n        - timezone: IANA timezone (e.g., \"America/New_York\")\n        - windows: Array of {days, open, close} in LOCAL time\n        - windows_utc: Same windows converted to UTC\n        - category: Asset category\n        - is_open: Current status (if include_status=True)\n        - displayName: Human-readable name\n    \n    Examples:\n        - get_market_hours(instrument=\"EUR_USD\") - Single instrument\n        - get_market_hours(category=\"Index CFDs\") - All indices\n        - get_market_hours(include_status=False) - All instruments, no status check\n    ",
              "inputSchema": {
                "properties": {
                  "category": {
                    "default": null,
                    "title": "Category",
                    "type": "string"
                  },
                  "include_status": {
                    "default": true,
                    "title": "Include Status",
                    "type": "boolean"
                  },
                  "instrument": {
                    "default": null,
                    "title": "Instrument",
                    "type": "string"
                  }
                },
                "title": "get_market_hoursArguments",
                "type": "object"
              },
              "name": "get_market_hours",
              "title": "Get Market Hours"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/market-status-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Check if a specific market is currently open for trading.\n    \n    Args:\n        instrument: The OANDA instrument name (e.g., \"EUR_USD\", \"US30_USD\", \"XAU_USD\").\n        at_time: Optional ISO8601 datetime to check (e.g., \"2024-01-15T14:30:00Z\").\n                 Defaults to current time if not provided.\n    \n    Returns:\n        - instrument: The queried instrument\n        - is_open: Boolean - True if market is open\n        - checked_at_utc: When the check was made (UTC)\n        - checked_at_local: Same time in instrument's local timezone\n        - timezone: The instrument's native timezone\n        - category: Asset category (Forex CFDs, Index CFDs, etc.)\n        - displayName: Human-readable name\n        - reason: Why the market is open/closed\n        - schedule: Schedule type if available (e.g., \"24/5\", \"24/7\")\n        - dstAffected: Whether DST affects trading hours\n    \n    Example:\n        is_market_open(instrument=\"US30_USD\")\n        is_market_open(instrument=\"SUGAR_USD\", at_time=\"2024-01-15T10:00:00-05:00\")\n    ",
              "inputSchema": {
                "properties": {
                  "at_time": {
                    "default": null,
                    "title": "At Time",
                    "type": "string"
                  },
                  "instrument": {
                    "title": "Instrument",
                    "type": "string"
                  }
                },
                "required": [
                  "instrument"
                ],
                "title": "is_market_openArguments",
                "type": "object"
              },
              "name": "is_market_open",
              "title": "Is Market Open"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/search-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/search-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/search-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              },
              "description": "\n    Get all available market categories and instrument counts.\n    Useful for understanding what categories can be queried with get_market_hours.\n    \n    Returns:\n        List of categories with counts and sample instruments.\n    ",
              "inputSchema": {
                "properties": {},
                "title": "get_market_categoriesArguments",
                "type": "object"
              },
              "name": "get_market_categories",
              "title": "Get Market Categories"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/instrument-specs-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/instrument-specs-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/instrument-specs-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Get instrument specifications (precision, limits, margin, financing rates).\n    \n    Args:\n        instrument: Specific instrument (e.g., \"EUR_USD\"). If None, returns all or filtered by type.\n        type_filter: Filter by type: \"CURRENCY\", \"METAL\", \"CFD\". If None, returns all.\n        include: List of field groups to include. Options: \n                 [\"precision\", \"limits\", \"margin\", \"financing\", \"gslo\", \"trailing\"]\n                 If None, includes all fields.\n    \n    Returns:\n        For each instrument:\n        - displayName: Human-readable name\n        - type: CURRENCY, METAL, CFD\n        - precision: pip location, display precision, trade units precision\n        - limits: min trade size, max order units, max position size\n        - margin: rate and calculated leverage (e.g., \"30:1\")\n        - financing: longRate, shortRate, tripleSwapDay\n        - gslo: guaranteed stop loss mode, min distance, premium\n        - trailingStop: min/max distance\n        - meta: cache age, staleness status\n    \n    Examples:\n        - get_instrument_specs(instrument=\"EUR_USD\") - Single instrument\n        - get_instrument_specs(type_filter=\"METAL\") - All metals\n        - get_instrument_specs(instrument=\"XAU_USD\", include=[\"precision\", \"margin\"]) - Specific fields\n    ",
              "inputSchema": {
                "properties": {
                  "include": {
                    "default": null,
                    "items": {
                      "type": "string"
                    },
                    "title": "Include",
                    "type": "array"
                  },
                  "instrument": {
                    "default": null,
                    "title": "Instrument",
                    "type": "string"
                  },
                  "type_filter": {
                    "default": null,
                    "title": "Type Filter",
                    "type": "string"
                  }
                },
                "title": "get_instrument_specsArguments",
                "type": "object"
              },
              "name": "get_instrument_specs",
              "title": "Get Instrument Specs"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/market-status-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": false
              },
              "description": "\n    Manually refresh instrument data from OANDA API.\n    Updates financing rates, margin requirements, and other parameters.\n    \n    Requires: User must have saved OANDA credentials via save_oanda_credentials.\n    \n    Returns:\n        - success: Boolean indicating if refresh succeeded\n        - message: Status message\n        - count: Number of instruments refreshed\n        - refreshedAt: Timestamp of refresh\n    \n    Note: This fetches fresh data from OANDA's practice environment.\n    The cache is automatically refreshed on server startup if data is >24 hours old.\n    ",
              "inputSchema": {
                "properties": {},
                "title": "refresh_instrument_dataArguments",
                "type": "object"
              },
              "name": "refresh_instrument_data",
              "title": "Refresh Instrument Data"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/system-status-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              },
              "description": "\n    Check the status of the instrument data cache.\n    \n    Returns:\n        - ageHours: How old the cached data is\n        - isStale: True if data is older than 24 hours\n        - lastRefreshed: When the cache was last updated\n        - instrumentCount: Number of instruments in cache\n        - recommendation: Whether refresh is recommended\n    ",
              "inputSchema": {
                "properties": {},
                "title": "get_instrument_cache_statusArguments",
                "type": "object"
              },
              "name": "get_instrument_cache_status",
              "title": "Get Instrument Cache Status"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/account-summary-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/account-summary-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Return the current user's token balances from Auth0 app_metadata.\n\n    Uses _safe_profile() so that the same values shown inside AI analysis\n    (token_quota, purchased_tokens, total_token_usage, last_reset, email, user_id)\n    are returned in a simple JSON structure.\n    ",
              "inputSchema": {
                "properties": {},
                "title": "get_token_balancesArguments",
                "type": "object"
              },
              "name": "get_token_balances",
              "title": "Get Token Balances"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/asset-list-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/asset-list-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/asset-list-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              },
              "description": "\n    Return supported asset symbols from config.OANDA_UNIVERSE.\n    Optional:\n      \u2022 filter: substring (case-insensitive) to narrow the list\n      \u2022 asset: specific symbol to test membership\n    ",
              "inputSchema": {
                "properties": {
                  "asset": {
                    "default": "",
                    "title": "Asset",
                    "type": "string"
                  },
                  "filter": {
                    "default": "",
                    "title": "Filter",
                    "type": "string"
                  }
                },
                "title": "list_assetsArguments",
                "type": "object"
              },
              "name": "list_assets",
              "title": "List Assets"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/analysis-card.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/analysis-card.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-card.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Run a one-shot technical analysis for a single asset/timeframe.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD, XAU_USD)\n        timeframe: Timeframe for analysis (D, H4, H1, etc.)\n        priceType: Price type - B (bid), A (ask), or M (mid)\n        timeoutSec: Timeout in seconds (5-120)\n    \n    Returns:\n        Analysis results with status, signals, and recommendations\n    ",
              "inputSchema": {
                "properties": {
                  "asset": {
                    "title": "Asset",
                    "type": "string"
                  },
                  "priceType": {
                    "default": "B",
                    "title": "Pricetype",
                    "type": "string"
                  },
                  "timeframe": {
                    "default": "D",
                    "title": "Timeframe",
                    "type": "string"
                  },
                  "timeoutSec": {
                    "default": 45,
                    "title": "Timeoutsec",
                    "type": "integer"
                  }
                },
                "required": [
                  "asset"
                ],
                "title": "analyze_assetArguments",
                "type": "object"
              },
              "name": "analyze_asset",
              "title": "Analyze Asset"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/watchlist-card.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              },
              "description": "\n    View the current assets in your saved watchlist.\n    \n    Returns:\n        List of saved assets and count.\n    ",
              "inputSchema": {
                "properties": {},
                "title": "get_watchlistArguments",
                "type": "object"
              },
              "name": "get_watchlist",
              "title": "Get Watchlist"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/watchlist-card.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": false
              },
              "description": "\n    Add a new asset to your persistent watchlist.\n    \n    Args:\n        asset: Asset symbol (e.g. 'EUR_USD', 'BTC_USD')\n    ",
              "inputSchema": {
                "properties": {
                  "asset": {
                    "title": "Asset",
                    "type": "string"
                  }
                },
                "required": [
                  "asset"
                ],
                "title": "add_to_watchlistArguments",
                "type": "object"
              },
              "name": "add_to_watchlist",
              "title": "Add to Watchlist"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/watchlist-card.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-card.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": false
              },
              "description": "\n    Remove an asset from your persistent watchlist.\n    \n    Args:\n        asset: Asset symbol to remove\n    ",
              "inputSchema": {
                "properties": {
                  "asset": {
                    "title": "Asset",
                    "type": "string"
                  }
                },
                "required": [
                  "asset"
                ],
                "title": "remove_from_watchlistArguments",
                "type": "object"
              },
              "name": "remove_from_watchlist",
              "title": "Remove from Watchlist"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/watchlist-analysis-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/watchlist-analysis-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/watchlist-analysis-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Analyze multiple assets from the user's SAVED watchlist in parallel.\n    \n    Args:\n        timeframe: Timeframe (D, H4, H1, etc.)\n        priceType: B (bid), A (ask), or M (mid)\n        timeoutSec: Overall timeout in seconds (30-300)\n        (optional) timeframes: list of timeframes (timeframes mode) \u2013 if provided, supersedes timeframe\n        (optional) max_assets: limit how many watchlist assets to analyze (default: all)\n    \n    Returns:\n        Results for all watchlist assets with analysis data\n    ",
              "inputSchema": {
                "properties": {
                  "max_assets": {
                    "default": null,
                    "title": "Max Assets",
                    "type": "integer"
                  },
                  "priceType": {
                    "default": "B",
                    "title": "Pricetype",
                    "type": "string"
                  },
                  "timeframe": {
                    "default": "D",
                    "title": "Timeframe",
                    "type": "string"
                  },
                  "timeframes": {
                    "default": null,
                    "items": {
                      "type": "string"
                    },
                    "title": "Timeframes",
                    "type": "array"
                  },
                  "timeoutSec": {
                    "default": 120,
                    "title": "Timeoutsec",
                    "type": "integer"
                  }
                },
                "title": "analyze_watchlistArguments",
                "type": "object"
              },
              "name": "analyze_watchlist",
              "title": "Analyze Watchlist"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/multi-analysis-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/multi-analysis-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/multi-analysis-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Analyze a single asset across multiple timeframes simultaneously.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD)\n        timeframes: List of timeframes (e.g., [\"D\", \"H4\", \"H1\"])\n        priceType: B (bid), A (ask), or M (mid)\n        timeoutSec: Overall timeout in seconds (30-300)\n    \n    Returns:\n        Multi-timeframe analysis results\n    ",
              "inputSchema": {
                "properties": {
                  "asset": {
                    "title": "Asset",
                    "type": "string"
                  },
                  "priceType": {
                    "default": "B",
                    "title": "Pricetype",
                    "type": "string"
                  },
                  "timeframes": {
                    "items": {
                      "type": "string"
                    },
                    "title": "Timeframes",
                    "type": "array"
                  },
                  "timeoutSec": {
                    "default": 90,
                    "title": "Timeoutsec",
                    "type": "integer"
                  }
                },
                "required": [
                  "asset",
                  "timeframes"
                ],
                "title": "analyze_timeframesArguments",
                "type": "object"
              },
              "name": "analyze_timeframes",
              "title": "Analyze Timeframes"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/calendar-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/calendar-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/calendar-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Fetch upcoming economic events via the TradingView proxy source.\n    \n    Args:\n        fromDays: Start of date range (days from now, 0-90)\n        toDays: End of date range (days from now, 0-90)\n    \n    Returns:\n        List of economic events with importance, country, and timing\n    ",
              "inputSchema": {
                "properties": {
                  "fromDays": {
                    "default": 0,
                    "title": "Fromdays",
                    "type": "integer"
                  },
                  "toDays": {
                    "default": 7,
                    "title": "Todays",
                    "type": "integer"
                  }
                },
                "title": "economic_eventsArguments",
                "type": "object"
              },
              "name": "economic_events",
              "title": "Economic Events"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/news-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/news-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/news-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Get recent articles from the Forex-GPT blog feed.\n    \n    Args:\n        max_results: Maximum number of articles to return (1-50, default: 10)\n    \n    Returns:\n        List of recent blog articles with titles, URLs, summaries, images, and publication dates\n    ",
              "inputSchema": {
                "properties": {
                  "max_results": {
                    "default": 10,
                    "title": "Max Results",
                    "type": "integer"
                  }
                },
                "title": "get_blog_articlesArguments",
                "type": "object"
              },
              "name": "get_blog_articles",
              "title": "Get Blog Articles"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/system-status-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Comprehensive health and status check including optional upstream dependencies.\n    \n    Args:\n        checkOpenAI: Verify OpenAI API connectivity\n        checkTradingView: Verify TradingView API connectivity\n        checkOANDA: Verify OANDA API connectivity\n    \n    Returns:\n        Health status with environment info and dependency checks\n    ",
              "inputSchema": {
                "properties": {
                  "checkOANDA": {
                    "default": false,
                    "title": "Checkoanda",
                    "type": "boolean"
                  },
                  "checkOpenAI": {
                    "default": false,
                    "title": "Checkopenai",
                    "type": "boolean"
                  },
                  "checkTradingView": {
                    "default": false,
                    "title": "Checktradingview",
                    "type": "boolean"
                  }
                },
                "title": "healthArguments",
                "type": "object"
              },
              "name": "health",
              "title": "Health Check"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/chart-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/chart-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/chart-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Retrieve OHLC (candlestick) data for charting.\n    \n    Args:\n        asset: Asset symbol (e.g., EUR_USD)\n        timeframe: Timeframe (D, H4, H1, etc.)\n        count: Number of candles (50-5000)\n    \n    Returns:\n        Candlestick data with timestamps, open, high, low, close prices\n    ",
              "inputSchema": {
                "properties": {
                  "asset": {
                    "title": "Asset",
                    "type": "string"
                  },
                  "count": {
                    "default": 460,
                    "title": "Count",
                    "type": "integer"
                  },
                  "price": {
                    "default": "M",
                    "title": "Price",
                    "type": "string"
                  },
                  "timeframe": {
                    "default": "D",
                    "title": "Timeframe",
                    "type": "string"
                  }
                },
                "required": [
                  "asset"
                ],
                "title": "get_chart_dataArguments",
                "type": "object"
              },
              "name": "get_chart_data",
              "title": "Get Chart Data"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/heatmap-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/heatmap-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/heatmap-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Generates a real-time Sentiment Heatmap snapshot.\n    \n    Behavior:\n    1. If 'assets' are provided, scans those specific assets.\n    2. If 'assets' not provided, scans the user's saved Watchlist.\n    3. If Watchlist is empty, scans a default list of popular global assets.\n    \n    Args:\n        assets: Optional list of symbols.\n        timeframe: Granularity (e.g. 'H1', 'D').\n    ",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "anyOf": [
                      {
                        "items": {
                          "type": "string"
                        },
                        "type": "array"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "default": null,
                    "title": "Assets"
                  },
                  "count": {
                    "default": 460,
                    "title": "Count",
                    "type": "integer"
                  },
                  "timeframe": {
                    "default": "D",
                    "title": "Timeframe",
                    "type": "string"
                  }
                },
                "title": "get_live_heatmapArguments",
                "type": "object"
              },
              "name": "get_live_heatmap",
              "title": "Live Heatmap"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/search-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/search-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/search-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              },
              "description": "\n    Search forex analysis results by asset name, timeframe, or keywords.\n    Returns a list of available analyses matching the search criteria.\n    \n    Args:\n        query: Search query (e.g., \"EUR_USD\", \"daily analysis\", \"gold\", \"bitcoin\")\n    \n    Returns:\n        Search results with IDs for fetching full analysis\n    ",
              "inputSchema": {
                "properties": {
                  "query": {
                    "title": "Query",
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ],
                "title": "searchArguments",
                "type": "object"
              },
              "name": "search",
              "title": "Search"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/analysis-viewer-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/analysis-viewer-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/analysis-viewer-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Retrieve complete forex analysis by ID.\n    \n    Args:\n        id: Analysis ID in format \"ASSET_TIMEFRAME\" (e.g., \"EUR_USD_D\", \"XAU_USD_H4\")\n    \n    Returns:\n        Full analysis document with technical indicators, signals, and recommendations\n    ",
              "inputSchema": {
                "properties": {
                  "id": {
                    "title": "Id",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "title": "fetchArguments",
                "type": "object"
              },
              "name": "fetch",
              "title": "Fetch Analysis"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-scanner.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/market-scanner.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-scanner.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Scans the entire market universe (Forex, Crypto, Metals, Indices) to find the strongest trading opportunities.\n    \n    Args:\n        timeframes: List of timeframes to scan (e.g. [\"H1\", \"H4\", \"D\"]). Default is [\"H8\"].\n        min_score: Minimum absolute sentiment score (0-100) to include. Default 80 (Bullish/Bearish).\n        limit: Maximum number of results to return. Default 6.\n        \n    Returns:\n        A list of the top opportunities ranked by sentiment strength.\n    ",
              "inputSchema": {
                "properties": {
                  "limit": {
                    "default": 6,
                    "title": "Limit",
                    "type": "integer"
                  },
                  "minAbs": {
                    "anyOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "default": null,
                    "title": "Minabs"
                  },
                  "min_score": {
                    "default": 80.0,
                    "title": "Min Score",
                    "type": "number"
                  },
                  "perSide": {
                    "anyOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "default": null,
                    "title": "Perside"
                  },
                  "sentiment": {
                    "default": null,
                    "title": "Sentiment",
                    "type": "string"
                  },
                  "timeframes": {
                    "default": [
                      "H8"
                    ],
                    "items": {
                      "type": "string"
                    },
                    "title": "Timeframes",
                    "type": "array"
                  }
                },
                "title": "scan_marketArguments",
                "type": "object"
              },
              "name": "scan_market",
              "title": "Scan Market"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/spread-card.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/spread-card.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/spread-card.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Checks the current liquidity and trading cost (spread) for an asset.\n    Useful for checking if a market is too expensive to trade right now.\n    \n    Args:\n        asset: The asset symbol (e.g., \"EUR_USD\", \"XAU_USD\")\n        \n    Returns:\n        Current spread, average spread, and cost in basis points.\n    ",
              "inputSchema": {
                "properties": {
                  "asset": {
                    "title": "Asset",
                    "type": "string"
                  },
                  "count": {
                    "default": 100,
                    "title": "Count",
                    "type": "integer"
                  },
                  "granularity": {
                    "default": "M1",
                    "title": "Granularity",
                    "type": "string"
                  }
                },
                "required": [
                  "asset"
                ],
                "title": "get_spreadsArguments",
                "type": "object"
              },
              "name": "get_spreads",
              "title": "Get Spreads"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/system-status-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/system-status-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              },
              "description": "\n    Return the server's current UTC timestamp (ISO 8601).\n    ",
              "inputSchema": {
                "properties": {},
                "title": "get_server_timeArguments",
                "type": "object"
              },
              "name": "get_server_time",
              "title": "Get Server Time"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/help-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/help-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/help-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": false,
                "readOnlyHint": true
              },
              "description": "\n    Master tutorial for MCP tools: usage tips, key parameters, and suggested flows.\n    ",
              "inputSchema": {
                "properties": {},
                "title": "help_tutorialArguments",
                "type": "object"
              },
              "name": "help_tutorial",
              "title": "Help Tutorial"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/chart-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/chart-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/chart-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Return a short-lived URL for the raw price stream (SSE) for given instruments.\n    The URL expires after ~10 minutes.\n    ",
              "inputSchema": {
                "properties": {
                  "instruments": {
                    "items": {
                      "type": "string"
                    },
                    "title": "Instruments",
                    "type": "array"
                  }
                },
                "required": [
                  "instruments"
                ],
                "title": "get_price_stream_urlArguments",
                "type": "object"
              },
              "name": "get_price_stream_url",
              "title": "Get Price Stream URL"
            },
            {
              "_meta": {
                "mimeType": "text/html;profile=mcp-app",
                "openai/csp": "default-src 'self' https://mcp.forex-gpt.ai https://chatgpt.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://mcp.forex-gpt.ai; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: https:; connect-src 'self' https://mcp.forex-gpt.ai https://*.oanda.com *;",
                "openai/domain": "mcp.forex-gpt.ai",
                "openai/outputTemplate": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html",
                "openai/widgetAccessible": true,
                "ui": {
                  "csp": {
                    "connectDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://*.oanda.com"
                    ],
                    "frameDomains": [],
                    "resourceDomains": [
                      "https://mcp.forex-gpt.ai",
                      "https://fonts.googleapis.com",
                      "https://fonts.gstatic.com"
                    ]
                  },
                  "domain": "https://mcp.forex-gpt.ai",
                  "resourceUri": "ui://widget/market-status-widget.html",
                  "visibility": [
                    "app",
                    "model"
                  ]
                },
                "ui/resourceUri": "https://mcp.forex-gpt.ai/widgets/market-status-widget.html"
              },
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Return a short-lived URL for the sentiment stream (SSE) for given instruments and granularity.\n    The URL expires after ~10 minutes.\n    ",
              "inputSchema": {
                "properties": {
                  "granularity": {
                    "default": "D",
                    "title": "Granularity",
                    "type": "string"
                  },
                  "instruments": {
                    "items": {
                      "type": "string"
                    },
                    "title": "Instruments",
                    "type": "array"
                  }
                },
                "required": [
                  "instruments"
                ],
                "title": "get_sentiment_stream_urlArguments",
                "type": "object"
              },
              "name": "get_sentiment_stream_url",
              "title": "Get Sentiment Stream URL"
            },
            {
              "annotations": {
                "destructiveHint": false,
                "idempotentHint": false,
                "openWorldHint": true,
                "readOnlyHint": true
              },
              "description": "\n    Proxy to the Flask /api/chart-chat endpoint using the caller's bearer token.\n    Keeps token accounting/auth consistent with the web app while exposing chat via MCP.\n    ",
              "inputSchema": {
                "properties": {
                  "chart_id": {
                    "default": "",
                    "title": "Chart Id",
                    "type": "string"
                  },
                  "chat_session_id": {
                    "default": "",
                    "title": "Chat Session Id",
                    "type": "string"
                  },
                  "granularity": {
                    "default": "",
                    "title": "Granularity",
                    "type": "string"
                  },
                  "instrument": {
                    "default": "",
                    "title": "Instrument",
                    "type": "string"
                  },
                  "max_tokens": {
                    "default": null,
                    "title": "Max Tokens",
                    "type": "integer"
                  },
                  "message": {
                    "title": "Message",
                    "type": "string"
                  },
                  "price_type": {
                    "default": "B",
                    "title": "Price Type",
                    "type": "string"
                  }
                },
                "required": [
                  "message"
                ],
                "title": "chart_chat_proxyArguments",
                "type": "object"
              },
              "name": "chart_chat_proxy",
              "title": "Chart Chat Proxy"
            }
          ]
        }
      },
      "bad_protocol_status_code": 200,
      "delete_error": null,
      "delete_status_code": 405,
      "expired_session_error": null,
      "expired_session_status_code": 200,
      "issues": [
        "missing_protocol_header",
        "bad_protocol_not_rejected",
        "delete_session_unexpected",
        "expired_session_not_404"
      ],
      "last_event_id_visible": false,
      "protocol_header_present": false,
      "requested_protocol_version": "2024-11-05",
      "session_id_present": true,
      "transport": "sse"
    }
  },
  "remote_url": "https://mcp.forex-gpt.ai/mcp",
  "server_card_payload": null,
  "server_identifier": "io.github.hatgit/forex-gpt-mcp"
}

Known versions

Validation history

7 day score delta
+0.0
30 day score delta
+0.0
Recent healthy ratio
90%
Freshness
614.4h
TimestampStatusScoreLatencyTools
Apr 08, 2026 04:24:36 PM UTC Healthy 74.7 1123.9 ms 45
Apr 07, 2026 04:24:16 PM UTC Healthy 74.7 1088.4 ms 45
Apr 06, 2026 04:23:05 PM UTC Healthy 74.7 957.7 ms 45
Apr 05, 2026 04:22:05 PM UTC Healthy 74.7 1075.0 ms 45
Apr 04, 2026 04:21:07 PM UTC Healthy 74.7 916.4 ms 45
Apr 03, 2026 04:20:21 PM UTC Healthy 74.7 840.9 ms 45
Apr 02, 2026 04:18:43 PM UTC Healthy 74.7 3136.6 ms 45
Apr 01, 2026 04:05:58 PM UTC Healthy 75.3 2641.8 ms 45

Validation timeline

ValidatedSummaryScoreProtocolAuth modeToolsHigh-risk toolsChanges
Apr 08, 2026 04:24:36 PM UTC Healthy 74.7 2024-11-05 oauth_supported 45 3 none
Apr 07, 2026 04:24:16 PM UTC Healthy 74.7 2024-11-05 oauth_supported 45 3 none
Apr 06, 2026 04:23:05 PM UTC Healthy 74.7 2024-11-05 oauth_supported 45 3 none
Apr 05, 2026 04:22:05 PM UTC Healthy 74.7 2024-11-05 oauth_supported 45 3 none
Apr 04, 2026 04:21:07 PM UTC Healthy 74.7 2024-11-05 oauth_supported 45 3 none
Apr 03, 2026 04:20:21 PM UTC Healthy 74.7 2024-11-05 oauth_supported 45 3 none
Apr 02, 2026 04:18:43 PM UTC Healthy 74.7 2024-11-05 oauth_supported 45 3 none
Apr 01, 2026 04:05:58 PM UTC Healthy 75.3 2024-11-05 oauth_supported 45 3 none
Mar 31, 2026 04:01:45 PM UTC Healthy 75.3 2024-11-05 oauth_supported 45 3 summary_changed
Mar 31, 2026 07:57:17 AM UTC Degraded 72.6 2024-11-05 oauth_supported 45 3 none
Mar 30, 2026 11:53:47 PM UTC Degraded 72.6 2024-11-05 oauth_supported 45 3 none
Mar 30, 2026 03:45:22 PM UTC Degraded 72.6 2024-11-05 oauth_supported 45 3 none

Recent validation runs

StartedStatusSummaryLatencyChecks
Apr 08, 2026 04:24:35 PM UTC Completed Healthy 1123.9 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe
Apr 07, 2026 04:24:15 PM UTC Completed Healthy 1088.4 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe
Apr 06, 2026 04:23:04 PM UTC Completed Healthy 957.7 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe
Apr 05, 2026 04:22:04 PM UTC Completed Healthy 1075.0 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe
Apr 04, 2026 04:21:06 PM UTC Completed Healthy 916.4 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe
Apr 03, 2026 04:20:21 PM UTC Completed Healthy 840.9 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe
Apr 02, 2026 04:18:40 PM UTC Completed Healthy 3136.6 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe
Apr 01, 2026 04:05:56 PM UTC Completed Healthy 2641.8 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe
Mar 31, 2026 04:01:44 PM UTC Completed Healthy 1021.5 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe
Mar 31, 2026 07:57:16 AM UTC Completed Degraded 855.1 ms action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe