diff --git a/runtime/history/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z.json b/runtime/history/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z.json new file mode 100644 index 0000000..a419307 --- /dev/null +++ b/runtime/history/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "change", + "component": "gram1-charts-v39-isolate", + "started_at_utc": "2026-08-01T13:03:04Z", + "finished_at_utc": "2026-08-01T13:03:14Z", + "reference_register_checked": true, + "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", + "error_register_checked": true, + "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83", + "command_sha256": "4f55a1050c754cf7fe1061aa15bc026e90841e5fb92e9059422766b1ee9a3022", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "change_declared": true, + "result_contract_valid": true, + "result_contract_status": "OK", + "result_contract_error": null, + "command_rc": 0, + "changes_made": true, + "rollback_started": false, + "rollback_restored": null, + "mutation_outcome": "MUTATED", + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "f11c272aefef172d26485070fdc4f24a2f6e51a2610df5d8547083820cbc9067", + "sanitized_output_sha256": "c7fd85598e290aa09a0d6b6553d8fde0df9a34ff9088875d117e81ffa68f572a", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "HOMELAB_RESULT_CONTRACT={\"changes_made\":true,\"command_id\":\"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z\",\"mutation_outcome\":\"MUTATED\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"changes_made\":true,\"command_id\":\"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z\",\"control_plane_error\":null,\"gitea_changed\":false,\"mutation_outcome\":\"MUTATED\",\"pinned_host_key_aliases\":[\"[PRIVATE_IP]\"],\"production_site_changed\":true,\"rc\":0,\"remote_result\":{\"backup_dir\":\"/var/lib/homelab-change-rollback/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z\",\"baseline_capsule_sha256\":\"905d0b554ff025817a7480375ac6c8685396a99b456f01f54220ef4398af7139\",\"baseline_command_id\":\"GRAM1-SITE-CHARTS-V37-SCOPED-RUNTIME-VERIFY-20260801T122700Z\",\"changed_paths\":[\"templates/index.html\"],\"changes_made\":true,\"command_id\":\"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z\",\"control_plane_error\":null,\"deployment\":{\"container_hashes\":[{\"path\":\"app.py\",\"service\":\"web\",\"sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\"},{\"path\":\"templates/index.html\",\"service\":\"web\",\"sha256\":\"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65\"},{\"path\":\"worker.py\",\"service\":\"worker\",\"sha256\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"}],\"running\":[\"web\",\"worker\"],\"runtime\":{\"local_headers\":{\"server\":\"uvicorn\"},\"local_root_sha256\":\"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65\",\"public\":{\"headers\":{},\"root_sha256\":\"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65\",\"status\":200},\"svg\":{\"AVAX\":{\"bytes\":12739,\"candles\":72,\"sha256\":\"2dd8850447185c0b4be5c146242e8195ae840af1666fe877a4c5b110f60a22c9\"},\"HBAR\":{\"bytes\":14697,\"candles\":84,\"sha256\":\"cb5c6cdf8268990e735cb91e3070ee34f282e9826bacacc9be1fe04268c62951\"},\"LINK\":{\"bytes\":16003,\"candles\":92,\"sha256\":\"cb40e40aac61db48c82361a18fe7e89e93c96624718d205c3575db9f4d22d38c\"},\"POL\":{\"bytes\":4949,\"candles\":24,\"sha256\":\"e54be1f05c3abb3c23bd4fdd79e3a1e16352eb78f32cbd580d5a3f4aefd8c07f\"}}}},\"diagnostic_capsule_sha256\":\"7e704e0217aabc9d825ee36d299b74f51d05f482ee543d706a024b53a3177147\",\"diagnostic_command_id\":\"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z\",\"duration_seconds\":8.869,\"gitea_changed\":false,\"mutation_outcome\":\"MUTATED\",\"old_hashes\":{\"app.py\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\",\"templates/index.html\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\",\"worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"},\"production_site_changed\":true,\"rc\":0,\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"semantic_checks\":{\"details\":true,\"dom_ready\":true,\"hidden_legacy_status\":true,\"images\":true,\"legacy_sink\":true,\"new_script\":true,\"new_style\":true,\"old_marker_removed\":true,\"one_initial_open\":true,\"single_open_logic\":true,\"valid_html_boundary\":true,\"visible_heading\":true,\"visible_root\":true},\"status\":\"OK\",\"target_hashes\":{\"app.py\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\",\"templates/index.html\":\"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65\",\"worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"}},\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"selected_method\":\"ALIAS_PINNED_AS_DEBIAN\",\"ssh_method_probes\":[{\"duration_seconds\":0.125,\"identity_count\":null,\"identity_sudo_read_ok\":true,\"name\":\"ALIAS_PINNED_AS_DEBIAN\",\"rc\":0,\"stderr\":\"\"},{\"duration_seconds\":0.125,\"identity_count\":2,\"identity_sudo_read_ok\":true,\"name\":\"DIRECT_PINNED_AS_DEBIAN_NO_PROXY\",\"rc\":0,\"stderr\":\"\"}],\"status\":\"OK\"}\n" +} diff --git a/runtime/history/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z.txt b/runtime/history/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z.txt new file mode 100644 index 0000000..a9f5b9f --- /dev/null +++ b/runtime/history/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z.txt @@ -0,0 +1,34 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z +STATUS=OK +RC=0 +HOST=pve01 +MODE=change +COMPONENT=gram1-charts-v39-isolate +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83 +COMMAND_SHA256=4f55a1050c754cf7fe1061aa15bc026e90841e5fb92e9059422766b1ee9a3022 +DUPLICATE_FAILED_COMMAND_BLOCKED=false +EXECUTION_STARTED=true +CHANGE_DECLARED=true +RESULT_CONTRACT_VALID=true +RESULT_CONTRACT_STATUS=OK +RESULT_CONTRACT_ERROR=NONE +COMMAND_RC=0 +CHANGES_MADE=true +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +MUTATION_OUTCOME=MUTATED +SANITIZED=yes +SECRETS_INCLUDED=no +PRIVATE_ADDRESSES_INCLUDED=no +RAW_EVIDENCE_SHA256=f11c272aefef172d26485070fdc4f24a2f6e51a2610df5d8547083820cbc9067 +SANITIZED_OUTPUT_SHA256=c7fd85598e290aa09a0d6b6553d8fde0df9a34ff9088875d117e81ffa68f572a +OUTPUT_BEGIN +HOMELAB_RESULT_CONTRACT={"changes_made":true,"command_id":"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z","mutation_outcome":"MUTATED","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +{"changes_made":true,"command_id":"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z","control_plane_error":null,"gitea_changed":false,"mutation_outcome":"MUTATED","pinned_host_key_aliases":["[PRIVATE_IP]"],"production_site_changed":true,"rc":0,"remote_result":{"backup_dir":"/var/lib/homelab-change-rollback/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z","baseline_capsule_sha256":"905d0b554ff025817a7480375ac6c8685396a99b456f01f54220ef4398af7139","baseline_command_id":"GRAM1-SITE-CHARTS-V37-SCOPED-RUNTIME-VERIFY-20260801T122700Z","changed_paths":["templates/index.html"],"changes_made":true,"command_id":"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z","control_plane_error":null,"deployment":{"container_hashes":[{"path":"app.py","service":"web","sha256":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d"},{"path":"templates/index.html","service":"web","sha256":"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65"},{"path":"worker.py","service":"worker","sha256":"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c"}],"running":["web","worker"],"runtime":{"local_headers":{"server":"uvicorn"},"local_root_sha256":"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65","public":{"headers":{},"root_sha256":"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65","status":200},"svg":{"AVAX":{"bytes":12739,"candles":72,"sha256":"2dd8850447185c0b4be5c146242e8195ae840af1666fe877a4c5b110f60a22c9"},"HBAR":{"bytes":14697,"candles":84,"sha256":"cb5c6cdf8268990e735cb91e3070ee34f282e9826bacacc9be1fe04268c62951"},"LINK":{"bytes":16003,"candles":92,"sha256":"cb40e40aac61db48c82361a18fe7e89e93c96624718d205c3575db9f4d22d38c"},"POL":{"bytes":4949,"candles":24,"sha256":"e54be1f05c3abb3c23bd4fdd79e3a1e16352eb78f32cbd580d5a3f4aefd8c07f"}}}},"diagnostic_capsule_sha256":"7e704e0217aabc9d825ee36d299b74f51d05f482ee543d706a024b53a3177147","diagnostic_command_id":"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z","duration_seconds":8.869,"gitea_changed":false,"mutation_outcome":"MUTATED","old_hashes":{"app.py":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d","templates/index.html":"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5","worker.py":"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c"},"production_site_changed":true,"rc":0,"rollback_restored":null,"rollback_started":false,"schema":1,"semantic_checks":{"details":true,"dom_ready":true,"hidden_legacy_status":true,"images":true,"legacy_sink":true,"new_script":true,"new_style":true,"old_marker_removed":true,"one_initial_open":true,"single_open_logic":true,"valid_html_boundary":true,"visible_heading":true,"visible_root":true},"status":"OK","target_hashes":{"app.py":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d","templates/index.html":"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65","worker.py":"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c"}},"rollback_restored":null,"rollback_started":false,"schema":1,"selected_method":"ALIAS_PINNED_AS_DEBIAN","ssh_method_probes":[{"duration_seconds":0.125,"identity_count":null,"identity_sudo_read_ok":true,"name":"ALIAS_PINNED_AS_DEBIAN","rc":0,"stderr":""},{"duration_seconds":0.125,"identity_count":2,"identity_sudo_read_ok":true,"name":"DIRECT_PINNED_AS_DEBIAN_NO_PROXY","rc":0,"stderr":""}],"status":"OK"} + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index e2f2c7c..a419307 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,38 +1,38 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z", + "command_id": "GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z", "status": "OK", "rc": 0, "host": "pve01", - "mode": "verify", - "component": "gram1-charts-v38r1-conflict", - "started_at_utc": "2026-08-01T12:43:26Z", - "finished_at_utc": "2026-08-01T12:43:27Z", + "mode": "change", + "component": "gram1-charts-v39-isolate", + "started_at_utc": "2026-08-01T13:03:04Z", + "finished_at_utc": "2026-08-01T13:03:14Z", "reference_register_checked": true, "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", "error_register_checked": true, "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83", - "command_sha256": "7a893a91638a4f1e9b7bc56a5953f15a92f5e83f98db532793a6a4c70ab87132", + "command_sha256": "4f55a1050c754cf7fe1061aa15bc026e90841e5fb92e9059422766b1ee9a3022", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, - "change_declared": false, + "change_declared": true, "result_contract_valid": true, - "result_contract_status": null, + "result_contract_status": "OK", "result_contract_error": null, "command_rc": 0, - "changes_made": false, + "changes_made": true, "rollback_started": false, "rollback_restored": null, - "mutation_outcome": "NO_MUTATION", + "mutation_outcome": "MUTATED", "sanitized": true, "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "7909460d0d093dc7b3fd4fc26760c31b746c2726817e367c4f54af19d08b1973", - "sanitized_output_sha256": "1d40dade1f3b2a33564b123ae1f5845ed486fd142c4ffe88f92143c9d8e2a4e9", + "raw_evidence_sha256": "f11c272aefef172d26485070fdc4f24a2f6e51a2610df5d8547083820cbc9067", + "sanitized_output_sha256": "c7fd85598e290aa09a0d6b6553d8fde0df9a34ff9088875d117e81ffa68f572a", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "HOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z\",\"mutation_outcome\":\"NO_MUTATION\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"changes_made\":false,\"command_id\":\"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z\",\"control_plane_error\":null,\"gitea_changed\":false,\"mutation_outcome\":\"NO_MUTATION\",\"pinned_host_key_aliases\":[\"[PRIVATE_IP]\"],\"production_site_changed\":false,\"rc\":0,\"remote_result\":{\"app_analysis\":{\"app_bytes\":32843,\"app_sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\",\"chart_matches\":[{\"line\":466,\"snippet\":\"00461: x=left+step*(i+.5);color=\\\"#63e6be\\\" if c>=o else \\\"#ff6b81\\\";yo=y(o);yc=y(c);yh=y(h);yl=y(l);rh=max(1.2,abs(yc-yo));ry=min(yo,yc)\\n00462: parts.append(f'');parts.append(f'')\\n00463: parts.append(f'{_gram1_html.escape(symbol)} / USDT · 1M · {len(rows)} свечей')\\n00464: return ''.join(parts)\\n00465: \\n00466: @app.get(\\\"/api/chart-svg/{symbol}\\\", include_in_schema=False)\\n00467: async def _gram1_chart_svg_endpoint_v4(symbol: str, request: _Gram1Request):\\n00468: if not request.session.get(\\\"auth\\\"):\\n00469: return _Gram1Response(content=\\\"Требуется вход\\\", status_code=401, media_type=\\\"text/plain; charset=utf-8\\\")\\n00470: symbol=symbol.upper()\\n00471: if symbol not in _GRAM1_CHART_SYMBOLS:\",\"token\":\"/api/chart-svg\"},{\"line\":397,\"snippet\":\"00392: require_login(request)\\n00393: with db() as c:\\n00394: c.execute(\\\"DELETE FROM alerts WHERE id=?\\\",(alert_id,)); c.commit()\\n00395: return {\\\"ok\\\":True}\\n00396: \\n00397: # GRAM1_SERVER_CHART_FALLBACK_V4\\n00398: import asyncio as _gram1_asyncio\\n00399: import base64 as _gram1_base64\\n00400: import html as _gram1_html\\n00401: import inspect as _gram1_inspect\\n00402: import json as _gram1_json\",\"token\":\"GRAM1_SERVER_CHART_FALLBACK_V4\"},{\"line\":452,\"snippet\":\"00447: except Exception:\\n00448: continue\\n00449: if not rows: raise RuntimeError(\\\"no valid OHLC rows\\\")\\n00450: return rows[-180:]\\n00451: \\n00452: def _gram1_chart_svg_v4(symbol: str, rows):\\n00453: width,height,left,right,top,bottom=1200,430,72,28,24,42\\n00454: lo=min(r[3] for r in rows);hi=max(r[2] for r in rows);span=max(hi-lo,abs(hi)*1e-9,1e-12)\\n00455: plot_w=width-left-right;plot_h=height-top-bottom;step=plot_w/max(len(rows),1);body=max(2.0,min(10.0,step*0.58))\\n00456: def y(v): return top+(hi-v)/span*plot_h\\n00457: parts=[f'', '']\",\"token\":\"_gram1_chart_svg_v4\"},{\"line\":475,\"snippet\":\"00470: symbol=symbol.upper()\\n00471: if symbol not in _GRAM1_CHART_SYMBOLS:\\n00472: return _Gram1Response(content=\\\"Неизвестная монета\\\", status_code=404, media_type=\\\"text/plain; charset=utf-8\\\")\\n00473: try:\\n00474: rows=await _gram1_chart_data_v4(symbol,request)\\n00475: svg=_gram1_chart_svg_v4(symbol,rows)\\n00476: return _Gram1Response(content=svg,media_type=\\\"image/svg+xml\\\",headers={\\\"Cache-Control\\\":\\\"no-store\\\"})\\n00477: except Exception as exc:\\n00478: msg=_gram1_html.escape(str(exc))\\n00479: svg=f'Ошибка серверного графика {symbol}: {msg}'\\n00480: return _Gram1Response(content=svg,status_code=503,media_type=\\\"image/svg+xml\\\",headers={\\\"Cache-Control\\\":\\\"no-store\\\"})\",\"token\":\"_gram1_chart_svg_v4\"},{\"line\":409,\"snippet\":\"00404: from fastapi.responses import Response as _Gram1Response\\n00405: \\n00406: _GRAM1_CHART_JS_B64 = \\\"KCgpPT57CiAgInVzZSBzdHJpY3QiOwogIGNvbnN0IFZFUlNJT049IkdSQU0xX0NIQVJUU19FWFRFUk5BTF9WNCI7CiAgY29uc3Qgc3ltYm9scz1bIkhCQVIiLCJQT0wiLCJBVkFYIiwiTElOSyJdOwogIGNvbnN0IGNoYXJ0cz1uZXcgTWFwKCk7CiAgY29uc3QgY2FuZGxlQ2FjaGU9bmV3IE1hcCgpOwogIGNvbnN0IHNsZWVwPW1zPT5uZXcgUHJvbWlzZShyZXNvbHZlPT5zZXRUaW1lb3V0KHJlc29sdmUsbXMpKTsKICBjb25zdCBhZnRlckxheW91dD0oKT0+bmV3IFByb21pc2UocmVzb2x2ZT0+cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpKTsKICBjb25zdCB0aW1lS2V5PXZhbHVlPT57CiAgICBpZih0eXBlb2YgdmFsdWU9PT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7CiAgICBpZih0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIil7CiAgICAgIGNvbnN0IG51bWVyaWM9TnVtYmVyKHZhbHVlKTtpZihOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpcmV0dXJuIG51bWVyaWM7CiAgICAgIGNvbnN0IHBhcnNlZD1EYXRlLnBhcnNlKHZhbHVlKTtpZihOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSlyZXR1cm4gTWF0aC5mbG9vcihwYXJzZWQvMTAwMCk7CiAgICB9CiAgICBpZih2YWx1ZSYmdHlwZW9mIHZhbHVlPT09Im9iamVjdCImJk51bWJlci5pc0Zpbml0ZShOdW1iZXIodmFsdWUueWVhcikpJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHZhbHVlLm1vbnRoKSkmJk51bWJlci5pc0Zpbml0ZShOdW1iZXIodmFsdWUuZGF5KSkpcmV0dXJuIERhdGUuVVRDKE51bWJlcih2YWx1ZS55ZWFyKSxOdW1iZXIodmFsdWUubW9udGgpLTEsTnVtYmVyKHZhbHVlLmRheSkpLzEwMDA7CiAgICByZXR1cm4gTmFOOwogIH07CiAgY29uc3Qgbm9ybWFsaXplVGltZT12YWx1ZT0+ewogICAgaWYodHlwZW9mIHZhbHVlPT09InN0cmluZyImJi9eXGQrJC8udGVzdCh2YWx1ZSkpdmFsdWU9TnVtYmVyKHZhbHVlKTsKICAgIGlmKHR5cGVvZiB2YWx1ZT09PSJudW1iZXIiJiZOdW1iZXIuaXNGaW5pdGUodmFsdWUpKXJldHVybiBNYXRoLmZsb29yKHZhbHVlPjFlMTE/dmFsdWUvMTAwMDp2YWx1ZSk7CiAgICBpZih0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIiYmL15cZHs0fS1cZHsyfS1cZHsyfS8udGVzdCh2YWx1ZSkpcmV0dXJuIHZhbHVlLnNsaWNlKDAsMTApOwogICAgaWYodmFsdWUmJnR5cGVvZiB2YWx1ZT09PSJvYmplY3QiJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHZhbHVlLnllYXIpKSYmTnVtYmVyLmlzRmluaXRlKE51bWJlcih2YWx1ZS5tb250aCkpJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHZhbHVlLmRheSkpKXJldHVybiB7eWVhcjpOdW1iZXIodmFsdWUueWVhciksbW9udGg6TnVtYmVyKHZhbHVlLm1vbnRoKSxkYXk6TnVtYmVyKHZhbHVlLmRheSl9OwogICAgcmV0dXJuIG51bGw7CiAgfTsKICBjb25zdCBub3JtYWxpemVDYW5kbGVzPXJhdz0+ewogICAgY29uc3Qgcm93cz1bXTsKICAgIGZvcihjb25zdCBpdGVtIG9mIEFycmF5LmlzQXJyYXkocmF3KT9yYXc6W10pewogICAgICBjb25zdCBpc0FycmF5PUFycmF5LmlzQXJyYXkoaXRlbSk7CiAgICAgIGNvbnN0IHRpbWU9bm9ybWFsaXplVGltZShpc0FycmF5P2l0ZW1bMF06KGl0ZW0mJihpdGVtLnRpbWU/P2l0ZW0ub3Blbl90aW1lPz9pdGVtLm9wZW5UaW1lKSkpOwogICAgICBjb25zdCBvcGVuPU51bWJlcihpc0FycmF5P2l0ZW1bMV06aXRlbSYmaXRlbS5vcGVuKSxoaWdoPU51bWJlcihpc0FycmF5P2l0ZW1bMl06aXRlbSYmaXRlbS5oaWdoKSxsb3c9TnVtYmVyKGlzQXJyYXk/aXRlbVszXTppdGVtJiZpdGVtLmxvdyksY2xvc2U9TnVtYmVyKGlzQXJyYXk/aXRlbVs0XTppdGVtJiZpdGVtLmNsb3NlKTsKICAgICAgaWYodGltZT09PW51bGx8fCFbb3BlbixoaWdoLGxvdyxjbG9zZV0uZXZlcnkoTnVtYmVyLmlzRmluaXRlKSljb250aW51ZTsKICAgICAgcm93cy5wdXNoKHt0aW1lLG9wZW4saGlnaCxsb3csY2xvc2V9KTsKICAgIH0KICAgIHJvd3Muc29ydCgoYSxiKT0+dGltZUtleShhLnRpbWUpLXRpbWVLZXkoYi50aW1lKSk7CiAgICBjb25zdCBkZWR1cD1bXTsKICAgIGZvcihjb25zdCByb3cgb2Ygcm93cyl7Y29uc3Qga2V5PVN0cmluZyh0aW1lS2V5KHJvdy50aW1lKSk7aWYoZGVkdXAubGVuZ3RoJiZTdHJpbmcodGltZUtleShkZWR1cFtkZWR1cC5sZW5ndGgtMV0udGltZSkpPT09a2V5KWRlZHVwW2RlZHVwLmxlbmd0aC0xXT1yb3c7ZWxzZSBkZWR1cC5wdXNoKHJvdyl9CiAgICBpZighZGVkdXAubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQVBJINCy0LXRgNC90YPQuyDQtNCw0L3QvdGL0LUg0LHQtdC3INC60L7RgNGA0LXQutGC0L3Ri9GFIE9ITEMt0YHQstC10YfQtdC5Iik7CiAgICByZXR1cm4gZGVkdXA7CiAgfTsKICBjb25zdCBsb2FkQ2FuZGxlcz1hc3luYyBzeW1ib2w9PnsKICAgIGlmKGNhbmRsZUNhY2hlLmhhcyhzeW1ib2wpKXJldHVybiBjYW5kbGVDYWNoZS5nZXQoc3ltYm9sKTsKICAgIGNvbnN0IHRhc2s9KGFzeW5jKCk9PnsKICAgICAgY29uc3QgcmVzcG9uc2U9YXdhaXQgZmV0Y2goIi9hcGkva2xpbmVzLyIrZW5jb2RlVVJJQ29tcG9uZW50KHN5bWJvbCkrIj9saW1pdD0xMDAwJmludGVydmFsPTFNIix7Y2FjaGU6Im5vLXN0b3JlIixjcmVkZW50aWFsczoic2FtZS1vcmlnaW4iLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiJ9fSk7CiAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PTQwMXx8cmVzcG9uc2Uuc3RhdHVzPT09NDAzKXtsb2NhdGlvbj0iL2xvZ2luIjt0aHJvdyBuZXcgRXJyb3IoItCi0YDQtdCx0YPQtdGC0YHRjyDQv9C+0LLRgtC+0YDQvdGL0Lkg0LLRhdC+0LQiKX0KICAgICAgaWYoIXJlc3BvbnNlLm9rKXRocm93IG5ldyBFcnJvcigiSFRUUCAiK3Jlc3BvbnNlLnN0YXR1cyk7CiAgICAgIGNvbnN0IGRhdGE9YXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICBpZihkYXRhJiZkYXRhLnN0YXR1cyYmZGF0YS5zdGF0dXMhPT0iT0siKXRocm93IG5ldyBFcnJvcihTdHJpbmcoZGF0YS5lcnJvcnx8ZGF0YS5tZXNzYWdlfHxkYXRhLnN0YXR1cykpOwogICAgICBjb25zdCByYXc9QXJyYXkuaXNBcnJheShkYXRhJiZkYXRhLmNhbmRsZXMpP2RhdGEuY2FuZGxlczooZGF0YSYmZGF0YS5yZXN1bHQmJkFycmF5LmlzQXJyYXkoZGF0YS5yZXN1bHQuY2FuZGxlcyk/ZGF0YS5yZXN1bHQuY2FuZGxlczpbXSk7CiAgICAgIHJldHVybiBub3JtYWxpemVDYW5kbGVzKHJhdyk7CiAgICB9KSgpOwogICAgY2FuZGxlQ2FjaGUuc2V0KHN5bWJvbCx0YXNrKTt0cnl7cmV0dXJuIGF3YWl0IHRhc2t9Y2F0Y2goZXJyb3Ipe2NhbmRsZUNhY2hlLmRlbGV0ZShzeW1ib2wpO3Rocm93IGVycm9yfQogIH07CiAgY29uc3Qgd2lkdGhPZj1ib3g9Pk1hdGgubWF4KDMyMCxNYXRoLmZsb29yKGJveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aHx8Ym94LmNsaWVudFdpZHRofHw5MDApKTsKICBjb25zdCB3YWl0TGlicmFyeT1hc3luYygpPT57Zm9yKGxldCBuPTA7bjwxMDA7bisrKXtpZih3aW5kb3cuTGlnaHR3ZWlnaHRDaGFydHMmJnR5cGVvZiB3aW5kb3cuTGlnaHR3ZWlnaHRDaGFydHMuY3JlYXRlQ2hhcnQ9PT0iZnVuY3Rpb24iKXJldHVybiB3aW5kb3cuTGlnaHR3ZWlnaHRDaGFydHM7YXdhaXQgc2xlZXAoMTAwKX10aHJvdyBuZXcgRXJyb3IoItCb0L7QutCw0LvRjNC90LDRjyDQsdC40LHQu9C40L7RgtC10LrQsCDQs9GA0LDRhNC40LrQvtCyINC90LUg0LfQsNCz0YDRg9C30LjQu9Cw0YHRjCIpfTsKICBjb25zdCBtYWtlU2VyaWVzPShhcGksb3B0aW9ucyk9PntpZihhcGkmJnR5cGVvZiBhcGkuYWRkQ2FuZGxlc3RpY2tTZXJpZXM9PT0iZnVuY3Rpb24iKXJldHVybiBhcGkuYWRkQ2FuZGxlc3RpY2tTZXJpZXMob3B0aW9ucyk7aWYoYXBpJiZ0eXBlb2YgYXBpLmFkZFNlcmllcz09PSJmdW5jdGlvbiImJndpbmRvdy5MaWdodHdlaWdodENoYXJ0cyYmd2luZG93LkxpZ2h0d2VpZ2h0Q2hhcnRzLkNhbmRsZXN0aWNrU2VyaWVzKXJldHVybiBhcGkuYWRkU2VyaWVzKHdpbmRvdy5MaWdodHdlaWdodENoYXJ0cy5DYW5kbGVzdGlja1NlcmllcyxvcHRpb25zKTt0aHJvdyBuZXcgRXJyb3IoItCS0LXRgNGB0LjRjyBMaWdodHdlaWdodCBDaGFydHMg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YLRgdGPIil9OwogIGNvbnN0IGVuc3VyZUNoYXJ0PWNhcmQ9PnsKICAgIGlmKGNhcmQuZGF0YXNldC5jaGFydFN0YXRlPT09InJlYWR5IilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNoYXJ0cy5nZXQoY2FyZC5kYXRhc2V0LnN5bWJvbCkpOwogICAgaWYoY2FyZC5kYXRhc2V0LmNoYXJ0U3RhdGU9PT0ibG9hZGluZyImJmNhcmQuX2NoYXJ0UHJvbWlzZSlyZXR1cm4gY2FyZC5fY2hhcnRQcm9taXNlOwogICAgY29uc3Qgc3ltYm9sPWNhcmQuZGF0YXNldC5zeW1ib2wsYm94PWNhcmQucXVlcnlTZWxlY3RvcigiLnR2LXdpZGdldC1zbG90IiksZXJyb3JCb3g9Y2FyZC5xdWVyeVNlbGVjdG9yKCIudHYtY2hhcnQtZXJyb3IiKTsKICAgIGNhcmQuZGF0YXNldC5jaGFydFN0YXRlPSJsb2FkaW5nIjtpZihlcnJvckJveCllcnJvckJveC50ZXh0Q29udGVudD0i0JfQsNCz0YDRg9C30LrQsCDQuNC90YLQtdGA0LDQutGC0LjQstC90L7Qs9C+INCz0YDQsNGE0LjQutCwLi4uIjsKICAgIGNhcmQuX2NoYXJ0UHJvbWlzZT0oYXN5bmMoKT0+e3RyeXsKICAgICAgY29uc3QgW2NhbmRsZXMsbGlicmFyeV09YXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRDYW5kbGVzKHN5bWJvbCksd2FpdExpYnJhcnkoKV0pO2F3YWl0IGFmdGVyTGF5b3V0KCk7aWYoIWNhcmQub3Blbil7Y2FyZC5kYXRhc2V0LmNoYXJ0U3RhdGU9ImlkbGUiO3JldHVybiBudWxsfQogICAgICBib3gucmVwbGFjZUNoaWxkcmVuKCk7CiAgICAgIGNvbnN0IGJhY2tncm91bmQ9bGlicmFyeS5Db2xvclR5cGUmJmxpYnJhcnkuQ29sb3JUeXBlLlNvbGlkP3t0eXBlOmxpYnJhcnkuQ29sb3JUeXBlLlNvbGlkLGNvbG9yOiIjMDgxODIzIn06e2NvbG9yOiIjMDgxODIzIn07CiAgICAgIGNvbnN0IGFwaT1saWJyYXJ5LmNyZWF0ZUNoYXJ0KGJveCx7d2lkdGg6d2lkdGhPZihib3gpLGhlaWdodDo0MzAsbGF5b3V0OntiYWNrZ3JvdW5kLHRleHRDb2xvcjoiIzhmYTViNiJ9LGdyaWQ6e3ZlcnRMaW5lczp7Y29sb3I6InJnYmEoMTQzLDE2NSwxODIsLjA4KSJ9LGhvcnpMaW5lczp7Y29sb3I6InJnYmEoMTQzLDE2NSwxODIsLjA4KSJ9fSxyaWdodFByaWNlU2NhbGU6e2JvcmRlckNvbG9yOiJyZ2JhKDE0MywxNjUsMTgyLC4yKSJ9LHRpbWVTY2FsZTp7Ym9yZGVyQ29sb3I6InJnYmEoMTQzLDE2NSwxODIsLjIpIix0aW1lVmlzaWJsZTpmYWxzZSxzZWNvbmRzVmlzaWJsZTpmYWxzZX19KTsKICAgICAgY29uc3Qgc2VyaWVzPW1ha2VTZXJpZXMoYXBpLHt1cENvbG9yOiIjNjNlNmJlIixkb3duQ29sb3I6IiNmZjZiODEiLHdpY2tVcENvbG9yOiIjNjNlNmJlIix3aWNrRG93bkNvbG9yOiIjZmY2YjgxIixib3JkZXJWaXNpYmxlOmZhbHNlLHByaWNlRm9ybWF0Ont0eXBlOiJwcmljZSIscHJlY2lzaW9uOjgsbWluTW92ZTowLjAwMDAwMDAxfX0pOwogICAgICBzZXJpZXMuc2V0RGF0YShjYW5kbGVzKTthcGkudGltZVNjYWxlKCkuZml0Q29udGVudCgpOwogICAgICBjb25zdCByZXNpemU9KCk9Pntjb25zdCB3aWR0aD13aWR0aE9mKGJveCk7aWYod2lkdGg+MClhcGkuYXBwbHlPcHRpb25zKHt3aWR0aH0pfTtjb25zdCBvYnNlcnZlcj10eXBlb2YgUmVzaXplT2JzZXJ2ZXI9PT0iZnVuY3Rpb24iP25ldyBSZXNpemVPYnNlcnZlcihyZXNpemUpOm51bGw7aWYob2JzZXJ2ZXIpb2JzZXJ2ZXIub2JzZXJ2ZShib3gpO2Vsc2Ugd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIscmVzaXplKTsKICAgICAgY29uc3QgaW5zdGFuY2U9e3N5bWJvbCxhcGksc2VyaWVzLG9ic2VydmVyLHJlc2l6ZX07Y2hhcnRzLnNldChzeW1ib2wsaW5zdGFuY2UpO2NhcmQuZGF0YXNldC5jaGFydFN0YXRlPSJyZWFkeSI7aWYoZXJyb3JCb3gpZXJyb3JCb3gudGV4dENvbnRlbnQ9IiI7cmV0dXJuIGluc3RhbmNlOwogICAgfWNhdGNoKGVycm9yKXtjYXJkLmRhdGFzZXQuY2hhcnRTdGF0ZT0iZmFsbGJhY2siO2lmKGVycm9yQm94KWVycm9yQm94LnRleHRDb250ZW50PSLQn9C+0LrQsNC30LDQvSDRgdC10YDQstC10YDQvdGL0Lkg0LPRgNCw0YTQuNC6LiDQmNC90YLQtdGA0LDQutGC0LjQstC90YvQuSDRgNC10LbQuNC8OiAiK1N0cmluZyhlcnJvciYmZXJyb3IubWVzc2FnZXx8ZXJyb3IpO2NvbnNvbGUuZXJyb3IoIkdyYW0xIGNoYXJ0IGVycm9yIixzeW1ib2wsZXJyb3IpO3JldHVybiBudWxsfWZpbmFsbHl7Y2FyZC5fY2hhcnRQcm9taXNlPW51bGx9fSkoKTsKICAgIHJldHVybiBjYXJkLl9jaGFydFByb21pc2U7CiAgfTsKICBjb25zdCBzdGFydD1hc3luYygpPT57CiAgICBjb25zdCByb290PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0dkNoYXJ0cyIpO2lmKCFyb290KXJldHVybjsKICAgIHJvb3QuZGF0YXNldC5jaGFydFVpPVZFUlNJT047CiAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoImRldGFpbHMudHYtYWNjb3JkaW9uLWl0ZW0iKS5mb3JFYWNoKGNhcmQ9PntjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInRvZ2dsZSIsKCk9PntpZighY2FyZC5vcGVuKXJldHVybjtyb290LnF1ZXJ5U2VsZWN0b3JBbGwoImRldGFpbHMudHYtYWNjb3JkaW9uLWl0ZW0iKS5mb3JFYWNoKGl0ZW09PntpZihpdGVtIT09Y2FyZClpdGVtLm9wZW49ZmFsc2V9KTtlbnN1cmVDaGFydChjYXJkKX0pfSk7CiAgICBjb25zdCBmaXJzdD1yb290LnF1ZXJ5U2VsZWN0b3IoImRldGFpbHMudHYtYWNjb3JkaW9uLWl0ZW1bb3Blbl0iKXx8cm9vdC5xdWVyeVNlbGVjdG9yKCJkZXRhaWxzLnR2LWFjY29yZGlvbi1pdGVtIik7aWYoZmlyc3Qpe2ZpcnN0Lm9wZW49dHJ1ZTthd2FpdCBhZnRlckxheW91dCgpO2F3YWl0IGVuc3VyZUNoYXJ0KGZpcnN0KX0KICB9OwogIHdpbmRvdy5fX0dSQU0xX0NIQVJUX1VJX1ZFUlNJT05fXz1WRVJTSU9OOwogIGlmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0ibG9hZGluZyIpZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsc3RhcnQse29uY2U6dHJ1ZX0pO2Vsc2Ugc3RhcnQoKTsKfSkoKTsK\\\"\\n00407: _GRAM1_CHART_SYMBOLS = {\\\"HBAR\\\", \\\"POL\\\", \\\"AVAX\\\", \\\"LINK\\\"}\\n00408: \\n00409: @app.get(\\\"/vendor/gram1-charts-v4.js\\\", include_in_schema=False)\\n00410: def _gram1_chart_javascript_v4():\\n00411: return _Gram1Response(content=_gram1_base64.b64decode(_GRAM1_CHART_JS_B64), media_type=\\\"application/javascript\\\", headers={\\\"Cache-Control\\\":\\\"no-store\\\"})\\n00412: \\n00413: async def _gram1_chart_data_v4(symbol: str, request: _Gram1Request):\\n00414: fn = globals().get(\\\"klines\\\")\",\"token\":\"/vendor/gram1-charts-v4.js\"}]},\"changes_made\":false,\"command_id\":\"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z\",\"container_files\":{\"app.py\":[{\"bytes\":32843,\"path\":\"app.py\",\"sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\"},{\"bytes\":32843,\"path\":\"/app/app.py\",\"sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\"}],\"templates/index.html\":[{\"bytes\":29232,\"path\":\"templates/index.html\",\"sha256\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\"},{\"bytes\":29232,\"path\":\"/app/templates/index.html\",\"sha256\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\"}]},\"control_plane_error\":null,\"diagnosis\":[\"ACCORDION_INIT_IS_INLINE_AND_NOT_DEFERRED\",\"LEGACY_CHART_RENDERER_STILL_TARGETS_SAME_ID_CHART\",\"SERVER_SVG_ACCORDION_IS_INSIDE_LEGACY_CHART_TARGET\",\"LEGACY_NO_DATA_STATE_TEXT_STILL_EXISTS_IN_JAVASCRIPT\",\"TWO_RENDERING_PIPELINES_CAN_STACK_IN_ONE_CONTAINER\",\"RUNNING_WEB_CONTAINER_USES_CURRENT_HOST_TEMPLATE\"],\"duration_seconds\":0.171,\"exact_state\":{\"app.py\":{\"bytes\":32843,\"sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\"},\"compose\":{\"path\":\"/opt/stacks/crypto-portfolio/compose.yaml\",\"sha256\":\"6d344e46b3de94ad86131a914df2ff3ff25e9d82f7ce0557cbffa468b8cdc1b8\"},\"templates/index.html\":{\"bytes\":29232,\"sha256\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\"},\"worker.py\":{\"bytes\":10300,\"sha256\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"}},\"gitea_changed\":false,\"host_container_index_match\":true,\"mutation_outcome\":\"NO_MUTATION\",\"production_site_changed\":false,\"rc\":0,\"repair_plan_constraints\":[\"Do not put the new accordion inside the legacy #chart target.\",\"Choose one rendering pipeline for the visible coin-chart area.\",\"Remove or rewire the stale chart status badge instead of leaving «Нет данных».\",\"Initialize the accordion after DOM creation via external defer script or DOMContentLoaded.\",\"Enforce exactly one open section and verify it in a real DOM engine.\"],\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"status\":\"OK\",\"template_analysis\":{\"chart_elements\":[{\"body_bytes\":1946,\"body_end\":\"
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
\",\"body_sha256\":\"bbc7836d04ccc13777a3aba6fd0502d6f94dd4fd2c8bdbb93e3150c7c7209411\",\"body_start\":\"
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
\",\"contains_no_data\":false,\"details_count\":4,\"line\":6,\"open_details_count\":1,\"open_tag\":\"\",\"server_svg_count\":4}],\"diagnosis\":[\"ACCORDION_INIT_IS_INLINE_AND_NOT_DEFERRED\",\"LEGACY_CHART_RENDERER_STILL_TARGETS_SAME_ID_CHART\",\"SERVER_SVG_ACCORDION_IS_INSIDE_LEGACY_CHART_TARGET\",\"LEGACY_NO_DATA_STATE_TEXT_STILL_EXISTS_IN_JAVASCRIPT\",\"TWO_RENDERING_PIPELINES_CAN_STACK_IN_ONE_CONTAINER\"],\"legacy_chart_scripts\":[{\"body_sha256\":\"e6afa17d7b94d9da5036d55bf6b8c623ec036ca05e9dea9c789432631c1b6ca7\",\"chart_refs\":[\"chart.innerHTML\",\"Нет данных\"],\"id\":null,\"index\":0,\"line\":9,\"snippet\":\"00005:
Стоимость портфеля
Вложено
Прибыль / убыток0%
Обновление рынкакаждые 5 минут
\\n00006:

