fix: 빌드 경고 정리 (미사용 변수, 중복 using 제거)

This commit is contained in:
2026-06-29 23:20:05 +09:00
parent e7e7d1470d
commit d083eb7bf9
87 changed files with 419 additions and 17 deletions
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Application")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+66f75d90147cc79aede830c90dd0b6fefe5dce0b")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e7e7d1470d5dc4a958da105e9b89e4d291e0e404")]
[assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Application")]
[assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Application")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
e7c350baac109d1911ad834a377d673266deb4edf4fd2e63153edc74440843e2
87dbbc76dca5a64fa3c7becfe897a485e711cbef3b5e2ee7a301fcc073444470
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Core.Tests")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+aad4788e8430ad7244d0628047aaf40d0590ef95")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e7e7d1470d5dc4a958da105e9b89e4d291e0e404")]
[assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Core.Tests")]
[assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Core.Tests")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
29474253b828ac86032076fb599b35fb19bd047e400aaabe06be96e0930730fc
7ffdfa076a0d3dee805c89668015ca8cc7e093d2a4f9aa67f4b4b9b0c87bb6f5
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Core")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+66f75d90147cc79aede830c90dd0b6fefe5dce0b")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e7e7d1470d5dc4a958da105e9b89e4d291e0e404")]
[assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Core")]
[assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Core")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
a42f144c7048f344f7d30f4862120ef236c2b6773e17f93afe31b500b0ce422d
eedfce1e89465e348d32b7727267df8de810ceb43700575cc9584eda6010e509
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Infrastructure")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+66f75d90147cc79aede830c90dd0b6fefe5dce0b")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e7e7d1470d5dc4a958da105e9b89e4d291e0e404")]
[assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Infrastructure")]
[assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Infrastructure")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
d5c5f777488b3948c52768724c22864266e92e3ebbb4d65d72d02b574d714276
ed04eb2ec98ea7203001d52f1bbd4c7d4f61cf65c6cfcab8ebd12f4ebfa222b4
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Tools")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+66f75d90147cc79aede830c90dd0b6fefe5dce0b")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e7e7d1470d5dc4a958da105e9b89e4d291e0e404")]
[assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Tools")]
[assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Tools")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
195595b70c86f17cd0f5f22ea89f31d535dcbf947e2dfd120fa4982c4d045443
9042b570a3313e83306d0d63853d7f31a6bd1f2b84b897684fe4ea0fe92273bb
@@ -0,0 +1,179 @@
@page "/collection"
@using QuantEngine.Web.Services
@inject ApiClient ApiClient
@inject ILogger<Collection> Logger
<PageTitle>QuantEngine - Collection</PageTitle>
<h1 style="margin: 0 0 8px 0; font-size: 28px; font-weight: 600;">Data Collection</h1>
<p style="margin: 0 0 16px 0; color: var(--neutral-foreground-2); font-size: 14px;">
KIS API data collection dashboard. Monitor runs, snapshots, and error trends.
</p>
<!-- Controls -->
<FluentStack Orientation="Orientation.Horizontal" HorizontalGap="8" Style="margin-bottom: 16px;">
<FluentButton Appearance="ButtonAppearance.Primary" OnClick="@StartCollectionAsync" Disabled="@IsProcessing">
@if (IsProcessing) { <span>Running...</span> } else { <span>Start Collection</span> }
</FluentButton>
<FluentButton Appearance="ButtonAppearance.Default" OnClick="@RefreshAsync" Disabled="@IsProcessing">
Refresh
</FluentButton>
</FluentStack>
<!-- Loading skeleton -->
@if (IsLoading)
{
<FluentStack Orientation="Orientation.Vertical" VerticalGap="16">
<FluentSkeleton Width="100%" Height="60px" />
<FluentSkeleton Width="100%" Height="200px" />
</FluentStack>
}
else if (DashboardState != null)
{
<!-- Summary Cards -->
<FluentStack Orientation="Orientation.Horizontal" HorizontalGap="16" Wrap="true" Style="margin-bottom: 16px;">
<FluentCard Style="flex: 1; min-width: 150px;">
<div style="padding: 16px;">
<p style="margin: 0 0 8px 0; color: var(--neutral-foreground-2); font-size: 12px; font-weight: 500;">Last Run</p>
<h3 style="margin: 0; font-size: 18px; font-weight: 600;">@(DashboardState.LastRunStatus ?? "N/A")</h3>
<p style="margin: 8px 0 0 0; color: var(--neutral-foreground-3); font-size: 12px;">@(DashboardState.LastFinishedAt ?? "Not finished")</p>
</div>
</FluentCard>
<FluentCard Style="flex: 1; min-width: 150px;">
<div style="padding: 16px;">
<p style="margin: 0 0 8px 0; color: var(--neutral-foreground-2); font-size: 12px; font-weight: 500;">Total Snapshots</p>
<h3 style="margin: 0; font-size: 18px; font-weight: 600;">@DashboardState.TotalSnapshots</h3>
</div>
</FluentCard>
<FluentCard Style="flex: 1; min-width: 150px;">
<div style="padding: 16px;">
<p style="margin: 0 0 8px 0; color: var(--neutral-foreground-2); font-size: 12px; font-weight: 500;">Total Errors</p>
<h3 style="margin: 0; font-size: 18px; font-weight: 600;">@DashboardState.TotalErrors</h3>
</div>
</FluentCard>
</FluentStack>
<!-- Recent Errors -->
@if (DashboardState.RecentErrors.Count > 0)
{
<FluentCard Style="margin-bottom: 16px;">
<div style="padding: 16px;">
<h3 style="margin: 0 0 12px 0; font-size: 16px; font-weight: 600;">Recent Errors</h3>
<table style="width: 100%; border-collapse: collapse;">
<thead style="background: var(--neutral-subtle);">
<tr>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Source</th>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Kind</th>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Ticker</th>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Message</th>
</tr>
</thead>
<tbody>
@foreach (var error in DashboardState.RecentErrors)
{
<tr>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@error.SourceName</td>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@error.ErrorKind</td>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@error.Ticker</td>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@error.ErrorMessage</td>
</tr>
}
</tbody>
</table>
</div>
</FluentCard>
}
<!-- Recent Runs -->
@if (RecentRuns != null && RecentRuns.Count > 0)
{
<FluentCard>
<div style="padding: 16px;">
<h3 style="margin: 0 0 12px 0; font-size: 16px; font-weight: 600;">Recent Runs</h3>
<table style="width: 100%; border-collapse: collapse;">
<thead style="background: var(--neutral-subtle);">
<tr>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Run ID</th>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Status</th>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Started</th>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Finished</th>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Snapshots</th>
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Errors</th>
</tr>
</thead>
<tbody>
@foreach (var run in RecentRuns)
{
<tr>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest); font-family: monospace; font-size: 12px;">@run.RunId</td>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@run.Status</td>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest); font-size: 12px;">@run.StartedAt</td>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest); font-size: 12px;">@run.FinishedAt</td>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@run.TotalSnapshots</td>
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@run.TotalErrors</td>
</tr>
}
</tbody>
</table>
</div>
</FluentCard>
}
}
@code {
private CollectionDashboardStateDto? DashboardState;
private List<CollectionRunDto>? RecentRuns;
private bool IsLoading = true;
private bool IsProcessing = false;
protected override async Task OnInitializedAsync()
{
await LoadDashboardStateAsync();
}
private async Task LoadDashboardStateAsync()
{
IsLoading = true;
try
{
DashboardState = await ApiClient.GetCollectionStateAsync();
var runsResponse = await ApiClient.GetCollectionRunsAsync(10);
RecentRuns = runsResponse?.Runs ?? new();
}
catch (Exception ex)
{
Logger.LogError(ex, "Error loading dashboard");
}
finally
{
IsLoading = false;
}
}
private async Task StartCollectionAsync()
{
IsProcessing = true;
try
{
var result = await ApiClient.StartCollectionRunAsync();
if (result != null)
{
await LoadDashboardStateAsync();
}
}
catch (Exception ex)
{
Logger.LogError(ex, "Error starting collection");
}
finally
{
IsProcessing = false;
}
}
private async Task RefreshAsync()
{
await LoadDashboardStateAsync();
}
}
@@ -12,4 +12,3 @@
@using QuantEngine.Web.Components
@using QuantEngine.Web.Components.Layout
@using QuantEngine.Web.Services
@using QuantEngine.Web.Services
@@ -0,0 +1,216 @@
using System.Net.Http.Json;
using System.Text.Json.Serialization;
using QuantEngine.Core.Interfaces;
namespace QuantEngine.Web.Services;
public class ApiClient
{
private readonly HttpClient _http;
private readonly ILogger<ApiClient> _logger;
private string BaseUrl { get; set; }
public ApiClient(HttpClient http, ILogger<ApiClient> logger)
{
_http = http;
_logger = logger;
BaseUrl = "http://localhost:5001"; // Default for Blazor Server
}
// Collection API Methods
public async Task<CollectionDashboardStateDto?> GetCollectionStateAsync()
{
try
{
return await _http.GetFromJsonAsync<CollectionDashboardStateDto>($"{BaseUrl}/api/collection/state");
}
catch (Exception ex)
{
_logger.LogError(ex, "Error fetching collection state");
return null;
}
}
public async Task<CollectionRunsResponse?> GetCollectionRunsAsync(int limit = 20)
{
try
{
return await _http.GetFromJsonAsync<CollectionRunsResponse>($"{BaseUrl}/api/collection/runs?limit={limit}");
}
catch (Exception ex)
{
_logger.LogError(ex, "Error fetching collection runs");
return null;
}
}
public async Task<CollectionRunSnapshotsResponse?> GetCollectionSnapshotsAsync(string runId)
{
try
{
return await _http.GetFromJsonAsync<CollectionRunSnapshotsResponse>($"{BaseUrl}/api/collection/runs/{runId}/snapshots");
}
catch (Exception ex)
{
_logger.LogError(ex, $"Error fetching snapshots for run {runId}");
return null;
}
}
public async Task<CollectionRunErrorsResponse?> GetCollectionErrorsAsync(string runId, int limit = 50)
{
try
{
return await _http.GetFromJsonAsync<CollectionRunErrorsResponse>($"{BaseUrl}/api/collection/runs/{runId}/errors?limit={limit}");
}
catch (Exception ex)
{
_logger.LogError(ex, $"Error fetching errors for run {runId}");
return null;
}
}
public async Task<CollectionRunStartResponse?> StartCollectionRunAsync()
{
try
{
var response = await _http.PostAsJsonAsync($"{BaseUrl}/api/collection/run", new { });
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadFromJsonAsync<CollectionRunStartResponse>();
}
return null;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error starting collection run");
return null;
}
}
}
// DTOs
public class CollectionDashboardStateDto
{
[JsonPropertyName("lastRunId")]
public string? LastRunId { get; set; }
[JsonPropertyName("lastRunStatus")]
public string? LastRunStatus { get; set; }
[JsonPropertyName("lastFinishedAt")]
public string? LastFinishedAt { get; set; }
[JsonPropertyName("totalSnapshots")]
public int TotalSnapshots { get; set; }
[JsonPropertyName("totalErrors")]
public int TotalErrors { get; set; }
[JsonPropertyName("recentErrors")]
public List<CollectionErrorDto> RecentErrors { get; set; } = new();
}
public class CollectionRunDto
{
[JsonPropertyName("runId")]
public string RunId { get; set; } = "";
[JsonPropertyName("status")]
public string Status { get; set; } = "";
[JsonPropertyName("startedAt")]
public string StartedAt { get; set; } = "";
[JsonPropertyName("finishedAt")]
public string? FinishedAt { get; set; }
[JsonPropertyName("totalSnapshots")]
public int? TotalSnapshots { get; set; }
[JsonPropertyName("totalErrors")]
public int? TotalErrors { get; set; }
}
public class CollectionSnapshotDto
{
[JsonPropertyName("runId")]
public string RunId { get; set; } = "";
[JsonPropertyName("datasetName")]
public string DatasetName { get; set; } = "";
[JsonPropertyName("ticker")]
public string Ticker { get; set; } = "";
[JsonPropertyName("sourceName")]
public string SourceName { get; set; } = "";
[JsonPropertyName("capturedAt")]
public string CapturedAt { get; set; } = "";
}
public class CollectionErrorDto
{
[JsonPropertyName("runId")]
public string RunId { get; set; } = "";
[JsonPropertyName("sourceName")]
public string SourceName { get; set; } = "";
[JsonPropertyName("errorKind")]
public string ErrorKind { get; set; } = "";
[JsonPropertyName("errorMessage")]
public string ErrorMessage { get; set; } = "";
[JsonPropertyName("ticker")]
public string Ticker { get; set; } = "";
}
public class CollectionRunsResponse
{
[JsonPropertyName("runs")]
public List<CollectionRunDto> Runs { get; set; } = new();
[JsonPropertyName("count")]
public int Count { get; set; }
}
public class CollectionRunSnapshotsResponse
{
[JsonPropertyName("runId")]
public string RunId { get; set; } = "";
[JsonPropertyName("snapshots")]
public List<CollectionSnapshotDto> Snapshots { get; set; } = new();
[JsonPropertyName("count")]
public int Count { get; set; }
}
public class CollectionRunErrorsResponse
{
[JsonPropertyName("runId")]
public string RunId { get; set; } = "";
[JsonPropertyName("errors")]
public List<CollectionErrorDto> Errors { get; set; } = new();
[JsonPropertyName("count")]
public int Count { get; set; }
}
public class CollectionRunStartResponse
{
[JsonPropertyName("runId")]
public string RunId { get; set; } = "";
[JsonPropertyName("status")]
public string Status { get; set; } = "";
[JsonPropertyName("startedAt")]
public string StartedAt { get; set; } = "";
}
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Web")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+aad4788e8430ad7244d0628047aaf40d0590ef95")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e7e7d1470d5dc4a958da105e9b89e4d291e0e404")]
[assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Web")]
[assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Web")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
f65fdbf5ae13b230002b1911966d3803d46022cf6234aa717189fff95ad3d9d1
bad5c7aa3a10ed623a291da4069db1fcdc8306037aadba3178e61b4c4b729968
@@ -23,6 +23,14 @@ build_property._RazorSourceGeneratorDebug =
build_property.EffectiveAnalysisLevelStyle = 10.0
build_property.EnableCodeStyleSeverity =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Client/Pages/Collection.razor]
build_metadata.AdditionalFiles.TargetPath = Q2xpZW50XFBhZ2VzXENvbGxlY3Rpb24ucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Client/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q2xpZW50XF9JbXBvcnRzLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/App.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
@@ -1 +1 @@
0e1d6e7f1c84fdbf2e852a7227f82a6008223f92775fb884340ae9e6fac59f0f
166d6a1fc1ca2d51e6a2788ece085ff1655cc6516563c314fd7b15cb1c7f9ceb
@@ -1 +1 @@
{"GlobalPropertiesHash":"61ZzOkAafDUCzt7x0mEjc+KORTs/Of52hN2aYDIQSWo=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8=","m1RQtzMLoQWq6UnuVeiRVXSM2c2Q6/OzZc55uM2i93A=","hiPreQqqr5M81jQh\u002BsyYzu6fPzHbXkO00H\u002BjwFUXmVI=","nj4bTNdXLks/ifVLGyyn0JSdi3PzYDtjcCY1DlyDaUQ=","vQOI1xTEFZObVDsVgjTF2znZABTIHfwG/zTPmKPVBe0=","7elVBzPhnnl25N/3P1W6oFDvEswhk00rPXKO0IH/4LA=","/fjr/20ykorSUoc\u002BNr88YUutwXt205KL3aG5hglcfpI="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"61ZzOkAafDUCzt7x0mEjc+KORTs/Of52hN2aYDIQSWo=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","Ve1QW/FmTNllJk3cvvhc6GX9yH8fpHWmRRGHdwsWzSk=","Lnqf\u002BNn8uUZsaje5OQes9m0Q0KwAfchqG1V350Yn6BM=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8=","m1RQtzMLoQWq6UnuVeiRVXSM2c2Q6/OzZc55uM2i93A=","hiPreQqqr5M81jQh\u002BsyYzu6fPzHbXkO00H\u002BjwFUXmVI=","nj4bTNdXLks/ifVLGyyn0JSdi3PzYDtjcCY1DlyDaUQ=","vQOI1xTEFZObVDsVgjTF2znZABTIHfwG/zTPmKPVBe0=","7elVBzPhnnl25N/3P1W6oFDvEswhk00rPXKO0IH/4LA=","HDtDJ\u002B0WeFQOmX9x35CcP9M\u002BCthxE2T5\u002B5j32C0HgkQ="],"CachedAssets":{},"CachedCopyCandidates":{}}
@@ -1 +1 @@
{"GlobalPropertiesHash":"hb9Mk8Q4BfRLjPFbSBNw4B6QTKNWFUuDQL43Qwq5ZuI=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8=","m1RQtzMLoQWq6UnuVeiRVXSM2c2Q6/OzZc55uM2i93A=","hiPreQqqr5M81jQh\u002BsyYzu6fPzHbXkO00H\u002BjwFUXmVI=","nj4bTNdXLks/ifVLGyyn0JSdi3PzYDtjcCY1DlyDaUQ=","vQOI1xTEFZObVDsVgjTF2znZABTIHfwG/zTPmKPVBe0=","7elVBzPhnnl25N/3P1W6oFDvEswhk00rPXKO0IH/4LA=","/fjr/20ykorSUoc\u002BNr88YUutwXt205KL3aG5hglcfpI="],"CachedAssets":{"vQOI1xTEFZObVDsVgjTF2znZABTIHfwG/zTPmKPVBe0=":{"Identity":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\Components\\Layout\\ReconnectModal.razor.js","SourceId":"QuantEngine.Web","SourceType":"Discovered","ContentRoot":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\","BasePath":"/","RelativePath":"Components/Layout/ReconnectModal#[.{fingerprint}]?.razor.js","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"13ja33weya","Integrity":"4zGYCWZ4pfXdYacNs7XaH1BXGvludoT6JCkX9NZucgI=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"Components\\Layout\\ReconnectModal.razor.js","FileLength":2364,"LastWriteTime":"2026-06-29T13:57:48.3610236+00:00"}},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"hb9Mk8Q4BfRLjPFbSBNw4B6QTKNWFUuDQL43Qwq5ZuI=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","Ve1QW/FmTNllJk3cvvhc6GX9yH8fpHWmRRGHdwsWzSk=","Lnqf\u002BNn8uUZsaje5OQes9m0Q0KwAfchqG1V350Yn6BM=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8=","m1RQtzMLoQWq6UnuVeiRVXSM2c2Q6/OzZc55uM2i93A=","hiPreQqqr5M81jQh\u002BsyYzu6fPzHbXkO00H\u002BjwFUXmVI=","nj4bTNdXLks/ifVLGyyn0JSdi3PzYDtjcCY1DlyDaUQ=","vQOI1xTEFZObVDsVgjTF2znZABTIHfwG/zTPmKPVBe0=","7elVBzPhnnl25N/3P1W6oFDvEswhk00rPXKO0IH/4LA=","HDtDJ\u002B0WeFQOmX9x35CcP9M\u002BCthxE2T5\u002B5j32C0HgkQ="],"CachedAssets":{"vQOI1xTEFZObVDsVgjTF2znZABTIHfwG/zTPmKPVBe0=":{"Identity":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\Components\\Layout\\ReconnectModal.razor.js","SourceId":"QuantEngine.Web","SourceType":"Discovered","ContentRoot":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\","BasePath":"/","RelativePath":"Components/Layout/ReconnectModal#[.{fingerprint}]?.razor.js","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"13ja33weya","Integrity":"4zGYCWZ4pfXdYacNs7XaH1BXGvludoT6JCkX9NZucgI=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"Components\\Layout\\ReconnectModal.razor.js","FileLength":2364,"LastWriteTime":"2026-06-29T13:57:48.3610236+00:00"}},"CachedCopyCandidates":{}}
@@ -1 +1 @@
{"GlobalPropertiesHash":"sRnjZ123Hmd3VL4RmNf3gURHR16GI5Uk+lQqQ4VvHbs=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8="],"CachedAssets":{"rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=":{"Identity":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\favicon.png","SourceId":"QuantEngine.Web","SourceType":"Discovered","ContentRoot":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\","BasePath":"/","RelativePath":"favicon#[.{fingerprint}]?.png","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"ifv42okdf2","Integrity":"4mWsDy3aHl36ZbGt8zByK7Pvd4kRUoNgTYzRnwmPHwg=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\favicon.png","FileLength":1148,"LastWriteTime":"2026-06-29T13:57:48.879071+00:00"},"JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=":{"Identity":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\app.css","SourceId":"QuantEngine.Web","SourceType":"Discovered","ContentRoot":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\","BasePath":"/","RelativePath":"app#[.{fingerprint}]?.css","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"hhus5bms5i","Integrity":"q\u002BWOaqM0nK\u002BYJc9mffiSnfzZ9cNGTWpp3KaiKimoxBQ=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\app.css","FileLength":6886,"LastWriteTime":"2026-06-29T13:57:48.8780717+00:00"}},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"sRnjZ123Hmd3VL4RmNf3gURHR16GI5Uk+lQqQ4VvHbs=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","Ve1QW/FmTNllJk3cvvhc6GX9yH8fpHWmRRGHdwsWzSk=","Lnqf\u002BNn8uUZsaje5OQes9m0Q0KwAfchqG1V350Yn6BM=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8="],"CachedAssets":{"rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=":{"Identity":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\favicon.png","SourceId":"QuantEngine.Web","SourceType":"Discovered","ContentRoot":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\","BasePath":"/","RelativePath":"favicon#[.{fingerprint}]?.png","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"ifv42okdf2","Integrity":"4mWsDy3aHl36ZbGt8zByK7Pvd4kRUoNgTYzRnwmPHwg=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\favicon.png","FileLength":1148,"LastWriteTime":"2026-06-29T13:57:48.879071+00:00"},"JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=":{"Identity":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\app.css","SourceId":"QuantEngine.Web","SourceType":"Discovered","ContentRoot":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\","BasePath":"/","RelativePath":"app#[.{fingerprint}]?.css","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"hhus5bms5i","Integrity":"q\u002BWOaqM0nK\u002BYJc9mffiSnfzZ9cNGTWpp3KaiKimoxBQ=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\app.css","FileLength":6886,"LastWriteTime":"2026-06-29T13:57:48.8780717+00:00"}},"CachedCopyCandidates":{}}