@@ -0,0 +1,9 @@ | |||||
*.user | |||||
*.suo | |||||
.vs/ | |||||
*.log | |||||
obj/ | |||||
bin/ | |||||
.idea/ | |||||
.vscode/ | |||||
publish/ |
@@ -0,0 +1,7 @@ | |||||
namespace HealthMonitor.Common | |||||
{ | |||||
public class Class1 | |||||
{ | |||||
} | |||||
} |
@@ -0,0 +1,22 @@ | |||||
using System; | |||||
namespace HealthMonitor.Common | |||||
{ | |||||
public class Consts | |||||
{ | |||||
/// <summary> | |||||
/// HttpClient常用配置分组名称 | |||||
/// </summary> | |||||
public const string DEFAULT_HTTPCLIENT_NAME = "DEFAULT_HTTP"; | |||||
/// <summary> | |||||
/// 纪元时间(UTC时间戳起始计算时间) | |||||
/// </summary> | |||||
public static DateTime EraUtcTime = DateTime.Parse("1970/01/01"); | |||||
/// <summary> | |||||
/// 有效定位的半径阈值(大于该值则为无效定位) | |||||
/// </summary> | |||||
public static int RadiusThreshold = 150; | |||||
} | |||||
} |
@@ -0,0 +1,37 @@ | |||||
using Microsoft.Extensions.Logging; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Diagnostics; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace HealthMonitor.Common | |||||
{ | |||||
public class CustomizeStopWatch : IDisposable | |||||
{ | |||||
private readonly Stopwatch _sw; | |||||
private readonly string _domain; | |||||
private readonly ILogger _logger; | |||||
public string Content { get; set; } = default!; | |||||
public CustomizeStopWatch(string domain, ILogger logger) | |||||
{ | |||||
_domain = domain; | |||||
_logger = logger; | |||||
_sw = new Stopwatch(); | |||||
_sw.Start(); | |||||
} | |||||
public void Dispose() | |||||
{ | |||||
if (_sw != null) | |||||
{ | |||||
_logger.LogInformation($"统计时间[{_domain}],耗时 {_sw.Elapsed.TotalMilliseconds} 毫秒 {Content}"); | |||||
_sw.Stop(); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,14 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<TargetFramework>net6.0</TargetFramework> | |||||
<ImplicitUsings>enable</ImplicitUsings> | |||||
<Nullable>enable</Nullable> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" /> | |||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,129 @@ | |||||
using Microsoft.Extensions.Logging; | |||||
using Newtonsoft.Json; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Net; | |||||
using System.Net.Http; | |||||
using System.Net.Http.Headers; | |||||
using System.Net.Security; | |||||
using System.Security.Cryptography.X509Certificates; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace HealthMonitor.Common.helper | |||||
{ | |||||
public class HttpHelper | |||||
{ | |||||
private readonly IHttpClientFactory _httpClientFactory; | |||||
private readonly ILogger<HttpHelper> _logger; | |||||
public HttpHelper(IHttpClientFactory httpClientFactory, ILogger<HttpHelper> logger) | |||||
{ | |||||
_httpClientFactory = httpClientFactory; | |||||
_logger = logger; | |||||
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult!); | |||||
} | |||||
public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) | |||||
{ | |||||
return true; | |||||
} | |||||
public async Task<string?> HttpToGetAsync(string url) | |||||
{ | |||||
return await HttpToGetAsync(url, new List<KeyValuePair<string, string>>()); | |||||
} | |||||
public async Task<string?> HttpToGetAsync(string url, List<KeyValuePair<string, string>> headers) | |||||
{ | |||||
var client = _httpClientFactory.CreateClient(Consts.DEFAULT_HTTPCLIENT_NAME); | |||||
if (headers != null && headers.Count > 0) //指定请求头 | |||||
{ | |||||
headers.ForEach(e => | |||||
{ | |||||
client.DefaultRequestHeaders.Add(e.Key, e.Value); | |||||
}); | |||||
} | |||||
try | |||||
{ | |||||
using (var response = await client.GetAsync(url).ConfigureAwait(false)) | |||||
{ | |||||
if (!response.IsSuccessStatusCode) return null; | |||||
else | |||||
{ | |||||
var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false); | |||||
return result; | |||||
} | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
_logger.LogError($"HttpToGetAsync发生异常, Msg:{ex.Message}\n{ex.StackTrace}"); | |||||
return null; | |||||
} | |||||
} | |||||
public async Task<string?> HttpToPostAsync(string url, object data) | |||||
{ | |||||
return await HttpToPostAsync(url, data, new List<KeyValuePair<string, string>>()); | |||||
} | |||||
public async Task<string?> HttpToPostAsync(string url, object data, List<KeyValuePair<string, string>> headers) | |||||
{ | |||||
if (data == null) return null; | |||||
var client = _httpClientFactory.CreateClient(Consts.DEFAULT_HTTPCLIENT_NAME); | |||||
if (headers != null && headers.Count > 0) //指定请求头 | |||||
{ | |||||
headers.ForEach(e => | |||||
{ | |||||
client.DefaultRequestHeaders.Add(e.Key, e.Value); | |||||
}); | |||||
} | |||||
string? body; | |||||
if (data is string) body = data as string; | |||||
else body = JsonConvert.SerializeObject(data); | |||||
try | |||||
{ | |||||
using (var content = new StringContent(body!)) | |||||
{ | |||||
content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); | |||||
using (var response = await client.PostAsync(url, content).ConfigureAwait(false)) | |||||
{ | |||||
if (!response.IsSuccessStatusCode) return null; | |||||
else | |||||
{ | |||||
var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false); | |||||
return result; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
_logger.LogError($"HttpToPostAsync发生异常, Msg:{ex.Message}\n{ex.StackTrace}"); | |||||
return null; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Authorization 的 Base64 加密 | |||||
/// </summary> | |||||
/// <param name="username"></param> | |||||
/// <param name="password"></param> | |||||
/// <returns></returns> | |||||
public string GetEncodedCredentials(string username, string password) | |||||
{ | |||||
string mergedCredentials = string.Format("{0}:{1}", username, password); | |||||
byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials); | |||||
return Convert.ToBase64String(byteCredentials); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,7 @@ | |||||
namespace HealthMonitor.Model | |||||
{ | |||||
public class Class1 | |||||
{ | |||||
} | |||||
} |
@@ -0,0 +1,23 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace HealthMonitor.Model.Config | |||||
{ | |||||
public class TDengineServiceConfig | |||||
{ | |||||
public string Host { get; set; } = default!; | |||||
public string UserName { get; set; } = default!; | |||||
public string Password { get; set; } = default!; | |||||
public short Port { get; set; } = default!; | |||||
public string DB { get; set; } = default!; | |||||
} | |||||
} |
@@ -0,0 +1,9 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<TargetFramework>net6.0</TargetFramework> | |||||
<ImplicitUsings>enable</ImplicitUsings> | |||||
<Nullable>enable</Nullable> | |||||
</PropertyGroup> | |||||
</Project> |
@@ -0,0 +1,148 @@ | |||||
using HealthMonitor.Model.Config; | |||||
using Microsoft.Extensions.Logging; | |||||
using Microsoft.Extensions.Options; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using TDengineDriver; | |||||
using TDengineDriver.Impl; | |||||
namespace HealthMonitor.Service.Biz.db | |||||
{ | |||||
public class TDengineService | |||||
{ | |||||
private readonly ILogger<TDengineService> _logger; | |||||
private readonly TDengineServiceConfig _configTDengineService; | |||||
public TDengineService(ILogger<TDengineService> logger, IOptions<TDengineServiceConfig> configTDengineService) | |||||
{ | |||||
_logger = logger; | |||||
_configTDengineService = configTDengineService.Value; | |||||
} | |||||
public IntPtr Connection() | |||||
{ | |||||
string host = _configTDengineService.Host; | |||||
string user = _configTDengineService.UserName; | |||||
string db = _configTDengineService.DB; | |||||
short port = _configTDengineService.Port; | |||||
string password = _configTDengineService.Password; | |||||
IntPtr conn = TDengine.Connect(host, user, password, db, port); | |||||
//string host = "172.16.255.180"; | |||||
//short port = 6030; | |||||
//string user = "root"; | |||||
//string password = "taosdata"; | |||||
//string db = "health_monitor"; | |||||
//IntPtr conn = TDengine.Connect(host, user, password, db, port); | |||||
// Check if get connection success | |||||
if (conn == IntPtr.Zero) | |||||
{ | |||||
Console.WriteLine("Connect to TDengine failed"); | |||||
} | |||||
else | |||||
{ | |||||
Console.WriteLine("Connect to TDengine success"); | |||||
} | |||||
return conn; | |||||
} | |||||
public void ExecuteSQL(IntPtr conn, string sql) | |||||
{ | |||||
IntPtr res = TDengine.Query(conn, sql); | |||||
// Check if query success | |||||
if ((res == IntPtr.Zero) || (TDengine.ErrorNo(res) != 0)) | |||||
{ | |||||
Console.Write(sql + " failure, "); | |||||
// Get error message while Res is a not null pointer. | |||||
if (res != IntPtr.Zero) | |||||
{ | |||||
Console.Write("reason:" + TDengine.Error(res)); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
Console.Write(sql + " success, {0} rows affected", TDengine.AffectRows(res)); | |||||
//... do something with res ... | |||||
// Important: need to free result to avoid memory leak. | |||||
TDengine.FreeResult(res); | |||||
} | |||||
} | |||||
public void ExecuteQuerySQL(IntPtr conn, string sql) | |||||
{ | |||||
IntPtr res = TDengine.Query(conn, sql); | |||||
// Check if query success | |||||
if ((res == IntPtr.Zero) || (TDengine.ErrorNo(res) != 0)) | |||||
{ | |||||
Console.Write(sql + " failure, "); | |||||
// Get error message while Res is a not null pointer. | |||||
if (res != IntPtr.Zero) | |||||
{ | |||||
Console.Write("reason:" + TDengine.Error(res)); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
Console.Write(sql + " success, {0} rows affected", TDengine.AffectRows(res)); | |||||
//... do something with res ... | |||||
List<TDengineDriver.TDengineMeta> resMeta = LibTaos.GetMeta(res); | |||||
List<Object> resData = LibTaos.GetData(res); | |||||
foreach (var meta in resMeta) | |||||
{ | |||||
Console.Write($"\t|{meta.name} {meta.TypeName()} ({meta.size})\t|"); | |||||
} | |||||
for (int i = 0; i < resData.Count; i++) | |||||
{ | |||||
Console.Write($"|{resData[i].ToString()} \t"); | |||||
//Console.WriteLine("{0},{1},{2}", i, resMeta.Count, (i) % resMeta.Count); | |||||
if (((i + 1) % resMeta.Count == 0)) | |||||
{ | |||||
Console.WriteLine(""); | |||||
} | |||||
} | |||||
// Important: need to free result to avoid memory leak. | |||||
TDengine.FreeResult(res); | |||||
} | |||||
} | |||||
public void CheckRes(IntPtr conn, IntPtr res, String errorMsg) | |||||
{ | |||||
if (TDengine.ErrorNo(res) != 0) | |||||
{ | |||||
throw new Exception($"{errorMsg} since: {TDengine.Error(res)}"); | |||||
} | |||||
} | |||||
public void ExecuteInsertSQL(IntPtr conn, string sql) | |||||
{ | |||||
try | |||||
{ | |||||
//sql = "INSERT INTO d1001 USING meters TAGS('California.SanFrancisco', 2) VALUES ('2018-10-03 14:38:05.000', 10.30000, 219, 0.31000) ('2018-10-03 14:38:15.000', 12.60000, 218, 0.33000) ('2018-10-03 14:38:16.800', 12.30000, 221, 0.31000) " + | |||||
// "d1002 USING power.meters TAGS('California.SanFrancisco', 3) VALUES('2018-10-03 14:38:16.650', 10.30000, 218, 0.25000) " + | |||||
// "d1003 USING power.meters TAGS('California.LosAngeles', 2) VALUES('2018-10-03 14:38:05.500', 11.80000, 221, 0.28000)('2018-10-03 14:38:16.600', 13.40000, 223, 0.29000) " + | |||||
// "d1004 USING power.meters TAGS('California.LosAngeles', 3) VALUES('2018-10-03 14:38:05.000', 10.80000, 223, 0.29000)('2018-10-03 14:38:06.500', 11.50000, 221, 0.35000)"; | |||||
IntPtr res = TDengine.Query(conn, sql); | |||||
CheckRes(conn, res, "failed to insert data"); | |||||
int affectedRows = TDengine.AffectRows(res); | |||||
Console.WriteLine("affectedRows " + affectedRows); | |||||
TDengine.FreeResult(res); | |||||
} | |||||
finally | |||||
{ | |||||
TDengine.Close(conn); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,7 @@ | |||||
namespace HealthMonitor.Service | |||||
{ | |||||
public class Class1 | |||||
{ | |||||
} | |||||
} |
@@ -0,0 +1,19 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<TargetFramework>net6.0</TargetFramework> | |||||
<ImplicitUsings>enable</ImplicitUsings> | |||||
<Nullable>enable</Nullable> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.0" /> | |||||
<PackageReference Include="TDengine.Connector" Version="3.0.2" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\HealthMonitor.Model\HealthMonitor.Model.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,57 @@ | |||||
using HealthMonitor.Service.Biz.db; | |||||
using Microsoft.AspNetCore.Mvc; | |||||
namespace HealthMonitor.WebApi.Controllers | |||||
{ | |||||
[ApiController] | |||||
[Route("[controller]")] | |||||
public class WeatherForecastController : ControllerBase | |||||
{ | |||||
private static readonly string[] Summaries = new[] | |||||
{ | |||||
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" | |||||
}; | |||||
private readonly ILogger<WeatherForecastController> _logger; | |||||
private readonly TDengineService _serviceTDengine; | |||||
public WeatherForecastController(ILogger<WeatherForecastController> logger, TDengineService serviceDengine) | |||||
{ | |||||
_logger = logger; | |||||
_serviceTDengine = serviceDengine; | |||||
} | |||||
//[HttpGet(Name = "GetWeatherForecast")] | |||||
//public IEnumerable<WeatherForecast> Get() | |||||
//{ | |||||
// return Enumerable.Range(1, 5).Select(index => new WeatherForecast | |||||
// { | |||||
// Date = DateTime.Now.AddDays(index), | |||||
// TemperatureC = Random.Shared.Next(-20, 55), | |||||
// Summary = Summaries[Random.Shared.Next(Summaries.Length)] | |||||
// }) | |||||
// .ToArray(); | |||||
//} | |||||
[HttpGet(Name = "GetWeatherForecast")] | |||||
public async Task<IActionResult> Get() | |||||
{ | |||||
IntPtr conn = _serviceTDengine.Connection(); | |||||
var sql = "select * from gps_bloodpress"; | |||||
//Task.Factory.StartNew(async () => | |||||
//{ | |||||
// await _serviceTDengine.ExecuteQuerySQL(conn, sql); | |||||
//}); | |||||
_serviceTDengine.ExecuteQuerySQL(conn, sql); | |||||
//var res= await _serviceAliIot.QueryDeviceStatisticseAsync(nameof(Get)); | |||||
//var online = res?.OnlineCount; | |||||
return Ok("aa"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,19 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk.Web"> | |||||
<PropertyGroup> | |||||
<TargetFramework>net6.0</TargetFramework> | |||||
<Nullable>enable</Nullable> | |||||
<ImplicitUsings>enable</ImplicitUsings> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\HealthMonitor.Common\HealthMonitor.Common.csproj" /> | |||||
<ProjectReference Include="..\HealthMonitor.Model\HealthMonitor.Model.csproj" /> | |||||
<ProjectReference Include="..\HealthMonitor.Service\HealthMonitor.Service.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,51 @@ | |||||
using HealthMonitor.Common; | |||||
using HealthMonitor.Common.helper; | |||||
using HealthMonitor.Model.Config; | |||||
using HealthMonitor.Service.Biz.db; | |||||
namespace HealthMonitor.WebApi | |||||
{ | |||||
public class Program | |||||
{ | |||||
public static void Main(string[] args) | |||||
{ | |||||
var builder = WebApplication.CreateBuilder(args); | |||||
// Add services to the container. | |||||
builder.Services.AddHttpClient(Consts.DEFAULT_HTTPCLIENT_NAME, c => | |||||
{ | |||||
c.Timeout = TimeSpan.FromSeconds(10); //³¬Ê±ÏÞÖÆ | |||||
c.DefaultRequestHeaders.Add("Accept", "application/json"); | |||||
//c.DefaultRequestHeaders.Connection.Add("keep-alive"); | |||||
}); | |||||
builder.Services.Configure<TDengineServiceConfig>(builder.Configuration.GetSection("TDengineServiceConfig")); | |||||
builder.Services.AddSingleton<HttpHelper>(); | |||||
builder.Services.AddSingleton<TDengineService>(); | |||||
builder.Services.AddControllers(); | |||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle | |||||
builder.Services.AddEndpointsApiExplorer(); | |||||
builder.Services.AddSwaggerGen(); | |||||
var app = builder.Build(); | |||||
// Configure the HTTP request pipeline. | |||||
if (app.Environment.IsDevelopment()) | |||||
{ | |||||
app.UseSwagger(); | |||||
app.UseSwaggerUI(); | |||||
} | |||||
app.UseHttpsRedirection(); | |||||
app.UseAuthorization(); | |||||
app.MapControllers(); | |||||
app.Run(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,31 @@ | |||||
{ | |||||
"$schema": "https://json.schemastore.org/launchsettings.json", | |||||
"iisSettings": { | |||||
"windowsAuthentication": false, | |||||
"anonymousAuthentication": true, | |||||
"iisExpress": { | |||||
"applicationUrl": "http://localhost:44512", | |||||
"sslPort": 44381 | |||||
} | |||||
}, | |||||
"profiles": { | |||||
"HealthMonitor.WebApi": { | |||||
"commandName": "Project", | |||||
"dotnetRunMessages": true, | |||||
"launchBrowser": true, | |||||
"launchUrl": "swagger", | |||||
"applicationUrl": "https://localhost:7149;http://localhost:5083", | |||||
"environmentVariables": { | |||||
"ASPNETCORE_ENVIRONMENT": "Development" | |||||
} | |||||
}, | |||||
"IIS Express": { | |||||
"commandName": "IISExpress", | |||||
"launchBrowser": true, | |||||
"launchUrl": "swagger", | |||||
"environmentVariables": { | |||||
"ASPNETCORE_ENVIRONMENT": "Development" | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,13 @@ | |||||
namespace HealthMonitor.WebApi | |||||
{ | |||||
public class WeatherForecast | |||||
{ | |||||
public DateTime Date { get; set; } | |||||
public int TemperatureC { get; set; } | |||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); | |||||
public string? Summary { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,16 @@ | |||||
{ | |||||
"Logging": { | |||||
"LogLevel": { | |||||
"Default": "Information", | |||||
"Microsoft.AspNetCore": "Warning" | |||||
} | |||||
}, | |||||
"TDengineServiceConfig": { | |||||
"Host": "47.116.142.20", | |||||
"UserName": "root", | |||||
"Password": "taosdata", | |||||
"Port": 6030, | |||||
"DB": "health_monitor" | |||||
} | |||||
} |
@@ -0,0 +1,9 @@ | |||||
{ | |||||
"Logging": { | |||||
"LogLevel": { | |||||
"Default": "Information", | |||||
"Microsoft.AspNetCore": "Warning" | |||||
} | |||||
}, | |||||
"AllowedHosts": "*" | |||||
} |
@@ -0,0 +1,43 @@ | |||||
| |||||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||||
# Visual Studio Version 17 | |||||
VisualStudioVersion = 17.4.33213.308 | |||||
MinimumVisualStudioVersion = 10.0.40219.1 | |||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HealthMonitor.WebApi", "HealthMonitor.WebApi\HealthMonitor.WebApi.csproj", "{9E002515-7C55-4B0E-A193-2991626539DF}" | |||||
EndProject | |||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HealthMonitor.Common", "HealthMonitor.Common\HealthMonitor.Common.csproj", "{BCEC4A3D-10B0-441D-B523-D7D5ECF5BBD8}" | |||||
EndProject | |||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HealthMonitor.Model", "HealthMonitor.Model\HealthMonitor.Model.csproj", "{D02C5E59-99CD-4842-A675-FA58124E0405}" | |||||
EndProject | |||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HealthMonitor.Service", "HealthMonitor.Service\HealthMonitor.Service.csproj", "{52135FAB-BB8B-417B-8714-7B8521E8FF38}" | |||||
EndProject | |||||
Global | |||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||||
Debug|Any CPU = Debug|Any CPU | |||||
Release|Any CPU = Release|Any CPU | |||||
EndGlobalSection | |||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||||
{9E002515-7C55-4B0E-A193-2991626539DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{9E002515-7C55-4B0E-A193-2991626539DF}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{9E002515-7C55-4B0E-A193-2991626539DF}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{9E002515-7C55-4B0E-A193-2991626539DF}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{BCEC4A3D-10B0-441D-B523-D7D5ECF5BBD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{BCEC4A3D-10B0-441D-B523-D7D5ECF5BBD8}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{BCEC4A3D-10B0-441D-B523-D7D5ECF5BBD8}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{BCEC4A3D-10B0-441D-B523-D7D5ECF5BBD8}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{D02C5E59-99CD-4842-A675-FA58124E0405}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{D02C5E59-99CD-4842-A675-FA58124E0405}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{D02C5E59-99CD-4842-A675-FA58124E0405}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{D02C5E59-99CD-4842-A675-FA58124E0405}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{52135FAB-BB8B-417B-8714-7B8521E8FF38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{52135FAB-BB8B-417B-8714-7B8521E8FF38}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{52135FAB-BB8B-417B-8714-7B8521E8FF38}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{52135FAB-BB8B-417B-8714-7B8521E8FF38}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
EndGlobalSection | |||||
GlobalSection(SolutionProperties) = preSolution | |||||
HideSolutionNode = FALSE | |||||
EndGlobalSection | |||||
GlobalSection(ExtensibilityGlobals) = postSolution | |||||
SolutionGuid = {8BD2A1C6-360A-43B0-866E-D9EF81686192} | |||||
EndGlobalSection | |||||
EndGlobal |