График цены

7 дней
Загрузка
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период

Резкие движения

\\n00007:

Позиции портфеля

Количество и средняя цена покупки
АктивЦенаКапитализацияКоличествоСредняя покупка (USD)ВложеноСейчасP/L
\\n00008:

Новое оповещение

Мои оповещения

\\n00009: \\n00222: \\n---\\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"src\":null}],\"no_data_occurrences\":[{\"inside_chart\":false,\"inside_script\":true,\"line\":9,\"snippet\":\"00005:
Стоимость портфеля
Вложено
Прибыль / убыток0%
Обновление рынкакаждые 5 минут
\\n00006:

График цены

7 дней
Загрузка
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период

Резкие движения

\\n00007:

Позиции портфеля

Количество и средняя цена покупки
АктивЦенаКапитализацияКоличествоСредняя покупка (USD)ВложеноСейчасP/L
\\n00008:

Новое оповещение

Мои оповещения

\\n00009: \\n00004:
https://gram1.ru/

Мой криптопортфель

\\n00005:
Стоимость портфеля
Вложено
Прибыль / убыток0%
Обновление рынкакаждые 5 минут
\\n00006:

График цены

7 дней
Загрузка
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период

Резкие движения

\\n00007:

Позиции портфеля

Количество и средняя цена покупки
АктивЦенаКапитализацияКоличествоСредняя покупка (USD)ВложеноСейчасP/L
\\n00008:

Новое оповещение

Мои оповещения

\\n00009: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"tvCharts\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":219,\"snippet\":\"00214: document.querySelectorAll(\\\".currency-btn\\\").forEach(button=>button.addEventListener(\\\"click\\\",()=>setTimeout(redrawForCurrency,0)));\\n00215: })();\\n00216: \\n00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"GRAM1_CHARTS_DIRECT_VISIBLE_SCRIPT_V5\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":219,\"snippet\":\"00214: document.querySelectorAll(\\\".currency-btn\\\").forEach(button=>button.addEventListener(\\\"click\\\",()=>setTimeout(redrawForCurrency,0)));\\n00215: })();\\n00216: \\n00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"GRAM1_DIRECT_SERVER_V5\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":219,\"snippet\":\"00214: document.querySelectorAll(\\\".currency-btn\\\").forEach(button=>button.addEventListener(\\\"click\\\",()=>setTimeout(redrawForCurrency,0)));\\n00215: })();\\n00216: \\n00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"getElementById(\\\"chart\\\")\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":222,\"snippet\":\"00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"appendChild(\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":222,\"snippet\":\"00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"getElementById(\\\"chart\\\")\"}],\"scripts\":[{\"async\":false,\"body_sha256\":\"e6afa17d7b94d9da5036d55bf6b8c623ec036ca05e9dea9c789432631c1b6ca7\",\"chart_refs\":[\"chart.innerHTML\",\"Нет данных\"],\"defer\":false,\"id\":null,\"index\":0,\"line\":9,\"src\":null,\"type\":null},{\"async\":false,\"body_sha256\":\"f30846a0a26517bd6e8303d552aeba19887576c54b4a70678e234a5e1f6e7582\",\"chart_refs\":[],\"defer\":false,\"id\":\"ALERT_CREATE_OVERRIDE_V3\",\"index\":1,\"line\":9,\"src\":null,\"type\":null},{\"async\":false,\"body_sha256\":\"b6fedba59295891e784ab98cef7690efe81553715d35a9cf6a31c30d08efb5a9\",\"chart_refs\":[\"replaceChildren(\"],\"defer\":false,\"id\":\"ALERT_LIST_RENDERER_V5\",\"index\":2,\"line\":109,\"src\":null,\"type\":null},{\"async\":false,\"body_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"chart_refs\":[],\"defer\":false,\"id\":null,\"index\":3,\"line\":218,\"src\":\"/vendor/lightweight-charts.js\",\"type\":null},{\"async\":false,\"body_sha256\":\"6f74b154d9dce15511aff93e6f92a28c111d4160f3ed55f11ed33eb5016c8384\",\"chart_refs\":[\"getElementById(\\\"chart\\\")\",\"GRAM1_DIRECT_SERVER_V5\"],\"defer\":false,\"id\":\"GRAM1_CHARTS_DIRECT_VISIBLE_SCRIPT_V5\",\"index\":4,\"line\":219,\"src\":null,\"type\":null},{\"async\":false,\"body_sha256\":\"90a765a83fb8a5a0542dee1abf8c32af0f248aa411aa203848f73758bc3f9b40\",\"chart_refs\":[\"getElementById(\\\"chart\\\")\",\"appendChild(\"],\"defer\":false,\"id\":\"MOVE_CHARTS_TO_BOTTOM_ALLTIME_V1\",\"index\":5,\"line\":222,\"src\":null,\"type\":null}],\"styles\":[{\"body_sha256\":\"3771004bd01fc75eefe9d744e1e53a584c70d396fdb6543c98df7e7626dd007e\",\"id\":\"GRAM1_CHARTS_DIRECT_VISIBLE_STYLE_V5\",\"index\":2,\"line\":217,\"snippet\":\"#chart{display:block!important;margin-top:12px;border:1px solid var(--l);border-radius:16px;overflow:hidden;background:#081823;min-height:56px}#tvCharts{display:none!important}.tv-accordion-item{display:block;border-bottom:1px solid var(--l);background:#081823}.tv-accordion-item:last-child{border-bottom:0}.tv-accordion-head{list-style:none;cursor:pointer;padding:14px 16px;font-weight:800;display:flex;align-items:center;justify-content:space-between;gap:12px;user-select:none}.tv-accordion-head::-webkit-details-marker{display:none}.tv-accordion-chevron{font-size:18px;transition:transform .2s ease}.tv-accordion-item[open] .tv-accordion-chevron{transform:rotate(180deg)}.tv-accordion-body{display:block;border-top:1px solid var(--l)}.tv-server-chart{display:block;width:100%;height:auto;min-height:320px;max-height:430px;object-fit:fill;border:0;background:#081823}.tv-chart-note{min-height:20px;padding:0 14px 12px}@media(max-width:750px){.tv-accordion-head{padding:12px 14px}.tv-server-chart{min-height:260px}}\"}],\"template_bytes\":29232,\"template_sha256\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\"}},\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"selected_method\":\"ALIAS_PINNED_AS_DEBIAN\",\"ssh_method_probes\":[{\"duration_seconds\":0.123,\"identity_count\":null,\"identity_sudo_read_ok\":true,\"name\":\"ALIAS_PINNED_AS_DEBIAN\",\"rc\":0,\"stderr\":\"\"},{\"duration_seconds\":0.121,\"identity_count\":2,\"identity_sudo_read_ok\":true,\"name\":\"DIRECT_PINNED_AS_DEBIAN_NO_PROXY\",\"rc\":0,\"stderr\":\"\"}],\"status\":\"OK\"}\n" + "output": "HOMELAB_RESULT_CONTRACT={\"changes_made\":true,\"command_id\":\"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z\",\"mutation_outcome\":\"MUTATED\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"changes_made\":true,\"command_id\":\"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z\",\"control_plane_error\":null,\"gitea_changed\":false,\"mutation_outcome\":\"MUTATED\",\"pinned_host_key_aliases\":[\"[PRIVATE_IP]\"],\"production_site_changed\":true,\"rc\":0,\"remote_result\":{\"backup_dir\":\"/var/lib/homelab-change-rollback/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z\",\"baseline_capsule_sha256\":\"905d0b554ff025817a7480375ac6c8685396a99b456f01f54220ef4398af7139\",\"baseline_command_id\":\"GRAM1-SITE-CHARTS-V37-SCOPED-RUNTIME-VERIFY-20260801T122700Z\",\"changed_paths\":[\"templates/index.html\"],\"changes_made\":true,\"command_id\":\"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z\",\"control_plane_error\":null,\"deployment\":{\"container_hashes\":[{\"path\":\"app.py\",\"service\":\"web\",\"sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\"},{\"path\":\"templates/index.html\",\"service\":\"web\",\"sha256\":\"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65\"},{\"path\":\"worker.py\",\"service\":\"worker\",\"sha256\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"}],\"running\":[\"web\",\"worker\"],\"runtime\":{\"local_headers\":{\"server\":\"uvicorn\"},\"local_root_sha256\":\"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65\",\"public\":{\"headers\":{},\"root_sha256\":\"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65\",\"status\":200},\"svg\":{\"AVAX\":{\"bytes\":12739,\"candles\":72,\"sha256\":\"2dd8850447185c0b4be5c146242e8195ae840af1666fe877a4c5b110f60a22c9\"},\"HBAR\":{\"bytes\":14697,\"candles\":84,\"sha256\":\"cb5c6cdf8268990e735cb91e3070ee34f282e9826bacacc9be1fe04268c62951\"},\"LINK\":{\"bytes\":16003,\"candles\":92,\"sha256\":\"cb40e40aac61db48c82361a18fe7e89e93c96624718d205c3575db9f4d22d38c\"},\"POL\":{\"bytes\":4949,\"candles\":24,\"sha256\":\"e54be1f05c3abb3c23bd4fdd79e3a1e16352eb78f32cbd580d5a3f4aefd8c07f\"}}}},\"diagnostic_capsule_sha256\":\"7e704e0217aabc9d825ee36d299b74f51d05f482ee543d706a024b53a3177147\",\"diagnostic_command_id\":\"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z\",\"duration_seconds\":8.869,\"gitea_changed\":false,\"mutation_outcome\":\"MUTATED\",\"old_hashes\":{\"app.py\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\",\"templates/index.html\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\",\"worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"},\"production_site_changed\":true,\"rc\":0,\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"semantic_checks\":{\"details\":true,\"dom_ready\":true,\"hidden_legacy_status\":true,\"images\":true,\"legacy_sink\":true,\"new_script\":true,\"new_style\":true,\"old_marker_removed\":true,\"one_initial_open\":true,\"single_open_logic\":true,\"valid_html_boundary\":true,\"visible_heading\":true,\"visible_root\":true},\"status\":\"OK\",\"target_hashes\":{\"app.py\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\",\"templates/index.html\":\"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65\",\"worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"}},\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"selected_method\":\"ALIAS_PINNED_AS_DEBIAN\",\"ssh_method_probes\":[{\"duration_seconds\":0.125,\"identity_count\":null,\"identity_sudo_read_ok\":true,\"name\":\"ALIAS_PINNED_AS_DEBIAN\",\"rc\":0,\"stderr\":\"\"},{\"duration_seconds\":0.125,\"identity_count\":2,\"identity_sudo_read_ok\":true,\"name\":\"DIRECT_PINNED_AS_DEBIAN_NO_PROXY\",\"rc\":0,\"stderr\":\"\"}],\"status\":\"OK\"}\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index 7d279a8..a9f5b9f 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,34 +1,34 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z +COMMAND_ID=GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z STATUS=OK RC=0 HOST=pve01 -MODE=verify -COMPONENT=gram1-charts-v38r1-conflict +MODE=change +COMPONENT=gram1-charts-v39-isolate REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83 -COMMAND_SHA256=7a893a91638a4f1e9b7bc56a5953f15a92f5e83f98db532793a6a4c70ab87132 +COMMAND_SHA256=4f55a1050c754cf7fe1061aa15bc026e90841e5fb92e9059422766b1ee9a3022 DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true -CHANGE_DECLARED=false +CHANGE_DECLARED=true RESULT_CONTRACT_VALID=true -RESULT_CONTRACT_STATUS=NOT_APPLICABLE +RESULT_CONTRACT_STATUS=OK RESULT_CONTRACT_ERROR=NONE COMMAND_RC=0 -CHANGES_MADE=false +CHANGES_MADE=true ROLLBACK_STARTED=false ROLLBACK_RESTORED=null -MUTATION_OUTCOME=NO_MUTATION +MUTATION_OUTCOME=MUTATED SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=7909460d0d093dc7b3fd4fc26760c31b746c2726817e367c4f54af19d08b1973 -SANITIZED_OUTPUT_SHA256=1d40dade1f3b2a33564b123ae1f5845ed486fd142c4ffe88f92143c9d8e2a4e9 +RAW_EVIDENCE_SHA256=f11c272aefef172d26485070fdc4f24a2f6e51a2610df5d8547083820cbc9067 +SANITIZED_OUTPUT_SHA256=c7fd85598e290aa09a0d6b6553d8fde0df9a34ff9088875d117e81ffa68f572a OUTPUT_BEGIN -HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z","mutation_outcome":"NO_MUTATION","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} -{"changes_made":false,"command_id":"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z","control_plane_error":null,"gitea_changed":false,"mutation_outcome":"NO_MUTATION","pinned_host_key_aliases":["[PRIVATE_IP]"],"production_site_changed":false,"rc":0,"remote_result":{"app_analysis":{"app_bytes":32843,"app_sha256":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d","chart_matches":[{"line":466,"snippet":"00461: x=left+step*(i+.5);color=\"#63e6be\" if c>=o else \"#ff6b81\";yo=y(o);yc=y(c);yh=y(h);yl=y(l);rh=max(1.2,abs(yc-yo));ry=min(yo,yc)\n00462: parts.append(f'');parts.append(f'')\n00463: parts.append(f'{_gram1_html.escape(symbol)} / USDT · 1M · {len(rows)} свечей')\n00464: return ''.join(parts)\n00465: \n00466: @app.get(\"/api/chart-svg/{symbol}\", include_in_schema=False)\n00467: async def _gram1_chart_svg_endpoint_v4(symbol: str, request: _Gram1Request):\n00468: if not request.session.get(\"auth\"):\n00469: return _Gram1Response(content=\"Требуется вход\", status_code=401, media_type=\"text/plain; charset=utf-8\")\n00470: symbol=symbol.upper()\n00471: if symbol not in _GRAM1_CHART_SYMBOLS:","token":"/api/chart-svg"},{"line":397,"snippet":"00392: require_login(request)\n00393: with db() as c:\n00394: c.execute(\"DELETE FROM alerts WHERE id=?\",(alert_id,)); c.commit()\n00395: return {\"ok\":True}\n00396: \n00397: # GRAM1_SERVER_CHART_FALLBACK_V4\n00398: import asyncio as _gram1_asyncio\n00399: import base64 as _gram1_base64\n00400: import html as _gram1_html\n00401: import inspect as _gram1_inspect\n00402: import json as _gram1_json","token":"GRAM1_SERVER_CHART_FALLBACK_V4"},{"line":452,"snippet":"00447: except Exception:\n00448: continue\n00449: if not rows: raise RuntimeError(\"no valid OHLC rows\")\n00450: return rows[-180:]\n00451: \n00452: def _gram1_chart_svg_v4(symbol: str, rows):\n00453: width,height,left,right,top,bottom=1200,430,72,28,24,42\n00454: lo=min(r[3] for r in rows);hi=max(r[2] for r in rows);span=max(hi-lo,abs(hi)*1e-9,1e-12)\n00455: plot_w=width-left-right;plot_h=height-top-bottom;step=plot_w/max(len(rows),1);body=max(2.0,min(10.0,step*0.58))\n00456: def y(v): return top+(hi-v)/span*plot_h\n00457: parts=[f'', '']","token":"_gram1_chart_svg_v4"},{"line":475,"snippet":"00470: symbol=symbol.upper()\n00471: if symbol not in _GRAM1_CHART_SYMBOLS:\n00472: return _Gram1Response(content=\"Неизвестная монета\", status_code=404, media_type=\"text/plain; charset=utf-8\")\n00473: try:\n00474: rows=await _gram1_chart_data_v4(symbol,request)\n00475: svg=_gram1_chart_svg_v4(symbol,rows)\n00476: return _Gram1Response(content=svg,media_type=\"image/svg+xml\",headers={\"Cache-Control\":\"no-store\"})\n00477: except Exception as exc:\n00478: msg=_gram1_html.escape(str(exc))\n00479: svg=f'Ошибка серверного графика {symbol}: {msg}'\n00480: return _Gram1Response(content=svg,status_code=503,media_type=\"image/svg+xml\",headers={\"Cache-Control\":\"no-store\"})","token":"_gram1_chart_svg_v4"},{"line":409,"snippet":"00404: from fastapi.responses import Response as _Gram1Response\n00405: \n00406: _GRAM1_CHART_JS_B64 = \"KCgpPT57CiAgInVzZSBzdHJpY3QiOwogIGNvbnN0IFZFUlNJT049IkdSQU0xX0NIQVJUU19FWFRFUk5BTF9WNCI7CiAgY29uc3Qgc3ltYm9scz1bIkhCQVIiLCJQT0wiLCJBVkFYIiwiTElOSyJdOwogIGNvbnN0IGNoYXJ0cz1uZXcgTWFwKCk7CiAgY29uc3QgY2FuZGxlQ2FjaGU9bmV3IE1hcCgpOwogIGNvbnN0IHNsZWVwPW1zPT5uZXcgUHJvbWlzZShyZXNvbHZlPT5zZXRUaW1lb3V0KHJlc29sdmUsbXMpKTsKICBjb25zdCBhZnRlckxheW91dD0oKT0+bmV3IFByb21pc2UocmVzb2x2ZT0+cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpKTsKICBjb25zdCB0aW1lS2V5PXZhbHVlPT57CiAgICBpZih0eXBlb2YgdmFsdWU9PT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7CiAgICBpZih0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIil7CiAgICAgIGNvbnN0IG51bWVyaWM9TnVtYmVyKHZhbHVlKTtpZihOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpcmV0dXJuIG51bWVyaWM7CiAgICAgIGNvbnN0IHBhcnNlZD1EYXRlLnBhcnNlKHZhbHVlKTtpZihOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSlyZXR1cm4gTWF0aC5mbG9vcihwYXJzZWQvMTAwMCk7CiAgICB9CiAgICBpZih2YWx1ZSYmdHlwZW9mIHZhbHVlPT09Im9iamVjdCImJk51bWJlci5pc0Zpbml0ZShOdW1iZXIodmFsdWUueWVhcikpJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHZhbHVlLm1vbnRoKSkmJk51bWJlci5pc0Zpbml0ZShOdW1iZXIodmFsdWUuZGF5KSkpcmV0dXJuIERhdGUuVVRDKE51bWJlcih2YWx1ZS55ZWFyKSxOdW1iZXIodmFsdWUubW9udGgpLTEsTnVtYmVyKHZhbHVlLmRheSkpLzEwMDA7CiAgICByZXR1cm4gTmFOOwogIH07CiAgY29uc3Qgbm9ybWFsaXplVGltZT12YWx1ZT0+ewogICAgaWYodHlwZW9mIHZhbHVlPT09InN0cmluZyImJi9eXGQrJC8udGVzdCh2YWx1ZSkpdmFsdWU9TnVtYmVyKHZhbHVlKTsKICAgIGlmKHR5cGVvZiB2YWx1ZT09PSJudW1iZXIiJiZOdW1iZXIuaXNGaW5pdGUodmFsdWUpKXJldHVybiBNYXRoLmZsb29yKHZhbHVlPjFlMTE/dmFsdWUvMTAwMDp2YWx1ZSk7CiAgICBpZih0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIiYmL15cZHs0fS1cZHsyfS1cZHsyfS8udGVzdCh2YWx1ZSkpcmV0dXJuIHZhbHVlLnNsaWNlKDAsMTApOwogICAgaWYodmFsdWUmJnR5cGVvZiB2YWx1ZT09PSJvYmplY3QiJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHZhbHVlLnllYXIpKSYmTnVtYmVyLmlzRmluaXRlKE51bWJlcih2YWx1ZS5tb250aCkpJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHZhbHVlLmRheSkpKXJldHVybiB7eWVhcjpOdW1iZXIodmFsdWUueWVhciksbW9udGg6TnVtYmVyKHZhbHVlLm1vbnRoKSxkYXk6TnVtYmVyKHZhbHVlLmRheSl9OwogICAgcmV0dXJuIG51bGw7CiAgfTsKICBjb25zdCBub3JtYWxpemVDYW5kbGVzPXJhdz0+ewogICAgY29uc3Qgcm93cz1bXTsKICAgIGZvcihjb25zdCBpdGVtIG9mIEFycmF5LmlzQXJyYXkocmF3KT9yYXc6W10pewogICAgICBjb25zdCBpc0FycmF5PUFycmF5LmlzQXJyYXkoaXRlbSk7CiAgICAgIGNvbnN0IHRpbWU9bm9ybWFsaXplVGltZShpc0FycmF5P2l0ZW1bMF06KGl0ZW0mJihpdGVtLnRpbWU/P2l0ZW0ub3Blbl90aW1lPz9pdGVtLm9wZW5UaW1lKSkpOwogICAgICBjb25zdCBvcGVuPU51bWJlcihpc0FycmF5P2l0ZW1bMV06aXRlbSYmaXRlbS5vcGVuKSxoaWdoPU51bWJlcihpc0FycmF5P2l0ZW1bMl06aXRlbSYmaXRlbS5oaWdoKSxsb3c9TnVtYmVyKGlzQXJyYXk/aXRlbVszXTppdGVtJiZpdGVtLmxvdyksY2xvc2U9TnVtYmVyKGlzQXJyYXk/aXRlbVs0XTppdGVtJiZpdGVtLmNsb3NlKTsKICAgICAgaWYodGltZT09PW51bGx8fCFbb3BlbixoaWdoLGxvdyxjbG9zZV0uZXZlcnkoTnVtYmVyLmlzRmluaXRlKSljb250aW51ZTsKICAgICAgcm93cy5wdXNoKHt0aW1lLG9wZW4saGlnaCxsb3csY2xvc2V9KTsKICAgIH0KICAgIHJvd3Muc29ydCgoYSxiKT0+dGltZUtleShhLnRpbWUpLXRpbWVLZXkoYi50aW1lKSk7CiAgICBjb25zdCBkZWR1cD1bXTsKICAgIGZvcihjb25zdCByb3cgb2Ygcm93cyl7Y29uc3Qga2V5PVN0cmluZyh0aW1lS2V5KHJvdy50aW1lKSk7aWYoZGVkdXAubGVuZ3RoJiZTdHJpbmcodGltZUtleShkZWR1cFtkZWR1cC5sZW5ndGgtMV0udGltZSkpPT09a2V5KWRlZHVwW2RlZHVwLmxlbmd0aC0xXT1yb3c7ZWxzZSBkZWR1cC5wdXNoKHJvdyl9CiAgICBpZighZGVkdXAubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQVBJINCy0LXRgNC90YPQuyDQtNCw0L3QvdGL0LUg0LHQtdC3INC60L7RgNGA0LXQutGC0L3Ri9GFIE9ITEMt0YHQstC10YfQtdC5Iik7CiAgICByZXR1cm4gZGVkdXA7CiAgfTsKICBjb25zdCBsb2FkQ2FuZGxlcz1hc3luYyBzeW1ib2w9PnsKICAgIGlmKGNhbmRsZUNhY2hlLmhhcyhzeW1ib2wpKXJldHVybiBjYW5kbGVDYWNoZS5nZXQoc3ltYm9sKTsKICAgIGNvbnN0IHRhc2s9KGFzeW5jKCk9PnsKICAgICAgY29uc3QgcmVzcG9uc2U9YXdhaXQgZmV0Y2goIi9hcGkva2xpbmVzLyIrZW5jb2RlVVJJQ29tcG9uZW50KHN5bWJvbCkrIj9saW1pdD0xMDAwJmludGVydmFsPTFNIix7Y2FjaGU6Im5vLXN0b3JlIixjcmVkZW50aWFsczoic2FtZS1vcmlnaW4iLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiJ9fSk7CiAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PTQwMXx8cmVzcG9uc2Uuc3RhdHVzPT09NDAzKXtsb2NhdGlvbj0iL2xvZ2luIjt0aHJvdyBuZXcgRXJyb3IoItCi0YDQtdCx0YPQtdGC0YHRjyDQv9C+0LLRgtC+0YDQvdGL0Lkg0LLRhdC+0LQiKX0KICAgICAgaWYoIXJlc3BvbnNlLm9rKXRocm93IG5ldyBFcnJvcigiSFRUUCAiK3Jlc3BvbnNlLnN0YXR1cyk7CiAgICAgIGNvbnN0IGRhdGE9YXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICBpZihkYXRhJiZkYXRhLnN0YXR1cyYmZGF0YS5zdGF0dXMhPT0iT0siKXRocm93IG5ldyBFcnJvcihTdHJpbmcoZGF0YS5lcnJvcnx8ZGF0YS5tZXNzYWdlfHxkYXRhLnN0YXR1cykpOwogICAgICBjb25zdCByYXc9QXJyYXkuaXNBcnJheShkYXRhJiZkYXRhLmNhbmRsZXMpP2RhdGEuY2FuZGxlczooZGF0YSYmZGF0YS5yZXN1bHQmJkFycmF5LmlzQXJyYXkoZGF0YS5yZXN1bHQuY2FuZGxlcyk/ZGF0YS5yZXN1bHQuY2FuZGxlczpbXSk7CiAgICAgIHJldHVybiBub3JtYWxpemVDYW5kbGVzKHJhdyk7CiAgICB9KSgpOwogICAgY2FuZGxlQ2FjaGUuc2V0KHN5bWJvbCx0YXNrKTt0cnl7cmV0dXJuIGF3YWl0IHRhc2t9Y2F0Y2goZXJyb3Ipe2NhbmRsZUNhY2hlLmRlbGV0ZShzeW1ib2wpO3Rocm93IGVycm9yfQogIH07CiAgY29uc3Qgd2lkdGhPZj1ib3g9Pk1hdGgubWF4KDMyMCxNYXRoLmZsb29yKGJveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aHx8Ym94LmNsaWVudFdpZHRofHw5MDApKTsKICBjb25zdCB3YWl0TGlicmFyeT1hc3luYygpPT57Zm9yKGxldCBuPTA7bjwxMDA7bisrKXtpZih3aW5kb3cuTGlnaHR3ZWlnaHRDaGFydHMmJnR5cGVvZiB3aW5kb3cuTGlnaHR3ZWlnaHRDaGFydHMuY3JlYXRlQ2hhcnQ9PT0iZnVuY3Rpb24iKXJldHVybiB3aW5kb3cuTGlnaHR3ZWlnaHRDaGFydHM7YXdhaXQgc2xlZXAoMTAwKX10aHJvdyBuZXcgRXJyb3IoItCb0L7QutCw0LvRjNC90LDRjyDQsdC40LHQu9C40L7RgtC10LrQsCDQs9GA0LDRhNC40LrQvtCyINC90LUg0LfQsNCz0YDRg9C30LjQu9Cw0YHRjCIpfTsKICBjb25zdCBtYWtlU2VyaWVzPShhcGksb3B0aW9ucyk9PntpZihhcGkmJnR5cGVvZiBhcGkuYWRkQ2FuZGxlc3RpY2tTZXJpZXM9PT0iZnVuY3Rpb24iKXJldHVybiBhcGkuYWRkQ2FuZGxlc3RpY2tTZXJpZXMob3B0aW9ucyk7aWYoYXBpJiZ0eXBlb2YgYXBpLmFkZFNlcmllcz09PSJmdW5jdGlvbiImJndpbmRvdy5MaWdodHdlaWdodENoYXJ0cyYmd2luZG93LkxpZ2h0d2VpZ2h0Q2hhcnRzLkNhbmRsZXN0aWNrU2VyaWVzKXJldHVybiBhcGkuYWRkU2VyaWVzKHdpbmRvdy5MaWdodHdlaWdodENoYXJ0cy5DYW5kbGVzdGlja1NlcmllcyxvcHRpb25zKTt0aHJvdyBuZXcgRXJyb3IoItCS0LXRgNGB0LjRjyBMaWdodHdlaWdodCBDaGFydHMg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YLRgdGPIil9OwogIGNvbnN0IGVuc3VyZUNoYXJ0PWNhcmQ9PnsKICAgIGlmKGNhcmQuZGF0YXNldC5jaGFydFN0YXRlPT09InJlYWR5IilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNoYXJ0cy5nZXQoY2FyZC5kYXRhc2V0LnN5bWJvbCkpOwogICAgaWYoY2FyZC5kYXRhc2V0LmNoYXJ0U3RhdGU9PT0ibG9hZGluZyImJmNhcmQuX2NoYXJ0UHJvbWlzZSlyZXR1cm4gY2FyZC5fY2hhcnRQcm9taXNlOwogICAgY29uc3Qgc3ltYm9sPWNhcmQuZGF0YXNldC5zeW1ib2wsYm94PWNhcmQucXVlcnlTZWxlY3RvcigiLnR2LXdpZGdldC1zbG90IiksZXJyb3JCb3g9Y2FyZC5xdWVyeVNlbGVjdG9yKCIudHYtY2hhcnQtZXJyb3IiKTsKICAgIGNhcmQuZGF0YXNldC5jaGFydFN0YXRlPSJsb2FkaW5nIjtpZihlcnJvckJveCllcnJvckJveC50ZXh0Q29udGVudD0i0JfQsNCz0YDRg9C30LrQsCDQuNC90YLQtdGA0LDQutGC0LjQstC90L7Qs9C+INCz0YDQsNGE0LjQutCwLi4uIjsKICAgIGNhcmQuX2NoYXJ0UHJvbWlzZT0oYXN5bmMoKT0+e3RyeXsKICAgICAgY29uc3QgW2NhbmRsZXMsbGlicmFyeV09YXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRDYW5kbGVzKHN5bWJvbCksd2FpdExpYnJhcnkoKV0pO2F3YWl0IGFmdGVyTGF5b3V0KCk7aWYoIWNhcmQub3Blbil7Y2FyZC5kYXRhc2V0LmNoYXJ0U3RhdGU9ImlkbGUiO3JldHVybiBudWxsfQogICAgICBib3gucmVwbGFjZUNoaWxkcmVuKCk7CiAgICAgIGNvbnN0IGJhY2tncm91bmQ9bGlicmFyeS5Db2xvclR5cGUmJmxpYnJhcnkuQ29sb3JUeXBlLlNvbGlkP3t0eXBlOmxpYnJhcnkuQ29sb3JUeXBlLlNvbGlkLGNvbG9yOiIjMDgxODIzIn06e2NvbG9yOiIjMDgxODIzIn07CiAgICAgIGNvbnN0IGFwaT1saWJyYXJ5LmNyZWF0ZUNoYXJ0KGJveCx7d2lkdGg6d2lkdGhPZihib3gpLGhlaWdodDo0MzAsbGF5b3V0OntiYWNrZ3JvdW5kLHRleHRDb2xvcjoiIzhmYTViNiJ9LGdyaWQ6e3ZlcnRMaW5lczp7Y29sb3I6InJnYmEoMTQzLDE2NSwxODIsLjA4KSJ9LGhvcnpMaW5lczp7Y29sb3I6InJnYmEoMTQzLDE2NSwxODIsLjA4KSJ9fSxyaWdodFByaWNlU2NhbGU6e2JvcmRlckNvbG9yOiJyZ2JhKDE0MywxNjUsMTgyLC4yKSJ9LHRpbWVTY2FsZTp7Ym9yZGVyQ29sb3I6InJnYmEoMTQzLDE2NSwxODIsLjIpIix0aW1lVmlzaWJsZTpmYWxzZSxzZWNvbmRzVmlzaWJsZTpmYWxzZX19KTsKICAgICAgY29uc3Qgc2VyaWVzPW1ha2VTZXJpZXMoYXBpLHt1cENvbG9yOiIjNjNlNmJlIixkb3duQ29sb3I6IiNmZjZiODEiLHdpY2tVcENvbG9yOiIjNjNlNmJlIix3aWNrRG93bkNvbG9yOiIjZmY2YjgxIixib3JkZXJWaXNpYmxlOmZhbHNlLHByaWNlRm9ybWF0Ont0eXBlOiJwcmljZSIscHJlY2lzaW9uOjgsbWluTW92ZTowLjAwMDAwMDAxfX0pOwogICAgICBzZXJpZXMuc2V0RGF0YShjYW5kbGVzKTthcGkudGltZVNjYWxlKCkuZml0Q29udGVudCgpOwogICAgICBjb25zdCByZXNpemU9KCk9Pntjb25zdCB3aWR0aD13aWR0aE9mKGJveCk7aWYod2lkdGg+MClhcGkuYXBwbHlPcHRpb25zKHt3aWR0aH0pfTtjb25zdCBvYnNlcnZlcj10eXBlb2YgUmVzaXplT2JzZXJ2ZXI9PT0iZnVuY3Rpb24iP25ldyBSZXNpemVPYnNlcnZlcihyZXNpemUpOm51bGw7aWYob2JzZXJ2ZXIpb2JzZXJ2ZXIub2JzZXJ2ZShib3gpO2Vsc2Ugd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIscmVzaXplKTsKICAgICAgY29uc3QgaW5zdGFuY2U9e3N5bWJvbCxhcGksc2VyaWVzLG9ic2VydmVyLHJlc2l6ZX07Y2hhcnRzLnNldChzeW1ib2wsaW5zdGFuY2UpO2NhcmQuZGF0YXNldC5jaGFydFN0YXRlPSJyZWFkeSI7aWYoZXJyb3JCb3gpZXJyb3JCb3gudGV4dENvbnRlbnQ9IiI7cmV0dXJuIGluc3RhbmNlOwogICAgfWNhdGNoKGVycm9yKXtjYXJkLmRhdGFzZXQuY2hhcnRTdGF0ZT0iZmFsbGJhY2siO2lmKGVycm9yQm94KWVycm9yQm94LnRleHRDb250ZW50PSLQn9C+0LrQsNC30LDQvSDRgdC10YDQstC10YDQvdGL0Lkg0LPRgNCw0YTQuNC6LiDQmNC90YLQtdGA0LDQutGC0LjQstC90YvQuSDRgNC10LbQuNC8OiAiK1N0cmluZyhlcnJvciYmZXJyb3IubWVzc2FnZXx8ZXJyb3IpO2NvbnNvbGUuZXJyb3IoIkdyYW0xIGNoYXJ0IGVycm9yIixzeW1ib2wsZXJyb3IpO3JldHVybiBudWxsfWZpbmFsbHl7Y2FyZC5fY2hhcnRQcm9taXNlPW51bGx9fSkoKTsKICAgIHJldHVybiBjYXJkLl9jaGFydFByb21pc2U7CiAgfTsKICBjb25zdCBzdGFydD1hc3luYygpPT57CiAgICBjb25zdCByb290PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0dkNoYXJ0cyIpO2lmKCFyb290KXJldHVybjsKICAgIHJvb3QuZGF0YXNldC5jaGFydFVpPVZFUlNJT047CiAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoImRldGFpbHMudHYtYWNjb3JkaW9uLWl0ZW0iKS5mb3JFYWNoKGNhcmQ9PntjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInRvZ2dsZSIsKCk9PntpZighY2FyZC5vcGVuKXJldHVybjtyb290LnF1ZXJ5U2VsZWN0b3JBbGwoImRldGFpbHMudHYtYWNjb3JkaW9uLWl0ZW0iKS5mb3JFYWNoKGl0ZW09PntpZihpdGVtIT09Y2FyZClpdGVtLm9wZW49ZmFsc2V9KTtlbnN1cmVDaGFydChjYXJkKX0pfSk7CiAgICBjb25zdCBmaXJzdD1yb290LnF1ZXJ5U2VsZWN0b3IoImRldGFpbHMudHYtYWNjb3JkaW9uLWl0ZW1bb3Blbl0iKXx8cm9vdC5xdWVyeVNlbGVjdG9yKCJkZXRhaWxzLnR2LWFjY29yZGlvbi1pdGVtIik7aWYoZmlyc3Qpe2ZpcnN0Lm9wZW49dHJ1ZTthd2FpdCBhZnRlckxheW91dCgpO2F3YWl0IGVuc3VyZUNoYXJ0KGZpcnN0KX0KICB9OwogIHdpbmRvdy5fX0dSQU0xX0NIQVJUX1VJX1ZFUlNJT05fXz1WRVJTSU9OOwogIGlmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0ibG9hZGluZyIpZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsc3RhcnQse29uY2U6dHJ1ZX0pO2Vsc2Ugc3RhcnQoKTsKfSkoKTsK\"\n00407: _GRAM1_CHART_SYMBOLS = {\"HBAR\", \"POL\", \"AVAX\", \"LINK\"}\n00408: \n00409: @app.get(\"/vendor/gram1-charts-v4.js\", include_in_schema=False)\n00410: def _gram1_chart_javascript_v4():\n00411: return _Gram1Response(content=_gram1_base64.b64decode(_GRAM1_CHART_JS_B64), media_type=\"application/javascript\", headers={\"Cache-Control\":\"no-store\"})\n00412: \n00413: async def _gram1_chart_data_v4(symbol: str, request: _Gram1Request):\n00414: fn = globals().get(\"klines\")","token":"/vendor/gram1-charts-v4.js"}]},"changes_made":false,"command_id":"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z","container_files":{"app.py":[{"bytes":32843,"path":"app.py","sha256":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d"},{"bytes":32843,"path":"/app/app.py","sha256":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d"}],"templates/index.html":[{"bytes":29232,"path":"templates/index.html","sha256":"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5"},{"bytes":29232,"path":"/app/templates/index.html","sha256":"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5"}]},"control_plane_error":null,"diagnosis":["ACCORDION_INIT_IS_INLINE_AND_NOT_DEFERRED","LEGACY_CHART_RENDERER_STILL_TARGETS_SAME_ID_CHART","SERVER_SVG_ACCORDION_IS_INSIDE_LEGACY_CHART_TARGET","LEGACY_NO_DATA_STATE_TEXT_STILL_EXISTS_IN_JAVASCRIPT","TWO_RENDERING_PIPELINES_CAN_STACK_IN_ONE_CONTAINER","RUNNING_WEB_CONTAINER_USES_CURRENT_HOST_TEMPLATE"],"duration_seconds":0.171,"exact_state":{"app.py":{"bytes":32843,"sha256":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d"},"compose":{"path":"/opt/stacks/crypto-portfolio/compose.yaml","sha256":"6d344e46b3de94ad86131a914df2ff3ff25e9d82f7ce0557cbffa468b8cdc1b8"},"templates/index.html":{"bytes":29232,"sha256":"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5"},"worker.py":{"bytes":10300,"sha256":"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c"}},"gitea_changed":false,"host_container_index_match":true,"mutation_outcome":"NO_MUTATION","production_site_changed":false,"rc":0,"repair_plan_constraints":["Do not put the new accordion inside the legacy #chart target.","Choose one rendering pipeline for the visible coin-chart area.","Remove or rewire the stale chart status badge instead of leaving «Нет данных».","Initialize the accordion after DOM creation via external defer script or DOMContentLoaded.","Enforce exactly one open section and verify it in a real DOM engine."],"rollback_restored":null,"rollback_started":false,"schema":1,"status":"OK","template_analysis":{"chart_elements":[{"body_bytes":1946,"body_end":"
HBAR / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
","body_sha256":"bbc7836d04ccc13777a3aba6fd0502d6f94dd4fd2c8bdbb93e3150c7c7209411","body_start":"
HBAR / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
","contains_no_data":false,"details_count":4,"line":6,"open_details_count":1,"open_tag":"","server_svg_count":4}],"diagnosis":["ACCORDION_INIT_IS_INLINE_AND_NOT_DEFERRED","LEGACY_CHART_RENDERER_STILL_TARGETS_SAME_ID_CHART","SERVER_SVG_ACCORDION_IS_INSIDE_LEGACY_CHART_TARGET","LEGACY_NO_DATA_STATE_TEXT_STILL_EXISTS_IN_JAVASCRIPT","TWO_RENDERING_PIPELINES_CAN_STACK_IN_ONE_CONTAINER"],"legacy_chart_scripts":[{"body_sha256":"e6afa17d7b94d9da5036d55bf6b8c623ec036ca05e9dea9c789432631c1b6ca7","chart_refs":["chart.innerHTML","Нет данных"],"id":null,"index":0,"line":9,"snippet":"00005:
Стоимость портфеля
Вложено
Прибыль / убыток0%
Обновление рынкакаждые 5 минут
\n00006:

График цены

7 дней
Загрузка
HBAR / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период

Резкие движения

\n00007:

Позиции портфеля

Количество и средняя цена покупки
АктивЦенаКапитализацияКоличествоСредняя покупка (USD)ВложеноСейчасP/L
\n00008:

Новое оповещение

Мои оповещения

\n00009: \n00222: \n---\n00218: \n00219: \n00220: \n00221: \n00222: ","src":null}],"no_data_occurrences":[{"inside_chart":false,"inside_script":true,"line":9,"snippet":"00005:
Стоимость портфеля
Вложено
Прибыль / убыток0%
Обновление рынкакаждые 5 минут
\n00006:

График цены

7 дней
Загрузка
HBAR / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период

Резкие движения

\n00007:

Позиции портфеля

Количество и средняя цена покупки
АктивЦенаКапитализацияКоличествоСредняя покупка (USD)ВложеноСейчасP/L
\n00008:

Новое оповещение

Мои оповещения

\n00009: \n00004:
https://gram1.ru/

Мой криптопортфель

\n00005:
Стоимость портфеля
Вложено
Прибыль / убыток0%
Обновление рынкакаждые 5 минут
\n00006:

График цены

7 дней
Загрузка
HBAR / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\"Свечной
Binance USDT · 1 месяц · весь доступный период

Резкие движения

\n00007:

Позиции портфеля

Количество и средняя цена покупки
АктивЦенаКапитализацияКоличествоСредняя покупка (USD)ВложеноСейчасP/L
\n00008:

Новое оповещение

Мои оповещения

\n00009: \n00218: \n00219: \n00220: \n00221: \n00222: ","token":"tvCharts"},{"inside_chart":false,"inside_script":true,"line":219,"snippet":"00214: document.querySelectorAll(\".currency-btn\").forEach(button=>button.addEventListener(\"click\",()=>setTimeout(redrawForCurrency,0)));\n00215: })();\n00216: \n00217: \n00218: \n00219: \n00220: \n00221: \n00222: ","token":"GRAM1_CHARTS_DIRECT_VISIBLE_SCRIPT_V5"},{"inside_chart":false,"inside_script":true,"line":219,"snippet":"00214: document.querySelectorAll(\".currency-btn\").forEach(button=>button.addEventListener(\"click\",()=>setTimeout(redrawForCurrency,0)));\n00215: })();\n00216: \n00217: \n00218: \n00219: \n00220: \n00221: \n00222: ","token":"GRAM1_DIRECT_SERVER_V5"},{"inside_chart":false,"inside_script":true,"line":219,"snippet":"00214: document.querySelectorAll(\".currency-btn\").forEach(button=>button.addEventListener(\"click\",()=>setTimeout(redrawForCurrency,0)));\n00215: })();\n00216: \n00217: \n00218: \n00219: \n00220: \n00221: \n00222: ","token":"getElementById(\"chart\")"},{"inside_chart":false,"inside_script":true,"line":222,"snippet":"00217: \n00218: \n00219: \n00220: \n00221: \n00222: ","token":"appendChild("},{"inside_chart":false,"inside_script":true,"line":222,"snippet":"00217: \n00218: \n00219: \n00220: \n00221: \n00222: ","token":"getElementById(\"chart\")"}],"scripts":[{"async":false,"body_sha256":"e6afa17d7b94d9da5036d55bf6b8c623ec036ca05e9dea9c789432631c1b6ca7","chart_refs":["chart.innerHTML","Нет данных"],"defer":false,"id":null,"index":0,"line":9,"src":null,"type":null},{"async":false,"body_sha256":"f30846a0a26517bd6e8303d552aeba19887576c54b4a70678e234a5e1f6e7582","chart_refs":[],"defer":false,"id":"ALERT_CREATE_OVERRIDE_V3","index":1,"line":9,"src":null,"type":null},{"async":false,"body_sha256":"b6fedba59295891e784ab98cef7690efe81553715d35a9cf6a31c30d08efb5a9","chart_refs":["replaceChildren("],"defer":false,"id":"ALERT_LIST_RENDERER_V5","index":2,"line":109,"src":null,"type":null},{"async":false,"body_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","chart_refs":[],"defer":false,"id":null,"index":3,"line":218,"src":"/vendor/lightweight-charts.js","type":null},{"async":false,"body_sha256":"6f74b154d9dce15511aff93e6f92a28c111d4160f3ed55f11ed33eb5016c8384","chart_refs":["getElementById(\"chart\")","GRAM1_DIRECT_SERVER_V5"],"defer":false,"id":"GRAM1_CHARTS_DIRECT_VISIBLE_SCRIPT_V5","index":4,"line":219,"src":null,"type":null},{"async":false,"body_sha256":"90a765a83fb8a5a0542dee1abf8c32af0f248aa411aa203848f73758bc3f9b40","chart_refs":["getElementById(\"chart\")","appendChild("],"defer":false,"id":"MOVE_CHARTS_TO_BOTTOM_ALLTIME_V1","index":5,"line":222,"src":null,"type":null}],"styles":[{"body_sha256":"3771004bd01fc75eefe9d744e1e53a584c70d396fdb6543c98df7e7626dd007e","id":"GRAM1_CHARTS_DIRECT_VISIBLE_STYLE_V5","index":2,"line":217,"snippet":"#chart{display:block!important;margin-top:12px;border:1px solid var(--l);border-radius:16px;overflow:hidden;background:#081823;min-height:56px}#tvCharts{display:none!important}.tv-accordion-item{display:block;border-bottom:1px solid var(--l);background:#081823}.tv-accordion-item:last-child{border-bottom:0}.tv-accordion-head{list-style:none;cursor:pointer;padding:14px 16px;font-weight:800;display:flex;align-items:center;justify-content:space-between;gap:12px;user-select:none}.tv-accordion-head::-webkit-details-marker{display:none}.tv-accordion-chevron{font-size:18px;transition:transform .2s ease}.tv-accordion-item[open] .tv-accordion-chevron{transform:rotate(180deg)}.tv-accordion-body{display:block;border-top:1px solid var(--l)}.tv-server-chart{display:block;width:100%;height:auto;min-height:320px;max-height:430px;object-fit:fill;border:0;background:#081823}.tv-chart-note{min-height:20px;padding:0 14px 12px}@media(max-width:750px){.tv-accordion-head{padding:12px 14px}.tv-server-chart{min-height:260px}}"}],"template_bytes":29232,"template_sha256":"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5"}},"rollback_restored":null,"rollback_started":false,"schema":1,"selected_method":"ALIAS_PINNED_AS_DEBIAN","ssh_method_probes":[{"duration_seconds":0.123,"identity_count":null,"identity_sudo_read_ok":true,"name":"ALIAS_PINNED_AS_DEBIAN","rc":0,"stderr":""},{"duration_seconds":0.121,"identity_count":2,"identity_sudo_read_ok":true,"name":"DIRECT_PINNED_AS_DEBIAN_NO_PROXY","rc":0,"stderr":""}],"status":"OK"} +HOMELAB_RESULT_CONTRACT={"changes_made":true,"command_id":"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z","mutation_outcome":"MUTATED","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +{"changes_made":true,"command_id":"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z","control_plane_error":null,"gitea_changed":false,"mutation_outcome":"MUTATED","pinned_host_key_aliases":["[PRIVATE_IP]"],"production_site_changed":true,"rc":0,"remote_result":{"backup_dir":"/var/lib/homelab-change-rollback/GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z","baseline_capsule_sha256":"905d0b554ff025817a7480375ac6c8685396a99b456f01f54220ef4398af7139","baseline_command_id":"GRAM1-SITE-CHARTS-V37-SCOPED-RUNTIME-VERIFY-20260801T122700Z","changed_paths":["templates/index.html"],"changes_made":true,"command_id":"GRAM1-SITE-CHARTS-V39-SEPARATE-PIPELINES-20260801T125100Z","control_plane_error":null,"deployment":{"container_hashes":[{"path":"app.py","service":"web","sha256":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d"},{"path":"templates/index.html","service":"web","sha256":"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65"},{"path":"worker.py","service":"worker","sha256":"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c"}],"running":["web","worker"],"runtime":{"local_headers":{"server":"uvicorn"},"local_root_sha256":"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65","public":{"headers":{},"root_sha256":"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65","status":200},"svg":{"AVAX":{"bytes":12739,"candles":72,"sha256":"2dd8850447185c0b4be5c146242e8195ae840af1666fe877a4c5b110f60a22c9"},"HBAR":{"bytes":14697,"candles":84,"sha256":"cb5c6cdf8268990e735cb91e3070ee34f282e9826bacacc9be1fe04268c62951"},"LINK":{"bytes":16003,"candles":92,"sha256":"cb40e40aac61db48c82361a18fe7e89e93c96624718d205c3575db9f4d22d38c"},"POL":{"bytes":4949,"candles":24,"sha256":"e54be1f05c3abb3c23bd4fdd79e3a1e16352eb78f32cbd580d5a3f4aefd8c07f"}}}},"diagnostic_capsule_sha256":"7e704e0217aabc9d825ee36d299b74f51d05f482ee543d706a024b53a3177147","diagnostic_command_id":"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z","duration_seconds":8.869,"gitea_changed":false,"mutation_outcome":"MUTATED","old_hashes":{"app.py":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d","templates/index.html":"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5","worker.py":"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c"},"production_site_changed":true,"rc":0,"rollback_restored":null,"rollback_started":false,"schema":1,"semantic_checks":{"details":true,"dom_ready":true,"hidden_legacy_status":true,"images":true,"legacy_sink":true,"new_script":true,"new_style":true,"old_marker_removed":true,"one_initial_open":true,"single_open_logic":true,"valid_html_boundary":true,"visible_heading":true,"visible_root":true},"status":"OK","target_hashes":{"app.py":"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d","templates/index.html":"d60f575395d203b3d638c2416daa1f981a4a827b9d61caf2d1b90bf0e8063d65","worker.py":"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c"}},"rollback_restored":null,"rollback_started":false,"schema":1,"selected_method":"ALIAS_PINNED_AS_DEBIAN","ssh_method_probes":[{"duration_seconds":0.125,"identity_count":null,"identity_sudo_read_ok":true,"name":"ALIAS_PINNED_AS_DEBIAN","rc":0,"stderr":""},{"duration_seconds":0.125,"identity_count":2,"identity_sudo_read_ok":true,"name":"DIRECT_PINNED_AS_DEBIAN_NO_PROXY","rc":0,"stderr":""}],"status":"OK"} OUTPUT_END CHAT_OUTPUT_END