commit fd3f98384c52a79738aa45af5f55892e204c35cc Author: Natalia Portillo Date: Sat Nov 2 01:40:41 2019 +0000 Move server to separate folder. diff --git a/DiscImageChef.Server.Task/App.config b/DiscImageChef.Server.Task/App.config new file mode 100644 index 00000000..4980456b --- /dev/null +++ b/DiscImageChef.Server.Task/App.config @@ -0,0 +1,29 @@ + + + + + +
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server.Task/DiscImageChef.Server.Task.csproj b/DiscImageChef.Server.Task/DiscImageChef.Server.Task.csproj new file mode 100644 index 00000000..8821ad18 --- /dev/null +++ b/DiscImageChef.Server.Task/DiscImageChef.Server.Task.csproj @@ -0,0 +1,105 @@ + + + + + Debug + AnyCPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2} + Exe + Properties + DiscImageChef.Server.Task + DiscImageChef.Server.Task + v4.7.1 + true + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\..\..\tmp\claunia-temp-aspnet-0\e277a754\assembly\shadow\34ef13c2\840cc539_b0e3d6fb_00000001\DiscImageChef.CommonTypes.dll + + + ..\..\..\..\..\tmp\claunia-temp-aspnet-0\e277a754\assembly\shadow\3a88f867\8a6b2e9c_b0e3d6fb_00000001\DiscImageChef.Decoders.dll + + + ..\..\..\.nuget\packages\entityframework\6.2.0\lib\net45\EntityFramework.dll + + + + + + + + + + + + + {f8bdf57b-1571-4cd0-84b3-b422088d359a} + DiscImageChef.Helpers + + + {911addf5-e5fa-445d-88cd-c7f8ffdbe645} + DiscImageChef.Server + + + + + + + + + + + + LICENSE.LGPL + + + + + + + + + /Library/Frameworks/Mono.framework/Versions/Current/lib/mono + /usr/lib/mono + /usr/local/lib/mono + + $(BaseFrameworkPathOverrideForMono)/4.0-api + $(BaseFrameworkPathOverrideForMono)/4.5-api + $(BaseFrameworkPathOverrideForMono)/4.5.1-api + $(BaseFrameworkPathOverrideForMono)/4.5.2-api + $(BaseFrameworkPathOverrideForMono)/4.6-api + $(BaseFrameworkPathOverrideForMono)/4.6.1-api + $(BaseFrameworkPathOverrideForMono)/4.6.2-api + $(BaseFrameworkPathOverrideForMono)/4.7-api + $(BaseFrameworkPathOverrideForMono)/4.7.1-api + true + + $(FrameworkPathOverride)/Facades;$(AssemblySearchPaths) + + \ No newline at end of file diff --git a/DiscImageChef.Server.Task/Program.cs b/DiscImageChef.Server.Task/Program.cs new file mode 100644 index 00000000..5041ec53 --- /dev/null +++ b/DiscImageChef.Server.Task/Program.cs @@ -0,0 +1,435 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Program.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server Task. +// +// --[ Description ] ---------------------------------------------------------- +// +// Runs time consuming server tasks. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Data.Entity.Migrations; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using DiscImageChef.Server.Migrations; +using DiscImageChef.Server.Models; +using HtmlAgilityPack; + +namespace DiscImageChef.Server.Task +{ + class Program + { + public static void Main(string[] args) + { + DateTime start, end; + Console.WriteLine("{0}: Migrating database to latest version...", DateTime.UtcNow); + start = DateTime.UtcNow; + Configuration migratorConfig = new Configuration(); + DbMigrator dbMigrator = new DbMigrator(migratorConfig); + dbMigrator.Update(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", DateTime.UtcNow, (end - start).TotalSeconds); + + start = DateTime.UtcNow; + Console.WriteLine("{0}: Connecting to database...", DateTime.UtcNow); + DicServerContext ctx = new DicServerContext(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + WebClient client; + + try + { + Console.WriteLine("{0}: Retrieving USB IDs from Linux USB...", DateTime.UtcNow); + start = DateTime.UtcNow; + client = new WebClient(); + StringReader sr = new StringReader(client.DownloadString("http://www.linux-usb.org/usb.ids")); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + UsbVendor vendor = null; + int newVendors = 0; + int newProducts = 0; + int modifiedVendors = 0; + int modifiedProducts = 0; + int counter = 0; + + start = DateTime.UtcNow; + Console.WriteLine("{0}: Adding and updating database entries...", DateTime.UtcNow); + do + { + if(counter == 1000) + { + DateTime start2 = DateTime.UtcNow; + Console.WriteLine("{0}: Saving changes", start2); + ctx.SaveChanges(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start2).TotalSeconds); + counter = 0; + } + + string line = sr.ReadLine(); + + if(line is null) break; + + if(line.Length == 0 || line[0] == '#') continue; + + ushort number; + string name; + if(line[0] == '\t') + { + try { number = Convert.ToUInt16(line.Substring(1, 4), 16); } + catch(FormatException) { continue; } + + if(number == 0) continue; + + name = line.Substring(7); + + UsbProduct product = + ctx.UsbProducts.FirstOrDefault(p => p.ProductId == number && p.Vendor != null && + p.Vendor.VendorId == vendor.VendorId); + + if(product is null) + { + product = new UsbProduct(vendor, number, name); + ctx.UsbProducts.Add(product); + Console.WriteLine("{0}: Will add product {1} with ID {2:X4} and vendor {3} ({4:X4})", + DateTime.UtcNow, product.Product, product.ProductId, + product.Vendor?.Vendor ?? "null", product.Vendor?.VendorId ?? 0); + newProducts++; + counter++; + } + else if(name != product.Product) + { + Console + .WriteLine("{0}: Will modify product with ID {1:X4} and vendor {2} ({3:X4}) from \"{4}\" to \"{5}\"", + DateTime.UtcNow, product.ProductId, product.Vendor?.Vendor ?? "null", + product.Vendor?.VendorId ?? 0, + product.Product, name); + product.Product = name; + product.ModifiedWhen = DateTime.UtcNow; + modifiedProducts++; + counter++; + } + + continue; + } + + try { number = Convert.ToUInt16(line.Substring(0, 4), 16); } + catch(FormatException) { continue; } + + if(number == 0) continue; + + name = line.Substring(6); + + vendor = ctx.UsbVendors.FirstOrDefault(v => v.VendorId == number); + + if(vendor is null) + { + vendor = new UsbVendor(number, name); + ctx.UsbVendors.Add(vendor); + Console.WriteLine("{0}: Will add vendor {1} with ID {2:X4}", DateTime.UtcNow, vendor.Vendor, + vendor.VendorId); + newVendors++; + counter++; + } + else if(name != vendor.Vendor) + { + Console.WriteLine("{0}: Will modify vendor with ID {1:X4} from \"{2}\" to \"{3}\"", + DateTime.UtcNow, vendor.VendorId, vendor.Vendor, name); + vendor.Vendor = name; + vendor.ModifiedWhen = DateTime.UtcNow; + modifiedVendors++; + counter++; + } + } + while(true); + + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Saving database changes...", DateTime.UtcNow); + start = DateTime.UtcNow; + ctx.SaveChanges(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: {1} vendors added.", DateTime.UtcNow, newVendors); + Console.WriteLine("{0}: {1} products added.", DateTime.UtcNow, newProducts); + Console.WriteLine("{0}: {1} vendors modified.", DateTime.UtcNow, modifiedVendors); + Console.WriteLine("{0}: {1} products modified.", DateTime.UtcNow, modifiedProducts); + + Console.WriteLine("{0}: Looking up a vendor", DateTime.UtcNow); + start = DateTime.UtcNow; + vendor = ctx.UsbVendors.FirstOrDefault(v => v.VendorId == 0x8086); + if(vendor is null) Console.WriteLine("{0}: Error, could not find vendor.", DateTime.UtcNow); + else + Console.WriteLine("{0}: Found {1}.", DateTime.UtcNow, + vendor.Vendor); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Looking up a product", DateTime.UtcNow); + start = DateTime.UtcNow; + UsbProduct prd = + ctx.UsbProducts.FirstOrDefault(p => p.ProductId == 0x0001 && p.Vendor.VendorId == 0x8086); + if(prd is null) Console.WriteLine("{0}: Error, could not find product.", DateTime.UtcNow); + else Console.WriteLine("{0}: Found {1}.", DateTime.UtcNow, prd.Product); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + } + catch(Exception ex) + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + Console.WriteLine("{0}: Exception {1} filling USB IDs...", DateTime.UtcNow, ex); + } + + Console.WriteLine("{0}: Fixing all devices without modification time...", DateTime.UtcNow); + start = DateTime.UtcNow; + foreach(Device device in ctx.Devices.Where(d => d.ModifiedWhen == null)) + device.ModifiedWhen = device.AddedWhen; + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Committing changes...", DateTime.UtcNow); + start = DateTime.UtcNow; + ctx.SaveChanges(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + try + { + Console.WriteLine("{0}: Retrieving CompactDisc read offsets from AccurateRip...", DateTime.UtcNow); + start = DateTime.UtcNow; + + client = new WebClient(); + string html = client.DownloadString("http://www.accuraterip.com/driveoffsets.htm"); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + // The HTML is too malformed to process easily, so find start of table + html = "" + + html.Substring(html.IndexOf("
", StringComparison.Ordinal)); + + HtmlDocument doc = new HtmlDocument(); + doc.LoadHtml(html); + HtmlNode firstTable = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/table[1]"); + + bool firstRow = true; + + int addedOffsets = 0; + int modifiedOffsets = 0; + + Console.WriteLine("{0}: Processing offsets...", DateTime.UtcNow); + start = DateTime.UtcNow; + foreach(HtmlNode row in firstTable.Descendants("tr")) + { + HtmlNode[] columns = row.Descendants("td").ToArray(); + + if(columns.Length != 4) + { + Console.WriteLine("{0}: Row does not have correct number of columns...", DateTime.UtcNow); + continue; + } + + string column0 = columns[0].InnerText; + string column1 = columns[1].InnerText; + string column2 = columns[2].InnerText; + string column3 = columns[3].InnerText; + + if(firstRow) + { + if(column0.ToLowerInvariant() != "cd drive") + { + Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow, + columns[0].InnerText); + break; + } + + if(column1.ToLowerInvariant() != "correction offset") + { + Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow, + columns[1].InnerText); + break; + } + + if(column2.ToLowerInvariant() != "submitted by") + { + Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow, + columns[2].InnerText); + break; + } + + if(column3.ToLowerInvariant() != "percentage agree") + { + Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow, + columns[3].InnerText); + break; + } + + firstRow = false; + continue; + } + + string manufacturer; + string model; + + if(column0[0] == '-' && column0[1] == ' ') + { + manufacturer = null; + model = column0.Substring(2).Trim(); + } + else + { + int cutOffset = column0.IndexOf(" - ", StringComparison.Ordinal); + + if(cutOffset == -1) + { + manufacturer = null; + model = column0; + } + else + { + manufacturer = column0.Substring(0, cutOffset).Trim(); + model = column0.Substring(cutOffset + 3).Trim(); + } + } + + switch(manufacturer) + { + case "Lite-ON": + manufacturer = "JLMS"; + break; + case "LG Electronics": + manufacturer = "HL-DT-ST"; + break; + case "Panasonic": + manufacturer = "MATSHITA"; + break; + } + + CompactDiscOffset cdOffset = + ctx.CdOffsets.FirstOrDefault(o => o.Manufacturer == manufacturer && o.Model == model); + + if(column1.ToLowerInvariant() == "[purged]") + { + if(cdOffset != null) ctx.CdOffsets.Remove(cdOffset); + continue; + } + + if(!short.TryParse(column1, out short offset)) continue; + if(!int.TryParse(column2, out int submissions)) continue; + + if(column3[column3.Length - 1] != '%') continue; + + column3 = column3.Substring(0, column3.Length - 1); + + if(!float.TryParse(column3, out float percentage)) continue; + + percentage /= 100; + + if(cdOffset is null) + { + cdOffset = new CompactDiscOffset + { + AddedWhen = DateTime.UtcNow, + ModifiedWhen = DateTime.UtcNow, + Agreement = percentage, + Manufacturer = manufacturer, + Model = model, + Offset = offset, + Submissions = submissions + }; + + ctx.CdOffsets.Add(cdOffset); + addedOffsets++; + } + else + { + if(Math.Abs(cdOffset.Agreement - percentage) > 0) + { + cdOffset.Agreement = percentage; + cdOffset.ModifiedWhen = DateTime.UtcNow; + } + + if(cdOffset.Offset != offset) + { + cdOffset.Offset = offset; + cdOffset.ModifiedWhen = DateTime.UtcNow; + } + + if(cdOffset.Submissions != submissions) + { + cdOffset.Submissions = submissions; + cdOffset.ModifiedWhen = DateTime.UtcNow; + } + + if(Math.Abs(cdOffset.Agreement - percentage) > 0 || cdOffset.Offset != offset || + cdOffset.Submissions != submissions) modifiedOffsets++; + } + + foreach(Device device in ctx + .Devices + .Where(d => d.Manufacturer == null && d.Model != null && + d.Model.Trim() == model) + .Union(ctx.Devices.Where(d => d.Manufacturer != null && + d.Manufacturer.Trim() == manufacturer && + d.Model != null && + d.Model == model))) + { + if(device.CdOffset == cdOffset && device.ModifiedWhen == cdOffset.ModifiedWhen) continue; + + device.CdOffset = cdOffset; + device.ModifiedWhen = cdOffset.ModifiedWhen; + } + } + + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Committing changes...", DateTime.UtcNow); + start = DateTime.UtcNow; + ctx.SaveChanges(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Added {1} offsets", end, addedOffsets); + Console.WriteLine("{0}: Modified {1} offsets", end, modifiedOffsets); + } + catch(Exception ex) + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + Console.WriteLine("{0}: Exception {1} filling CompactDisc read offsets...", DateTime.UtcNow, ex); + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server.Task/Properties/AssemblyInfo.cs b/DiscImageChef.Server.Task/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..0952c4ca --- /dev/null +++ b/DiscImageChef.Server.Task/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DiscImageChef.Server.Task")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DiscImageChef.Server.Task")] +[assembly: AssemblyCopyright("Copyright © 2011-2019 Natalia Portillo")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("4.5.99.1693")] +[assembly: AssemblyFileVersion("4.5.99.1693")] \ No newline at end of file diff --git a/DiscImageChef.Server.sln b/DiscImageChef.Server.sln new file mode 100644 index 00000000..e532070e --- /dev/null +++ b/DiscImageChef.Server.sln @@ -0,0 +1,61 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28922.388 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Server", "DiscImageChef.Server\DiscImageChef.Server.csproj", "{911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.CommonTypes", "DiscImageChef.CommonTypes\DiscImageChef.CommonTypes.csproj", "{F2B84194-26EB-4227-B1C5-6602517E85AE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.Decoders", "DiscImageChef.Decoders\DiscImageChef.Decoders.csproj", "{0BEB3088-B634-4289-AE17-CDF2D25D00D5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.Dto", "DiscImageChef.Dto\DiscImageChef.Dto.csproj", "{F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.Helpers", "DiscImageChef.Helpers\DiscImageChef.Helpers.csproj", "{F8BDF57B-1571-4CD0-84B3-B422088D359A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.Console", "DiscImageChef.Console\DiscImageChef.Console.csproj", "{CCAA7AFE-C094-4D82-A66D-630DE8A3F545}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Server.Task", "DiscImageChef.Server.Task\DiscImageChef.Server.Task.csproj", "{79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}.Debug|Any CPU.Build.0 = Debug|Any CPU + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}.Release|Any CPU.ActiveCfg = Release|Any CPU + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}.Release|Any CPU.Build.0 = Release|Any CPU + {F2B84194-26EB-4227-B1C5-6602517E85AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2B84194-26EB-4227-B1C5-6602517E85AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2B84194-26EB-4227-B1C5-6602517E85AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2B84194-26EB-4227-B1C5-6602517E85AE}.Release|Any CPU.Build.0 = Release|Any CPU + {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Release|Any CPU.Build.0 = Release|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Release|Any CPU.Build.0 = Release|Any CPU + {F8BDF57B-1571-4CD0-84B3-B422088D359A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8BDF57B-1571-4CD0-84B3-B422088D359A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8BDF57B-1571-4CD0-84B3-B422088D359A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8BDF57B-1571-4CD0-84B3-B422088D359A}.Release|Any CPU.Build.0 = Release|Any CPU + {CCAA7AFE-C094-4D82-A66D-630DE8A3F545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCAA7AFE-C094-4D82-A66D-630DE8A3F545}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCAA7AFE-C094-4D82-A66D-630DE8A3F545}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCAA7AFE-C094-4D82-A66D-630DE8A3F545}.Release|Any CPU.Build.0 = Release|Any CPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8A988A8F-0588-4935-AAB6-64E34A68CE30} + EndGlobalSection +EndGlobal diff --git a/DiscImageChef.Server/App_Start/Ata.cs b/DiscImageChef.Server/App_Start/Ata.cs new file mode 100644 index 00000000..fb793c88 --- /dev/null +++ b/DiscImageChef.Server/App_Start/Ata.cs @@ -0,0 +1,1498 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Ata.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes ATA information from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.ATA; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + public static class Ata + { + /// + /// Takes the ATA part of a device report and prints it as a list of values and another list of key=value pairs to be + /// sequenced by ASP.NET in the rendering + /// + /// ATA part of a device report + /// true if compact flash device + /// true if atapi device + /// true if removable device + /// List to put values on + /// List to put key=value pairs on + /// List of tested media + public static void Report(CommonTypes.Metadata.Ata ataReport, bool cfa, bool atapi, + ref bool removable, + ref List ataOneValue, ref Dictionary ataTwoValue, + ref List testedMedia) + { + uint logicalsectorsize = 0; + + Identify.IdentifyDevice? ataIdentifyNullable = Identify.Decode(ataReport.Identify); + if(!ataIdentifyNullable.HasValue) return; + + Identify.IdentifyDevice ataIdentify = ataIdentifyNullable.Value; + + if(!string.IsNullOrEmpty(ataIdentify.Model)) ataTwoValue.Add("Model", ataIdentify.Model); + if(!string.IsNullOrEmpty(ataIdentify.FirmwareRevision)) + ataTwoValue.Add("Firmware revision", ataIdentify.FirmwareRevision); + if(!string.IsNullOrEmpty(ataIdentify.AdditionalPID)) + ataTwoValue.Add("Additional product ID", ataIdentify.AdditionalPID); + + bool ata1 = false, + ata2 = false, + ata3 = false, + ata4 = false, + ata5 = false, + ata6 = false, + ata7 = false, + acs = false, + acs2 = false, + acs3 = false, + acs4 = false; + + if((ushort)ataIdentify.MajorVersion == 0x0000 || (ushort)ataIdentify.MajorVersion == 0xFFFF) + { + // Obsolete in ATA-2, if present, device supports ATA-1 + ata1 |= ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.FastIDE) || + ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SlowIDE) || + ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.UltraFastIDE); + + ata2 |= ataIdentify.ExtendedIdentify.HasFlag(Identify.ExtendedIdentifyBit.Words54to58Valid) || + ataIdentify.ExtendedIdentify.HasFlag(Identify.ExtendedIdentifyBit.Words64to70Valid) || + ataIdentify.ExtendedIdentify.HasFlag(Identify.ExtendedIdentifyBit.Word88Valid); + + if(!ata1 && !ata2 && !atapi && !cfa) ata2 = true; + + ata4 |= atapi; + ata3 |= cfa; + + if(cfa && ata1) ata1 = false; + if(cfa && ata2) ata2 = false; + } + else + { + ata1 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata1); + ata2 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata2); + ata3 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata3); + ata4 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi4); + ata5 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi5); + ata6 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi6); + ata7 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi7); + acs |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata8ACS); + acs2 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.ACS2); + acs3 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.ACS3); + acs4 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.ACS4); + } + + int maxatalevel = 0; + int minatalevel = 255; + string tmpString = ""; + if(ata1) + { + tmpString += "ATA-1 "; + maxatalevel = 1; + if(minatalevel > 1) minatalevel = 1; + } + + if(ata2) + { + tmpString += "ATA-2 "; + maxatalevel = 2; + if(minatalevel > 2) minatalevel = 2; + } + + if(ata3) + { + tmpString += "ATA-3 "; + maxatalevel = 3; + if(minatalevel > 3) minatalevel = 3; + } + + if(ata4) + { + tmpString += "ATA/ATAPI-4 "; + maxatalevel = 4; + if(minatalevel > 4) minatalevel = 4; + } + + if(ata5) + { + tmpString += "ATA/ATAPI-5 "; + maxatalevel = 5; + if(minatalevel > 5) minatalevel = 5; + } + + if(ata6) + { + tmpString += "ATA/ATAPI-6 "; + maxatalevel = 6; + if(minatalevel > 6) minatalevel = 6; + } + + if(ata7) + { + tmpString += "ATA/ATAPI-7 "; + maxatalevel = 7; + if(minatalevel > 7) minatalevel = 7; + } + + if(acs) + { + tmpString += "ATA8-ACS "; + maxatalevel = 8; + if(minatalevel > 8) minatalevel = 8; + } + + if(acs2) + { + tmpString += "ATA8-ACS2 "; + maxatalevel = 9; + if(minatalevel > 9) minatalevel = 9; + } + + if(acs3) + { + tmpString += "ATA8-ACS3 "; + maxatalevel = 10; + if(minatalevel > 10) minatalevel = 10; + } + + if(acs4) + { + tmpString += "ATA8-ACS4 "; + maxatalevel = 11; + if(minatalevel > 11) minatalevel = 11; + } + + if(tmpString != "") ataTwoValue.Add("Supported ATA versions", tmpString); + + if(maxatalevel >= 3) + { + switch(ataIdentify.MinorVersion) + { + case 0x0000: + case 0xFFFF: + tmpString = "Minor ATA version not specified"; + break; + case 0x0001: + tmpString = "ATA (ATA-1) X3T9.2 781D prior to revision 4"; + break; + case 0x0002: + tmpString = "ATA-1 published, ANSI X3.221-1994"; + break; + case 0x0003: + tmpString = "ATA (ATA-1) X3T9.2 781D revision 4"; + break; + case 0x0004: + tmpString = "ATA-2 published, ANSI X3.279-1996"; + break; + case 0x0005: + tmpString = "ATA-2 X3T10 948D prior to revision 2k"; + break; + case 0x0006: + tmpString = "ATA-3 X3T10 2008D revision 1"; + break; + case 0x0007: + tmpString = "ATA-2 X3T10 948D revision 2k"; + break; + case 0x0008: + tmpString = "ATA-3 X3T10 2008D revision 0"; + break; + case 0x0009: + tmpString = "ATA-2 X3T10 948D revision 3"; + break; + case 0x000A: + tmpString = "ATA-3 published, ANSI X3.298-1997"; + break; + case 0x000B: + tmpString = "ATA-3 X3T10 2008D revision 6"; + break; + case 0x000C: + tmpString = "ATA-3 X3T13 2008D revision 7"; + break; + case 0x000D: + tmpString = "ATA/ATAPI-4 X3T13 1153D revision 6"; + break; + case 0x000E: + tmpString = "ATA/ATAPI-4 T13 1153D revision 13"; + break; + case 0x000F: + tmpString = "ATA/ATAPI-4 X3T13 1153D revision 7"; + break; + case 0x0010: + tmpString = "ATA/ATAPI-4 T13 1153D revision 18"; + break; + case 0x0011: + tmpString = "ATA/ATAPI-4 T13 1153D revision 15"; + break; + case 0x0012: + tmpString = "ATA/ATAPI-4 published, ANSI INCITS 317-1998"; + break; + case 0x0013: + tmpString = "ATA/ATAPI-5 T13 1321D revision 3"; + break; + case 0x0014: + tmpString = "ATA/ATAPI-4 T13 1153D revision 14"; + break; + case 0x0015: + tmpString = "ATA/ATAPI-5 T13 1321D revision 1"; + break; + case 0x0016: + tmpString = "ATA/ATAPI-5 published, ANSI INCITS 340-2000"; + break; + case 0x0017: + tmpString = "ATA/ATAPI-4 T13 1153D revision 17"; + break; + case 0x0018: + tmpString = "ATA/ATAPI-6 T13 1410D revision 0"; + break; + case 0x0019: + tmpString = "ATA/ATAPI-6 T13 1410D revision 3a"; + break; + case 0x001A: + tmpString = "ATA/ATAPI-7 T13 1532D revision 1"; + break; + case 0x001B: + tmpString = "ATA/ATAPI-6 T13 1410D revision 2"; + break; + case 0x001C: + tmpString = "ATA/ATAPI-6 T13 1410D revision 1"; + break; + case 0x001D: + tmpString = "ATA/ATAPI-7 published ANSI INCITS 397-2005"; + break; + case 0x001E: + tmpString = "ATA/ATAPI-7 T13 1532D revision 0"; + break; + case 0x001F: + tmpString = "ACS-3 Revision 3b"; + break; + case 0x0021: + tmpString = "ATA/ATAPI-7 T13 1532D revision 4a"; + break; + case 0x0022: + tmpString = "ATA/ATAPI-6 published, ANSI INCITS 361-2002"; + break; + case 0x0027: + tmpString = "ATA8-ACS revision 3c"; + break; + case 0x0028: + tmpString = "ATA8-ACS revision 6"; + break; + case 0x0029: + tmpString = "ATA8-ACS revision 4"; + break; + case 0x0031: + tmpString = "ACS-2 Revision 2"; + break; + case 0x0033: + tmpString = "ATA8-ACS Revision 3e"; + break; + case 0x0039: + tmpString = "ATA8-ACS Revision 4c"; + break; + case 0x0042: + tmpString = "ATA8-ACS Revision 3f"; + break; + case 0x0052: + tmpString = "ATA8-ACS revision 3b"; + break; + case 0x006D: + tmpString = "ACS-3 Revision 5"; + break; + case 0x0082: + tmpString = "ACS-2 published, ANSI INCITS 482-2012"; + break; + case 0x0107: + tmpString = "ATA8-ACS revision 2d"; + break; + case 0x0110: + tmpString = "ACS-2 Revision 3"; + break; + case 0x011B: + tmpString = "ACS-3 Revision 4"; + break; + default: + tmpString = $"Unknown ATA revision 0x{ataIdentify.MinorVersion:X4}"; + break; + } + + ataTwoValue.Add("Maximum ATA revision supported", tmpString); + } + + tmpString = ""; + switch((ataIdentify.TransportMajorVersion & 0xF000) >> 12) + { + case 0x0: + if((ataIdentify.TransportMajorVersion & 0x0002) == 0x0002) tmpString += "ATA/ATAPI-7 "; + if((ataIdentify.TransportMajorVersion & 0x0001) == 0x0001) tmpString += "ATA8-APT "; + ataTwoValue.Add("Parallel ATA device", tmpString); + break; + case 0x1: + if((ataIdentify.TransportMajorVersion & 0x0001) == 0x0001) tmpString += "ATA8-AST "; + if((ataIdentify.TransportMajorVersion & 0x0002) == 0x0002) tmpString += "SATA 1.0a "; + if((ataIdentify.TransportMajorVersion & 0x0004) == 0x0004) tmpString += "SATA II Extensions "; + if((ataIdentify.TransportMajorVersion & 0x0008) == 0x0008) tmpString += "SATA 2.5 "; + if((ataIdentify.TransportMajorVersion & 0x0010) == 0x0010) tmpString += "SATA 2.6 "; + if((ataIdentify.TransportMajorVersion & 0x0020) == 0x0020) tmpString += "SATA 3.0 "; + if((ataIdentify.TransportMajorVersion & 0x0040) == 0x0040) tmpString += "SATA 3.1 "; + ataTwoValue.Add("Serial ATA device: ", tmpString); + break; + case 0xE: + ataTwoValue.Add("SATA Express device", "No version"); + break; + default: + ataTwoValue.Add("Unknown transport type", + $"0x{(ataIdentify.TransportMajorVersion & 0xF000) >> 12:X1}"); + break; + } + + if(atapi) + { + // Bits 12 to 8, SCSI Peripheral Device Type + switch((PeripheralDeviceTypes)(((ushort)ataIdentify.GeneralConfiguration & 0x1F00) >> 8)) + { + case PeripheralDeviceTypes.DirectAccess: //0x00, + ataOneValue.Add("ATAPI Direct-access device"); + break; + case PeripheralDeviceTypes.SequentialAccess: //0x01, + ataOneValue.Add("ATAPI Sequential-access device"); + break; + case PeripheralDeviceTypes.PrinterDevice: //0x02, + ataOneValue.Add("ATAPI Printer device"); + break; + case PeripheralDeviceTypes.ProcessorDevice: //0x03, + ataOneValue.Add("ATAPI Processor device"); + break; + case PeripheralDeviceTypes.WriteOnceDevice: //0x04, + ataOneValue.Add("ATAPI Write-once device"); + break; + case PeripheralDeviceTypes.MultiMediaDevice: //0x05, + ataOneValue.Add("ATAPI CD-ROM/DVD/etc device"); + break; + case PeripheralDeviceTypes.ScannerDevice: //0x06, + ataOneValue.Add("ATAPI Scanner device"); + break; + case PeripheralDeviceTypes.OpticalDevice: //0x07, + ataOneValue.Add("ATAPI Optical memory device"); + break; + case PeripheralDeviceTypes.MediumChangerDevice: //0x08, + ataOneValue.Add("ATAPI Medium change device"); + break; + case PeripheralDeviceTypes.CommsDevice: //0x09, + ataOneValue.Add("ATAPI Communications device"); + break; + case PeripheralDeviceTypes.PrePressDevice1: //0x0A, + ataOneValue.Add("ATAPI Graphics arts pre-press device (defined in ASC IT8)"); + break; + case PeripheralDeviceTypes.PrePressDevice2: //0x0B, + ataOneValue.Add("ATAPI Graphics arts pre-press device (defined in ASC IT8)"); + break; + case PeripheralDeviceTypes.ArrayControllerDevice: //0x0C, + ataOneValue.Add("ATAPI Array controller device"); + break; + case PeripheralDeviceTypes.EnclosureServiceDevice: //0x0D, + ataOneValue.Add("ATAPI Enclosure services device"); + break; + case PeripheralDeviceTypes.SimplifiedDevice: //0x0E, + ataOneValue.Add("ATAPI Simplified direct-access device"); + break; + case PeripheralDeviceTypes.OCRWDevice: //0x0F, + ataOneValue.Add("ATAPI Optical card reader/writer device"); + break; + case PeripheralDeviceTypes.BridgingExpander: //0x10, + ataOneValue.Add("ATAPI Bridging Expanders"); + break; + case PeripheralDeviceTypes.ObjectDevice: //0x11, + ataOneValue.Add("ATAPI Object-based Storage Device"); + break; + case PeripheralDeviceTypes.ADCDevice: //0x12, + ataOneValue.Add("ATAPI Automation/Drive Interface"); + break; + case PeripheralDeviceTypes.WellKnownDevice: //0x1E, + ataOneValue.Add("ATAPI Well known logical unit"); + break; + case PeripheralDeviceTypes.UnknownDevice: //0x1F + ataOneValue.Add("ATAPI Unknown or no device type"); + break; + default: + ataOneValue + .Add($"ATAPI Unknown device type field value 0x{((ushort)ataIdentify.GeneralConfiguration & 0x1F00) >> 8:X2}"); + break; + } + + // ATAPI DRQ behaviour + switch(((ushort)ataIdentify.GeneralConfiguration & 0x60) >> 5) + { + case 0: + ataOneValue.Add("Device shall set DRQ within 3 ms of receiving PACKET"); + break; + case 1: + ataOneValue.Add("Device shall assert INTRQ when DRQ is set to one"); + break; + case 2: + ataOneValue.Add("Device shall set DRQ within 50 µs of receiving PACKET"); + break; + default: + ataOneValue + .Add($"Unknown ATAPI DRQ behaviour code {((ushort)ataIdentify.GeneralConfiguration & 0x60) >> 5}"); + break; + } + + // ATAPI PACKET size + switch((ushort)ataIdentify.GeneralConfiguration & 0x03) + { + case 0: + ataOneValue.Add("ATAPI device uses 12 byte command packet"); + break; + case 1: + ataOneValue.Add("ATAPI device uses 16 byte command packet"); + break; + default: + ataOneValue + .Add($"Unknown ATAPI packet size code {(ushort)ataIdentify.GeneralConfiguration & 0x03}"); + break; + } + } + else if(!cfa) + { + if(minatalevel >= 5) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.IncompleteResponse)) + ataOneValue.Add("Incomplete identify response"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.NonMagnetic)) + ataOneValue.Add("Device uses non-magnetic media"); + + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.Removable)) + ataOneValue.Add("Device is removable"); + + if(minatalevel <= 5) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.Fixed)) + ataOneValue.Add("Device is fixed"); + + if(ata1) + { + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SlowIDE)) + ataOneValue.Add("Device transfer rate is <= 5 Mb/s"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.FastIDE)) + ataOneValue.Add("Device transfer rate is > 5 Mb/s but <= 10 Mb/s"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.UltraFastIDE)) + ataOneValue.Add("Device transfer rate is > 10 Mb/s"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SoftSector)) + ataOneValue.Add("Device is soft sectored"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.HardSector)) + ataOneValue.Add("Device is hard sectored"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.NotMFM)) + ataOneValue.Add("Device is not MFM encoded"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.FormatGapReq)) + ataOneValue.Add("Format speed tolerance gap is required"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.TrackOffset)) + ataOneValue.Add("Track offset option is available"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.DataStrobeOffset)) + ataOneValue.Add("Data strobe offset option is available"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit + .RotationalSpeedTolerance)) + ataOneValue.Add("Rotational speed tolerance is higher than 0,5%"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SpindleControl)) + ataOneValue.Add("Spindle motor control is implemented"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.HighHeadSwitch)) + ataOneValue.Add("Head switch time is bigger than 15 µs."); + } + } + + if((ushort)ataIdentify.SpecificConfiguration != 0x0000 && + (ushort)ataIdentify.SpecificConfiguration != 0xFFFF) + switch(ataIdentify.SpecificConfiguration) + { + case Identify.SpecificConfigurationEnum.RequiresSetIncompleteResponse: + ataOneValue + .Add("Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete."); + break; + case Identify.SpecificConfigurationEnum.RequiresSetCompleteResponse: + ataOneValue + .Add("Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is complete."); + break; + case Identify.SpecificConfigurationEnum.NotRequiresSetIncompleteResponse: + ataOneValue + .Add("Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete."); + break; + case Identify.SpecificConfigurationEnum.NotRequiresSetCompleteResponse: + ataOneValue + .Add("Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is complete."); + break; + default: + ataOneValue + .Add($"Unknown device specific configuration 0x{(ushort)ataIdentify.SpecificConfiguration:X4}"); + break; + } + + // Obsolete since ATA-2, however, it is yet used in ATA-8 devices + if(ataIdentify.BufferSize != 0x0000 && ataIdentify.BufferSize != 0xFFFF && + ataIdentify.BufferType != 0x0000 && ataIdentify.BufferType != 0xFFFF) + switch(ataIdentify.BufferType) + { + case 1: + ataOneValue + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of single ported single sector buffer"); + break; + case 2: + ataOneValue + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of dual ported multi sector buffer"); + break; + case 3: + ataOneValue + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of dual ported multi sector buffer with read caching"); + break; + default: + ataOneValue + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of unknown type {ataIdentify.BufferType} buffer"); + break; + } + + ataOneValue.Add("Device capabilities:"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.StandardStanbyTimer)) + ataOneValue.Add("Standby time values are standard"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.IORDY)) + ataOneValue.Add(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.CanDisableIORDY) + ? "IORDY is supported and can be disabled" + : "IORDY is supported"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.DMASupport)) + ataOneValue.Add("DMA is supported"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.PhysicalAlignment1) || + ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.PhysicalAlignment0)) + ataOneValue.Add($"Long Physical Alignment setting is {(ushort)ataIdentify.Capabilities & 0x03}"); + if(atapi) + { + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.InterleavedDMA)) + ataOneValue.Add("ATAPI device supports interleaved DMA"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.CommandQueue)) + ataOneValue.Add("ATAPI device supports command queueing"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.OverlapOperation)) + ataOneValue.Add("ATAPI device supports overlapped operations"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.RequiresATASoftReset)) + ataOneValue.Add("ATAPI device requires ATA software reset"); + } + + if(ataIdentify.Capabilities2.HasFlag(Identify.CapabilitiesBit2.MustBeSet) && + !ataIdentify.Capabilities2.HasFlag(Identify.CapabilitiesBit2.MustBeClear)) + if(ataIdentify.Capabilities2.HasFlag(Identify.CapabilitiesBit2.SpecificStandbyTimer)) + ataOneValue.Add("Device indicates a specific minimum standby timer value"); + + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.MultipleValid)) + { + ataOneValue.Add($"A maximum of {ataIdentify.MultipleSectorNumber} sectors can be transferred per interrupt on READ/WRITE MULTIPLE"); + ataOneValue.Add($"Device supports setting a maximum of {ataIdentify.MultipleMaxSectors} sectors"); + } + + if(ata1) + if(ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.TrustedComputing)) + ataOneValue.Add("Device supports doubleword I/O"); + + if(minatalevel <= 3) + { + if(ataIdentify.PIOTransferTimingMode > 0) + ataTwoValue.Add("PIO timing mode", $"{ataIdentify.PIOTransferTimingMode}"); + if(ataIdentify.DMATransferTimingMode > 0) + ataTwoValue.Add("DMA timing mode", $"{ataIdentify.DMATransferTimingMode}"); + } + + tmpString = ""; + + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode0)) tmpString += "PIO0 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode1)) tmpString += "PIO1 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode2)) tmpString += "PIO2 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode3)) tmpString += "PIO3 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode4)) tmpString += "PIO4 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode5)) tmpString += "PIO5 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode6)) tmpString += "PIO6 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode7)) tmpString += "PIO7 "; + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Advanced PIO", tmpString); + + if(minatalevel <= 3 && !atapi) + { + tmpString = ""; + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode0)) + { + tmpString += "DMA0 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode0)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode1)) + { + tmpString += "DMA1 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode1)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode2)) + { + tmpString += "DMA2 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode2)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode3)) + { + tmpString += "DMA3 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode3)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode4)) + { + tmpString += "DMA4 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode4)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode5)) + { + tmpString += "DMA5 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode5)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode6)) + { + tmpString += "DMA6 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode6)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode7)) + { + tmpString += "DMA7 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode7)) tmpString += "(active) "; + } + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Single-word DMA", tmpString); + } + + tmpString = ""; + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode0)) + { + tmpString += "MDMA0 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode0)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode1)) + { + tmpString += "MDMA1 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode1)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode2)) + { + tmpString += "MDMA2 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode2)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode3)) + { + tmpString += "MDMA3 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode3)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode4)) + { + tmpString += "MDMA4 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode4)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode5)) + { + tmpString += "MDMA5 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode5)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode6)) + { + tmpString += "MDMA6 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode6)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode7)) + { + tmpString += "MDMA7 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode7)) tmpString += "(active) "; + } + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Multi-word DMA", tmpString); + + tmpString = ""; + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode0)) + { + tmpString += "UDMA0 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode0)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode1)) + { + tmpString += "UDMA1 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode1)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode2)) + { + tmpString += "UDMA2 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode2)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode3)) + { + tmpString += "UDMA3 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode3)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode4)) + { + tmpString += "UDMA4 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode4)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode5)) + { + tmpString += "UDMA5 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode5)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode6)) + { + tmpString += "UDMA6 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode6)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode7)) + { + tmpString += "UDMA7 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode7)) tmpString += "(active) "; + } + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Ultra DMA", tmpString); + + if(ataIdentify.MinMDMACycleTime != 0 && ataIdentify.RecMDMACycleTime != 0) + ataOneValue.Add($"At minimum {ataIdentify.MinMDMACycleTime} ns. transfer cycle time per word in MDMA, " + + $"{ataIdentify.RecMDMACycleTime} ns. recommended"); + if(ataIdentify.MinPIOCycleTimeNoFlow != 0) + ataOneValue.Add($"At minimum {ataIdentify.MinPIOCycleTimeNoFlow} ns. transfer cycle time per word in PIO, " + + "without flow control"); + if(ataIdentify.MinPIOCycleTimeFlow != 0) + ataOneValue.Add($"At minimum {ataIdentify.MinPIOCycleTimeFlow} ns. transfer cycle time per word in PIO, " + + "with IORDY flow control"); + + if(ataIdentify.MaxQueueDepth != 0) + ataOneValue.Add($"{ataIdentify.MaxQueueDepth + 1} depth of queue maximum"); + + if(atapi) + { + if(ataIdentify.PacketBusRelease != 0) + ataOneValue + .Add($"{ataIdentify.PacketBusRelease} ns. typical to release bus from receipt of PACKET"); + if(ataIdentify.ServiceBusyClear != 0) + ataOneValue + .Add($"{ataIdentify.ServiceBusyClear} ns. typical to clear BSY bit from receipt of SERVICE"); + } + + if((ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0x1 || + (ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0xE) + { + if(!ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Clear)) + { + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Gen1Speed)) + ataOneValue.Add("SATA 1.5Gb/s is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Gen2Speed)) + ataOneValue.Add("SATA 3.0Gb/s is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Gen3Speed)) + ataOneValue.Add("SATA 6.0Gb/s is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.PowerReceipt)) + ataOneValue.Add("Receipt of host initiated power management requests is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.PHYEventCounter)) + ataOneValue.Add("PHY Event counters are supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.HostSlumbTrans)) + ataOneValue.Add("Supports host automatic partial to slumber transitions is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.DevSlumbTrans)) + ataOneValue.Add("Supports device automatic partial to slumber transitions is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.NCQ)) + { + ataOneValue.Add("NCQ is supported"); + + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.NCQPriority)) + ataOneValue.Add("NCQ priority is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.UnloadNCQ)) + ataOneValue.Add("Unload is supported with outstanding NCQ commands"); + } + } + + if(!ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.Clear)) + { + if(!ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Clear) && + ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.NCQ)) + { + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.NCQMgmt)) + ataOneValue.Add("NCQ queue management is supported"); + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.NCQStream)) + ataOneValue.Add("NCQ streaming is supported"); + } + + if(atapi) + { + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.HostEnvDetect)) + ataOneValue.Add("ATAPI device supports host environment detection"); + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.DevAttSlimline)) + ataOneValue.Add("ATAPI device supports attention on slimline connected devices"); + } + } + } + + if(ataIdentify.InterseekDelay != 0x0000 && ataIdentify.InterseekDelay != 0xFFFF) + ataOneValue.Add($"{ataIdentify.InterseekDelay} microseconds of interseek delay for ISO-7779 accoustic testing"); + + if((ushort)ataIdentify.DeviceFormFactor != 0x0000 && (ushort)ataIdentify.DeviceFormFactor != 0xFFFF) + switch(ataIdentify.DeviceFormFactor) + { + case Identify.DeviceFormFactorEnum.FiveAndQuarter: + ataOneValue.Add("Device nominal size is 5.25\""); + break; + case Identify.DeviceFormFactorEnum.ThreeAndHalf: + ataOneValue.Add("Device nominal size is 3.5\""); + break; + case Identify.DeviceFormFactorEnum.TwoAndHalf: + ataOneValue.Add("Device nominal size is 2.5\""); + break; + case Identify.DeviceFormFactorEnum.OnePointEight: + ataOneValue.Add("Device nominal size is 1.8\""); + break; + case Identify.DeviceFormFactorEnum.LessThanOnePointEight: + ataOneValue.Add("Device nominal size is smaller than 1.8\""); + break; + default: + ataOneValue.Add($"Device nominal size field value {ataIdentify.DeviceFormFactor} is unknown"); + break; + } + + if(atapi) + if(ataIdentify.ATAPIByteCount > 0) + ataOneValue.Add($"{ataIdentify.ATAPIByteCount} bytes count limit for ATAPI"); + + if(cfa) + if((ataIdentify.CFAPowerMode & 0x8000) == 0x8000) + { + ataOneValue.Add("CompactFlash device supports power mode 1"); + if((ataIdentify.CFAPowerMode & 0x2000) == 0x2000) + ataOneValue.Add("CompactFlash power mode 1 required for one or more commands"); + if((ataIdentify.CFAPowerMode & 0x1000) == 0x1000) + ataOneValue.Add("CompactFlash power mode 1 is disabled"); + + ataOneValue.Add($"CompactFlash device uses a maximum of {ataIdentify.CFAPowerMode & 0x0FFF} mA"); + } + + ataOneValue.Add("Command set and features:"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Nop)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Nop) + ? "NOP is supported and enabled" + : "NOP is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.ReadBuffer)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.ReadBuffer) + ? "READ BUFFER is supported and enabled" + : "READ BUFFER is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.WriteBuffer)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.WriteBuffer) + ? "WRITE BUFFER is supported and enabled" + : "WRITE BUFFER is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.HPA)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.HPA) + ? "Host Protected Area is supported and enabled" + : "Host Protected Area is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.DeviceReset)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.DeviceReset) + ? "DEVICE RESET is supported and enabled" + : "DEVICE RESET is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Service)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Service) + ? "SERVICE interrupt is supported and enabled" + : "SERVICE interrupt is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Release)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Release) + ? "Release is supported and enabled" + : "Release is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.LookAhead)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.LookAhead) + ? "Look-ahead read is supported and enabled" + : "Look-ahead read is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.WriteCache)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.WriteCache) + ? "Write cache is supported and enabled" + : "Write cache is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Packet)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Packet) + ? "PACKET is supported and enabled" + : "PACKET is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.PowerManagement)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.PowerManagement) + ? "Power management is supported and enabled" + : "Power management is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.RemovableMedia)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.RemovableMedia) + ? "Removable media feature set is supported and enabled" + : "Removable media feature set is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.SecurityMode)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.SecurityMode) + ? "Security mode is supported and enabled" + : "Security mode is supported"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.LBASupport)) + ataOneValue.Add("28-bit LBA is supported"); + + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.MustBeSet) && + !ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.MustBeClear)) + { + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.LBA48)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.LBA48) + ? "48-bit LBA is supported and enabled" + : "48-bit LBA is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.FlushCache)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.FlushCache) + ? "FLUSH CACHE is supported and enabled" + : "FLUSH CACHE is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.FlushCacheExt)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.FlushCacheExt) + ? "FLUSH CACHE EXT is supported and enabled" + : "FLUSH CACHE EXT is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.DCO)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.DCO) + ? "Device Configuration Overlay feature set is supported and enabled" + : "Device Configuration Overlay feature set is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.AAM)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.AAM) + ? $"Automatic Acoustic Management is supported and enabled with value {ataIdentify.CurrentAAM} (vendor recommends {ataIdentify.RecommendedAAM}" + : "Automatic Acoustic Management is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.SetMax)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.SetMax) + ? "SET MAX security extension is supported and enabled" + : "SET MAX security extension is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.AddressOffsetReservedAreaBoot)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2 + .AddressOffsetReservedAreaBoot) + ? "Address Offset Reserved Area Boot is supported and enabled" + : "Address Offset Reserved Area Boot is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.SetFeaturesRequired)) + ataOneValue.Add("SET FEATURES is required before spin-up"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.PowerUpInStandby)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.PowerUpInStandby) + ? "Power-up in standby is supported and enabled" + : "Power-up in standby is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.RemovableNotification)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2 + .RemovableNotification) + ? "Removable Media Status Notification is supported and enabled" + : "Removable Media Status Notification is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.APM)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.APM) + ? $"Advanced Power Management is supported and enabled with value {ataIdentify.CurrentAPM}" + : "Advanced Power Management is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.CompactFlash)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.CompactFlash) + ? "CompactFlash feature set is supported and enabled" + : "CompactFlash feature set is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.RWQueuedDMA)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.RWQueuedDMA) + ? "READ DMA QUEUED and WRITE DMA QUEUED are supported and enabled" + : "READ DMA QUEUED and WRITE DMA QUEUED are supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.DownloadMicrocode)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.DownloadMicrocode) + ? "DOWNLOAD MICROCODE is supported and enabled" + : "DOWNLOAD MICROCODE is supported"); + } + + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.SMART)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.SMART) + ? "S.M.A.R.T. is supported and enabled" + : "S.M.A.R.T. is supported"); + + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.Supported)) + ataOneValue.Add("S.M.A.R.T. Command Transport is supported"); + + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeSet) && + !ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeClear)) + { + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.SMARTSelfTest)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.SMARTSelfTest) + ? "S.M.A.R.T. self-testing is supported and enabled" + : "S.M.A.R.T. self-testing is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.SMARTLog)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.SMARTLog) + ? "S.M.A.R.T. error logging is supported and enabled" + : "S.M.A.R.T. error logging is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.IdleImmediate)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.IdleImmediate) + ? "IDLE IMMEDIATE with UNLOAD FEATURE is supported and enabled" + : "IDLE IMMEDIATE with UNLOAD FEATURE is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.WriteURG)) + ataOneValue.Add("URG bit is supported in WRITE STREAM DMA EXT and WRITE STREAM EXT"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.ReadURG)) + ataOneValue.Add("URG bit is supported in READ STREAM DMA EXT and READ STREAM EXT"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.WWN)) + ataOneValue.Add("Device has a World Wide Name"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.FUAWriteQ)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.FUAWriteQ) + ? "WRITE DMA QUEUED FUA EXT is supported and enabled" + : "WRITE DMA QUEUED FUA EXT is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.FUAWrite)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.FUAWrite) + ? "WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported and enabled" + : "WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.GPL)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.GPL) + ? "General Purpose Logging is supported and enabled" + : "General Purpose Logging is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.Streaming)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.Streaming) + ? "Streaming feature set is supported and enabled" + : "Streaming feature set is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MCPT)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MCPT) + ? "Media Card Pass Through command set is supported and enabled" + : "Media Card Pass Through command set is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial) + ? "Media Serial is supported and valid" + : "Media Serial is supported"); + } + + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.MustBeSet) && + !ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.MustBeClear)) + { + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.DSN)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.DSN) + ? "DSN feature set is supported and enabled" + : "DSN feature set is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.AMAC)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.AMAC) + ? "Accessible Max Address Configuration is supported and enabled" + : "Accessible Max Address Configuration is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.ExtPowerCond)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.ExtPowerCond) + ? "Extended Power Conditions are supported and enabled" + : "Extended Power Conditions are supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.ExtStatusReport)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.ExtStatusReport) + ? "Extended Status Reporting is supported and enabled" + : "Extended Status Reporting is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.FreeFallControl)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.FreeFallControl) + ? "Free-fall control feature set is supported and enabled" + : "Free-fall control feature set is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.SegmentedDownloadMicrocode)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4 + .SegmentedDownloadMicrocode) + ? "Segmented feature in DOWNLOAD MICROCODE is supported and enabled" + : "Segmented feature in DOWNLOAD MICROCODE is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.RWDMAExtGpl)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.RWDMAExtGpl) + ? "READ/WRITE DMA EXT GPL are supported and enabled" + : "READ/WRITE DMA EXT GPL are supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.WriteUnc)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.WriteUnc) + ? "WRITE UNCORRECTABLE is supported and enabled" + : "WRITE UNCORRECTABLE is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.WRV)) + { + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.WRV) + ? "Write/Read/Verify is supported and enabled" + : "Write/Read/Verify is supported"); + ataOneValue.Add($"{ataIdentify.WRVSectorCountMode2} sectors for Write/Read/Verify mode 2"); + ataOneValue.Add($"{ataIdentify.WRVSectorCountMode3} sectors for Write/Read/Verify mode 3"); + if(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.WRV)) + ataOneValue.Add($"Current Write/Read/Verify mode: {ataIdentify.WRVMode}"); + } + + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.DT1825)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.DT1825) + ? "DT1825 is supported and enabled" + : "DT1825 is supported"); + } + + if(true) + { + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.BlockErase)) + ataOneValue.Add("BLOCK ERASE EXT is supported"); + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.Overwrite)) + ataOneValue.Add("OVERWRITE EXT is supported"); + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.CryptoScramble)) + ataOneValue.Add("CRYPTO SCRAMBLE EXT is supported"); + } + + if(true) + { + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.DeviceConfDMA)) + ataOneValue.Add("DEVICE CONFIGURATION IDENTIFY DMA and DEVICE CONFIGURATION SET DMA are supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ReadBufferDMA)) + ataOneValue.Add("READ BUFFER DMA is supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.WriteBufferDMA)) + ataOneValue.Add("WRITE BUFFER DMA is supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.DownloadMicroCodeDMA)) + ataOneValue.Add("DOWNLOAD MICROCODE DMA is supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.SetMaxDMA)) + ataOneValue.Add("SET PASSWORD DMA and SET UNLOCK DMA are supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.Ata28)) + ataOneValue.Add("Not all 28-bit commands are supported"); + + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.CFast)) + ataOneValue.Add("Device follows CFast specification"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.IEEE1667)) + ataOneValue.Add("Device follows IEEE-1667"); + + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.DeterministicTrim)) + { + ataOneValue.Add("Read after TRIM is deterministic"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ReadZeroTrim)) + ataOneValue.Add("Read after TRIM returns empty data"); + } + + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.LongPhysSectorAligError)) + ataOneValue.Add("Device supports Long Physical Sector Alignment Error Reporting Control"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.Encrypted)) + ataOneValue.Add("Device encrypts all user data"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.AllCacheNV)) + ataOneValue.Add("Device's write cache is non-volatile"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ZonedBit0) || + ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ZonedBit1)) + ataOneValue.Add("Device is zoned"); + } + + if(true) + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.Sanitize)) + { + ataOneValue.Add("Sanitize feature set is supported"); + ataOneValue.Add(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.SanitizeCommands) + ? "Sanitize commands are specified by ACS-3 or higher" + : "Sanitize commands are specified by ACS-2"); + + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.SanitizeAntifreeze)) + ataOneValue.Add("SANITIZE ANTIFREEZE LOCK EXT is supported"); + } + + if(!ata1 && maxatalevel >= 8) + if(ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.Set) && + !ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.Clear) && + ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.TrustedComputing)) + ataOneValue.Add("Trusted Computing feature set is supported"); + + if((ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0x1 || + (ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0xE) + { + if(true) + if(!ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Clear)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.ReadLogDMAExt)) + ataOneValue.Add("READ LOG DMA EXT is supported"); + + if(true) + if(!ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.Clear)) + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.FPDMAQ)) + ataOneValue.Add("RECEIVE FPDMA QUEUED and SEND FPDMA QUEUED are supported"); + + if(true) + if(!ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.Clear)) + { + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.NonZeroBufferOffset)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit + .NonZeroBufferOffset) + ? "Non-zero buffer offsets are supported and enabled" + : "Non-zero buffer offsets are supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.DMASetup)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.DMASetup) + ? "DMA Setup auto-activation is supported and enabled" + : "DMA Setup auto-activation is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.InitPowerMgmt)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit + .InitPowerMgmt) + ? "Device-initiated power management is supported and enabled" + : "Device-initiated power management is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.InOrderData)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures + .HasFlag(Identify.SATAFeaturesBit.InOrderData) + ? "In-order data delivery is supported and enabled" + : "In-order data delivery is supported"); + if(!atapi) + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.HardwareFeatureControl)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit + .HardwareFeatureControl) + ? "Hardware Feature Control is supported and enabled" + : "Hardware Feature Control is supported"); + if(atapi) + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.AsyncNotification)) + if(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.AsyncNotification)) + ataOneValue.Add("Asynchronous notification is supported"); + else + ataOneValue.Add("Asynchronous notification is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.SettingsPreserve)) + if(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.SettingsPreserve)) + ataOneValue.Add("Software Settings Preservation is supported"); + else + ataOneValue.Add("Software Settings Preservation is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.NCQAutoSense)) + ataOneValue.Add("NCQ Autosense is supported"); + if(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.EnabledSlumber)) + ataOneValue.Add("Automatic Partial to Slumber transitions are enabled"); + } + } + + if((ataIdentify.RemovableStatusSet & 0x03) > 0) + ataOneValue.Add("Removable Media Status Notification feature set is supported"); + + if(ataIdentify.FreeFallSensitivity != 0x00 && ataIdentify.FreeFallSensitivity != 0xFF) + ataOneValue.Add($"Free-fall sensitivity set to {ataIdentify.FreeFallSensitivity}"); + + if(ataIdentify.DataSetMgmt.HasFlag(Identify.DataSetMgmtBit.Trim)) ataOneValue.Add("TRIM is supported"); + if(ataIdentify.DataSetMgmtSize > 0) + ataOneValue.Add($"DATA SET MANAGEMENT can receive a maximum of {ataIdentify.DataSetMgmtSize} blocks of 512 bytes"); + + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Supported)) + { + ataOneValue.Add("Security:"); + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Enabled)) + { + ataOneValue.Add("Security is enabled"); + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Locked) + ? "Security is locked" + : "Security is not locked"); + + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Frozen) + ? "Security is frozen" + : "Security is not frozen"); + + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Expired) + ? "Security count has expired" + : "Security count has notexpired"); + + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Maximum) + ? "Security level is maximum" + : "Security level is high"); + } + else ataOneValue.Add("Security is not enabled"); + + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Enhanced)) + ataOneValue.Add("Supports enhanced security erase"); + + ataOneValue.Add($"{ataIdentify.SecurityEraseTime * 2} minutes to complete secure erase"); + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Enhanced)) + ataOneValue + .Add($"{ataIdentify.EnhancedSecurityEraseTime * 2} minutes to complete enhanced secure erase"); + + ataOneValue.Add($"Master password revision code: {ataIdentify.MasterPasswordRevisionCode}"); + } + + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeSet) && + !ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeClear) && + ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.Streaming)) + { + ataOneValue.Add("Streaming:"); + ataOneValue.Add($"Minimum request size is {ataIdentify.StreamMinReqSize}"); + ataOneValue.Add($"Streaming transfer time in PIO is {ataIdentify.StreamTransferTimePIO}"); + ataOneValue.Add($"Streaming transfer time in DMA is {ataIdentify.StreamTransferTimeDMA}"); + ataOneValue.Add($"Streaming access latency is {ataIdentify.StreamAccessLatency}"); + ataOneValue.Add($"Streaming performance granularity is {ataIdentify.StreamPerformanceGranularity}"); + } + + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.Supported)) + { + ataOneValue.Add("S.M.A.R.T. Command Transport (SCT):"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.LongSectorAccess)) + ataOneValue.Add("SCT Long Sector Address is supported"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.WriteSame)) + ataOneValue.Add("SCT Write Same is supported"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.ErrorRecoveryControl)) + ataOneValue.Add("SCT Error Recovery Control is supported"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.FeaturesControl)) + ataOneValue.Add("SCT Features Control is supported"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.DataTables)) + ataOneValue.Add("SCT Data Tables are supported"); + } + + if((ataIdentify.NVCacheCaps & 0x0010) == 0x0010) + { + ataOneValue.Add("Non-Volatile Cache:"); + ataOneValue.Add($"Version {(ataIdentify.NVCacheCaps & 0xF000) >> 12}"); + if((ataIdentify.NVCacheCaps & 0x0001) == 0x0001) + { + ataOneValue.Add((ataIdentify.NVCacheCaps & 0x0002) == 0x0002 + ? "Power mode feature set is supported and enabled" + : "Power mode feature set is supported"); + + ataOneValue.Add($"Version {(ataIdentify.NVCacheCaps & 0x0F00) >> 8}"); + } + + ataOneValue.Add($"Non-Volatile Cache is {ataIdentify.NVCacheSize * logicalsectorsize} bytes"); + } + + if(ataReport.ReadCapabilities != null) + { + removable = false; + ataOneValue.Add(""); + + if(ataReport.ReadCapabilities.NominalRotationRate != null && + ataReport.ReadCapabilities.NominalRotationRate != 0x0000 && + ataReport.ReadCapabilities.NominalRotationRate != 0xFFFF) + ataOneValue.Add(ataReport.ReadCapabilities.NominalRotationRate == 0x0001 + ? "Device does not rotate." + : $"Device rotates at {ataReport.ReadCapabilities.NominalRotationRate} rpm"); + + if(!atapi) + { + if(ataReport.ReadCapabilities.BlockSize != null) + { + ataTwoValue.Add("Logical sector size", $"{ataReport.ReadCapabilities.BlockSize} bytes"); + logicalsectorsize = ataReport.ReadCapabilities.BlockSize.Value; + } + + if(ataReport.ReadCapabilities.PhysicalBlockSize != null) + ataTwoValue.Add("Physical sector size", + $"{ataReport.ReadCapabilities.PhysicalBlockSize} bytes"); + if(ataReport.ReadCapabilities.LongBlockSize != null) + ataTwoValue.Add("READ LONG sector size", $"{ataReport.ReadCapabilities.LongBlockSize} bytes"); + + if(ataReport.ReadCapabilities.BlockSize != null && + ataReport.ReadCapabilities.PhysicalBlockSize != null && + ataReport.ReadCapabilities.BlockSize.Value != + ataReport.ReadCapabilities.PhysicalBlockSize.Value && + (ataReport.ReadCapabilities.LogicalAlignment & 0x8000) == 0x0000 && + (ataReport.ReadCapabilities.LogicalAlignment & 0x4000) == 0x4000) + ataOneValue + .Add($"Logical sector starts at offset {ataReport.ReadCapabilities.LogicalAlignment & 0x3FFF} from physical sector"); + + if(ataReport.ReadCapabilities.CHS != null && ataReport.ReadCapabilities.CurrentCHS != null) + { + int currentSectors = ataReport.ReadCapabilities.CurrentCHS.Cylinders * + ataReport.ReadCapabilities.CurrentCHS.Heads * + ataReport.ReadCapabilities.CurrentCHS.Sectors; + ataTwoValue.Add("Cylinders", + $"{ataReport.ReadCapabilities.CHS.Cylinders} max., {ataReport.ReadCapabilities.CurrentCHS.Cylinders} current"); + ataTwoValue.Add("Heads", + $"{ataReport.ReadCapabilities.CHS.Heads} max., {ataReport.ReadCapabilities.CurrentCHS.Heads} current"); + ataTwoValue.Add("Sectors per track", + $"{ataReport.ReadCapabilities.CHS.Sectors} max., {ataReport.ReadCapabilities.CurrentCHS.Sectors} current"); + ataTwoValue.Add("Sectors addressable in CHS mode", + $"{ataReport.ReadCapabilities.CHS.Cylinders * ataReport.ReadCapabilities.CHS.Heads * ataReport.ReadCapabilities.CHS.Sectors} max., {currentSectors} current"); + ataTwoValue.Add("Device size in CHS mode", + $"{(ulong)currentSectors * logicalsectorsize} bytes, {(ulong)currentSectors * logicalsectorsize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); + } + else if(ataReport.ReadCapabilities.CHS != null) + { + int currentSectors = ataReport.ReadCapabilities.CHS.Cylinders * + ataReport.ReadCapabilities.CHS.Heads * + ataReport.ReadCapabilities.CHS.Sectors; + ataTwoValue.Add("Cylinders", + $"{ataReport.ReadCapabilities.CHS.Cylinders}"); + ataTwoValue.Add("Heads", $"{ataReport.ReadCapabilities.CHS.Heads}"); + ataTwoValue.Add("Sectors per track", $"{ataReport.ReadCapabilities.CHS.Sectors}"); + ataTwoValue.Add("Sectors addressable in CHS mode", $"{currentSectors}"); + ataTwoValue.Add("Device size in CHS mode", + $"{(ulong)currentSectors * logicalsectorsize} bytes, {(ulong)currentSectors * logicalsectorsize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); + } + + if(ataReport.ReadCapabilities.LBASectors != null) + { + ataTwoValue.Add("Sectors addressable in sectors in 28-bit LBA mode", + $"{ataReport.ReadCapabilities.LBASectors}"); + + if((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1024 / 1024 > 1000000) + ataTwoValue.Add("Device size in 28-bit LBA mode", + $"{(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize} bytes, {(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000} Tb, {(double)((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1024 / 1024 > 1000) + ataTwoValue.Add("Device size in 28-bit LBA mode", + $"{(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize} bytes, {(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1000 / 1000 / 1000} Gb, {(double)((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize) / 1024 / 1024 / 1024:F2} GiB"); + else + ataTwoValue.Add("Device size in 28-bit LBA mode", + $"{(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize} bytes, {(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1000 / 1000} Mb, {(double)((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); + } + + if(ataReport.ReadCapabilities.LBA48Sectors != null) + { + ataTwoValue.Add("Sectors addressable in sectors in 48-bit LBA mode", + $"{ataReport.ReadCapabilities.LBA48Sectors}"); + + if(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1024 / 1024 > 1000000) + ataTwoValue.Add("Device size in 48-bit LBA mode", + $"{ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize} bytes, {ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000} Tb, {(double)(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1024 / 1024 > 1000) + ataTwoValue.Add("Device size in 48-bit LBA mode", + $"{ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize} bytes, {ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1000 / 1000 / 1000} Gb, {(double)(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize) / 1024 / 1024 / 1024:F2} GiB"); + else + ataTwoValue.Add("Device size in 48-bit LBA mode", + $"{ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize} bytes, {ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1000 / 1000} Mb, {(double)(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); + } + + if(ata1 || cfa) + { + if(ataReport.ReadCapabilities.UnformattedBPT > 0) + ataTwoValue.Add("Bytes per unformatted track", + $"{ataReport.ReadCapabilities.UnformattedBPT}"); + if(ataReport.ReadCapabilities.UnformattedBPS > 0) + ataTwoValue.Add("Bytes per unformatted sector", + $"{ataReport.ReadCapabilities.UnformattedBPS}"); + } + } + + if(ataReport.ReadCapabilities.SupportsReadSectors == true) + ataOneValue.Add("Device supports READ SECTOR(S) command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadRetry == true) + ataOneValue.Add("Device supports READ SECTOR(S) RETRY command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadDma == true) + ataOneValue.Add("Device supports READ DMA command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadDmaRetry == true) + ataOneValue.Add("Device supports READ DMA RETRY command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadLong == true) + ataOneValue.Add("Device supports READ LONG command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadLongRetry == true) + ataOneValue.Add("Device supports READ LONG RETRY command in CHS mode"); + + if(ataReport.ReadCapabilities.SupportsReadLba == true) + ataOneValue.Add("Device supports READ SECTOR(S) command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadRetryLba == true) + ataOneValue.Add("Device supports READ SECTOR(S) RETRY command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadDmaLba == true) + ataOneValue.Add("Device supports READ DMA command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadDmaRetryLba == true) + ataOneValue.Add("Device supports READ DMA RETRY command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadLongLba == true) + ataOneValue.Add("Device supports READ LONG command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadLongRetryLba == true) + ataOneValue.Add("Device supports READ LONG RETRY command in 28-bit LBA mode"); + + if(ataReport.ReadCapabilities.SupportsReadLba48 == true) + ataOneValue.Add("Device supports READ SECTOR(S) command in 48-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadDmaLba48 == true) + ataOneValue.Add("Device supports READ DMA command in 48-bit LBA mode"); + + if(ataReport.ReadCapabilities.SupportsSeek == true) + ataOneValue.Add("Device supports SEEK command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsSeekLba == true) + ataOneValue.Add("Device supports SEEK command in 28-bit LBA mode"); + } + else testedMedia = ataReport.RemovableMedias; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/RouteConfig.cs b/DiscImageChef.Server/App_Start/RouteConfig.cs new file mode 100644 index 00000000..1c7e5413 --- /dev/null +++ b/DiscImageChef.Server/App_Start/RouteConfig.cs @@ -0,0 +1,50 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : RouteConfig.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets ASP.NET routing information. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Web.Mvc; +using System.Web.Routing; + +namespace DiscImageChef.Server +{ + public class RouteConfig + { + public static void RegisterRoutes(RouteCollection routes) + { + routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); + + routes.MapMvcAttributeRoutes(); + + routes.MapRoute("Default", "{controller}/{action}/{id}", + new {controller = "Home", action = "Index", id = UrlParameter.Optional}); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiEvpd.cs b/DiscImageChef.Server/App_Start/ScsiEvpd.cs new file mode 100644 index 00000000..9a290e8e --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiEvpd.cs @@ -0,0 +1,93 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiEvpd.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI EVPDs from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + public static class ScsiEvpd + { + /// + /// Takes the SCSI EVPD part of a device report and prints it as a list key=value pairs to be sequenced by ASP.NET in + /// the rendering + /// + /// EVPD pages + /// SCSI vendor string + /// List to put the key=value pairs on + public static void Report(IEnumerable pages, string vendor, ref Dictionary evpdPages) + { + foreach(ScsiPage evpd in pages) + { + string decoded; + if(evpd.page >= 0x01 && evpd.page <= 0x7F) decoded = EVPD.DecodeASCIIPage(evpd.value); + else if(evpd.page == 0x81) decoded = EVPD.PrettifyPage_81(evpd.value); + else if(evpd.page == 0x82) decoded = EVPD.DecodePage82(evpd.value); + else if(evpd.page == 0x83) decoded = EVPD.PrettifyPage_83(evpd.value); + else if(evpd.page == 0x84) decoded = EVPD.PrettifyPage_84(evpd.value); + else if(evpd.page == 0x85) decoded = EVPD.PrettifyPage_85(evpd.value); + else if(evpd.page == 0x86) decoded = EVPD.PrettifyPage_86(evpd.value); + else if(evpd.page == 0x89) decoded = EVPD.PrettifyPage_89(evpd.value); + else if(evpd.page == 0xB0) decoded = EVPD.PrettifyPage_B0(evpd.value); + else if(evpd.page == 0xB2) + decoded = + $"TapeAlert Supported Flags Bitmap: 0x{EVPD.DecodePageB2(evpd.value):X16}
"; + else if(evpd.page == 0xB4) decoded = EVPD.DecodePageB4(evpd.value); + else if(evpd.page == 0xC0 && vendor.Trim() == "quantum") + decoded = EVPD.PrettifyPage_C0_Quantum(evpd.value); + else if(evpd.page == 0xC0 && vendor.Trim() == "seagate") + decoded = + EVPD.PrettifyPage_C0_Seagate(evpd.value); + else if(evpd.page == 0xC0 && vendor.Trim() == "ibm") + decoded = EVPD.PrettifyPage_C0_IBM(evpd.value); + else if(evpd.page == 0xC1 && vendor.Trim() == "ibm") + decoded = EVPD.PrettifyPage_C1_IBM(evpd.value); + else if((evpd.page == 0xC0 || evpd.page == 0xC1) && vendor.Trim() == "certance") + decoded = EVPD.PrettifyPage_C0_C1_Certance(evpd.value); + else if((evpd.page == 0xC2 || evpd.page == 0xC3 || evpd.page == 0xC4 || evpd.page == 0xC5 || + evpd.page == 0xC6) && + vendor.Trim() == "certance") decoded = EVPD.PrettifyPage_C2_C3_C4_C5_C6_Certance(evpd.value); + else if((evpd.page == 0xC0 || evpd.page == 0xC1 || evpd.page == 0xC2 || evpd.page == 0xC3 || + evpd.page == 0xC4 || evpd.page == 0xC5) && + vendor.Trim() == "hp") decoded = EVPD.PrettifyPage_C0_to_C5_HP(evpd.value); + else if(evpd.page == 0xDF && vendor.Trim() == "certance") + decoded = EVPD.PrettifyPage_DF_Certance(evpd.value); + else decoded = "Undecoded"; + + if(!string.IsNullOrEmpty(decoded)) decoded = decoded.Replace("\n", "
"); + + evpdPages.Add($"EVPD page {evpd.page:X2}h", decoded); + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiInquiry.cs b/DiscImageChef.Server/App_Start/ScsiInquiry.cs new file mode 100644 index 00000000..5701e276 --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiInquiry.cs @@ -0,0 +1,1703 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiInquiry.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI INQUIRY from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + static class ScsiInquiry + { + /// + /// Takes the SCSI INQUIRY part of a device report and prints it as a list of values to be sequenced by ASP.NET in the + /// rendering + /// + /// INQUIRY part of the report + /// List of values + internal static IEnumerable Report(Inquiry.SCSIInquiry? inquiryNullable) + { + List scsiOneValue = new List(); + + if(!inquiryNullable.HasValue) return scsiOneValue; + + Inquiry.SCSIInquiry inquiry = inquiryNullable.Value; + + switch((PeripheralQualifiers)inquiry.PeripheralQualifier) + { + case PeripheralQualifiers.Supported: + scsiOneValue.Add("Device is connected and supported."); + break; + case PeripheralQualifiers.Unconnected: + scsiOneValue.Add("Device is supported but not connected."); + break; + case PeripheralQualifiers.Reserved: + scsiOneValue.Add("Reserved value set in Peripheral Qualifier field."); + break; + case PeripheralQualifiers.Unsupported: + scsiOneValue.Add("Device is connected but unsupported."); + break; + default: + scsiOneValue.Add($"Vendor value {inquiry.PeripheralQualifier} set in Peripheral Qualifier field."); + break; + } + + switch((PeripheralDeviceTypes)inquiry.PeripheralDeviceType) + { + case PeripheralDeviceTypes.DirectAccess: //0x00, + scsiOneValue.Add("Direct-access device"); + break; + case PeripheralDeviceTypes.SequentialAccess: //0x01, + scsiOneValue.Add("Sequential-access device"); + break; + case PeripheralDeviceTypes.PrinterDevice: //0x02, + scsiOneValue.Add("Printer device"); + break; + case PeripheralDeviceTypes.ProcessorDevice: //0x03, + scsiOneValue.Add("Processor device"); + break; + case PeripheralDeviceTypes.WriteOnceDevice: //0x04, + scsiOneValue.Add("Write-once device"); + break; + case PeripheralDeviceTypes.MultiMediaDevice: //0x05, + scsiOneValue.Add("CD-ROM/DVD/etc device"); + break; + case PeripheralDeviceTypes.ScannerDevice: //0x06, + scsiOneValue.Add("Scanner device"); + break; + case PeripheralDeviceTypes.OpticalDevice: //0x07, + scsiOneValue.Add("Optical memory device"); + break; + case PeripheralDeviceTypes.MediumChangerDevice: //0x08, + scsiOneValue.Add("Medium change device"); + break; + case PeripheralDeviceTypes.CommsDevice: //0x09, + scsiOneValue.Add("Communications device"); + break; + case PeripheralDeviceTypes.PrePressDevice1: //0x0A, + scsiOneValue.Add("Graphics arts pre-press device (defined in ASC IT8)"); + break; + case PeripheralDeviceTypes.PrePressDevice2: //0x0B, + scsiOneValue.Add("Graphics arts pre-press device (defined in ASC IT8)"); + break; + case PeripheralDeviceTypes.ArrayControllerDevice: //0x0C, + scsiOneValue.Add("Array controller device"); + break; + case PeripheralDeviceTypes.EnclosureServiceDevice: //0x0D, + scsiOneValue.Add("Enclosure services device"); + break; + case PeripheralDeviceTypes.SimplifiedDevice: //0x0E, + scsiOneValue.Add("Simplified direct-access device"); + break; + case PeripheralDeviceTypes.OCRWDevice: //0x0F, + scsiOneValue.Add("Optical card reader/writer device"); + break; + case PeripheralDeviceTypes.BridgingExpander: //0x10, + scsiOneValue.Add("Bridging Expanders"); + break; + case PeripheralDeviceTypes.ObjectDevice: //0x11, + scsiOneValue.Add("Object-based Storage Device"); + break; + case PeripheralDeviceTypes.ADCDevice: //0x12, + scsiOneValue.Add("Automation/Drive Interface"); + break; + case PeripheralDeviceTypes.SCSISecurityManagerDevice: //0x13, + scsiOneValue.Add("Security Manager Device"); + break; + case PeripheralDeviceTypes.SCSIZonedBlockDevice: //0x14 + scsiOneValue.Add("Host managed zoned block device"); + break; + case PeripheralDeviceTypes.WellKnownDevice: //0x1E, + scsiOneValue.Add("Well known logical unit"); + break; + case PeripheralDeviceTypes.UnknownDevice: //0x1F + scsiOneValue.Add("Unknown or no device type"); + break; + default: + scsiOneValue.Add($"Unknown device type field value 0x{inquiry.PeripheralDeviceType:X2}"); + break; + } + + switch((ANSIVersions)inquiry.ANSIVersion) + { + case ANSIVersions.ANSINoVersion: + scsiOneValue.Add("Device does not claim to comply with any SCSI ANSI standard"); + break; + case ANSIVersions.ANSI1986Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.131:1986 (SCSI-1)"); + break; + case ANSIVersions.ANSI1994Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.131:1994 (SCSI-2)"); + break; + case ANSIVersions.ANSI1997Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.301:1997 (SPC-1)"); + break; + case ANSIVersions.ANSI2001Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.351:2001 (SPC-2)"); + break; + case ANSIVersions.ANSI2005Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.408:2005 (SPC-3)"); + break; + case ANSIVersions.ANSI2008Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.408:2005 (SPC-4)"); + break; + default: + scsiOneValue + .Add($"Device claims to comply with unknown SCSI ANSI standard value 0x{inquiry.ANSIVersion:X2})"); + break; + } + + switch((ECMAVersions)inquiry.ECMAVersion) + { + case ECMAVersions.ECMANoVersion: + scsiOneValue.Add("Device does not claim to comply with any SCSI ECMA standard"); + break; + case ECMAVersions.ECMA111: + scsiOneValue.Add("Device claims to comply ECMA-111: Small Computer System Interface SCSI"); + break; + default: + scsiOneValue + .Add($"Device claims to comply with unknown SCSI ECMA standard value 0x{inquiry.ECMAVersion:X2})"); + break; + } + + switch((ISOVersions)inquiry.ISOVersion) + { + case ISOVersions.ISONoVersion: + scsiOneValue.Add("Device does not claim to comply with any SCSI ISO/IEC standard"); + break; + case ISOVersions.ISO1995Version: + scsiOneValue.Add("Device claims to comply with ISO/IEC 9316:1995"); + break; + default: + scsiOneValue + .Add($"Device claims to comply with unknown SCSI ISO/IEC standard value 0x{inquiry.ISOVersion:X2})"); + break; + } + + if(inquiry.RMB) scsiOneValue.Add("Device is removable"); + if(inquiry.AERC) scsiOneValue.Add("Device supports Asynchronous Event Reporting Capability"); + if(inquiry.TrmTsk) scsiOneValue.Add("Device supports TERMINATE TASK command"); + if(inquiry.NormACA) scsiOneValue.Add("Device supports setting Normal ACA"); + if(inquiry.HiSup) scsiOneValue.Add("Device supports LUN hierarchical addressing"); + if(inquiry.SCCS) scsiOneValue.Add("Device contains an embedded storage array controller"); + if(inquiry.ACC) scsiOneValue.Add("Device contains an Access Control Coordinator"); + if(inquiry.ThreePC) scsiOneValue.Add("Device supports third-party copy commands"); + if(inquiry.Protect) scsiOneValue.Add("Device supports protection information"); + if(inquiry.BQue) scsiOneValue.Add("Device supports basic queueing"); + if(inquiry.EncServ) scsiOneValue.Add("Device contains an embedded enclosure services component"); + if(inquiry.MultiP) scsiOneValue.Add("Multi-port device"); + if(inquiry.MChngr) scsiOneValue.Add("Device contains or is attached to a medium changer"); + if(inquiry.ACKREQQ) scsiOneValue.Add("Device supports request and acknowledge handshakes"); + if(inquiry.Addr32) scsiOneValue.Add("Device supports 32-bit wide SCSI addresses"); + if(inquiry.Addr16) scsiOneValue.Add("Device supports 16-bit wide SCSI addresses"); + if(inquiry.RelAddr) scsiOneValue.Add("Device supports relative addressing"); + if(inquiry.WBus32) scsiOneValue.Add("Device supports 32-bit wide data transfers"); + if(inquiry.WBus16) scsiOneValue.Add("Device supports 16-bit wide data transfers"); + if(inquiry.Sync) scsiOneValue.Add("Device supports synchronous data transfer"); + if(inquiry.Linked) scsiOneValue.Add("Device supports linked commands"); + if(inquiry.TranDis) scsiOneValue.Add("Device supports CONTINUE TASK and TARGET TRANSFER DISABLE commands"); + if(inquiry.QAS) scsiOneValue.Add("Device supports Quick Arbitration and Selection"); + if(inquiry.CmdQue) scsiOneValue.Add("Device supports TCQ queue"); + if(inquiry.IUS) scsiOneValue.Add("Device supports information unit transfers"); + if(inquiry.SftRe) scsiOneValue.Add("Device implements RESET as a soft reset"); + + switch((TGPSValues)inquiry.TPGS) + { + case TGPSValues.NotSupported: + scsiOneValue.Add("Device does not support assymetrical access"); + break; + case TGPSValues.OnlyImplicit: + scsiOneValue.Add("Device only supports implicit assymetrical access"); + break; + case TGPSValues.OnlyExplicit: + scsiOneValue.Add("Device only supports explicit assymetrical access"); + break; + case TGPSValues.Both: + scsiOneValue.Add("Device supports implicit and explicit assymetrical access"); + break; + default: + scsiOneValue.Add($"Unknown value in TPGS field 0x{inquiry.TPGS:X2}"); + break; + } + + switch((SPIClocking)inquiry.Clocking) + { + case SPIClocking.ST: + scsiOneValue.Add("Device supports only ST clocking"); + break; + case SPIClocking.DT: + scsiOneValue.Add("Device supports only DT clocking"); + break; + case SPIClocking.Reserved: + scsiOneValue.Add("Reserved value 0x02 found in SPI clocking field"); + break; + case SPIClocking.STandDT: + scsiOneValue.Add("Device supports ST and DT clocking"); + break; + default: + scsiOneValue.Add($"Unknown value in SPI clocking field 0x{inquiry.Clocking:X2}"); + break; + } + + if(inquiry.VersionDescriptors == null) return scsiOneValue; + + foreach(ushort versionDescriptor in inquiry.VersionDescriptors) + switch(versionDescriptor) + { + case 0xFFFF: + case 0x0000: break; + case 0x0020: + scsiOneValue.Add("Device complies with SAM (no version claimed)"); + break; + case 0x003B: + scsiOneValue.Add("Device complies with SAM T10/0994-D revision 18"); + break; + case 0x003C: + scsiOneValue.Add("Device complies with SAM ANSI INCITS 270-1996"); + break; + case 0x0040: + scsiOneValue.Add("Device complies with SAM-2 (no version claimed)"); + break; + case 0x0054: + scsiOneValue.Add("Device complies with SAM-2 T10/1157-D revision 23"); + break; + case 0x0055: + scsiOneValue.Add("Device complies with SAM-2 T10/1157-D revision 24"); + break; + case 0x005C: + scsiOneValue.Add("Device complies with SAM-2 ANSI INCITS 366-2003"); + break; + case 0x005E: + scsiOneValue.Add("Device complies with SAM-2 ISO/IEC 14776-412"); + break; + case 0x0060: + scsiOneValue.Add("Device complies with SAM-3 (no version claimed)"); + break; + case 0x0062: + scsiOneValue.Add("Device complies with SAM-3 T10/1561-D revision 7"); + break; + case 0x0075: + scsiOneValue.Add("Device complies with SAM-3 T10/1561-D revision 13"); + break; + case 0x0076: + scsiOneValue.Add("Device complies with SAM-3 T10/1561-D revision 14"); + break; + case 0x0077: + scsiOneValue.Add("Device complies with SAM-3 ANSI INCITS 402-2005"); + break; + case 0x0080: + scsiOneValue.Add("Device complies with SAM-4 (no version claimed)"); + break; + case 0x0087: + scsiOneValue.Add("Device complies with SAM-4 T10/1683-D revision 13"); + break; + case 0x008B: + scsiOneValue.Add("Device complies with SAM-4 T10/1683-D revision 14"); + break; + case 0x0090: + scsiOneValue.Add("Device complies with SAM-4 ANSI INCITS 447-2008"); + break; + case 0x0092: + scsiOneValue.Add("Device complies with SAM-4 ISO/IEC 14776-414"); + break; + case 0x00A0: + scsiOneValue.Add("Device complies with SAM-5 (no version claimed)"); + break; + case 0x00A2: + scsiOneValue.Add("Device complies with SAM-5 T10/2104-D revision 4"); + break; + case 0x00A4: + scsiOneValue.Add("Device complies with SAM-5 T10/2104-D revision 20"); + break; + case 0x00A6: + scsiOneValue.Add("Device complies with SAM-5 T10/2104-D revision 21"); + break; + case 0x00C0: + scsiOneValue.Add("Device complies with SAM-6 (no version claimed)"); + break; + case 0x0120: + scsiOneValue.Add("Device complies with SPC (no version claimed)"); + break; + case 0x013B: + scsiOneValue.Add("Device complies with SPC T10/0995-D revision 11a"); + break; + case 0x013C: + scsiOneValue.Add("Device complies with SPC ANSI INCITS 301-1997"); + break; + case 0x0140: + scsiOneValue.Add("Device complies with MMC (no version claimed)"); + break; + case 0x015B: + scsiOneValue.Add("Device complies with MMC T10/1048-D revision 10a"); + break; + case 0x015C: + scsiOneValue.Add("Device complies with MMC ANSI INCITS 304-1997"); + break; + case 0x0160: + scsiOneValue.Add("Device complies with SCC (no version claimed)"); + break; + case 0x017B: + scsiOneValue.Add("Device complies with SCC T10/1047-D revision 06c"); + break; + case 0x017C: + scsiOneValue.Add("Device complies with SCC ANSI INCITS 276-1997"); + break; + case 0x0180: + scsiOneValue.Add("Device complies with SBC (no version claimed)"); + break; + case 0x019B: + scsiOneValue.Add("Device complies with SBC T10/0996-D revision 08c"); + break; + case 0x019C: + scsiOneValue.Add("Device complies with SBC ANSI INCITS 306-1998"); + break; + case 0x01A0: + scsiOneValue.Add("Device complies with SMC (no version claimed)"); + break; + case 0x01BB: + scsiOneValue.Add("Device complies with SMC T10/0999-D revision 10a"); + break; + case 0x01BC: + scsiOneValue.Add("Device complies with SMC ANSI INCITS 314-1998"); + break; + case 0x01BE: + scsiOneValue.Add("Device complies with SMC ISO/IEC 14776-351"); + break; + case 0x01C0: + scsiOneValue.Add("Device complies with SES (no version claimed)"); + break; + case 0x01DB: + scsiOneValue.Add("Device complies with SES T10/1212-D revision 08b"); + break; + case 0x01DC: + scsiOneValue.Add("Device complies with SES ANSI INCITS 305-1998"); + break; + case 0x01DD: + scsiOneValue + .Add("Device complies with SES T10/1212 revision 08b w/ Amendment ANSI INCITS.305/AM1-2000"); + break; + case 0x01DE: + scsiOneValue + .Add("Device complies with SES ANSI INCITS 305-1998 w/ Amendment ANSI INCITS.305/AM1-2000"); + break; + case 0x01E0: + scsiOneValue.Add("Device complies with SCC-2 (no version claimed)"); + break; + case 0x01FB: + scsiOneValue.Add("Device complies with SCC-2 T10/1125-D revision 04"); + break; + case 0x01FC: + scsiOneValue.Add("Device complies with SCC-2 ANSI INCITS 318-1998"); + break; + case 0x0200: + scsiOneValue.Add("Device complies with SSC (no version claimed)"); + break; + case 0x0201: + scsiOneValue.Add("Device complies with SSC T10/0997-D revision 17"); + break; + case 0x0207: + scsiOneValue.Add("Device complies with SSC T10/0997-D revision 22"); + break; + case 0x021C: + scsiOneValue.Add("Device complies with SSC ANSI INCITS 335-2000"); + break; + case 0x0220: + scsiOneValue.Add("Device complies with RBC (no version claimed)"); + break; + case 0x0238: + scsiOneValue.Add("Device complies with RBC T10/1240-D revision 10a"); + break; + case 0x023C: + scsiOneValue.Add("Device complies with RBC ANSI INCITS 330-2000"); + break; + case 0x0240: + scsiOneValue.Add("Device complies with MMC-2 (no version claimed)"); + break; + case 0x0255: + scsiOneValue.Add("Device complies with MMC-2 T10/1228-D revision 11"); + break; + case 0x025B: + scsiOneValue.Add("Device complies with MMC-2 T10/1228-D revision 11a"); + break; + case 0x025C: + scsiOneValue.Add("Device complies with MMC-2 ANSI INCITS 333-2000"); + break; + case 0x0260: + scsiOneValue.Add("Device complies with SPC-2 (no version claimed)"); + break; + case 0x0267: + scsiOneValue.Add("Device complies with SPC-2 T10/1236-D revision 12"); + break; + case 0x0269: + scsiOneValue.Add("Device complies with SPC-2 T10/1236-D revision 18"); + break; + case 0x0275: + scsiOneValue.Add("Device complies with SPC-2 T10/1236-D revision 19"); + break; + case 0x0276: + scsiOneValue.Add("Device complies with SPC-2 T10/1236-D revision 20"); + break; + case 0x0277: + scsiOneValue.Add("Device complies with SPC-2 ANSI INCITS 351-2001"); + break; + case 0x0278: + scsiOneValue.Add("Device complies with SPC-2 ISO/IEC 14776-452"); + break; + case 0x0280: + scsiOneValue.Add("Device complies with OCRW (no version claimed)"); + break; + case 0x029E: + scsiOneValue.Add("Device complies with OCRW ISO/IEC 14776-381"); + break; + case 0x02A0: + scsiOneValue.Add("Device complies with MMC-3 (no version claimed)"); + break; + case 0x02B5: + scsiOneValue.Add("Device complies with MMC-3 T10/1363-D revision 9"); + break; + case 0x02B6: + scsiOneValue.Add("Device complies with MMC-3 T10/1363-D revision 10g"); + break; + case 0x02B8: + scsiOneValue.Add("Device complies with MMC-3 ANSI INCITS 360-2002"); + break; + case 0x02E0: + scsiOneValue.Add("Device complies with SMC-2 (no version claimed)"); + break; + case 0x02F5: + scsiOneValue.Add("Device complies with SMC-2 T10/1383-D revision 5"); + break; + case 0x02FC: + scsiOneValue.Add("Device complies with SMC-2 T10/1383-D revision 6"); + break; + case 0x02FD: + scsiOneValue.Add("Device complies with SMC-2 T10/1383-D revision 7"); + break; + case 0x02FE: + scsiOneValue.Add("Device complies with SMC-2 ANSI INCITS 382-2004"); + break; + case 0x0300: + scsiOneValue.Add("Device complies with SPC-3 (no version claimed)"); + break; + case 0x0301: + scsiOneValue.Add("Device complies with SPC-3 T10/1416-D revision 7"); + break; + case 0x0307: + scsiOneValue.Add("Device complies with SPC-3 T10/1416-D revision 21"); + break; + case 0x030F: + scsiOneValue.Add("Device complies with SPC-3 T10/1416-D revision 22"); + break; + case 0x0312: + scsiOneValue.Add("Device complies with SPC-3 T10/1416-D revision 23"); + break; + case 0x0314: + scsiOneValue.Add("Device complies with SPC-3 ANSI INCITS 408-2005"); + break; + case 0x0316: + scsiOneValue.Add("Device complies with SPC-3 ISO/IEC 14776-453"); + break; + case 0x0320: + scsiOneValue.Add("Device complies with SBC-2 (no version claimed)"); + break; + case 0x0322: + scsiOneValue.Add("Device complies with SBC-2 T10/1417-D revision 5a"); + break; + case 0x0324: + scsiOneValue.Add("Device complies with SBC-2 T10/1417-D revision 15"); + break; + case 0x033B: + scsiOneValue.Add("Device complies with SBC-2 T10/1417-D revision 16"); + break; + case 0x033D: + scsiOneValue.Add("Device complies with SBC-2 ANSI INCITS 405-2005"); + break; + case 0x033E: + scsiOneValue.Add("Device complies with SBC-2 ISO/IEC 14776-322"); + break; + case 0x0340: + scsiOneValue.Add("Device complies with OSD (no version claimed)"); + break; + case 0x0341: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 0"); + break; + case 0x0342: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 7a"); + break; + case 0x0343: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 8"); + break; + case 0x0344: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 9"); + break; + case 0x0355: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 10"); + break; + case 0x0356: + scsiOneValue.Add("Device complies with OSD ANSI INCITS 400-2004"); + break; + case 0x0360: + scsiOneValue.Add("Device complies with SSC-2 (no version claimed)"); + break; + case 0x0374: + scsiOneValue.Add("Device complies with SSC-2 T10/1434-D revision 7"); + break; + case 0x0375: + scsiOneValue.Add("Device complies with SSC-2 T10/1434-D revision 9"); + break; + case 0x037D: + scsiOneValue.Add("Device complies with SSC-2 ANSI INCITS 380-2003"); + break; + case 0x0380: + scsiOneValue.Add("Device complies with BCC (no version claimed)"); + break; + case 0x03A0: + scsiOneValue.Add("Device complies with MMC-4 (no version claimed)"); + break; + case 0x03B0: + scsiOneValue.Add("Device complies with MMC-4 T10/1545-D revision 5"); + break; + case 0x03B1: + scsiOneValue.Add("Device complies with MMC-4 T10/1545-D revision 5a"); + break; + case 0x03BD: + scsiOneValue.Add("Device complies with MMC-4 T10/1545-D revision 3"); + break; + case 0x03BE: + scsiOneValue.Add("Device complies with MMC-4 T10/1545-D revision 3d"); + break; + case 0x03BF: + scsiOneValue.Add("Device complies with MMC-4 ANSI INCITS 401-2005"); + break; + case 0x03C0: + scsiOneValue.Add("Device complies with ADC (no version claimed)"); + break; + case 0x03D5: + scsiOneValue.Add("Device complies with ADC T10/1558-D revision 6"); + break; + case 0x03D6: + scsiOneValue.Add("Device complies with ADC T10/1558-D revision 7"); + break; + case 0x03D7: + scsiOneValue.Add("Device complies with ADC ANSI INCITS 403-2005"); + break; + case 0x03E0: + scsiOneValue.Add("Device complies with SES-2 (no version claimed)"); + break; + case 0x03E1: + scsiOneValue.Add("Device complies with SES-2 T10/1559-D revision 16"); + break; + case 0x03E7: + scsiOneValue.Add("Device complies with SES-2 T10/1559-D revision 19"); + break; + case 0x03EB: + scsiOneValue.Add("Device complies with SES-2 T10/1559-D revision 20"); + break; + case 0x03F0: + scsiOneValue.Add("Device complies with SES-2 ANSI INCITS 448-2008"); + break; + case 0x03F2: + scsiOneValue.Add("Device complies with SES-2 ISO/IEC 14776-372"); + break; + case 0x0400: + scsiOneValue.Add("Device complies with SSC-3 (no version claimed)"); + break; + case 0x0403: + scsiOneValue.Add("Device complies with SSC-3 T10/1611-D revision 04a"); + break; + case 0x0407: + scsiOneValue.Add("Device complies with SSC-3 T10/1611-D revision 05"); + break; + case 0x0409: + scsiOneValue.Add("Device complies with SSC-3 ANSI INCITS 467-2011"); + break; + case 0x040B: + scsiOneValue.Add("Device complies with SSC-3 ISO/IEC 14776-333:2013"); + break; + case 0x0420: + scsiOneValue.Add("Device complies with MMC-5 (no version claimed)"); + break; + case 0x042F: + scsiOneValue.Add("Device complies with MMC-5 T10/1675-D revision 03"); + break; + case 0x0431: + scsiOneValue.Add("Device complies with MMC-5 T10/1675-D revision 03b"); + break; + case 0x0432: + scsiOneValue.Add("Device complies with MMC-5 T10/1675-D revision 04"); + break; + case 0x0434: + scsiOneValue.Add("Device complies with MMC-5 ANSI INCITS 430-2007"); + break; + case 0x0440: + scsiOneValue.Add("Device complies with OSD-2 (no version claimed)"); + break; + case 0x0444: + scsiOneValue.Add("Device complies with OSD-2 T10/1729-D revision 4"); + break; + case 0x0446: + scsiOneValue.Add("Device complies with OSD-2 T10/1729-D revision 5"); + break; + case 0x0448: + scsiOneValue.Add("Device complies with OSD-2 ANSI INCITS 458-2011"); + break; + case 0x0460: + scsiOneValue.Add("Device complies with SPC-4 (no version claimed)"); + break; + case 0x0461: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 16"); + break; + case 0x0462: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 18"); + break; + case 0x0463: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 23"); + break; + case 0x0466: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 36"); + break; + case 0x0468: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 37"); + break; + case 0x0469: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 37a"); + break; + case 0x046C: + scsiOneValue.Add("Device complies with SPC-4 ANSI INCITS 513-2015"); + break; + case 0x0480: + scsiOneValue.Add("Device complies with SMC-3 (no version claimed)"); + break; + case 0x0482: + scsiOneValue.Add("Device complies with SMC-3 T10/1730-D revision 15"); + break; + case 0x0484: + scsiOneValue.Add("Device complies with SMC-3 T10/1730-D revision 16"); + break; + case 0x0486: + scsiOneValue.Add("Device complies with SMC-3 ANSI INCITS 484-2012"); + break; + case 0x04A0: + scsiOneValue.Add("Device complies with ADC-2 (no version claimed)"); + break; + case 0x04A7: + scsiOneValue.Add("Device complies with ADC-2 T10/1741-D revision 7"); + break; + case 0x04AA: + scsiOneValue.Add("Device complies with ADC-2 T10/1741-D revision 8"); + break; + case 0x04AC: + scsiOneValue.Add("Device complies with ADC-2 ANSI INCITS 441-2008"); + break; + case 0x04C0: + scsiOneValue.Add("Device complies with SBC-3 (no version claimed)"); + break; + case 0x04C3: + scsiOneValue.Add("Device complies with SBC-3 T10/BSR INCITS 514 revision 35"); + break; + case 0x04C5: + scsiOneValue.Add("Device complies with SBC-3 T10/BSR INCITS 514 revision 36"); + break; + case 0x04C8: + scsiOneValue.Add("Device complies with SBC-3 ANSI INCITS 514-2014"); + break; + case 0x04E0: + scsiOneValue.Add("Device complies with MMC-6 (no version claimed)"); + break; + case 0x04E3: + scsiOneValue.Add("Device complies with MMC-6 T10/1836-D revision 02b"); + break; + case 0x04E5: + scsiOneValue.Add("Device complies with MMC-6 T10/1836-D revision 02g"); + break; + case 0x04E6: + scsiOneValue.Add("Device complies with MMC-6 ANSI INCITS 468-2010"); + break; + case 0x04E7: + scsiOneValue + .Add("Device complies with MMC-6 ANSI INCITS 468-2010 + MMC-6/AM1 ANSI INCITS 468-2010/AM 1"); + break; + case 0x0500: + scsiOneValue.Add("Device complies with ADC-3 (no version claimed)"); + break; + case 0x0502: + scsiOneValue.Add("Device complies with ADC-3 T10/1895-D revision 04"); + break; + case 0x0504: + scsiOneValue.Add("Device complies with ADC-3 T10/1895-D revision 05"); + break; + case 0x0506: + scsiOneValue.Add("Device complies with ADC-3 T10/1895-D revision 05a"); + break; + case 0x050A: + scsiOneValue.Add("Device complies with ADC-3 ANSI INCITS 497-2012"); + break; + case 0x0520: + scsiOneValue.Add("Device complies with SSC-4 (no version claimed)"); + break; + case 0x0523: + scsiOneValue.Add("Device complies with SSC-4 T10/BSR INCITS 516 revision 2"); + break; + case 0x0525: + scsiOneValue.Add("Device complies with SSC-4 T10/BSR INCITS 516 revision 3"); + break; + case 0x0527: + scsiOneValue.Add("Device complies with SSC-4 ANSI INCITS 516-2013"); + break; + case 0x0560: + scsiOneValue.Add("Device complies with OSD-3 (no version claimed)"); + break; + case 0x0580: + scsiOneValue.Add("Device complies with SES-3 (no version claimed)"); + break; + case 0x05A0: + scsiOneValue.Add("Device complies with SSC-5 (no version claimed)"); + break; + case 0x05C0: + scsiOneValue.Add("Device complies with SPC-5 (no version claimed)"); + break; + case 0x05E0: + scsiOneValue.Add("Device complies with SFSC (no version claimed)"); + break; + case 0x05E3: + scsiOneValue.Add("Device complies with SFSC BSR INCITS 501 revision 01"); + break; + case 0x0600: + scsiOneValue.Add("Device complies with SBC-4 (no version claimed)"); + break; + case 0x0620: + scsiOneValue.Add("Device complies with ZBC (no version claimed)"); + break; + case 0x0622: + scsiOneValue.Add("Device complies with ZBC BSR INCITS 536 revision 02"); + break; + case 0x0640: + scsiOneValue.Add("Device complies with ADC-4 (no version claimed)"); + break; + case 0x0820: + scsiOneValue.Add("Device complies with SSA-TL2 (no version claimed)"); + break; + case 0x083B: + scsiOneValue.Add("Device complies with SSA-TL2 T10.1/1147-D revision 05b"); + break; + case 0x083C: + scsiOneValue.Add("Device complies with SSA-TL2 ANSI INCITS 308-1998"); + break; + case 0x0840: + scsiOneValue.Add("Device complies with SSA-TL1 (no version claimed)"); + break; + case 0x085B: + scsiOneValue.Add("Device complies with SSA-TL1 T10.1/0989-D revision 10b"); + break; + case 0x085C: + scsiOneValue.Add("Device complies with SSA-TL1 ANSI INCITS 295-1996"); + break; + case 0x0860: + scsiOneValue.Add("Device complies with SSA-S3P (no version claimed)"); + break; + case 0x087B: + scsiOneValue.Add("Device complies with SSA-S3P T10.1/1051-D revision 05b"); + break; + case 0x087C: + scsiOneValue.Add("Device complies with SSA-S3P ANSI INCITS 309-1998"); + break; + case 0x0880: + scsiOneValue.Add("Device complies with SSA-S2P (no version claimed)"); + break; + case 0x089B: + scsiOneValue.Add("Device complies with SSA-S2P T10.1/1121-D revision 07b"); + break; + case 0x089C: + scsiOneValue.Add("Device complies with SSA-S2P ANSI INCITS 294-1996"); + break; + case 0x08A0: + scsiOneValue.Add("Device complies with SIP (no version claimed)"); + break; + case 0x08BB: + scsiOneValue.Add("Device complies with SIP T10/0856-D revision 10"); + break; + case 0x08BC: + scsiOneValue.Add("Device complies with SIP ANSI INCITS 292-1997"); + break; + case 0x08C0: + scsiOneValue.Add("Device complies with FCP (no version claimed)"); + break; + case 0x08DB: + scsiOneValue.Add("Device complies with FCP T10/0993-D revision 12"); + break; + case 0x08DC: + scsiOneValue.Add("Device complies with FCP ANSI INCITS 269-1996"); + break; + case 0x08E0: + scsiOneValue.Add("Device complies with SBP-2 (no version claimed)"); + break; + case 0x08FB: + scsiOneValue.Add("Device complies with SBP-2 T10/1155-D revision 04"); + break; + case 0x08FC: + scsiOneValue.Add("Device complies with SBP-2 ANSI INCITS 325-1998"); + break; + case 0x0900: + scsiOneValue.Add("Device complies with FCP-2 (no version claimed)"); + break; + case 0x0901: + scsiOneValue.Add("Device complies with FCP-2 T10/1144-D revision 4"); + break; + case 0x0915: + scsiOneValue.Add("Device complies with FCP-2 T10/1144-D revision 7"); + break; + case 0x0916: + scsiOneValue.Add("Device complies with FCP-2 T10/1144-D revision 7a"); + break; + case 0x0917: + scsiOneValue.Add("Device complies with FCP-2 ANSI INCITS 350-2003"); + break; + case 0x0918: + scsiOneValue.Add("Device complies with FCP-2 T10/1144-D revision 8"); + break; + case 0x0920: + scsiOneValue.Add("Device complies with SST (no version claimed)"); + break; + case 0x0935: + scsiOneValue.Add("Device complies with SST T10/1380-D revision 8b"); + break; + case 0x0940: + scsiOneValue.Add("Device complies with SRP (no version claimed)"); + break; + case 0x0954: + scsiOneValue.Add("Device complies with SRP T10/1415-D revision 10"); + break; + case 0x0955: + scsiOneValue.Add("Device complies with SRP T10/1415-D revision 16a"); + break; + case 0x095C: + scsiOneValue.Add("Device complies with SRP ANSI INCITS 365-2002"); + break; + case 0x0960: + scsiOneValue.Add("Device complies with iSCSI (no version claimed)"); + break; + case 0x0961: + case 0x0962: + case 0x0963: + case 0x0964: + case 0x0965: + case 0x0966: + case 0x0967: + case 0x0968: + case 0x0969: + case 0x096A: + case 0x096B: + case 0x096C: + case 0x096D: + case 0x096E: + case 0x096F: + case 0x0970: + case 0x0971: + case 0x0972: + case 0x0973: + case 0x0974: + case 0x0975: + case 0x0976: + case 0x0977: + case 0x0978: + case 0x0979: + case 0x097A: + case 0x097B: + case 0x097C: + case 0x097D: + case 0x097E: + case 0x097F: + scsiOneValue.Add($"Device complies with iSCSI revision {versionDescriptor & 0x1F}"); + break; + case 0x0980: + scsiOneValue.Add("Device complies with SBP-3 (no version claimed)"); + break; + case 0x0982: + scsiOneValue.Add("Device complies with SBP-3 T10/1467-D revision 1f"); + break; + case 0x0994: + scsiOneValue.Add("Device complies with SBP-3 T10/1467-D revision 3"); + break; + case 0x099A: + scsiOneValue.Add("Device complies with SBP-3 T10/1467-D revision 4"); + break; + case 0x099B: + scsiOneValue.Add("Device complies with SBP-3 T10/1467-D revision 5"); + break; + case 0x099C: + scsiOneValue.Add("Device complies with SBP-3 ANSI INCITS 375-2004"); + break; + case 0x09C0: + scsiOneValue.Add("Device complies with ADP (no version claimed)"); + break; + case 0x09E0: + scsiOneValue.Add("Device complies with ADT (no version claimed)"); + break; + case 0x09F9: + scsiOneValue.Add("Device complies with ADT T10/1557-D revision 11"); + break; + case 0x09FA: + scsiOneValue.Add("Device complies with ADT T10/1557-D revision 14"); + break; + case 0x09FD: + scsiOneValue.Add("Device complies with ADT ANSI INCITS 406-2005"); + break; + case 0x0A00: + scsiOneValue.Add("Device complies with FCP-3 (no version claimed)"); + break; + case 0x0A07: + scsiOneValue.Add("Device complies with FCP-3 T10/1560-D revision 3f"); + break; + case 0x0A0F: + scsiOneValue.Add("Device complies with FCP-3 T10/1560-D revision 4"); + break; + case 0x0A11: + scsiOneValue.Add("Device complies with FCP-3 ANSI INCITS 416-2006"); + break; + case 0x0A1C: + scsiOneValue.Add("Device complies with FCP-3 ISO/IEC 14776-223"); + break; + case 0x0A20: + scsiOneValue.Add("Device complies with ADT-2 (no version claimed)"); + break; + case 0x0A22: + scsiOneValue.Add("Device complies with ADT-2 T10/1742-D revision 06"); + break; + case 0x0A27: + scsiOneValue.Add("Device complies with ADT-2 T10/1742-D revision 08"); + break; + case 0x0A28: + scsiOneValue.Add("Device complies with ADT-2 T10/1742-D revision 09"); + break; + case 0x0A2B: + scsiOneValue.Add("Device complies with ADT-2 ANSI INCITS 472-2011"); + break; + case 0x0A40: + scsiOneValue.Add("Device complies with FCP-4 (no version claimed)"); + break; + case 0x0A42: + scsiOneValue.Add("Device complies with FCP-4 T10/1828-D revision 01"); + break; + case 0x0A44: + scsiOneValue.Add("Device complies with FCP-4 T10/1828-D revision 02"); + break; + case 0x0A45: + scsiOneValue.Add("Device complies with FCP-4 T10/1828-D revision 02b"); + break; + case 0x0A46: + scsiOneValue.Add("Device complies with FCP-4 ANSI INCITS 481-2012"); + break; + case 0x0A60: + scsiOneValue.Add("Device complies with ADT-3 (no version claimed)"); + break; + case 0x0AA0: + scsiOneValue.Add("Device complies with SPI (no version claimed)"); + break; + case 0x0AB9: + scsiOneValue.Add("Device complies with SPI T10/0855-D revision 15a"); + break; + case 0x0ABA: + scsiOneValue.Add("Device complies with SPI ANSI INCITS 253-1995"); + break; + case 0x0ABB: + scsiOneValue.Add("Device complies with SPI T10/0855-D revision 15a with SPI Amnd revision 3a"); + break; + case 0x0ABC: + scsiOneValue + .Add("Device complies with SPI ANSI INCITS 253-1995 with SPI Amnd ANSI INCITS 253/AM1-1998"); + break; + case 0x0AC0: + scsiOneValue.Add("Device complies with Fast-20 (no version claimed)"); + break; + case 0x0ADB: + scsiOneValue.Add("Device complies with Fast-20 T10/1071 revision 06"); + break; + case 0x0ADC: + scsiOneValue.Add("Device complies with Fast-20 ANSI INCITS 277-1996"); + break; + case 0x0AE0: + scsiOneValue.Add("Device complies with SPI-2 (no version claimed)"); + break; + case 0x0AFB: + scsiOneValue.Add("Device complies with SPI-2 T10/1142-D revision 20b"); + break; + case 0x0AFC: + scsiOneValue.Add("Device complies with SPI-2 ANSI INCITS 302-1999"); + break; + case 0x0B00: + scsiOneValue.Add("Device complies with SPI-3 (no version claimed)"); + break; + case 0x0B18: + scsiOneValue.Add("Device complies with SPI-3 T10/1302-D revision 10"); + break; + case 0x0B19: + scsiOneValue.Add("Device complies with SPI-3 T10/1302-D revision 13a"); + break; + case 0x0B1A: + scsiOneValue.Add("Device complies with SPI-3 T10/1302-D revision 14"); + break; + case 0x0B1C: + scsiOneValue.Add("Device complies with SPI-3 ANSI INCITS 336-2000"); + break; + case 0x0B20: + scsiOneValue.Add("Device complies with EPI (no version claimed)"); + break; + case 0x0B3B: + scsiOneValue.Add("Device complies with EPI T10/1134 revision 16"); + break; + case 0x0B3C: + scsiOneValue.Add("Device complies with EPI ANSI INCITS TR-23 1999"); + break; + case 0x0B40: + scsiOneValue.Add("Device complies with SPI-4 (no version claimed)"); + break; + case 0x0B54: + scsiOneValue.Add("Device complies with SPI-4 T10/1365-D revision 7"); + break; + case 0x0B55: + scsiOneValue.Add("Device complies with SPI-4 T10/1365-D revision 9"); + break; + case 0x0B56: + scsiOneValue.Add("Device complies with SPI-4 ANSI INCITS 362-2002"); + break; + case 0x0B59: + scsiOneValue.Add("Device complies with SPI-4 T10/1365-D revision 10"); + break; + case 0x0B60: + scsiOneValue.Add("Device complies with SPI-5 (no version claimed)"); + break; + case 0x0B79: + scsiOneValue.Add("Device complies with SPI-5 T10/1525-D revision 3"); + break; + case 0x0B7A: + scsiOneValue.Add("Device complies with SPI-5 T10/1525-D revision 5"); + break; + case 0x0B7B: + scsiOneValue.Add("Device complies with SPI-5 T10/1525-D revision 6"); + break; + case 0x0B7C: + scsiOneValue.Add("Device complies with SPI-5 ANSI INCITS 367-2003"); + break; + case 0x0BE0: + scsiOneValue.Add("Device complies with SAS (no version claimed)"); + break; + case 0x0BE1: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 01"); + break; + case 0x0BF5: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 03"); + break; + case 0x0BFA: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 04"); + break; + case 0x0BFB: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 04"); + break; + case 0x0BFC: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 05"); + break; + case 0x0BFD: + scsiOneValue.Add("Device complies with SAS ANSI INCITS 376-2003"); + break; + case 0x0C00: + scsiOneValue.Add("Device complies with SAS-1.1 (no version claimed)"); + break; + case 0x0C07: + scsiOneValue.Add("Device complies with SAS-1.1 T10/1601-D revision 9"); + break; + case 0x0C0F: + scsiOneValue.Add("Device complies with SAS-1.1 T10/1601-D revision 10"); + break; + case 0x0C11: + scsiOneValue.Add("Device complies with SAS-1.1 ANSI INCITS 417-2006"); + break; + case 0x0C12: + scsiOneValue.Add("Device complies with SAS-1.1 ISO/IEC 14776-151"); + break; + case 0x0C20: + scsiOneValue.Add("Device complies with SAS-2 (no version claimed)"); + break; + case 0x0C23: + scsiOneValue.Add("Device complies with SAS-2 T10/1760-D revision 14"); + break; + case 0x0C27: + scsiOneValue.Add("Device complies with SAS-2 T10/1760-D revision 15"); + break; + case 0x0C28: + scsiOneValue.Add("Device complies with SAS-2 T10/1760-D revision 16"); + break; + case 0x0C2A: + scsiOneValue.Add("Device complies with SAS-2 ANSI INCITS 457-2010"); + break; + case 0x0C40: + scsiOneValue.Add("Device complies with SAS-2.1 (no version claimed)"); + break; + case 0x0C48: + scsiOneValue.Add("Device complies with SAS-2.1 T10/2125-D revision 04"); + break; + case 0x0C4A: + scsiOneValue.Add("Device complies with SAS-2.1 T10/2125-D revision 06"); + break; + case 0x0C4B: + scsiOneValue.Add("Device complies with SAS-2.1 T10/2125-D revision 07"); + break; + case 0x0C4E: + scsiOneValue.Add("Device complies with SAS-2.1 ANSI INCITS 478-2011"); + break; + case 0x0C4F: + scsiOneValue + .Add("Device complies with SAS-2.1 ANSI INCITS 478-2011 w/ Amnd 1 ANSI INCITS 478/AM1-2014"); + break; + case 0x0C52: + scsiOneValue.Add("Device complies with SAS-2.1 ISO/IEC 14776-153"); + break; + case 0x0C60: + scsiOneValue.Add("Device complies with SAS-3 (no version claimed)"); + break; + case 0x0C63: + scsiOneValue.Add("Device complies with SAS-3 T10/BSR INCITS 519 revision 05a"); + break; + case 0x0C65: + scsiOneValue.Add("Device complies with SAS-3 T10/BSR INCITS 519 revision 06"); + break; + case 0x0C68: + scsiOneValue.Add("Device complies with SAS-3 ANSI INCITS 519-2014"); + break; + case 0x0C80: + scsiOneValue.Add("Device complies with SAS-4 (no version claimed)"); + break; + case 0x0D20: + scsiOneValue.Add("Device complies with FC-PH (no version claimed)"); + break; + case 0x0D3B: + scsiOneValue.Add("Device complies with FC-PH ANSI INCITS 230-1994"); + break; + case 0x0D3C: + scsiOneValue + .Add("Device complies with FC-PH ANSI INCITS 230-1994 with Amnd 1 ANSI INCITS 230/AM1-1996"); + break; + case 0x0D40: + scsiOneValue.Add("Device complies with FC-AL (no version claimed)"); + break; + case 0x0D5C: + scsiOneValue.Add("Device complies with FC-AL ANSI INCITS 272-1996"); + break; + case 0x0D60: + scsiOneValue.Add("Device complies with FC-AL-2 (no version claimed)"); + break; + case 0x0D61: + scsiOneValue.Add("Device complies with FC-AL-2 T11/1133-D revision 7.0"); + break; + case 0x0D63: + scsiOneValue.Add("Device complies with FC-AL-2 ANSI INCITS 332-1999 with AM1-2003 & AM2-2006"); + break; + case 0x0D64: + scsiOneValue.Add("Device complies with FC-AL-2 ANSI INCITS 332-1999 with Amnd 2 AM2-2006"); + break; + case 0x0D65: + scsiOneValue.Add("Device complies with FC-AL-2 ISO/IEC 14165-122 with AM1 & AM2"); + break; + case 0x0D7C: + scsiOneValue.Add("Device complies with FC-AL-2 ANSI INCITS 332-1999"); + break; + case 0x0D7D: + scsiOneValue.Add("Device complies with FC-AL-2 ANSI INCITS 332-1999 with Amnd 1 AM1-2003"); + break; + case 0x0D80: + scsiOneValue.Add("Device complies with FC-PH-3 (no version claimed)"); + break; + case 0x0D9C: + scsiOneValue.Add("Device complies with FC-PH-3 ANSI INCITS 303-1998"); + break; + case 0x0DA0: + scsiOneValue.Add("Device complies with FC-FS (no version claimed)"); + break; + case 0x0DB7: + scsiOneValue.Add("Device complies with FC-FS T11/1331-D revision 1.2"); + break; + case 0x0DB8: + scsiOneValue.Add("Device complies with FC-FS T11/1331-D revision 1.7"); + break; + case 0x0DBC: + scsiOneValue.Add("Device complies with FC-FS ANSI INCITS 373-2003"); + break; + case 0x0DBD: + scsiOneValue.Add("Device complies with FC-FS ISO/IEC 14165-251"); + break; + case 0x0DC0: + scsiOneValue.Add("Device complies with FC-PI (no version claimed)"); + break; + case 0x0DDC: + scsiOneValue.Add("Device complies with FC-PI ANSI INCITS 352-2002"); + break; + case 0x0DE0: + scsiOneValue.Add("Device complies with FC-PI-2 (no version claimed)"); + break; + case 0x0DE2: + scsiOneValue.Add("Device complies with FC-PI-2 T11/1506-D revision 5.0"); + break; + case 0x0DE4: + scsiOneValue.Add("Device complies with FC-PI-2 ANSI INCITS 404-2006"); + break; + case 0x0E00: + scsiOneValue.Add("Device complies with FC-FS-2 (no version claimed)"); + break; + case 0x0E02: + scsiOneValue.Add("Device complies with FC-FS-2 ANSI INCITS 242-2007"); + break; + case 0x0E03: + scsiOneValue + .Add("Device complies with FC-FS-2 ANSI INCITS 242-2007 with AM1 ANSI INCITS 242/AM1-2007"); + break; + case 0x0E20: + scsiOneValue.Add("Device complies with FC-LS (no version claimed)"); + break; + case 0x0E21: + scsiOneValue.Add("Device complies with FC-LS T11/1620-D revision 1.62"); + break; + case 0x0E29: + scsiOneValue.Add("Device complies with FC-LS ANSI INCITS 433-2007"); + break; + case 0x0E40: + scsiOneValue.Add("Device complies with FC-SP (no version claimed)"); + break; + case 0x0E42: + scsiOneValue.Add("Device complies with FC-SP T11/1570-D revision 1.6"); + break; + case 0x0E45: + scsiOneValue.Add("Device complies with FC-SP ANSI INCITS 426-2007"); + break; + case 0x0E60: + scsiOneValue.Add("Device complies with FC-PI-3 (no version claimed)"); + break; + case 0x0E62: + scsiOneValue.Add("Device complies with FC-PI-3 T11/1625-D revision 2.0"); + break; + case 0x0E68: + scsiOneValue.Add("Device complies with FC-PI-3 T11/1625-D revision 2.1"); + break; + case 0x0E6A: + scsiOneValue.Add("Device complies with FC-PI-3 T11/1625-D revision 4.0"); + break; + case 0x0E6E: + scsiOneValue.Add("Device complies with FC-PI-3 ANSI INCITS 460-2011"); + break; + case 0x0E80: + scsiOneValue.Add("Device complies with FC-PI-4 (no version claimed)"); + break; + case 0x0E82: + scsiOneValue.Add("Device complies with FC-PI-4 T11/1647-D revision 8.0"); + break; + case 0x0E88: + scsiOneValue.Add("Device complies with FC-PI-4 ANSI INCITS 450-2009"); + break; + case 0x0EA0: + scsiOneValue.Add("Device complies with FC 10GFC (no version claimed)"); + break; + case 0x0EA2: + scsiOneValue.Add("Device complies with FC 10GFC ANSI INCITS 364-2003"); + break; + case 0x0EA3: + scsiOneValue.Add("Device complies with FC 10GFC ISO/IEC 14165-116"); + break; + case 0x0EA5: + scsiOneValue.Add("Device complies with FC 10GFC ISO/IEC 14165-116 with AM1"); + break; + case 0x0EA6: + scsiOneValue + .Add("Device complies with FC 10GFC ANSI INCITS 364-2003 with AM1 ANSI INCITS 364/AM1-2007"); + break; + case 0x0EC0: + scsiOneValue.Add("Device complies with FC-SP-2 (no version claimed)"); + break; + case 0x0EE0: + scsiOneValue.Add("Device complies with FC-FS-3 (no version claimed)"); + break; + case 0x0EE2: + scsiOneValue.Add("Device complies with FC-FS-3 T11/1861-D revision 0.9"); + break; + case 0x0EE7: + scsiOneValue.Add("Device complies with FC-FS-3 T11/1861-D revision 1.0"); + break; + case 0x0EE9: + scsiOneValue.Add("Device complies with FC-FS-3 T11/1861-D revision 1.10"); + break; + case 0x0EEB: + scsiOneValue.Add("Device complies with FC-FS-3 ANSI INCITS 470-2011"); + break; + case 0x0F00: + scsiOneValue.Add("Device complies with FC-LS-2 (no version claimed)"); + break; + case 0x0F03: + scsiOneValue.Add("Device complies with FC-LS-2 T11/2103-D revision 2.11"); + break; + case 0x0F05: + scsiOneValue.Add("Device complies with FC-LS-2 T11/2103-D revision 2.21"); + break; + case 0x0F07: + scsiOneValue.Add("Device complies with FC-LS-2 ANSI INCITS 477-2011"); + break; + case 0x0F20: + scsiOneValue.Add("Device complies with FC-PI-5 (no version claimed)"); + break; + case 0x0F27: + scsiOneValue.Add("Device complies with FC-PI-5 T11/2118-D revision 2.00"); + break; + case 0x0F28: + scsiOneValue.Add("Device complies with FC-PI-5 T11/2118-D revision 3.00"); + break; + case 0x0F2A: + scsiOneValue.Add("Device complies with FC-PI-5 T11/2118-D revision 6.00"); + break; + case 0x0F2B: + scsiOneValue.Add("Device complies with FC-PI-5 T11/2118-D revision 6.10"); + break; + case 0x0F2E: + scsiOneValue.Add("Device complies with FC-PI-5 ANSI INCITS 479-2011"); + break; + case 0x0F40: + scsiOneValue.Add("Device complies with FC-PI-6 (no version claimed)"); + break; + case 0x0F60: + scsiOneValue.Add("Device complies with FC-FS-4 (no version claimed)"); + break; + case 0x0F80: + scsiOneValue.Add("Device complies with FC-LS-3 (no version claimed)"); + break; + case 0x12A0: + scsiOneValue.Add("Device complies with FC-SCM (no version claimed)"); + break; + case 0x12A3: + scsiOneValue.Add("Device complies with FC-SCM T11/1824DT revision 1.0"); + break; + case 0x12A5: + scsiOneValue.Add("Device complies with FC-SCM T11/1824DT revision 1.1"); + break; + case 0x12A7: + scsiOneValue.Add("Device complies with FC-SCM T11/1824DT revision 1.4"); + break; + case 0x12AA: + scsiOneValue.Add("Device complies with FC-SCM INCITS TR-47 2012"); + break; + case 0x12C0: + scsiOneValue.Add("Device complies with FC-DA-2 (no version claimed)"); + break; + case 0x12C3: + scsiOneValue.Add("Device complies with FC-DA-2 T11/1870DT revision 1.04"); + break; + case 0x12C5: + scsiOneValue.Add("Device complies with FC-DA-2 T11/1870DT revision 1.06"); + break; + case 0x12C9: + scsiOneValue.Add("Device complies with FC-DA-2 INCITS TR-49 2012"); + break; + case 0x12E0: + scsiOneValue.Add("Device complies with FC-DA (no version claimed)"); + break; + case 0x12E2: + scsiOneValue.Add("Device complies with FC-DA T11/1513-DT revision 3.1"); + break; + case 0x12E8: + scsiOneValue.Add("Device complies with FC-DA ANSI INCITS TR-36 2004"); + break; + case 0x12E9: + scsiOneValue.Add("Device complies with FC-DA ISO/IEC 14165-341"); + break; + case 0x1300: + scsiOneValue.Add("Device complies with FC-Tape (no version claimed)"); + break; + case 0x1301: + scsiOneValue.Add("Device complies with FC-Tape T11/1315 revision 1.16"); + break; + case 0x131B: + scsiOneValue.Add("Device complies with FC-Tape T11/1315 revision 1.17"); + break; + case 0x131C: + scsiOneValue.Add("Device complies with FC-Tape ANSI INCITS TR-24 1999"); + break; + case 0x1320: + scsiOneValue.Add("Device complies with FC-FLA (no version claimed)"); + break; + case 0x133B: + scsiOneValue.Add("Device complies with FC-FLA T11/1235 revision 7"); + break; + case 0x133C: + scsiOneValue.Add("Device complies with FC-FLA ANSI INCITS TR-20 1998"); + break; + case 0x1340: + scsiOneValue.Add("Device complies with FC-PLDA (no version claimed)"); + break; + case 0x135B: + scsiOneValue.Add("Device complies with FC-PLDA T11/1162 revision 2.1"); + break; + case 0x135C: + scsiOneValue.Add("Device complies with FC-PLDA ANSI INCITS TR-19 1998"); + break; + case 0x1360: + scsiOneValue.Add("Device complies with SSA-PH2 (no version claimed)"); + break; + case 0x137B: + scsiOneValue.Add("Device complies with SSA-PH2 T10.1/1145-D revision 09c"); + break; + case 0x137C: + scsiOneValue.Add("Device complies with SSA-PH2 ANSI INCITS 293-1996"); + break; + case 0x1380: + scsiOneValue.Add("Device complies with SSA-PH3 (no version claimed)"); + break; + case 0x139B: + scsiOneValue.Add("Device complies with SSA-PH3 T10.1/1146-D revision 05b"); + break; + case 0x139C: + scsiOneValue.Add("Device complies with SSA-PH3 ANSI INCITS 307-1998"); + break; + case 0x14A0: + scsiOneValue.Add("Device complies with IEEE 1394 (no version claimed)"); + break; + case 0x14BD: + scsiOneValue.Add("Device complies with ANSI IEEE 1394-1995"); + break; + case 0x14C0: + scsiOneValue.Add("Device complies with IEEE 1394a (no version claimed)"); + break; + case 0x14E0: + scsiOneValue.Add("Device complies with IEEE 1394b (no version claimed)"); + break; + case 0x15E0: + scsiOneValue.Add("Device complies with ATA/ATAPI-6 (no version claimed)"); + break; + case 0x15FD: + scsiOneValue.Add("Device complies with ATA/ATAPI-6 ANSI INCITS 361-2002"); + break; + case 0x1600: + scsiOneValue.Add("Device complies with ATA/ATAPI-7 (no version claimed)"); + break; + case 0x1602: + scsiOneValue.Add("Device complies with ATA/ATAPI-7 T13/1532-D revision 3"); + break; + case 0x161C: + scsiOneValue.Add("Device complies with ATA/ATAPI-7 ANSI INCITS 397-2005"); + break; + case 0x161E: + scsiOneValue.Add("Device complies with ATA/ATAPI-7 ISO/IEC 24739"); + break; + case 0x1620: + scsiOneValue.Add("Device complies with ATA/ATAPI-8 ATA8-AAM (no version claimed)"); + break; + case 0x1621: + scsiOneValue + .Add("Device complies with ATA/ATAPI-8 ATA8-APT Parallel Transport (no version claimed)"); + break; + case 0x1622: + scsiOneValue + .Add("Device complies with ATA/ATAPI-8 ATA8-AST Serial Transport (no version claimed)"); + break; + case 0x1623: + scsiOneValue + .Add("Device complies with ATA/ATAPI-8 ATA8-ACS ATA/ATAPI Command Set (no version claimed)"); + break; + case 0x1628: + scsiOneValue.Add("Device complies with ATA/ATAPI-8 ATA8-AAM ANSI INCITS 451-2008"); + break; + case 0x162A: + scsiOneValue + .Add("Device complies with ATA/ATAPI-8 ATA8-ACS ANSI INCITS 452-2009 w/ Amendment 1"); + break; + case 0x1728: + scsiOneValue.Add("Device complies with Universal Serial Bus Specification, Revision 1.1"); + break; + case 0x1729: + scsiOneValue.Add("Device complies with Universal Serial Bus Specification, Revision 2.0"); + break; + case 0x1730: + scsiOneValue + .Add("Device complies with USB Mass Storage Class Bulk-Only Transport, Revision 1.0"); + break; + case 0x1740: + scsiOneValue.Add("Device complies with UAS (no version claimed)"); + break; + case 0x1743: + scsiOneValue.Add("Device complies with UAS T10/2095-D revision 02"); + break; + case 0x1747: + scsiOneValue.Add("Device complies with UAS T10/2095-D revision 04"); + break; + case 0x1748: + scsiOneValue.Add("Device complies with UAS ANSI INCITS 471-2010"); + break; + case 0x1749: + scsiOneValue.Add("Device complies with UAS ISO/IEC 14776-251:2014"); + break; + case 0x1761: + scsiOneValue.Add("Device complies with ACS-2 (no version claimed)"); + break; + case 0x1762: + scsiOneValue.Add("Device complies with ACS-2 ANSI INCITS 482-2013"); + break; + case 0x1765: + scsiOneValue.Add("Device complies with ACS-3 (no version claimed)"); + break; + case 0x1780: + scsiOneValue.Add("Device complies with UAS-2 (no version claimed)"); + break; + case 0x1EA0: + scsiOneValue.Add("Device complies with SAT (no version claimed)"); + break; + case 0x1EA7: + scsiOneValue.Add("Device complies with SAT T10/1711-D revision 8"); + break; + case 0x1EAB: + scsiOneValue.Add("Device complies with SAT T10/1711-D revision 9"); + break; + case 0x1EAD: + scsiOneValue.Add("Device complies with SAT ANSI INCITS 431-2007"); + break; + case 0x1EC0: + scsiOneValue.Add("Device complies with SAT-2 (no version claimed)"); + break; + case 0x1EC4: + scsiOneValue.Add("Device complies with SAT-2 T10/1826-D revision 06"); + break; + case 0x1EC8: + scsiOneValue.Add("Device complies with SAT-2 T10/1826-D revision 09"); + break; + case 0x1ECA: + scsiOneValue.Add("Device complies with SAT-2 ANSI INCITS 465-2010"); + break; + case 0x1EE0: + scsiOneValue.Add("Device complies with SAT-3 (no version claimed)"); + break; + case 0x1EE2: + scsiOneValue.Add("Device complies with SAT-3 T10/BSR INCITS 517 revision 4"); + break; + case 0x1EE4: + scsiOneValue.Add("Device complies with SAT-3 T10/BSR INCITS 517 revision 7"); + break; + case 0x1EE8: + scsiOneValue.Add("Device complies with SAT-3 ANSI INCITS 517-2015"); + break; + case 0x1F00: + scsiOneValue.Add("Device complies with SAT-4 (no version claimed)"); + break; + case 0x20A0: + scsiOneValue.Add("Device complies with SPL (no version claimed)"); + break; + case 0x20A3: + scsiOneValue.Add("Device complies with SPL T10/2124-D revision 6a"); + break; + case 0x20A5: + scsiOneValue.Add("Device complies with SPL T10/2124-D revision 7"); + break; + case 0x20A7: + scsiOneValue.Add("Device complies with SPL ANSI INCITS 476-2011"); + break; + case 0x20A8: + scsiOneValue.Add("Device complies with SPL ANSI INCITS 476-2011 + SPL AM1 INCITS 476/AM1 2012"); + break; + case 0x20AA: + scsiOneValue.Add("Device complies with SPL ISO/IEC 14776-261:2012"); + break; + case 0x20C0: + scsiOneValue.Add("Device complies with SPL-2 (no version claimed)"); + break; + case 0x20C2: + scsiOneValue.Add("Device complies with SPL-2 T10/BSR INCITS 505 revision 4"); + break; + case 0x20C4: + scsiOneValue.Add("Device complies with SPL-2 T10/BSR INCITS 505 revision 5"); + break; + case 0x20C8: + scsiOneValue.Add("Device complies with SPL-2 ANSI INCITS 505-2013"); + break; + case 0x20E0: + scsiOneValue.Add("Device complies with SPL-3 (no version claimed)"); + break; + case 0x20E4: + scsiOneValue.Add("Device complies with SPL-3 T10/BSR INCITS 492 revision 6"); + break; + case 0x20E6: + scsiOneValue.Add("Device complies with SPL-3 T10/BSR INCITS 492 revision 7"); + break; + case 0x20E8: + scsiOneValue.Add("Device complies with SPL-3 ANSI INCITS 492-2015"); + break; + case 0x2100: + scsiOneValue.Add("Device complies with SPL-4 (no version claimed)"); + break; + case 0x21E0: + scsiOneValue.Add("Device complies with SOP (no version claimed)"); + break; + case 0x21E4: + scsiOneValue.Add("Device complies with SOP T10/BSR INCITS 489 revision 4"); + break; + case 0x21E6: + scsiOneValue.Add("Device complies with SOP T10/BSR INCITS 489 revision 5"); + break; + case 0x21E8: + scsiOneValue.Add("Device complies with SOP ANSI INCITS 489-2014"); + break; + case 0x2200: + scsiOneValue.Add("Device complies with PQI (no version claimed)"); + break; + case 0x2204: + scsiOneValue.Add("Device complies with PQI T10/BSR INCITS 490 revision 6"); + break; + case 0x2206: + scsiOneValue.Add("Device complies with PQI T10/BSR INCITS 490 revision 7"); + break; + case 0x2208: + scsiOneValue.Add("Device complies with PQI ANSI INCITS 490-2014"); + break; + case 0x2220: + scsiOneValue.Add("Device complies with SOP-2 (no version claimed)"); + break; + case 0x2240: + scsiOneValue.Add("Device complies with PQI-2 (no version claimed)"); + break; + case 0xFFC0: + scsiOneValue.Add("Device complies with IEEE 1667 (no version claimed)"); + break; + case 0xFFC1: + scsiOneValue.Add("Device complies with IEEE 1667-2006"); + break; + case 0xFFC2: + scsiOneValue.Add("Device complies with IEEE 1667-2009"); + break; + default: + scsiOneValue.Add($"Device complies with unknown standard code 0x{versionDescriptor:X4}"); + break; + } + + return scsiOneValue; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs b/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs new file mode 100644 index 00000000..b9e8fbb1 --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs @@ -0,0 +1,290 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiMmcFeatures.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MMC features from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.SCSI.MMC; + +namespace DiscImageChef.Server +{ + public static class ScsiMmcFeatures + { + /// + /// Takes the MMC FEATURES part of a device report and prints it as a list of values to be sequenced by ASP.NET in the + /// rendering + /// + /// FEATURES part of the report + /// List to put the values on + public static void Report(MmcFeatures ftr, ref List mmcOneValue) + { + if(ftr.SupportsAACS && ftr.AACSVersion.HasValue) + mmcOneValue.Add($"Drive supports AACS version {ftr.AACSVersion}"); + else if(ftr.SupportsAACS) mmcOneValue.Add("Drive supports AACS"); + if(ftr.AGIDs.HasValue) mmcOneValue.Add($"Drive supports {ftr.AGIDs} AGIDs concurrently"); + if(ftr.CanGenerateBindingNonce) + { + mmcOneValue.Add("Drive supports generating the binding nonce"); + if(ftr.BindingNonceBlocks.HasValue) + mmcOneValue.Add($"{ftr.BindingNonceBlocks} media blocks are required for the binding nonce"); + } + + if(ftr.BlocksPerReadableUnit > 1) + mmcOneValue.Add($"{ftr.BlocksPerReadableUnit} logical blocks per media writable unit"); + if(ftr.BufferUnderrunFreeInDVD) mmcOneValue.Add("Drive supports zero loss linking writing DVDs"); + if(ftr.BufferUnderrunFreeInSAO) mmcOneValue.Add("Drive supports zero loss linking in Session at Once Mode"); + if(ftr.BufferUnderrunFreeInTAO) mmcOneValue.Add("Drive supports zero loss linking in Track at Once Mode"); + if(ftr.CanAudioScan) mmcOneValue.Add("Drive supports the SCAN command"); + if(ftr.CanEject) mmcOneValue.Add("Drive can eject media"); + if(ftr.CanEraseSector) mmcOneValue.Add("Drive supports media that require erasing before writing"); + if(ftr.CanExpandBDRESpareArea) mmcOneValue.Add("Drive can expand the spare area on a formatted BD-RE disc"); + if(ftr.CanFormat) mmcOneValue.Add("Drive can format media into logical blocks"); + if(ftr.CanFormatBDREWithoutSpare) mmcOneValue.Add("Drive can format BD-RE with no spares allocated"); + if(ftr.CanFormatQCert) mmcOneValue.Add("Drive can format BD-RE discs with quick certification"); + if(ftr.CanFormatCert) mmcOneValue.Add("Drive can format BD-RE discs with full certification"); + if(ftr.CanFormatFRF) mmcOneValue.Add("Drive can fast re-format BD-RE discs"); + if(ftr.CanFormatRRM) mmcOneValue.Add("Drive can format BD-R discs with RRM format"); + if(ftr.CanLoad) mmcOneValue.Add("Drive can load media"); + if(ftr.CanMuteSeparateChannels) mmcOneValue.Add("Drive is able to mute channels separately"); + if(ftr.CanOverwriteSAOTrack) mmcOneValue.Add("Drive can overwrite a SAO track with another in CD-RWs"); + if(ftr.CanOverwriteTAOTrack) mmcOneValue.Add("Drive can overwrite a TAO track with another in CD-RWs"); + if(ftr.CanPlayCDAudio) mmcOneValue.Add("Drive has an analogue audio output"); + if(ftr.CanPseudoOverwriteBDR) mmcOneValue.Add("Drive can write BD-R on Pseudo-OVerwrite SRM mode"); + if(ftr.CanReadAllDualR) mmcOneValue.Add("Drive can read DVD-R DL from all recording modes"); + if(ftr.CanReadAllDualRW) mmcOneValue.Add("Drive can read DVD-RW DL from all recording modes"); + if(ftr.CanReadBD) mmcOneValue.Add("Drive can read BD-ROM"); + if(ftr.CanReadBDR) mmcOneValue.Add("Drive can read BD-R Ver.1"); + if(ftr.CanReadBDRE1) mmcOneValue.Add("Drive can read BD-RE Ver.1"); + if(ftr.CanReadBDRE2) mmcOneValue.Add("Drive can read BD-RE Ver.2"); + if(ftr.CanReadBDROM) mmcOneValue.Add("Drive can read BD-ROM Ver.1"); + if(ftr.CanReadBluBCA) mmcOneValue.Add("Drive can read BD's Burst Cutting Area"); + if(ftr.CanReadCD) mmcOneValue.Add("Drive can read CD-ROM"); + if(ftr.CanWriteCDMRW && ftr.CanReadDVDPlusMRW && ftr.CanWriteDVDPlusMRW) + mmcOneValue.Add("Drive can read and write CD-MRW and DVD+MRW"); + else if(ftr.CanReadDVDPlusMRW && ftr.CanWriteDVDPlusMRW) + mmcOneValue.Add("Drive can read and write DVD+MRW"); + else if(ftr.CanWriteCDMRW && ftr.CanReadDVDPlusMRW) + mmcOneValue.Add("Drive and read DVD+MRW and read and write CD-MRW"); + else if(ftr.CanWriteCDMRW) mmcOneValue.Add("Drive can read and write CD-MRW"); + else if(ftr.CanReadDVDPlusMRW) mmcOneValue.Add("Drive can read CD-MRW and DVD+MRW"); + else if(ftr.CanReadCDMRW) mmcOneValue.Add("Drive can read CD-MRW"); + if(ftr.CanReadCPRM_MKB) mmcOneValue.Add("Drive supports reading Media Key Block of CPRM"); + if(ftr.CanReadDDCD) mmcOneValue.Add("Drive can read DDCDs"); + if(ftr.CanReadDVD) mmcOneValue.Add("Drive can read DVD"); + if(ftr.CanWriteDVDPlusRW) mmcOneValue.Add("Drive can read and write DVD+RW"); + else if(ftr.CanReadDVDPlusRW) mmcOneValue.Add("Drive can read DVD+RW"); + if(ftr.CanWriteDVDPlusR) mmcOneValue.Add("Drive can read and write DVD+R"); + else if(ftr.CanReadDVDPlusR) mmcOneValue.Add("Drive can read DVD+R"); + if(ftr.CanWriteDVDPlusRDL) mmcOneValue.Add("Drive can read and write DVD+R DL"); + else if(ftr.CanReadDVDPlusRDL) mmcOneValue.Add("Drive can read DVD+R DL"); + if(ftr.CanReadDriveAACSCertificate) mmcOneValue.Add("Drive supports reading the Drive Certificate"); + if(ftr.CanReadHDDVD && ftr.CanReadHDDVDR && ftr.CanReadHDDVDRAM) + mmcOneValue.Add("Drive can read HD DVD-ROM, HD DVD-RW, HD DVD-R and HD DVD-RAM"); + else if(ftr.CanReadHDDVD && ftr.CanReadHDDVDR) + mmcOneValue.Add("Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-R"); + else if(ftr.CanReadHDDVD && ftr.CanReadHDDVDRAM) + mmcOneValue.Add("Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-RAM"); + else if(ftr.CanReadHDDVD) mmcOneValue.Add("Drive can read HD DVD-ROM and HD DVD-RW"); + if(ftr.CanReadLeadInCDText) mmcOneValue.Add("Drive can return CD-Text from Lead-In"); + if(ftr.CanReadOldBDR) mmcOneValue.Add("Drive can read BD-R pre-1.0"); + if(ftr.CanReadOldBDRE) mmcOneValue.Add("Drive can read BD-RE pre-1.0"); + if(ftr.CanReadOldBDROM) mmcOneValue.Add("Drive can read BD-ROM pre-1.0"); + if(ftr.CanReadSpareAreaInformation) mmcOneValue.Add("Drive can return Spare Area Information"); + if(ftr.CanReportDriveSerial) mmcOneValue.Add("Drive is to report drive serial number"); + if(ftr.CanReportMediaSerial) mmcOneValue.Add("Drive is to read media serial number"); + if(ftr.CanTestWriteDDCDR) mmcOneValue.Add("Drive can do a test writing with DDCD-R"); + if(ftr.CanTestWriteDVD) mmcOneValue.Add("Drive can do a test writing with DVDs"); + if(ftr.CanTestWriteInSAO) mmcOneValue.Add("Drive can do a test writing in Session at Once Mode"); + if(ftr.CanTestWriteInTAO) mmcOneValue.Add("Drive can do a test writing in Track at Once Mode"); + if(ftr.CanUpgradeFirmware) mmcOneValue.Add("Drive supports Microcode Upgrade"); + if(ftr.ErrorRecoveryPage) mmcOneValue.Add("Drive shall report Read/Write Error Recovery mode page"); + if(ftr.Locked) mmcOneValue.Add("Drive can lock media"); + if(ftr.LogicalBlockSize > 0) mmcOneValue.Add($"{ftr.LogicalBlockSize} bytes per logical block"); + if(ftr.MultiRead) + mmcOneValue.Add("Drive claims capability to read all CD formats according to OSTA Multi-Read Specification"); + + if(ftr.PhysicalInterfaceStandard.HasValue) + switch(ftr.PhysicalInterfaceStandard) + { + case PhysicalInterfaces.Unspecified: + mmcOneValue.Add("Drive uses an unspecified physical interface"); + break; + case PhysicalInterfaces.SCSI: + mmcOneValue.Add("Drive uses SCSI interface"); + break; + case PhysicalInterfaces.ATAPI: + mmcOneValue.Add("Drive uses ATAPI interface"); + break; + case PhysicalInterfaces.IEEE1394: + mmcOneValue.Add("Drive uses IEEE-1394 interface"); + break; + case PhysicalInterfaces.IEEE1394A: + mmcOneValue.Add("Drive uses IEEE-1394A interface"); + break; + case PhysicalInterfaces.FC: + mmcOneValue.Add("Drive uses Fibre Channel interface"); + break; + case PhysicalInterfaces.IEEE1394B: + mmcOneValue.Add("Drive uses IEEE-1394B interface"); + break; + case PhysicalInterfaces.SerialATAPI: + mmcOneValue.Add("Drive uses Serial ATAPI interface"); + break; + case PhysicalInterfaces.USB: + mmcOneValue.Add("Drive uses USB interface"); + break; + case PhysicalInterfaces.Vendor: + mmcOneValue.Add("Drive uses a vendor unique interface"); + break; + default: + mmcOneValue + .Add($"Drive uses an unknown interface with code {(uint)ftr.PhysicalInterfaceStandard}"); + break; + } + + if(ftr.PreventJumper) mmcOneValue.Add("Drive power ups locked"); + if(ftr.SupportsBusEncryption) mmcOneValue.Add("Drive supports bus encryption"); + if(ftr.CanWriteBD) mmcOneValue.Add("Drive can write BD-R or BD-RE"); + if(ftr.CanWriteBDR) mmcOneValue.Add("Drive can write BD-R Ver.1"); + if(ftr.CanWriteBDRE1) mmcOneValue.Add("Drive can write BD-RE Ver.1"); + if(ftr.CanWriteBDRE2) mmcOneValue.Add("Drive can write BD-RE Ver.2"); + if(ftr.CanWriteBusEncryptedBlocks) mmcOneValue.Add("Drive supports writing with bus encryption"); + if(ftr.CanWriteCDRW) mmcOneValue.Add("Drive can write CD-RW"); + if(ftr.CanWriteCDRWCAV) mmcOneValue.Add("Drive can write High-Speed CD-RW"); + if(ftr.CanWriteCDSAO && !ftr.CanWriteRaw) + mmcOneValue.Add("Drive can write CDs in Session at Once Mode:"); + else if(!ftr.CanWriteCDSAO && ftr.CanWriteRaw) mmcOneValue.Add("Drive can write CDs in raw Mode:"); + else if(ftr.CanWriteCDSAO && ftr.CanWriteRaw) + mmcOneValue.Add("Drive can write CDs in Session at Once and in Raw Modes:"); + if(ftr.CanWriteCDTAO) mmcOneValue.Add("Drive can write CDs in Track at Once Mode:"); + if(ftr.CanWriteCSSManagedDVD) mmcOneValue.Add("Drive can write CSS managed DVDs"); + if(ftr.CanWriteDDCDR) mmcOneValue.Add("Drive supports writing DDCD-R"); + if(ftr.CanWriteDDCDRW) mmcOneValue.Add("Drive supports writing DDCD-RW"); + if(ftr.CanWriteDVDPlusRWDL) mmcOneValue.Add("Drive can read and write DVD+RW DL"); + else if(ftr.CanReadDVDPlusRWDL) mmcOneValue.Add("Drive can read DVD+RW DL"); + if(ftr.CanWriteDVDR && ftr.CanWriteDVDRW && ftr.CanWriteDVDRDL) + mmcOneValue.Add("Drive supports writing DVD-R, DVD-RW and DVD-R DL"); + else if(ftr.CanWriteDVDR && ftr.CanWriteDVDRDL) + mmcOneValue.Add("Drive supports writing DVD-R and DVD-R DL"); + else if(ftr.CanWriteDVDR && ftr.CanWriteDVDRW) mmcOneValue.Add("Drive supports writing DVD-R and DVD-RW"); + else if(ftr.CanWriteDVDR) mmcOneValue.Add("Drive supports writing DVD-R"); + if(ftr.CanWriteHDDVDR && ftr.CanWriteHDDVDRAM) + mmcOneValue.Add("Drive can write HD DVD-RW, HD DVD-R and HD DVD-RAM"); + else if(ftr.CanWriteHDDVDR) mmcOneValue.Add("Drive can write HD DVD-RW and HD DVD-R"); + else if(ftr.CanWriteHDDVDRAM) mmcOneValue.Add("Drive can write HD DVD-RW and HD DVD-RAM"); + // TODO: Write HD DVD-RW + /* + else + mmcOneValue.Add("Drive can write HD DVD-RW"); + */ + if(ftr.CanWriteOldBDR) mmcOneValue.Add("Drive can write BD-R pre-1.0"); + if(ftr.CanWriteOldBDRE) mmcOneValue.Add("Drive can write BD-RE pre-1.0"); + if(ftr.CanWriteRWSubchannelInTAO) + { + mmcOneValue.Add("Drive can write user provided data in the R-W subchannels in Track at Once Mode"); + if(ftr.CanWriteRawSubchannelInTAO) + mmcOneValue.Add("Drive accepts RAW R-W subchannel data in Track at Once Mode"); + if(ftr.CanWritePackedSubchannelInTAO) + mmcOneValue.Add("Drive accepts Packed R-W subchannel data in Track at Once Mode"); + } + + if(ftr.CanWriteRWSubchannelInSAO) + mmcOneValue.Add("Drive can write user provided data in the R-W subchannels in Session at Once Mode"); + if(ftr.CanWriteRaw && ftr.CanWriteRawMultiSession) + mmcOneValue.Add("Drive can write multi-session CDs in raw mode"); + if(ftr.EmbeddedChanger) + { + mmcOneValue.Add("Drive contains an embedded changer"); + + if(ftr.ChangerIsSideChangeCapable) mmcOneValue.Add("Drive can change disc side"); + if(ftr.ChangerSupportsDiscPresent) + mmcOneValue.Add("Drive is able to report slots contents after a reset or change"); + + mmcOneValue.Add($"Drive has {ftr.ChangerSlots + 1} slots"); + } + + if(ftr.SupportsCSS && ftr.CSSVersion.HasValue) + mmcOneValue.Add($"Drive supports DVD CSS/CPPM version {ftr.CSSVersion}"); + else if(ftr.SupportsCSS) mmcOneValue.Add("Drive supports DVD CSS/CPRM"); + if(ftr.SupportsCPRM && ftr.CPRMVersion.HasValue) + mmcOneValue.Add($"Drive supports DVD CPPM version {ftr.CPRMVersion}"); + else if(ftr.SupportsCPRM) mmcOneValue.Add("Drive supports DVD CPRM"); + if(ftr.DBML) mmcOneValue.Add("Drive reports Device Busy Class events during medium loading/unloading"); + if(ftr.DVDMultiRead) mmcOneValue.Add("Drive conforms to DVD Multi Drive Read-only Specifications"); + if(ftr.FirmwareDate.HasValue) mmcOneValue.Add($"Drive firmware is dated {ftr.FirmwareDate}"); + if(ftr.SupportsC2) mmcOneValue.Add("Drive supports C2 Error Pointers"); + if(ftr.SupportsDAP) mmcOneValue.Add("Drive supports the DAP bit in the READ CD and READ CD MSF commands"); + if(ftr.SupportsDeviceBusyEvent) mmcOneValue.Add("Drive supports Device Busy events"); + + if(ftr.LoadingMechanismType.HasValue) + switch(ftr.LoadingMechanismType) + { + case 0: + mmcOneValue.Add("Drive uses media caddy"); + break; + case 1: + mmcOneValue.Add("Drive uses a tray"); + break; + case 2: + mmcOneValue.Add("Drive is pop-up"); + break; + case 4: + mmcOneValue.Add("Drive is a changer with individually changeable discs"); + break; + case 5: + mmcOneValue.Add("Drive is a changer using cartridges"); + break; + default: + mmcOneValue.Add($"Drive uses unknown loading mechanism type {ftr.LoadingMechanismType}"); + break; + } + + if(ftr.SupportsHybridDiscs) mmcOneValue.Add("Drive is able to access Hybrid discs"); + if(ftr.SupportsModePage1Ch) + mmcOneValue.Add("Drive supports the Informational Exceptions Control mode page 1Ch"); + if(ftr.SupportsOSSC) + mmcOneValue.Add("Drive supports the Trusted Computing Group Optical Security Subsystem Class"); + if(ftr.SupportsPWP) mmcOneValue.Add("Drive supports set/release of PWP status"); + if(ftr.SupportsSWPP) mmcOneValue.Add("Drive supports the SWPP bit of the Timeout and Protect mode page"); + if(ftr.SupportsSecurDisc) mmcOneValue.Add("Drive supports SecurDisc"); + if(ftr.SupportsSeparateVolume) mmcOneValue.Add("Drive supports separate volume per channel"); + if(ftr.SupportsVCPS) mmcOneValue.Add("Drive supports VCPS"); + if(ftr.VolumeLevels.HasValue) mmcOneValue.Add($"Drive has {ftr.VolumeLevels + 1} volume levels"); + if(ftr.SupportsWriteProtectPAC) + mmcOneValue.Add("Drive supports reading/writing the Disc Write Protect PAC on BD-R/-RE media"); + if(ftr.SupportsWriteInhibitDCB) + mmcOneValue.Add("Drive supports writing the Write Inhibit DCB on DVD+RW media"); + + mmcOneValue.Sort(); + mmcOneValue.Add(""); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiMmcMode.cs b/DiscImageChef.Server/App_Start/ScsiMmcMode.cs new file mode 100644 index 00000000..7c557828 --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiMmcMode.cs @@ -0,0 +1,172 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiMmcMode.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 2Ah from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using System.Linq; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + public static class ScsiMmcMode + { + /// + /// Takes the MODE PAGE 2Ah part of a device report and prints it as a list of values to be sequenced by ASP.NET in the + /// rendering + /// + /// MODE PAGE 2Ah part of the report + /// List to put the values on + public static void Report(Modes.ModePage_2A mode, ref List mmcOneValue) + { + if(mode.AudioPlay) mmcOneValue.Add("Drive can play audio"); + if(mode.Mode2Form1) mmcOneValue.Add("Drive can read sectors in Mode 2 Form 1 format"); + if(mode.Mode2Form2) mmcOneValue.Add("Drive can read sectors in Mode 2 Form 2 format"); + if(mode.MultiSession) mmcOneValue.Add("Drive supports multi-session discs and/or Photo-CD"); + + if(mode.CDDACommand) mmcOneValue.Add("Drive can read digital audio"); + if(mode.AccurateCDDA) mmcOneValue.Add("Drive can continue from streaming loss"); + if(mode.Subchannel) mmcOneValue.Add("Drive can read uncorrected and interleaved R-W subchannels"); + if(mode.DeinterlaveSubchannel) mmcOneValue.Add("Drive can read, deinterleave and correct R-W subchannels"); + if(mode.C2Pointer) mmcOneValue.Add("Drive supports C2 pointers"); + if(mode.UPC) mmcOneValue.Add("Drive can read Media Catalogue Number"); + if(mode.ISRC) mmcOneValue.Add("Drive can read ISRC"); + + switch(mode.LoadingMechanism) + { + case 0: + mmcOneValue.Add("Drive uses media caddy"); + break; + case 1: + mmcOneValue.Add("Drive uses a tray"); + break; + case 2: + mmcOneValue.Add("Drive is pop-up"); + break; + case 4: + mmcOneValue.Add("Drive is a changer with individually changeable discs"); + break; + case 5: + mmcOneValue.Add("Drive is a changer using cartridges"); + break; + default: + mmcOneValue.Add($"Drive uses unknown loading mechanism type {mode.LoadingMechanism}"); + break; + } + + if(mode.Lock) mmcOneValue.Add("Drive can lock media"); + if(mode.PreventJumper) + { + mmcOneValue.Add("Drive power ups locked"); + mmcOneValue.Add(mode.LockState + ? "Drive is locked, media cannot be ejected or inserted" + : "Drive is not locked, media can be ejected and inserted"); + } + else + mmcOneValue.Add(mode.LockState + ? "Drive is locked, media cannot be ejected, but if empty, can be inserted" + : "Drive is not locked, media can be ejected and inserted"); + + if(mode.Eject) mmcOneValue.Add("Drive can eject media"); + + if(mode.SeparateChannelMute) mmcOneValue.Add("Each channel can be muted independently"); + if(mode.SeparateChannelVolume) mmcOneValue.Add("Each channel's volume can be controlled independently"); + + if(mode.SupportedVolumeLevels > 0) + mmcOneValue.Add($"Drive supports {mode.SupportedVolumeLevels} volume levels"); + if(mode.BufferSize > 0) mmcOneValue.Add($"Drive has {mode.BufferSize} Kbyte of buffer"); + if(mode.MaximumSpeed > 0) + mmcOneValue.Add($"Drive's maximum reading speed is {mode.MaximumSpeed} Kbyte/sec."); + if(mode.CurrentSpeed > 0) + mmcOneValue.Add($"Drive's current reading speed is {mode.CurrentSpeed} Kbyte/sec."); + + if(mode.ReadCDR) + { + mmcOneValue.Add(mode.WriteCDR ? "Drive can read and write CD-R" : "Drive can read CD-R"); + + if(mode.Method2) mmcOneValue.Add("Drive supports reading CD-R packet media"); + } + + if(mode.ReadCDRW) + mmcOneValue.Add(mode.WriteCDRW ? "Drive can read and write CD-RW" : "Drive can read CD-RW"); + + if(mode.ReadDVDROM) mmcOneValue.Add("Drive can read DVD-ROM"); + if(mode.ReadDVDR) + mmcOneValue.Add(mode.WriteDVDR ? "Drive can read and write DVD-R" : "Drive can read DVD-R"); + if(mode.ReadDVDRAM) + mmcOneValue.Add(mode.WriteDVDRAM ? "Drive can read and write DVD-RAM" : "Drive can read DVD-RAM"); + + if(mode.Composite) mmcOneValue.Add("Drive can deliver a composite audio and video data stream"); + if(mode.DigitalPort1) mmcOneValue.Add("Drive supports IEC-958 digital output on port 1"); + if(mode.DigitalPort2) mmcOneValue.Add("Drive supports IEC-958 digital output on port 2"); + + if(mode.SDP) mmcOneValue.Add("Drive contains a changer that can report the exact contents of the slots"); + if(mode.CurrentWriteSpeedSelected > 0) + { + if(mode.RotationControlSelected == 0) + mmcOneValue + .Add($"Drive's current writing speed is {mode.CurrentWriteSpeedSelected} Kbyte/sec. in CLV mode"); + else if(mode.RotationControlSelected == 1) + mmcOneValue + .Add($"Drive's current writing speed is {mode.CurrentWriteSpeedSelected} Kbyte/sec. in pure CAV mode"); + } + else + { + if(mode.MaxWriteSpeed > 0) + mmcOneValue.Add($"Drive's maximum writing speed is {mode.MaxWriteSpeed} Kbyte/sec."); + if(mode.CurrentWriteSpeed > 0) + mmcOneValue.Add($"Drive's current writing speed is {mode.CurrentWriteSpeed} Kbyte/sec."); + } + + if(mode.WriteSpeedPerformanceDescriptors != null) + foreach(Modes.ModePage_2A_WriteDescriptor descriptor in + mode.WriteSpeedPerformanceDescriptors.Where(descriptor => descriptor.WriteSpeed > 0)) + if(descriptor.RotationControl == 0) + mmcOneValue.Add($"Drive supports writing at {descriptor.WriteSpeed} Kbyte/sec. in CLV mode"); + else if(descriptor.RotationControl == 1) + mmcOneValue + .Add($"Drive supports writing at is {descriptor.WriteSpeed} Kbyte/sec. in pure CAV mode"); + + if(mode.TestWrite) mmcOneValue.Add("Drive supports test writing"); + + if(mode.ReadBarcode) mmcOneValue.Add("Drive can read barcode"); + + if(mode.SCC) mmcOneValue.Add("Drive can read both sides of a disc"); + if(mode.LeadInPW) mmcOneValue.Add("Drive an read raw R-W subchannel from the Lead-In"); + + if(mode.CMRSupported == 1) mmcOneValue.Add("Drive supports DVD CSS and/or DVD CPPM"); + + if(mode.BUF) mmcOneValue.Add("Drive supports buffer under-run free recording"); + + mmcOneValue.Sort(); + mmcOneValue.Add(""); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiModeSense.cs b/DiscImageChef.Server/App_Start/ScsiModeSense.cs new file mode 100644 index 00000000..3a512445 --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiModeSense.cs @@ -0,0 +1,381 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiModeSense.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGEs from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + public static class ScsiModeSense + { + /// + /// Takes the MODE PAGEs part of a device report and prints it as a list of values and another list of key=value pairs + /// to be sequenced by ASP.NET in the rendering + /// + /// MODE PAGEs part of a device report + /// SCSI vendor string + /// SCSI peripheral device type + /// List to put values on + /// List to put key=value pairs on + public static void Report(ScsiMode modeSense, string vendor, + PeripheralDeviceTypes deviceType, + ref List scsiOneValue, ref Dictionary modePages) + { + if(modeSense.MediumType.HasValue) scsiOneValue.Add($"Medium type is {modeSense.MediumType:X2}h"); + if(modeSense.WriteProtected) scsiOneValue.Add("Device is write protected."); + if(modeSense.BlockDescriptors != null) + foreach(BlockDescriptor descriptor in modeSense.BlockDescriptors) + if(descriptor.Blocks.HasValue && descriptor.BlockLength.HasValue) + scsiOneValue + .Add($"Density code {descriptor.Density:X2}h has {descriptor.Blocks} blocks of {descriptor.BlockLength} bytes each"); + else + scsiOneValue.Add($"Density code {descriptor.Density:X2}h"); + + if(modeSense.DPOandFUA) scsiOneValue.Add("Drive supports DPO and FUA bits"); + if(modeSense.BlankCheckEnabled) scsiOneValue.Add("Blank checking during write is enabled"); + if(modeSense.BufferedMode.HasValue) + switch(modeSense.BufferedMode) + { + case 0: + scsiOneValue.Add("Device writes directly to media"); + break; + case 1: + scsiOneValue.Add("Device uses a write cache"); + break; + case 2: + scsiOneValue.Add("Device uses a write cache but doesn't return until cache is flushed"); + break; + default: + scsiOneValue.Add($"Unknown buffered mode code 0x{modeSense.BufferedMode:X2}"); + break; + } + + if(modeSense.ModePages == null) return; + + foreach(ScsiPage page in modeSense.ModePages) + switch(page.page) + { + case 0x00: + { + if(deviceType == PeripheralDeviceTypes.MultiMediaDevice && page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_00_SFF(page.value)); + else + modePages + .Add(page.subpage != 0 ? $"MODE page {page.page:X2}h subpage {page.subpage:X2}h" : $"MODE page {page.page:X2}h", + "Unknown vendor mode page"); + break; + } + case 0x01: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", + deviceType == PeripheralDeviceTypes.MultiMediaDevice + ? Modes.PrettifyModePage_01_MMC(page.value) + : Modes.PrettifyModePage_01(page.value)); + else goto default; + + break; + } + case 0x02: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_02(page.value)); + else goto default; + + break; + } + case 0x03: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_03(page.value)); + else goto default; + + break; + } + case 0x04: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_04(page.value)); + else goto default; + + break; + } + case 0x05: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_05(page.value)); + else goto default; + + break; + } + case 0x06: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_06(page.value)); + else goto default; + + break; + } + case 0x07: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", + deviceType == PeripheralDeviceTypes.MultiMediaDevice + ? Modes.PrettifyModePage_07_MMC(page.value) + : Modes.PrettifyModePage_07(page.value)); + else goto default; + + break; + } + case 0x08: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_08(page.value)); + else goto default; + + break; + } + case 0x0A: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0A(page.value)); + else if(page.subpage == 1) + modePages.Add($"MODE page {page.page:X2}h subpage {page.subpage:X2}h", + Modes.PrettifyModePage_0A_S01(page.value)); + else goto default; + + break; + } + case 0x0B: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0B(page.value)); + else goto default; + + break; + } + case 0x0D: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0D(page.value)); + else goto default; + + break; + } + case 0x0E: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0E(page.value)); + else goto default; + + break; + } + case 0x0F: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0F(page.value)); + else goto default; + + break; + } + case 0x10: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", + deviceType == PeripheralDeviceTypes.SequentialAccess + ? Modes.PrettifyModePage_10_SSC(page.value) + : Modes.PrettifyModePage_10(page.value)); + else goto default; + + break; + } + case 0x11: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_11(page.value)); + else goto default; + + break; + } + case 0x12: + case 0x13: + case 0x14: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_12_13_14(page.value)); + else goto default; + + break; + } + case 0x1A: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_1A(page.value)); + else if(page.subpage == 1) + modePages.Add($"MODE page {page.page:X2}h subpage {page.subpage:X2}h", + Modes.PrettifyModePage_1A_S01(page.value)); + else goto default; + + break; + } + case 0x1B: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_1B(page.value)); + else goto default; + + break; + } + case 0x1C: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", + deviceType == PeripheralDeviceTypes.MultiMediaDevice + ? Modes.PrettifyModePage_1C_SFF(page.value) + : Modes.PrettifyModePage_1C(page.value)); + else if(page.subpage == 1) + modePages.Add($"MODE page {page.page:X2}h subpage {page.subpage:X2}h", + Modes.PrettifyModePage_1C_S01(page.value)); + else goto default; + + break; + } + case 0x1D: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_1D(page.value)); + else goto default; + + break; + } + case 0x21: + { + if(vendor == "CERTANCE") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyCertanceModePage_21(page.value)); + else goto default; + + break; + } + case 0x22: + { + if(vendor == "CERTANCE") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyCertanceModePage_22(page.value)); + else goto default; + + break; + } + case 0x24: + { + if(vendor == "IBM") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyIBMModePage_24(page.value)); + else goto default; + + break; + } + case 0x2A: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_2A(page.value)); + else goto default; + + break; + } + case 0x2F: + { + if(vendor == "IBM") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyIBMModePage_2F(page.value)); + else goto default; + + break; + } + case 0x30: + { + if(Modes.IsAppleModePage_30(page.value)) + modePages.Add("MODE page 30h", "Drive identifies as an Apple OEM drive"); + else goto default; + + break; + } + case 0x3B: + { + if(vendor == "HP") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyHPModePage_3B(page.value)); + else goto default; + + break; + } + case 0x3C: + { + if(vendor == "HP") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyHPModePage_3C(page.value)); + else goto default; + + break; + } + case 0x3D: + { + if(vendor == "IBM") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyIBMModePage_3D(page.value)); + else if(vendor == "HP") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyHPModePage_3D(page.value)); + else goto default; + + break; + } + case 0x3E: + { + if(vendor == "FUJITSU") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyFujitsuModePage_3E(page.value)); + else if(vendor == "HP") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyHPModePage_3E(page.value)); + else goto default; + + break; + } + default: + { + modePages.Add(page.subpage != 0 ? $"MODE page {page.page:X2}h subpage {page.subpage:X2}h" : $"MODE page {page.page:X2}h", + "Unknown mode page"); + } + break; + } + + Dictionary newModePages = new Dictionary(); + foreach(KeyValuePair kvp in modePages) + newModePages.Add(kvp.Key, + string.IsNullOrWhiteSpace(kvp.Value) ? "Undecoded" : kvp.Value.Replace("\n", "
")); + + modePages = newModePages; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/SscTestedMedia.cs b/DiscImageChef.Server/App_Start/SscTestedMedia.cs new file mode 100644 index 00000000..6b6b2eec --- /dev/null +++ b/DiscImageChef.Server/App_Start/SscTestedMedia.cs @@ -0,0 +1,70 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : SscTestedMedia.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI Streaming media tests from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Server +{ + public static class SscTestedMedia + { + /// + /// Takes the tested media from SCSI Streaming devices of a device report and prints it as a list of values + /// + /// List to put values on + /// List of tested media + public static void Report(IEnumerable testedMedia, ref List mediaOneValue) + { + foreach(TestedSequentialMedia media in testedMedia) + { + if(!string.IsNullOrWhiteSpace(media.MediumTypeName)) + { + mediaOneValue.Add($"Information for medium named \"{media.MediumTypeName}\""); + if(media.MediumType.HasValue) mediaOneValue.Add($"Medium type code: {media.MediumType:X2}h"); + } + else if(media.MediumType.HasValue) + mediaOneValue.Add($"Information for medium type {media.MediumType:X2}h"); + else mediaOneValue.Add("Information for unknown medium type"); + + if(!string.IsNullOrWhiteSpace(media.Manufacturer)) + mediaOneValue.Add($"Medium manufactured by: {media.Manufacturer}"); + if(!string.IsNullOrWhiteSpace(media.Model)) mediaOneValue.Add($"Medium model: {media.Model}"); + + if(media.Density.HasValue) mediaOneValue.Add($"Medium has density code {media.Density:X2}h"); + if(media.CanReadMediaSerial == true) mediaOneValue.Add("Drive can read medium serial number."); + if(media.MediaIsRecognized) mediaOneValue.Add("Drive recognizes this medium."); + + mediaOneValue.Add(""); + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/StatsConverter.cs b/DiscImageChef.Server/App_Start/StatsConverter.cs new file mode 100644 index 00000000..da99fb37 --- /dev/null +++ b/DiscImageChef.Server/App_Start/StatsConverter.cs @@ -0,0 +1,364 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : StatsConverter.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Reads a statistics XML and stores it in the database context. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Linq; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Server.Models; +using Version = DiscImageChef.Server.Models.Version; + +namespace DiscImageChef.Server +{ + public static class StatsConverter + { + public static void Convert(Stats newStats) + { + DicServerContext ctx = new DicServerContext(); + + if(newStats.Commands != null) + { + if(newStats.Commands.Analyze > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "analyze"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Analyze, Name = "analyze"}); + else existing.Count += newStats.Commands.Analyze; + } + + if(newStats.Commands.Benchmark > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "benchmark"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Benchmark, Name = "benchmark"}); + else existing.Count += newStats.Commands.Benchmark; + } + + if(newStats.Commands.Checksum > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "checksum"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Checksum, Name = "checksum"}); + else existing.Count += newStats.Commands.Checksum; + } + + if(newStats.Commands.Compare > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "compare"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Compare, Name = "compare"}); + else existing.Count += newStats.Commands.Compare; + } + + if(newStats.Commands.CreateSidecar > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "create-sidecar"); + + if(existing == null) + ctx.Commands.Add(new Command + { + Count = newStats.Commands.CreateSidecar, Name = "create-sidecar" + }); + else existing.Count += newStats.Commands.CreateSidecar; + } + + if(newStats.Commands.Decode > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "decode"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Decode, Name = "decode"}); + else existing.Count += newStats.Commands.Decode; + } + + if(newStats.Commands.DeviceInfo > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "device-info"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.DeviceInfo, Name = "device-info"}); + else existing.Count += newStats.Commands.DeviceInfo; + } + + if(newStats.Commands.DeviceReport > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "device-report"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.DeviceReport, Name = "device-report"}); + else existing.Count += newStats.Commands.DeviceReport; + } + + if(newStats.Commands.DumpMedia > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "dump-media"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.DumpMedia, Name = "dump-media"}); + else existing.Count += newStats.Commands.DumpMedia; + } + + if(newStats.Commands.Entropy > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "entropy"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Entropy, Name = "entropy"}); + else existing.Count += newStats.Commands.Entropy; + } + + if(newStats.Commands.Formats > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "formats"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Formats, Name = "formats"}); + else existing.Count += newStats.Commands.Formats; + } + + if(newStats.Commands.MediaInfo > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "media-info"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.MediaInfo, Name = "media-info"}); + else existing.Count += newStats.Commands.MediaInfo; + } + + if(newStats.Commands.MediaScan > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "media-scan"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.MediaScan, Name = "media-scan"}); + else existing.Count += newStats.Commands.MediaScan; + } + + if(newStats.Commands.PrintHex > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "printhex"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.PrintHex, Name = "printhex"}); + else existing.Count += newStats.Commands.PrintHex; + } + + if(newStats.Commands.Verify > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "verify"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Verify, Name = "verify"}); + else existing.Count += newStats.Commands.Verify; + } + + if(newStats.Commands.Ls > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "ls"); + + if(existing == null) ctx.Commands.Add(new Command {Count = newStats.Commands.Ls, Name = "ls"}); + else existing.Count += newStats.Commands.Ls; + } + + if(newStats.Commands.ExtractFiles > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "extract-files"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.ExtractFiles, Name = "extract-files"}); + else existing.Count += newStats.Commands.ExtractFiles; + } + + if(newStats.Commands.ListDevices > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "list-devices"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.ListDevices, Name = "list-devices"}); + else existing.Count += newStats.Commands.ListDevices; + } + + if(newStats.Commands.ListEncodings > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "list-encodings"); + + if(existing == null) + ctx.Commands.Add(new Command + { + Count = newStats.Commands.ListEncodings, Name = "list-encodings" + }); + else existing.Count += newStats.Commands.ListEncodings; + } + + if(newStats.Commands.ConvertImage > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "convert-image"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.ConvertImage, Name = "convert-image"}); + else existing.Count += newStats.Commands.ConvertImage; + } + + if(newStats.Commands.ImageInfo > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "image-info"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.ImageInfo, Name = "image-info"}); + else existing.Count += newStats.Commands.ImageInfo; + } + } + + if(newStats.OperatingSystems != null) + foreach(OsStats operatingSystem in newStats.OperatingSystems) + { + if(string.IsNullOrWhiteSpace(operatingSystem.name) || + string.IsNullOrWhiteSpace(operatingSystem.version)) continue; + + OperatingSystem existing = + ctx.OperatingSystems.FirstOrDefault(c => c.Name == operatingSystem.name && + c.Version == operatingSystem.version); + + if(existing == null) + ctx.OperatingSystems.Add(new OperatingSystem + { + Count = operatingSystem.Value, + Name = operatingSystem.name, + Version = operatingSystem.version + }); + else existing.Count += operatingSystem.Value; + } + else + { + OperatingSystem existing = + ctx.OperatingSystems.FirstOrDefault(c => c.Name == "Linux" && c.Version == null); + + if(existing == null) ctx.OperatingSystems.Add(new OperatingSystem {Count = 1, Name = "Linux"}); + else existing.Count++; + } + + if(newStats.Versions != null) + foreach(NameValueStats nvs in newStats.Versions) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Version existing = ctx.Versions.FirstOrDefault(c => c.Value == nvs.name); + + if(existing == null) ctx.Versions.Add(new Version {Count = nvs.Value, Value = nvs.name}); + else existing.Count += nvs.Value; + } + else + { + Version existing = ctx.Versions.FirstOrDefault(c => c.Value == "previous"); + + if(existing == null) ctx.Versions.Add(new Version {Count = 1, Value = "previous"}); + else existing.Count++; + } + + if(newStats.Filesystems != null) + foreach(NameValueStats nvs in newStats.Filesystems) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filesystem existing = ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Filesystems.Add(new Filesystem {Count = nvs.Value, Name = nvs.name}); + else existing.Count += nvs.Value; + } + + if(newStats.Partitions != null) + foreach(NameValueStats nvs in newStats.Partitions) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Partition existing = ctx.Partitions.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Partitions.Add(new Partition {Count = nvs.Value, Name = nvs.name}); + else existing.Count += nvs.Value; + } + + if(newStats.MediaImages != null) + foreach(NameValueStats nvs in newStats.MediaImages) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + MediaFormat existing = ctx.MediaFormats.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.MediaFormats.Add(new MediaFormat {Count = nvs.Value, Name = nvs.name}); + else existing.Count += nvs.Value; + } + + if(newStats.Filters != null) + foreach(NameValueStats nvs in newStats.Filters) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filter existing = ctx.Filters.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Filters.Add(new Filter {Count = nvs.Value, Name = nvs.name}); + else existing.Count += nvs.Value; + } + + if(newStats.Devices != null) + foreach(DeviceStats device in newStats.Devices) + { + if(string.IsNullOrWhiteSpace(device.Model)) continue; + + if(!ctx.DeviceStats.Any(c => c.Bus == device.Bus && c.Manufacturer == device.Manufacturer && + c.Model == device.Model && c.Revision == device.Revision)) + ctx.DeviceStats.Add(new DeviceStat + { + Bus = device.Bus, + Manufacturer = device.Manufacturer, + Model = device.Model, + Revision = device.Revision + }); + } + + if(newStats.Medias != null) + foreach(MediaStats media in newStats.Medias) + { + if(string.IsNullOrWhiteSpace(media.type)) continue; + + Media existing = ctx.Medias.FirstOrDefault(c => c.Type == media.type && c.Real == media.real); + + if(existing == null) + ctx.Medias.Add(new Media {Count = media.Value, Real = media.real, Type = media.type}); + else existing.Count += media.Value; + } + + ctx.SaveChanges(); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/TestedMedia.cs b/DiscImageChef.Server/App_Start/TestedMedia.cs new file mode 100644 index 00000000..70ab174a --- /dev/null +++ b/DiscImageChef.Server/App_Start/TestedMedia.cs @@ -0,0 +1,306 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : TestedMedia.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes media tests from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; + +namespace DiscImageChef.Server.App_Start +{ + public static class TestedMedia + { + /// + /// Takes the tested media from a device report and prints it as a list of values + /// + /// true if device report is from an ATA device + /// List to put values on + /// List of tested media + public static void Report(List testedMedias, ref List mediaOneValue) + { + foreach(CommonTypes.Metadata.TestedMedia testedMedia in testedMedias) + { + if(!string.IsNullOrWhiteSpace(testedMedia.MediumTypeName)) + { + mediaOneValue.Add($"Information for medium named \"{testedMedia.MediumTypeName}\""); + if(testedMedia.MediumType != null) + mediaOneValue.Add($"Medium type code: {testedMedia.MediumType:X2}h"); + } + else if(testedMedia.MediumType != null) + mediaOneValue.Add($"Information for medium type {testedMedia.MediumType:X2}h"); + else mediaOneValue.Add("Information for unknown medium type"); + + mediaOneValue.Add(testedMedia.MediaIsRecognized + ? "Drive recognizes this medium." + : "Drive does not recognize this medium."); + + if(!string.IsNullOrWhiteSpace(testedMedia.Manufacturer)) + mediaOneValue.Add($"Medium manufactured by: {testedMedia.Manufacturer}"); + if(!string.IsNullOrWhiteSpace(testedMedia.Model)) + mediaOneValue.Add($"Medium model: {testedMedia.Model}"); + if(testedMedia.Density != null) mediaOneValue.Add($"Density code: {testedMedia.Density:X2}h"); + + if(testedMedia.BlockSize != null) + mediaOneValue.Add($"Logical sector size: {testedMedia.BlockSize} bytes"); + if(testedMedia.PhysicalBlockSize != null) + mediaOneValue.Add($"Physical sector size: {testedMedia.PhysicalBlockSize} bytes"); + if(testedMedia.LongBlockSize != null) + mediaOneValue.Add($"READ LONG sector size: {testedMedia.LongBlockSize} bytes"); + + if(testedMedia.Blocks != null && testedMedia.BlockSize != null) + { + mediaOneValue.Add($"Medium has {testedMedia.Blocks} blocks of {testedMedia.BlockSize} bytes each"); + + if(testedMedia.Blocks * testedMedia.BlockSize / 1024 / 1024 > 1000000) + mediaOneValue + .Add($"Medium size: {testedMedia.Blocks * testedMedia.BlockSize} bytes, {testedMedia.Blocks * testedMedia.BlockSize / 1000 / 1000 / 1000 / 1000} Tb, {(double)(testedMedia.Blocks * testedMedia.BlockSize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if(testedMedia.Blocks * testedMedia.BlockSize / 1024 / 1024 > 1000) + mediaOneValue + .Add($"Medium size: {testedMedia.Blocks * testedMedia.BlockSize} bytes, {testedMedia.Blocks * testedMedia.BlockSize / 1000 / 1000 / 1000} Gb, {(double)(testedMedia.Blocks * testedMedia.BlockSize) / 1024 / 1024 / 1024:F2} GiB"); + else + mediaOneValue + .Add($"Medium size: {testedMedia.Blocks * testedMedia.BlockSize} bytes, {testedMedia.Blocks * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)(testedMedia.Blocks * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(testedMedia.CHS != null && testedMedia.CurrentCHS != null) + { + int currentSectors = testedMedia.CurrentCHS.Cylinders * testedMedia.CurrentCHS.Heads * + testedMedia.CurrentCHS.Sectors; + mediaOneValue + .Add($"Cylinders: {testedMedia.CHS.Cylinders} max., {testedMedia.CurrentCHS.Cylinders} current"); + mediaOneValue.Add($"Heads: {testedMedia.CHS.Heads} max., {testedMedia.CurrentCHS.Heads} current"); + mediaOneValue + .Add($"Sectors per track: {testedMedia.CHS.Sectors} max., {testedMedia.CurrentCHS.Sectors} current"); + mediaOneValue + .Add($"Sectors addressable in CHS mode: {testedMedia.CHS.Cylinders * testedMedia.CHS.Heads * testedMedia.CHS.Sectors} max., {currentSectors} current"); + mediaOneValue + .Add($"Medium size in CHS mode: {(ulong)currentSectors * testedMedia.BlockSize} bytes, {(ulong)currentSectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + else if(testedMedia.CHS != null) + { + int currentSectors = testedMedia.CHS.Cylinders * testedMedia.CHS.Heads * testedMedia.CHS.Sectors; + mediaOneValue.Add($"Cylinders: {testedMedia.CHS.Cylinders}"); + mediaOneValue.Add($"Heads: {testedMedia.CHS.Heads}"); + mediaOneValue.Add($"Sectors per track: {testedMedia.CHS.Sectors}"); + mediaOneValue.Add($"Sectors addressable in CHS mode: {currentSectors}"); + mediaOneValue + .Add($"Medium size in CHS mode: {(ulong)currentSectors * testedMedia.BlockSize} bytes, {(ulong)currentSectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(testedMedia.LBASectors != null) + { + mediaOneValue.Add($"Sectors addressable in sectors in 28-bit LBA mode: {testedMedia.LBASectors}"); + + if((ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1024 / 1024 > 1000000) + mediaOneValue + .Add($"Medium size in 28-bit LBA mode: {(ulong)testedMedia.LBASectors * testedMedia.BlockSize} bytes, {(ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1000 / 1000 / 1000 / 1000} Tb, {(double)((ulong)testedMedia.LBASectors * testedMedia.BlockSize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if((ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1024 / 1024 > 1000) + mediaOneValue + .Add($"Medium size in 28-bit LBA mode: {(ulong)testedMedia.LBASectors * testedMedia.BlockSize} bytes, {(ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1000 / 1000 / 1000} Gb, {(double)((ulong)testedMedia.LBASectors * testedMedia.BlockSize) / 1024 / 1024 / 1024:F2} GiB"); + else + mediaOneValue + .Add($"Medium size in 28-bit LBA mode: {(ulong)testedMedia.LBASectors * testedMedia.BlockSize} bytes, {(ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)((ulong)testedMedia.LBASectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(testedMedia.LBA48Sectors != null) + { + mediaOneValue.Add($"Sectors addressable in sectors in 48-bit LBA mode: {testedMedia.LBA48Sectors}"); + + if(testedMedia.LBA48Sectors * testedMedia.BlockSize / 1024 / 1024 > 1000000) + mediaOneValue + .Add($"Medium size in 48-bit LBA mode: {testedMedia.LBA48Sectors * testedMedia.BlockSize} bytes, {testedMedia.LBA48Sectors * testedMedia.BlockSize / 1000 / 1000 / 1000 / 1000} Tb, {(double)(testedMedia.LBA48Sectors * testedMedia.BlockSize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if(testedMedia.LBA48Sectors * testedMedia.BlockSize / 1024 / 1024 > 1000) + mediaOneValue + .Add($"Medium size in 48-bit LBA mode: {testedMedia.LBA48Sectors * testedMedia.BlockSize} bytes, {testedMedia.LBA48Sectors * testedMedia.BlockSize / 1000 / 1000 / 1000} Gb, {(double)(testedMedia.LBA48Sectors * testedMedia.BlockSize) / 1024 / 1024 / 1024:F2} GiB"); + else + mediaOneValue + .Add($"Medium size in 48-bit LBA mode: {testedMedia.LBA48Sectors * testedMedia.BlockSize} bytes, {testedMedia.LBA48Sectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)(testedMedia.LBA48Sectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(testedMedia.NominalRotationRate != null && testedMedia.NominalRotationRate != 0x0000 && + testedMedia.NominalRotationRate != 0xFFFF) + mediaOneValue.Add(testedMedia.NominalRotationRate == 0x0001 + ? "Medium does not rotate." + : $"Medium rotates at {testedMedia.NominalRotationRate} rpm"); + + if(testedMedia.BlockSize != null && + testedMedia.PhysicalBlockSize != null && + testedMedia.BlockSize.Value != testedMedia.PhysicalBlockSize.Value && + (testedMedia.LogicalAlignment & 0x8000) == 0x0000 && + (testedMedia.LogicalAlignment & 0x4000) == 0x4000) + mediaOneValue + .Add($"Logical sector starts at offset {testedMedia.LogicalAlignment & 0x3FFF} from physical sector"); + + if(testedMedia.SupportsReadSectors == true) + mediaOneValue.Add("Device can use the READ SECTOR(S) command in CHS mode with this medium"); + if(testedMedia.SupportsReadRetry == true) + mediaOneValue.Add("Device can use the READ SECTOR(S) RETRY command in CHS mode with this medium"); + if(testedMedia.SupportsReadDma == true) + mediaOneValue.Add("Device can use the READ DMA command in CHS mode with this medium"); + if(testedMedia.SupportsReadDmaRetry == true) + mediaOneValue.Add("Device can use the READ DMA RETRY command in CHS mode with this medium"); + if(testedMedia.SupportsReadLong == true) + mediaOneValue.Add("Device can use the READ LONG command in CHS mode with this medium"); + if(testedMedia.SupportsReadLongRetry == true) + mediaOneValue.Add("Device can use the READ LONG RETRY command in CHS mode with this medium"); + + if(testedMedia.SupportsReadLba == true) + mediaOneValue.Add("Device can use the READ SECTOR(S) command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadRetryLba == true) + mediaOneValue + .Add("Device can use the READ SECTOR(S) RETRY command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadDmaLba == true) + mediaOneValue.Add("Device can use the READ DMA command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadDmaRetryLba == true) + mediaOneValue.Add("Device can use the READ DMA RETRY command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadLongLba == true) + mediaOneValue.Add("Device can use the READ LONG command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadLongRetryLba == true) + mediaOneValue.Add("Device can use the READ LONG RETRY command in 28-bit LBA mode with this medium"); + + if(testedMedia.SupportsReadLba48 == true) + mediaOneValue.Add("Device can use the READ SECTOR(S) command in 48-bit LBA mode with this medium"); + if(testedMedia.SupportsReadDmaLba48 == true) + mediaOneValue.Add("Device can use the READ DMA command in 48-bit LBA mode with this medium"); + + if(testedMedia.SupportsSeek == true) + mediaOneValue.Add("Device can use the SEEK command in CHS mode with this medium"); + if(testedMedia.SupportsSeekLba == true) + mediaOneValue.Add("Device can use the SEEK command in 28-bit LBA mode with this medium"); + + if(testedMedia.SupportsReadCapacity == true) + mediaOneValue.Add("Device can use the READ CAPACITY (10) command with this medium"); + if(testedMedia.SupportsReadCapacity16 == true) + mediaOneValue.Add("Device can use the READ CAPACITY (16) command with this medium"); + if(testedMedia.SupportsRead6 == true) + mediaOneValue.Add("Device can use the READ (6) command with this medium"); + if(testedMedia.SupportsRead10 == true) + mediaOneValue.Add("Device can use the READ (10) command with this medium"); + if(testedMedia.SupportsRead12 == true) + mediaOneValue.Add("Device can use the READ (12) command with this medium"); + if(testedMedia.SupportsRead16 == true) + mediaOneValue.Add("Device can use the READ (16) command with this medium"); + if(testedMedia.SupportsReadLong == true) + mediaOneValue.Add("Device can use the READ LONG (10) command with this medium"); + if(testedMedia.SupportsReadLong16 == true) + mediaOneValue.Add("Device can use the READ LONG (16) command with this medium"); + + if(testedMedia.SupportsReadCd == true) + mediaOneValue.Add("Device can use the READ CD command with LBA addressing with this medium"); + if(testedMedia.SupportsReadCdMsf == true) + mediaOneValue.Add("Device can use the READ CD command with MM:SS:FF addressing with this medium"); + if(testedMedia.SupportsReadCdRaw == true) + mediaOneValue + .Add("Device can use the READ CD command with LBA addressing with this medium to read raw sector"); + if(testedMedia.SupportsReadCdMsfRaw == true) + mediaOneValue + .Add("Device can use the READ CD command with MM:SS:FF addressing with this medium read raw sector"); + + if(testedMedia.SupportsHLDTSTReadRawDVD == true) + mediaOneValue.Add("Device can use the HL-DT-ST vendor READ DVD (RAW) command with this medium"); + if(testedMedia.SupportsNECReadCDDA == true) + mediaOneValue.Add("Device can use the NEC vendor READ CD-DA command with this medium"); + if(testedMedia.SupportsPioneerReadCDDA == true) + mediaOneValue.Add("Device can use the PIONEER vendor READ CD-DA command with this medium"); + if(testedMedia.SupportsPioneerReadCDDAMSF == true) + mediaOneValue.Add("Device can use the PIONEER vendor READ CD-DA MSF command with this medium"); + if(testedMedia.SupportsPlextorReadCDDA == true) + mediaOneValue.Add("Device can use the PLEXTOR vendor READ CD-DA command with this medium"); + if(testedMedia.SupportsPlextorReadRawDVD == true) + mediaOneValue.Add("Device can use the PLEXOR vendor READ DVD (RAW) command with this medium"); + + if(testedMedia.CanReadAACS == true) + mediaOneValue.Add("Device can read the Advanced Access Content System from this medium"); + if(testedMedia.CanReadADIP == true) + mediaOneValue.Add("Device can read the DVD ADress-In-Pregroove from this medium"); + if(testedMedia.CanReadATIP == true) + mediaOneValue.Add("Device can read the CD Absolute-Time-In-Pregroove from this medium"); + if(testedMedia.CanReadBCA == true) + mediaOneValue.Add("Device can read the Burst Cutting Area from this medium"); + if(testedMedia.CanReadC2Pointers == true) + mediaOneValue.Add("Device can report the C2 pointers when reading from this medium"); + if(testedMedia.CanReadCMI == true) + mediaOneValue.Add("Device can read the Copyright Management Information from this medium"); + if(testedMedia.CanReadCorrectedSubchannel == true) + mediaOneValue.Add("Device can correct subchannels when reading from this medium"); + if(testedMedia.CanReadCorrectedSubchannelWithC2 == true) + mediaOneValue + .Add("Device can correct subchannels and report the C2 pointers when reading from this medium"); + if(testedMedia.CanReadDCB == true) + mediaOneValue.Add("Device can read the Disc Control Blocks from this medium"); + if(testedMedia.CanReadDDS == true) + mediaOneValue.Add("Device can read the Disc Definition Structure from this medium"); + if(testedMedia.CanReadDMI == true) + mediaOneValue.Add("Device can read the Disc Manufacurer Information from this medium"); + if(testedMedia.CanReadDiscInformation == true) + mediaOneValue.Add("Device can read the Disc Information from this medium"); + if(testedMedia.CanReadFullTOC == true) + mediaOneValue.Add("Device can read the Table of Contents from this medium, without processing it"); + if(testedMedia.CanReadHDCMI == true) + mediaOneValue.Add("Device can read the HD DVD Copyright Management Information from this medium"); + if(testedMedia.CanReadLayerCapacity == true) + mediaOneValue.Add("Device can read the layer capacity from this medium"); + if(testedMedia.CanReadFirstTrackPreGap == true) + mediaOneValue.Add("Device can read the first track's pregap data"); + if(testedMedia.CanReadLeadIn == true) mediaOneValue.Add("Device can read the Lead-In from this medium"); + if(testedMedia.CanReadLeadOut == true) + mediaOneValue.Add("Device can read the Lead-Out from this medium"); + if(testedMedia.CanReadMediaID == true) + mediaOneValue.Add("Device can read the Media ID from this medium"); + if(testedMedia.CanReadMediaSerial == true) + mediaOneValue.Add("Device can read the Media Serial Number from this medium"); + if(testedMedia.CanReadPAC == true) mediaOneValue.Add("Device can read the PAC from this medium"); + if(testedMedia.CanReadPFI == true) + mediaOneValue.Add("Device can read the Physical Format Information from this medium"); + if(testedMedia.CanReadPMA == true) + mediaOneValue.Add("Device can read the Power Management Area from this medium"); + if(testedMedia.CanReadPQSubchannel == true) + mediaOneValue.Add("Device can read the P to Q subchannels from this medium"); + if(testedMedia.CanReadPQSubchannelWithC2 == true) + mediaOneValue + .Add("Device can read the P to Q subchannels from this medium reporting the C2 pointers"); + if(testedMedia.CanReadPRI == true) + mediaOneValue.Add("Device can read the Pre-Recorded Information from this medium"); + if(testedMedia.CanReadRWSubchannel == true) + mediaOneValue.Add("Device can read the R to W subchannels from this medium"); + if(testedMedia.CanReadRWSubchannelWithC2 == true) + mediaOneValue + .Add("Device can read the R to W subchannels from this medium reporting the C2 pointers"); + if(testedMedia.CanReadRecordablePFI == true) + mediaOneValue.Add("Device can read the Physical Format Information from Lead-In from this medium"); + if(testedMedia.CanReadSpareAreaInformation == true) + mediaOneValue.Add("Device can read the Spare Area Information from this medium"); + if(testedMedia.CanReadTOC == true) + mediaOneValue.Add("Device can read the Table of Contents from this medium"); + + mediaOneValue.Add(""); + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/WebApiConfig.cs b/DiscImageChef.Server/App_Start/WebApiConfig.cs new file mode 100644 index 00000000..e0cecbf5 --- /dev/null +++ b/DiscImageChef.Server/App_Start/WebApiConfig.cs @@ -0,0 +1,61 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : WebApiConfig.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Configures Web API +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +// This is verbatim from ASP.NET so left as is +// ReSharper disable All + +using System.Data.Entity.Migrations; +using System.Web.Http; +using DiscImageChef.Server.Migrations; +using DiscImageChef.Server.Models; + +namespace DiscImageChef.Server +{ + public static class WebApiConfig + { + public static void Register(HttpConfiguration config) + { + // Web API configuration and services + + // Web API routes + config.MapHttpAttributeRoutes(); + + config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", + defaults: new {id = RouteParameter.Optional}); + + //DicServerContext ctx = new DicServerContext(); + Configuration migratorConfig = new Migrations.Configuration(); + DbMigrator dbMigrator = new DbMigrator(migratorConfig); + dbMigrator.Update(); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/HomeController.cs b/DiscImageChef.Server/Controllers/HomeController.cs new file mode 100644 index 00000000..bbb25e28 --- /dev/null +++ b/DiscImageChef.Server/Controllers/HomeController.cs @@ -0,0 +1,199 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : HomeController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Provides documentation data for razor views. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.IO; +using System.Reflection; +using System.Web.Hosting; +using System.Web.Mvc; +using Markdig; + +namespace DiscImageChef.Server.Controllers +{ + [RoutePrefix("Home")] + public class HomeController : Controller + { + [Route("")] + [Route("~/")] + [Route("README")] + [Route("~/README")] + public ActionResult Index() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "README.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")"); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("Changelog")] + [Route("~/Changelog")] + public ActionResult Changelog() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "Changelog.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")"); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("CODE_OF_CONDUCT")] + [Route("~/CODE_OF_CONDUCT")] + public ActionResult CODE_OF_CONDUCT() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "CODE_OF_CONDUCT.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")").Replace("(.github/", "("); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("PULL_REQUEST_TEMPLATE")] + [Route("~/PULL_REQUEST_TEMPLATE")] + public ActionResult PULL_REQUEST_TEMPLATE() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "PULL_REQUEST_TEMPLATE.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")").Replace("(.github/", "("); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("ISSUE_TEMPLATE")] + [Route("~/ISSUE_TEMPLATE")] + public ActionResult ISSUE_TEMPLATE() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "ISSUE_TEMPLATE.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")").Replace("(.github/", "("); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("CONTRIBUTING")] + [Route("~/CONTRIBUTING")] + public ActionResult CONTRIBUTING() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "CONTRIBUTING.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")").Replace("(.github/", "("); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("DONATING")] + [Route("~/DONATING")] + public ActionResult DONATING() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "DONATING.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")"); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("TODO")] + [Route("~/TODO")] + public ActionResult TODO() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "TODO.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")"); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/ReportController.cs b/DiscImageChef.Server/Controllers/ReportController.cs new file mode 100644 index 00000000..5f599a50 --- /dev/null +++ b/DiscImageChef.Server/Controllers/ReportController.cs @@ -0,0 +1,474 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ReportController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Fetches reports from database for Razor views. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web.Mvc; +using System.Web.Routing; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.PCMCIA; +using DiscImageChef.Decoders.SCSI; +using DiscImageChef.Server.Models; +using Tuple = DiscImageChef.Decoders.PCMCIA.Tuple; + +namespace DiscImageChef.Server.Controllers +{ + public class ReportController : Controller + { + public ActionResult Index() => RedirectToAction("View", "Report", new RouteValueDictionary {{"id", 1}}); + + public ActionResult View(int? id) + { + if(id == null || id <= 0) return Content("Incorrect device report request"); + + try + { + DicServerContext ctx = new DicServerContext(); + Device report = ctx.Devices.FirstOrDefault(d => d.Id == id); + + if(report is null) return Content("Cannot find requested report"); + + ViewBag.lblManufacturer = report.Manufacturer; + ViewBag.lblModel = report.Model; + ViewBag.lblRevision = report.Revision; + + if(report.USB != null) + { + string usbVendorDescription = null; + string usbProductDescription = null; + + UsbProduct dbProduct = + ctx.UsbProducts.FirstOrDefault(p => p.ProductId == report.USB.ProductID && + p.Vendor != null && + p.Vendor.VendorId == report.USB.VendorID); + + if(dbProduct is null) + { + UsbVendor dbVendor = ctx.UsbVendors.FirstOrDefault(v => v.VendorId == report.USB.VendorID); + + if(!(dbVendor is null)) usbVendorDescription = dbVendor.Vendor; + } + else + { + usbProductDescription = dbProduct.Product; + usbVendorDescription = dbProduct.Vendor.Vendor; + } + + ViewBag.UsbItem = new Item + { + Manufacturer = report.USB.Manufacturer, + Product = report.USB.Product, + VendorDescription = + usbVendorDescription != null + ? $"0x{report.USB.VendorID:x4} ({usbVendorDescription})" + : $"0x{report.USB.VendorID:x4}", + ProductDescription = usbProductDescription != null + ? $"0x{report.USB.ProductID:x4} ({usbProductDescription})" + : $"0x{report.USB.ProductID:x4}" + }; + } + + if(report.FireWire != null) + ViewBag.FireWireItem = new Item + { + Manufacturer = report.FireWire.Manufacturer, + Product = report.FireWire.Product, + VendorDescription = $"0x{report.FireWire.VendorID:x8}", + ProductDescription = $"0x{report.FireWire.ProductID:x8}" + }; + + if(report.PCMCIA != null) + { + ViewBag.PcmciaItem = new PcmciaItem + { + Manufacturer = report.PCMCIA.Manufacturer, + Product = report.PCMCIA.ProductName, + VendorDescription = $"0x{report.PCMCIA.ManufacturerCode:x4}", + ProductDescription = $"0x{report.PCMCIA.CardCode:x4}", + Compliance = report.PCMCIA.Compliance + }; + + Tuple[] tuples = CIS.GetTuples(report.PCMCIA.CIS); + if(tuples != null) + { + Dictionary decodedTuples = new Dictionary(); + foreach(Tuple tuple in tuples) + switch(tuple.Code) + { + case TupleCodes.CISTPL_NULL: + case TupleCodes.CISTPL_END: + case TupleCodes.CISTPL_MANFID: + case TupleCodes.CISTPL_VERS_1: break; + case TupleCodes.CISTPL_DEVICEGEO: + case TupleCodes.CISTPL_DEVICEGEO_A: + DeviceGeometryTuple geom = CIS.DecodeDeviceGeometryTuple(tuple.Data); + if(geom?.Geometries != null) + foreach(DeviceGeometry geometry in geom.Geometries) + { + decodedTuples.Add("Device width", + $"{(1 << (geometry.CardInterface - 1)) * 8} bits"); + decodedTuples.Add("Erase block", + $"{(1 << (geometry.EraseBlockSize - 1)) * (1 << (geometry.Interleaving - 1))} bytes"); + decodedTuples.Add("Read block", + $"{(1 << (geometry.ReadBlockSize - 1)) * (1 << (geometry.Interleaving - 1))} bytes"); + decodedTuples.Add("Write block", + $"{(1 << (geometry.WriteBlockSize - 1)) * (1 << (geometry.Interleaving - 1))} bytes"); + decodedTuples.Add("Partition alignment", + $"{(1 << (geometry.EraseBlockSize - 1)) * (1 << (geometry.Interleaving - 1)) * (1 << (geometry.Partitions - 1))} bytes"); + } + + break; + case TupleCodes.CISTPL_ALTSTR: + case TupleCodes.CISTPL_BAR: + case TupleCodes.CISTPL_BATTERY: + case TupleCodes.CISTPL_BYTEORDER: + case TupleCodes.CISTPL_CFTABLE_ENTRY: + case TupleCodes.CISTPL_CFTABLE_ENTRY_CB: + case TupleCodes.CISTPL_CHECKSUM: + case TupleCodes.CISTPL_CONFIG: + case TupleCodes.CISTPL_CONFIG_CB: + case TupleCodes.CISTPL_DATE: + case TupleCodes.CISTPL_DEVICE: + case TupleCodes.CISTPL_DEVICE_A: + case TupleCodes.CISTPL_DEVICE_OA: + case TupleCodes.CISTPL_DEVICE_OC: + case TupleCodes.CISTPL_EXTDEVIC: + case TupleCodes.CISTPL_FORMAT: + case TupleCodes.CISTPL_FORMAT_A: + case TupleCodes.CISTPL_FUNCE: + case TupleCodes.CISTPL_FUNCID: + case TupleCodes.CISTPL_GEOMETRY: + case TupleCodes.CISTPL_INDIRECT: + case TupleCodes.CISTPL_JEDEC_A: + case TupleCodes.CISTPL_JEDEC_C: + case TupleCodes.CISTPL_LINKTARGET: + case TupleCodes.CISTPL_LONGLINK_A: + case TupleCodes.CISTPL_LONGLINK_C: + case TupleCodes.CISTPL_LONGLINK_CB: + case TupleCodes.CISTPL_LONGLINK_MFC: + case TupleCodes.CISTPL_NO_LINK: + case TupleCodes.CISTPL_ORG: + case TupleCodes.CISTPL_PWR_MGMNT: + case TupleCodes.CISTPL_SPCL: + case TupleCodes.CISTPL_SWIL: + case TupleCodes.CISTPL_VERS_2: + decodedTuples.Add("Undecoded tuple ID", tuple.Code.ToString()); + break; + default: + decodedTuples.Add("Unknown tuple ID", $"0x{(byte)tuple.Code:X2}"); + break; + } + + if(decodedTuples.Count > 0) ViewBag.repPcmciaTuples = decodedTuples; + } + } + + bool removable = true; + List testedMedia = null; + bool ata = false; + bool atapi = false; + bool sscMedia = false; + + if(report.ATA != null || report.ATAPI != null) + { + ata = true; + List ataOneValue = new List(); + Dictionary ataTwoValue = new Dictionary(); + CommonTypes.Metadata.Ata ataReport; + + if(report.ATAPI != null) + { + ViewBag.AtaItem = "ATAPI"; + ataReport = report.ATAPI; + atapi = true; + } + else + { + ViewBag.AtaItem = "ATA"; + ataReport = report.ATA; + } + + bool cfa = report.CompactFlash; + + if(atapi && !cfa) ViewBag.lblAtaDeviceType = "ATAPI device"; + else if(!atapi && cfa) ViewBag.lblAtaDeviceType = "CompactFlash device"; + else ViewBag.lblAtaDeviceType = "ATA device"; + + Ata.Report(ataReport, cfa, atapi, ref removable, ref ataOneValue, ref ataTwoValue, ref testedMedia); + + ViewBag.repAtaOne = ataOneValue; + ViewBag.repAtaTwo = ataTwoValue; + } + + if(report.SCSI != null) + { + List scsiOneValue = new List(); + Dictionary modePages = new Dictionary(); + Dictionary evpdPages = new Dictionary(); + + string vendorId = StringHandlers.CToString(report.SCSI.Inquiry?.VendorIdentification); + if(report.SCSI.Inquiry != null) + { + Inquiry.SCSIInquiry inq = report.SCSI.Inquiry.Value; + ViewBag.lblScsiVendor = VendorString.Prettify(vendorId) != vendorId + ? $"{vendorId} ({VendorString.Prettify(vendorId)})" + : vendorId; + ViewBag.lblScsiProduct = StringHandlers.CToString(inq.ProductIdentification); + ViewBag.lblScsiRevision = StringHandlers.CToString(inq.ProductRevisionLevel); + } + + scsiOneValue.AddRange(ScsiInquiry.Report(report.SCSI.Inquiry)); + + if(report.SCSI.SupportsModeSense6) scsiOneValue.Add("Device supports MODE SENSE (6)"); + if(report.SCSI.SupportsModeSense10) scsiOneValue.Add("Device supports MODE SENSE (10)"); + if(report.SCSI.SupportsModeSubpages) scsiOneValue.Add("Device supports MODE SENSE subpages"); + + if(report.SCSI.ModeSense != null) + { + PeripheralDeviceTypes devType = PeripheralDeviceTypes.DirectAccess; + if(report.SCSI.Inquiry != null) + devType = (PeripheralDeviceTypes)report.SCSI.Inquiry.Value.PeripheralDeviceType; + ScsiModeSense.Report(report.SCSI.ModeSense, vendorId, devType, ref scsiOneValue, ref modePages); + } + + if(modePages.Count > 0) ViewBag.repModeSense = modePages; + + if(report.SCSI.EVPDPages != null) ScsiEvpd.Report(report.SCSI.EVPDPages, vendorId, ref evpdPages); + + if(evpdPages.Count > 0) ViewBag.repEvpd = evpdPages; + + if(report.SCSI.MultiMediaDevice != null) + { + testedMedia = report.SCSI.MultiMediaDevice.TestedMedia; + + if(report.SCSI.MultiMediaDevice.ModeSense2A != null) + { + List mmcModeOneValue = new List(); + ScsiMmcMode.Report(report.SCSI.MultiMediaDevice.ModeSense2A, ref mmcModeOneValue); + if(mmcModeOneValue.Count > 0) ViewBag.repScsiMmcMode = mmcModeOneValue; + } + + if(report.SCSI.MultiMediaDevice.Features != null) + { + List mmcFeaturesOneValue = new List(); + ScsiMmcFeatures.Report(report.SCSI.MultiMediaDevice.Features, ref mmcFeaturesOneValue); + if(mmcFeaturesOneValue.Count > 0) ViewBag.repScsiMmcFeatures = mmcFeaturesOneValue; + } + } + else if(report.SCSI.SequentialDevice != null) + { + ViewBag.divScsiSscVisible = true; + + ViewBag.lblScsiSscGranularity = + report.SCSI.SequentialDevice.BlockSizeGranularity?.ToString() ?? "Unspecified"; + + ViewBag.lblScsiSscMaxBlock = + report.SCSI.SequentialDevice.MaxBlockLength?.ToString() ?? "Unspecified"; + + ViewBag.lblScsiSscMinBlock = + report.SCSI.SequentialDevice.MinBlockLength?.ToString() ?? "Unspecified"; + + if(report.SCSI.SequentialDevice.SupportedDensities != null) + ViewBag.repScsiSscDensities = report.SCSI.SequentialDevice.SupportedDensities; + + if(report.SCSI.SequentialDevice.SupportedMediaTypes != null) + ViewBag.repScsiSscMedias = report.SCSI.SequentialDevice.SupportedMediaTypes; + + if(report.SCSI.SequentialDevice.TestedMedia != null) + { + List mediaOneValue = new List(); + SscTestedMedia.Report(report.SCSI.SequentialDevice.TestedMedia, ref mediaOneValue); + if(mediaOneValue.Count > 0) + { + sscMedia = true; + ViewBag.repTestedMedia = mediaOneValue; + } + } + } + else if(report.SCSI.ReadCapabilities != null) + { + removable = false; + scsiOneValue.Add(""); + + if(report.SCSI.ReadCapabilities.Blocks.HasValue && + report.SCSI.ReadCapabilities.BlockSize.HasValue) + { + scsiOneValue + .Add($"Device has {report.SCSI.ReadCapabilities.Blocks} blocks of {report.SCSI.ReadCapabilities.BlockSize} bytes each"); + + if(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / 1024 / + 1024 > 1000000) + scsiOneValue + .Add($"Device size: {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize} bytes, {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / 1000 / 1000 / 1000 / 1000} Tb, {(double)(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / + 1024 / + 1024 > 1000) + scsiOneValue + .Add($"Device size: {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize} bytes, {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / 1000 / 1000 / 1000} Gb, {(double)(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize) / 1024 / 1024 / 1024:F2} GiB"); + else + scsiOneValue + .Add($"Device size: {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize} bytes, {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / 1000 / 1000} Mb, {(double)(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(report.SCSI.ReadCapabilities.MediumType.HasValue) + scsiOneValue.Add($"Medium type code: {report.SCSI.ReadCapabilities.MediumType:X2}h"); + if(report.SCSI.ReadCapabilities.Density.HasValue) + scsiOneValue.Add($"Density code: {report.SCSI.ReadCapabilities.Density:X2}h"); + if((report.SCSI.ReadCapabilities.SupportsReadLong == true || + report.SCSI.ReadCapabilities.SupportsReadLong16 == true) && + report.SCSI.ReadCapabilities.LongBlockSize.HasValue) + scsiOneValue.Add($"Long block size: {report.SCSI.ReadCapabilities.LongBlockSize} bytes"); + if(report.SCSI.ReadCapabilities.SupportsReadCapacity == true) + scsiOneValue.Add("Device supports READ CAPACITY (10) command."); + if(report.SCSI.ReadCapabilities.SupportsReadCapacity16 == true) + scsiOneValue.Add("Device supports READ CAPACITY (16) command."); + if(report.SCSI.ReadCapabilities.SupportsRead6 == true) + scsiOneValue.Add("Device supports READ (6) command."); + if(report.SCSI.ReadCapabilities.SupportsRead10 == true) + scsiOneValue.Add("Device supports READ (10) command."); + if(report.SCSI.ReadCapabilities.SupportsRead12 == true) + scsiOneValue.Add("Device supports READ (12) command."); + if(report.SCSI.ReadCapabilities.SupportsRead16 == true) + scsiOneValue.Add("Device supports READ (16) command."); + if(report.SCSI.ReadCapabilities.SupportsReadLong == true) + scsiOneValue.Add("Device supports READ LONG (10) command."); + if(report.SCSI.ReadCapabilities.SupportsReadLong16 == true) + scsiOneValue.Add("Device supports READ LONG (16) command."); + } + else testedMedia = report.SCSI.RemovableMedias; + + ViewBag.repScsi = scsiOneValue; + } + + if(report.MultiMediaCard != null) + { + List mmcOneValue = new List(); + + if(report.MultiMediaCard.CID != null) + { + mmcOneValue.Add(Decoders.MMC.Decoders.PrettifyCID(report.MultiMediaCard.CID) + .Replace("\n", "
")); + mmcOneValue.Add(""); + } + + if(report.MultiMediaCard.CSD != null) + { + mmcOneValue.Add(Decoders.MMC.Decoders.PrettifyCSD(report.MultiMediaCard.CSD) + .Replace("\n", "
")); + mmcOneValue.Add(""); + } + + if(report.MultiMediaCard.ExtendedCSD != null) + { + mmcOneValue.Add(Decoders.MMC.Decoders.PrettifyExtendedCSD(report.MultiMediaCard.ExtendedCSD) + .Replace("\n", "
")); + mmcOneValue.Add(""); + } + + if(report.MultiMediaCard.OCR != null) + { + mmcOneValue.Add(Decoders.MMC.Decoders.PrettifyCSD(report.MultiMediaCard.OCR) + .Replace("\n", "
")); + mmcOneValue.Add(""); + } + + ViewBag.repMMC = mmcOneValue; + } + + if(report.SecureDigital != null) + { + List sdOneValue = new List(); + + if(report.SecureDigital.CID != null) + { + sdOneValue.Add(Decoders.SecureDigital.Decoders.PrettifyCID(report.SecureDigital.CID) + .Replace("\n", "
")); + sdOneValue.Add(""); + } + + if(report.SecureDigital.CSD != null) + { + sdOneValue.Add(Decoders.SecureDigital.Decoders.PrettifyCSD(report.SecureDigital.CSD) + .Replace("\n", "
")); + sdOneValue.Add(""); + } + + if(report.SecureDigital.SCR != null) + { + sdOneValue.Add(Decoders.SecureDigital.Decoders.PrettifySCR(report.SecureDigital.SCR) + .Replace("\n", "
")); + sdOneValue.Add(""); + } + + if(report.SecureDigital.OCR != null) + { + sdOneValue.Add(Decoders.SecureDigital.Decoders.PrettifyCSD(report.SecureDigital.OCR) + .Replace("\n", "
")); + sdOneValue.Add(""); + } + + ViewBag.repSD = sdOneValue; + } + + if(removable && !sscMedia && testedMedia != null) + { + List mediaOneValue = new List(); + App_Start.TestedMedia.Report(testedMedia, ref mediaOneValue); + if(mediaOneValue.Count > 0) ViewBag.repTestedMedia = mediaOneValue; + } + } + catch(Exception) + { + #if DEBUG + throw; + #endif + return Content("Could not load device report"); + } + + return View(); + } + } + + public class Item + { + public string Manufacturer; + public string Product; + public string ProductDescription; + public string VendorDescription; + } + + public class PcmciaItem : Item + { + public string Compliance; + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/StatsController.cs b/DiscImageChef.Server/Controllers/StatsController.cs new file mode 100644 index 00000000..44da8683 --- /dev/null +++ b/DiscImageChef.Server/Controllers/StatsController.cs @@ -0,0 +1,531 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : StatsController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Fetches statistics for Razor views. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Web.Hosting; +using System.Web.Mvc; +using System.Xml; +using System.Xml.Serialization; +using DiscImageChef.CommonTypes.Interop; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Server.Models; +using Highsoft.Web.Mvc.Charts; +using Filter = DiscImageChef.Server.Models.Filter; +using OperatingSystem = DiscImageChef.Server.Models.OperatingSystem; +using PlatformID = DiscImageChef.CommonTypes.Interop.PlatformID; +using Version = DiscImageChef.Server.Models.Version; + +namespace DiscImageChef.Server.Controllers +{ + /// + /// Renders a page with statistics, list of media type, devices, etc + /// + public class StatsController : Controller + { + DicServerContext ctx = new DicServerContext(); + List devices; + List operatingSystems; + List realMedia; + List versions; + List virtualMedia; + + public ActionResult Index() + { + ViewBag.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + try + { + if( + System.IO.File + .Exists(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "Statistics", "Statistics.xml"))) + try + { + Stats statistics = new Stats(); + + XmlSerializer xs = new XmlSerializer(statistics.GetType()); + FileStream fs = + WaitForFile(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml"), + FileMode.Open, FileAccess.Read, FileShare.Read); + statistics = (Stats)xs.Deserialize(fs); + fs.Close(); + + StatsConverter.Convert(statistics); + + System.IO.File + .Delete(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "Statistics", "Statistics.xml")); + } + catch(XmlException) + { + // Do nothing + } + + if(ctx.OperatingSystems.Any()) + { + operatingSystems = new List(); + foreach(OperatingSystem nvs in ctx.OperatingSystems) + operatingSystems.Add(new NameValueStats + { + name = + $"{DetectOS.GetPlatformName((PlatformID)Enum.Parse(typeof(PlatformID), nvs.Name), nvs.Version)}{(string.IsNullOrEmpty(nvs.Version) ? "" : " ")}{nvs.Version}", + Value = nvs.Count + }); + + ViewBag.repOperatingSystems = operatingSystems.OrderBy(os => os.name).ToList(); + + List osPieData = new List(); + + decimal totalOsCount = ctx.OperatingSystems.Sum(o => o.Count); + foreach(string os in ctx.OperatingSystems.Select(o => o.Name).Distinct().ToList()) + { + decimal osCount = ctx.OperatingSystems.Where(o => o.Name == os).Sum(o => o.Count); + + osPieData.Add(new PieSeriesData + { + Name = + DetectOS.GetPlatformName((PlatformID)Enum.Parse(typeof(PlatformID), + os)), + Y = (double?)(osCount / totalOsCount), + Sliced = os == "Linux", + Selected = os == "Linux" + }); + } + + ViewData["osPieData"] = osPieData; + + List linuxPieData = new List(); + + decimal linuxCount = ctx.OperatingSystems.Where(o => o.Name == PlatformID.Linux.ToString()) + .Sum(o => o.Count); + foreach(OperatingSystem version in + ctx.OperatingSystems.Where(o => o.Name == PlatformID.Linux.ToString())) + linuxPieData.Add(new PieSeriesData + { + Name = + $"{DetectOS.GetPlatformName(PlatformID.Linux, version.Version)}{(string.IsNullOrEmpty(version.Version) ? "" : " ")}{version.Version}", + Y = (double?)(version.Count / linuxCount) + }); + + ViewData["linuxPieData"] = linuxPieData; + + List macosPieData = new List(); + + decimal macosCount = ctx.OperatingSystems.Where(o => o.Name == PlatformID.MacOSX.ToString()) + .Sum(o => o.Count); + foreach(OperatingSystem version in + ctx.OperatingSystems.Where(o => o.Name == PlatformID.MacOSX.ToString())) + macosPieData.Add(new PieSeriesData + { + Name = + $"{DetectOS.GetPlatformName(PlatformID.MacOSX, version.Version)}{(string.IsNullOrEmpty(version.Version) ? "" : " ")}{version.Version}", + Y = (double?)(version.Count / macosCount) + }); + + ViewData["macosPieData"] = macosPieData; + + List windowsPieData = new List(); + + decimal windowsCount = ctx.OperatingSystems.Where(o => o.Name == PlatformID.Win32NT.ToString()) + .Sum(o => o.Count); + foreach(OperatingSystem version in + ctx.OperatingSystems.Where(o => o.Name == PlatformID.Win32NT.ToString())) + windowsPieData.Add(new PieSeriesData + { + Name = + $"{DetectOS.GetPlatformName(PlatformID.Win32NT, version.Version)}{(string.IsNullOrEmpty(version.Version) ? "" : " ")}{version.Version}", + Y = (double?)(version.Count / windowsCount) + }); + + ViewData["windowsPieData"] = windowsPieData; + } + + if(ctx.Versions.Any()) + { + versions = new List(); + foreach(Version nvs in ctx.Versions) + versions.Add(new NameValueStats + { + name = nvs.Value == "previous" ? "Previous than 3.4.99.0" : nvs.Value, + Value = nvs.Count + }); + + ViewBag.repVersions = versions.OrderBy(ver => ver.name).ToList(); + + decimal totalVersionCount = ctx.Versions.Sum(o => o.Count); + + ViewData["versionsPieData"] = ctx.Versions.Select(version => new PieSeriesData + { + Name = + version.Value == "previous" + ? "Previous than 3.4.99.0" + : version.Value, + Y = (double?)(version.Count / + totalVersionCount), + Sliced = version.Value == "previous", + Selected = version.Value == "previous" + }).ToList(); + } + + if(ctx.Commands.Any()) + { + ViewBag.repCommands = ctx.Commands.OrderBy(c => c.Name).ToList(); + + decimal totalCommandCount = ctx.Commands.Sum(o => o.Count); + + ViewData["commandsPieData"] = ctx + .Commands.Select(command => new PieSeriesData + { + Name = command.Name, + Y = (double?)(command.Count / + totalCommandCount), + Sliced = command.Name == "analyze", + Selected = command.Name == "analyze" + }).ToList(); + } + + if(ctx.Filters.Any()) + { + ViewBag.repFilters = ctx.Filters.OrderBy(filter => filter.Name).ToList(); + + List filtersPieData = new List(); + + decimal totalFiltersCount = ctx.Filters.Sum(o => o.Count); + foreach(Filter filter in ctx.Filters.ToList()) + filtersPieData.Add(new PieSeriesData + { + Name = filter.Name, + Y = (double?)(filter.Count / totalFiltersCount), + Sliced = filter.Name == "No filter", + Selected = filter.Name == "No filter" + }); + + ViewData["filtersPieData"] = filtersPieData; + } + + if(ctx.MediaFormats.Any()) + { + ViewBag.repMediaImages = ctx.MediaFormats.OrderBy(filter => filter.Name).ToList(); + + List formatsPieData = new List(); + + decimal totalFormatsCount = ctx.MediaFormats.Sum(o => o.Count); + decimal top10FormatCount = 0; + + foreach(MediaFormat format in ctx.MediaFormats.OrderByDescending(o => o.Count).Take(10)) + { + top10FormatCount += format.Count; + + formatsPieData.Add(new PieSeriesData + { + Name = format.Name, Y = (double?)(format.Count / totalFormatsCount) + }); + } + + formatsPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?)((totalFormatsCount - top10FormatCount) / + totalFormatsCount), + Sliced = true, + Selected = true + }); + + ViewData["formatsPieData"] = formatsPieData; + } + + if(ctx.Partitions.Any()) + { + ViewBag.repPartitions = ctx.Partitions.OrderBy(filter => filter.Name).ToList(); + + List partitionsPieData = new List(); + + decimal totalPartitionsCount = ctx.Partitions.Sum(o => o.Count); + decimal top10PartitionCount = 0; + + foreach(Partition partition in ctx.Partitions.OrderByDescending(o => o.Count).Take(10)) + { + top10PartitionCount += partition.Count; + + partitionsPieData.Add(new PieSeriesData + { + Name = partition.Name, + Y = (double?)(partition.Count / totalPartitionsCount) + }); + } + + partitionsPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?)((totalPartitionsCount - top10PartitionCount) / + totalPartitionsCount), + Sliced = true, + Selected = true + }); + + ViewData["partitionsPieData"] = partitionsPieData; + } + + if(ctx.Filesystems.Any()) + { + ViewBag.repFilesystems = ctx.Filesystems.OrderBy(filter => filter.Name).ToList(); + + List filesystemsPieData = new List(); + + decimal totalFilesystemsCount = ctx.Filesystems.Sum(o => o.Count); + decimal top10FilesystemCount = 0; + + foreach(Filesystem filesystem in ctx.Filesystems.OrderByDescending(o => o.Count).Take(10)) + { + top10FilesystemCount += filesystem.Count; + + filesystemsPieData.Add(new PieSeriesData + { + Name = filesystem.Name, + Y = (double?)(filesystem.Count / totalFilesystemsCount) + }); + } + + filesystemsPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?)((totalFilesystemsCount - top10FilesystemCount) / + totalFilesystemsCount), + Sliced = true, + Selected = true + }); + + ViewData["filesystemsPieData"] = filesystemsPieData; + } + + if(ctx.Medias.Any()) + { + realMedia = new List(); + virtualMedia = new List(); + foreach(Media nvs in ctx.Medias) + try + { + MediaType + .MediaTypeToString((CommonTypes.MediaType)Enum.Parse(typeof(CommonTypes.MediaType), nvs.Type), + out string type, out string subtype); + + if(nvs.Real) + realMedia.Add(new MediaItem {Type = type, SubType = subtype, Count = nvs.Count}); + else virtualMedia.Add(new MediaItem {Type = type, SubType = subtype, Count = nvs.Count}); + } + catch + { + if(nvs.Real) + realMedia.Add(new MediaItem {Type = nvs.Type, SubType = null, Count = nvs.Count}); + else virtualMedia.Add(new MediaItem {Type = nvs.Type, SubType = null, Count = nvs.Count}); + } + + if(realMedia.Count > 0) + { + ViewBag.repRealMedia = + realMedia.OrderBy(media => media.Type).ThenBy(media => media.SubType).ToList(); + + List realMediaPieData = new List(); + + decimal totalRealMediaCount = realMedia.Sum(o => o.Count); + decimal top10RealMediaCount = 0; + + foreach(MediaItem realMediaItem in realMedia.OrderByDescending(o => o.Count).Take(10)) + { + top10RealMediaCount += realMediaItem.Count; + + realMediaPieData.Add(new PieSeriesData + { + Name = $"{realMediaItem.Type} ({realMediaItem.SubType})", + Y = (double?)(realMediaItem.Count / totalRealMediaCount) + }); + } + + realMediaPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?)((totalRealMediaCount - top10RealMediaCount) / + totalRealMediaCount), + Sliced = true, + Selected = true + }); + + ViewData["realMediaPieData"] = realMediaPieData; + } + + if(virtualMedia.Count > 0) + { + ViewBag.repVirtualMedia = + virtualMedia.OrderBy(media => media.Type).ThenBy(media => media.SubType).ToList(); + + List virtualMediaPieData = new List(); + + decimal totalVirtualMediaCount = virtualMedia.Sum(o => o.Count); + decimal top10VirtualMediaCount = 0; + + foreach(MediaItem virtualMediaItem in virtualMedia.OrderByDescending(o => o.Count).Take(10)) + { + top10VirtualMediaCount += virtualMediaItem.Count; + + virtualMediaPieData.Add(new PieSeriesData + { + Name = + $"{virtualMediaItem.Type} ({virtualMediaItem.SubType})", + Y = (double?)(virtualMediaItem.Count / + totalVirtualMediaCount) + }); + } + + virtualMediaPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?) + ((totalVirtualMediaCount - top10VirtualMediaCount) / + totalVirtualMediaCount), + Sliced = true, + Selected = true + }); + + ViewData["virtualMediaPieData"] = virtualMediaPieData; + } + } + + if(ctx.DeviceStats.Any()) + { + devices = new List(); + foreach(DeviceStat device in ctx.DeviceStats.ToList()) + { + string xmlFile; + if(!string.IsNullOrWhiteSpace(device.Manufacturer) && + !string.IsNullOrWhiteSpace(device.Model) && + !string.IsNullOrWhiteSpace(device.Revision)) + xmlFile = device.Manufacturer + "_" + device.Model + "_" + device.Revision + ".xml"; + else if(!string.IsNullOrWhiteSpace(device.Manufacturer) && + !string.IsNullOrWhiteSpace(device.Model)) + xmlFile = device.Manufacturer + "_" + device.Model + ".xml"; + else if(!string.IsNullOrWhiteSpace(device.Model) && !string.IsNullOrWhiteSpace(device.Revision)) + xmlFile = device.Model + "_" + device.Revision + ".xml"; + else xmlFile = device.Model + ".xml"; + + xmlFile = xmlFile.Replace('/', '_').Replace('\\', '_').Replace('?', '_'); + + if(System.IO.File.Exists(Path.Combine(HostingEnvironment.MapPath("~"), "Reports", xmlFile))) + { + DeviceReport deviceReport = new DeviceReport(); + + XmlSerializer xs = new XmlSerializer(deviceReport.GetType()); + FileStream fs = + WaitForFile(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Reports", xmlFile), + FileMode.Open, FileAccess.Read, FileShare.Read); + deviceReport = (DeviceReport)xs.Deserialize(fs); + fs.Close(); + + DeviceReportV2 deviceReportV2 = new DeviceReportV2(deviceReport); + + device.Report = ctx.Devices.Add(new Device(deviceReportV2)); + ctx.SaveChanges(); + + System.IO.File + .Delete(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "Reports", xmlFile)); + } + + devices.Add(new DeviceItem + { + Manufacturer = device.Manufacturer, + Model = device.Model, + Revision = device.Revision, + Bus = device.Bus, + ReportId = device.Report != null && device.Report.Id != 0 + ? device.Report.Id + : 0 + }); + } + + ViewBag.repDevices = devices.OrderBy(device => device.Manufacturer).ThenBy(device => device.Model) + .ThenBy(device => device.Revision).ThenBy(device => device.Bus) + .ToList(); + + ViewData["devicesBusPieData"] = (from deviceBus in devices.Select(d => d.Bus).Distinct() + let deviceBusCount = devices.Count(d => d.Bus == deviceBus) + select new PieSeriesData + { + Name = deviceBus, + Y = deviceBusCount / (double)devices.Count + }).ToList(); + + ViewData["devicesManufacturerPieData"] = + (from manufacturer in + devices.Where(d => d.Manufacturer != null).Select(d => d.Manufacturer.ToLowerInvariant()) + .Distinct() + let manufacturerCount = devices.Count(d => d.Manufacturer?.ToLowerInvariant() == manufacturer) + select new PieSeriesData {Name = manufacturer, Y = manufacturerCount / (double)devices.Count}) + .ToList(); + } + } + catch(Exception) + { + #if DEBUG + throw; + #endif + return Content("Could not read statistics"); + } + + return View(); + } + + static FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access, FileShare share) + { + for(int numTries = 0; numTries < 100; numTries++) + { + FileStream fs = null; + try + { + fs = new FileStream(fullPath, mode, access, share); + return fs; + } + catch(IOException) + { + fs?.Dispose(); + Thread.Sleep(50); + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/UpdateController.cs b/DiscImageChef.Server/Controllers/UpdateController.cs new file mode 100644 index 00000000..423f5502 --- /dev/null +++ b/DiscImageChef.Server/Controllers/UpdateController.cs @@ -0,0 +1,98 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UploadReportController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Handles report uploads. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Web.Http; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Dto; +using DiscImageChef.Server.Models; +using Newtonsoft.Json; + +namespace DiscImageChef.Server.Controllers +{ + public class UpdateController : ApiController + { + /// + /// Receives a report from DiscImageChef.Core, verifies it's in the correct format and stores it on the server + /// + /// HTTP response + [Route("api/update")] + [HttpGet] + public HttpResponseMessage UploadReport(long timestamp) + { + DicServerContext ctx = new DicServerContext(); + + SyncDto sync = new SyncDto(); + DateTime lastSync = DateHandlers.UnixToDateTime(timestamp); + + sync.UsbVendors = new List(); + foreach(UsbVendor vendor in ctx.UsbVendors.Where(v => v.ModifiedWhen > lastSync)) + sync.UsbVendors.Add(new UsbVendorDto {VendorId = (ushort)vendor.VendorId, Vendor = vendor.Vendor}); + + sync.UsbProducts = new List(); + foreach(UsbProduct product in ctx.UsbProducts.Where(p => p.ModifiedWhen > lastSync)) + sync.UsbProducts.Add(new UsbProductDto + { + Id = product.Id, + Product = product.Product, + ProductId = (ushort)product.ProductId, + VendorId = (ushort)product.Vendor.VendorId + }); + + sync.Offsets = new List(); + foreach(CompactDiscOffset offset in ctx.CdOffsets.Where(o => o.ModifiedWhen > lastSync)) + sync.Offsets.Add(new CdOffsetDto(offset, offset.Id)); + + sync.Devices = new List(); + foreach(Device device in ctx.Devices.Where(d => d.ModifiedWhen > lastSync).ToList()) + sync.Devices.Add(new + DeviceDto(JsonConvert.DeserializeObject(JsonConvert.SerializeObject(device, Formatting.None, new JsonSerializerSettings {ReferenceLoopHandling = ReferenceLoopHandling.Ignore})), + device.Id, device.OptimalMultipleSectorsRead)); + + JsonSerializer js = JsonSerializer.Create(); + StringWriter sw = new StringWriter(); + js.Serialize(sw, sync); + + return new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent(sw.ToString(), Encoding.UTF8, "application/json") + }; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/UploadReportController.cs b/DiscImageChef.Server/Controllers/UploadReportController.cs new file mode 100644 index 00000000..7cbe3be7 --- /dev/null +++ b/DiscImageChef.Server/Controllers/UploadReportController.cs @@ -0,0 +1,195 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UploadReportController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Handles report uploads. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Web; +using System.Web.Hosting; +using System.Web.Http; +using System.Xml.Serialization; +using Cinchoo.PGP; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Server.Models; +using MailKit.Net.Smtp; +using MimeKit; +using Newtonsoft.Json; + +namespace DiscImageChef.Server.Controllers +{ + public class UploadReportController : ApiController + { + DicServerContext ctx = new DicServerContext(); + + /// + /// Receives a report from DiscImageChef.Core, verifies it's in the correct format and stores it on the server + /// + /// HTTP response + [Route("api/uploadreport")] + [HttpPost] + public HttpResponseMessage UploadReport() + { + HttpResponseMessage response = new HttpResponseMessage {StatusCode = HttpStatusCode.OK}; + + try + { + DeviceReport newReport = new DeviceReport(); + HttpRequest request = HttpContext.Current.Request; + + XmlSerializer xs = new XmlSerializer(newReport.GetType()); + newReport = (DeviceReport)xs.Deserialize(request.InputStream); + + if(newReport == null) + { + response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); + return response; + } + + DeviceReportV2 reportV2 = new DeviceReportV2(newReport); + StringWriter jsonSw = new StringWriter(); + jsonSw.Write(JsonConvert.SerializeObject(reportV2, Formatting.Indented, + new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + })); + string reportV2String = jsonSw.ToString(); + jsonSw.Close(); + + ctx.Reports.Add(new UploadedReport(reportV2)); + ctx.SaveChanges(); + + MemoryStream pgpIn = new MemoryStream(Encoding.UTF8.GetBytes(reportV2String)); + MemoryStream pgpOut = new MemoryStream(); + ChoPGPEncryptDecrypt pgp = new ChoPGPEncryptDecrypt(); + pgp.Encrypt(pgpIn, pgpOut, + Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "public.asc"), true); + pgpOut.Position = 0; + reportV2String = Encoding.UTF8.GetString(pgpOut.ToArray()); + + MimeMessage message = new MimeMessage + { + Subject = "New device report (old version)", + Body = new TextPart("plain") {Text = reportV2String} + }; + message.From.Add(new MailboxAddress("DiscImageChef", "dic@claunia.com")); + message.To.Add(new MailboxAddress("Natalia Portillo", "claunia@claunia.com")); + + using(SmtpClient client = new SmtpClient()) + { + client.Connect("mail.claunia.com", 25, false); + client.Send(message); + client.Disconnect(true); + } + + response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); + return response; + } + // ReSharper disable once RedundantCatchClause + catch + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); + return response; + } + } + + /// + /// Receives a report from DiscImageChef.Core, verifies it's in the correct format and stores it on the server + /// + /// HTTP response + [Route("api/uploadreportv2")] + [HttpPost] + public HttpResponseMessage UploadReportV2() + { + HttpResponseMessage response = new HttpResponseMessage {StatusCode = HttpStatusCode.OK}; + + try + { + HttpRequest request = HttpContext.Current.Request; + + StreamReader sr = new StreamReader(request.InputStream); + string reportJson = sr.ReadToEnd(); + DeviceReportV2 newReport = JsonConvert.DeserializeObject(reportJson); + + if(newReport == null) + { + response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); + return response; + } + + ctx.Reports.Add(new UploadedReport(newReport)); + ctx.SaveChanges(); + + MemoryStream pgpIn = new MemoryStream(Encoding.UTF8.GetBytes(reportJson)); + MemoryStream pgpOut = new MemoryStream(); + ChoPGPEncryptDecrypt pgp = new ChoPGPEncryptDecrypt(); + pgp.Encrypt(pgpIn, pgpOut, + Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "public.asc"), true); + pgpOut.Position = 0; + reportJson = Encoding.UTF8.GetString(pgpOut.ToArray()); + + MimeMessage message = new MimeMessage + { + Subject = "New device report", Body = new TextPart("plain") {Text = reportJson} + }; + message.From.Add(new MailboxAddress("DiscImageChef", "dic@claunia.com")); + message.To.Add(new MailboxAddress("Natalia Portillo", "claunia@claunia.com")); + + using(SmtpClient client = new SmtpClient()) + { + client.Connect("mail.claunia.com", 25, false); + client.Send(message); + client.Disconnect(true); + } + + response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); + return response; + } + // ReSharper disable once RedundantCatchClause + catch + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); + return response; + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/UploadStatsController.cs b/DiscImageChef.Server/Controllers/UploadStatsController.cs new file mode 100644 index 00000000..cfadf535 --- /dev/null +++ b/DiscImageChef.Server/Controllers/UploadStatsController.cs @@ -0,0 +1,254 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UploadStatsController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Handles statistics uploads. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Web; +using System.Web.Http; +using System.Xml.Serialization; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Server.Models; +using Newtonsoft.Json; +using OperatingSystem = DiscImageChef.Server.Models.OperatingSystem; +using Version = DiscImageChef.Server.Models.Version; + +namespace DiscImageChef.Server.Controllers +{ + public class UploadStatsController : ApiController + { + /// + /// Receives statistics from DiscImageChef.Core, processes them and adds them to a server-side global statistics XML + /// + /// HTTP response + [Route("api/uploadstats")] + [HttpPost] + public HttpResponseMessage UploadStats() + { + HttpResponseMessage response = new HttpResponseMessage {StatusCode = HttpStatusCode.OK}; + + try + { + Stats newStats = new Stats(); + HttpRequest request = HttpContext.Current.Request; + + XmlSerializer xs = new XmlSerializer(newStats.GetType()); + newStats = (Stats)xs.Deserialize(request.InputStream); + + if(newStats == null) + { + response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); + return response; + } + + StatsConverter.Convert(newStats); + + response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); + return response; + } + catch(Exception ex) + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); + return response; + } + } + + /// + /// Receives a report from DiscImageChef.Core, verifies it's in the correct format and stores it on the server + /// + /// HTTP response + [Route("api/uploadstatsv2")] + [HttpPost] + public HttpResponseMessage UploadStatsV2() + { + HttpResponseMessage response = new HttpResponseMessage {StatusCode = HttpStatusCode.OK}; + + try + { + HttpRequest request = HttpContext.Current.Request; + + StreamReader sr = new StreamReader(request.InputStream); + StatsDto newstats = JsonConvert.DeserializeObject(sr.ReadToEnd()); + + if(newstats == null) + { + response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); + return response; + } + + DicServerContext ctx = new DicServerContext(); + + if(newstats.Commands != null) + foreach(NameValueStats nvs in newstats.Commands) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Commands.Add(new Command {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.Versions != null) + foreach(NameValueStats nvs in newstats.Versions) + { + Version existing = ctx.Versions.FirstOrDefault(c => c.Value == nvs.name); + + if(existing == null) ctx.Versions.Add(new Version {Value = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.Filesystems != null) + foreach(NameValueStats nvs in newstats.Filesystems) + { + Filesystem existing = ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Filesystems.Add(new Filesystem {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.Partitions != null) + foreach(NameValueStats nvs in newstats.Partitions) + { + Partition existing = ctx.Partitions.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Partitions.Add(new Partition {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.MediaFormats != null) + foreach(NameValueStats nvs in newstats.MediaFormats) + { + MediaFormat existing = ctx.MediaFormats.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.MediaFormats.Add(new MediaFormat {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.Filters != null) + foreach(NameValueStats nvs in newstats.Filters) + { + Filter existing = ctx.Filters.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Filters.Add(new Filter {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.OperatingSystems != null) + foreach(OsStats operatingSystem in newstats.OperatingSystems) + { + OperatingSystem existing = + ctx.OperatingSystems.FirstOrDefault(c => c.Name == operatingSystem.name && + c.Version == operatingSystem.version); + + if(existing == null) + ctx.OperatingSystems.Add(new OperatingSystem + { + Name = operatingSystem.name, + Version = operatingSystem.version, + Count = operatingSystem.Value + }); + else existing.Count += operatingSystem.Value; + } + + if(newstats.Medias != null) + foreach(MediaStats media in newstats.Medias) + { + Media existing = ctx.Medias.FirstOrDefault(c => c.Type == media.type && c.Real == media.real); + + if(existing == null) + ctx.Medias.Add(new Media {Type = media.type, Real = media.real, Count = media.Value}); + else existing.Count += media.Value; + } + + if(newstats.Devices != null) + foreach(DeviceStats device in newstats.Devices) + { + DeviceStat existing = + ctx.DeviceStats.FirstOrDefault(c => c.Bus == device.Bus && + c.Manufacturer == device.Manufacturer && + c.Model == device.Model && + c.Revision == device.Revision); + + if(existing == null) + ctx.DeviceStats.Add(new DeviceStat + { + Bus = device.Bus, + Manufacturer = device.Manufacturer, + Model = device.Model, + Revision = device.Revision + }); + } + + ctx.SaveChanges(); + + response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); + return response; + } + // ReSharper disable once RedundantCatchClause + catch + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); + return response; + } + } + + FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access, FileShare share) + { + for(int numTries = 0; numTries < 100; numTries++) + { + FileStream fs = null; + try + { + fs = new FileStream(fullPath, mode, access, share); + return fs; + } + catch(IOException) + { + if(fs != null) fs.Dispose(); + Thread.Sleep(50); + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/DiscImageChef.Server.csproj b/DiscImageChef.Server/DiscImageChef.Server.csproj new file mode 100644 index 00000000..1d015547 --- /dev/null +++ b/DiscImageChef.Server/DiscImageChef.Server.csproj @@ -0,0 +1,480 @@ + + + + + + + Debug + AnyCPU + + + 2.0 + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + DiscImageChef.Server + DiscImageChef.Server + v4.6.1 + false + true + + + + + + + + + false + 4.5.99.1693 + $(Version) + true + 4.5.99.1693 + Claunia.com + Copyright © 2011-2019 Natalia Portillo + The Disc Image Chef + DiscImageChef.Server + $(Version) + + + $(Version)-{chash:8} built by {mname} in $(Configuration){!:, modified} + true + true + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + true + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll + True + + + ..\packages\ChoPGP.1.0.1.2\lib\ChoPGP.dll + True + + + ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll + True + + + ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll + True + + + ..\packages\Google.Protobuf.3.7.0\lib\net45\Google.Protobuf.dll + True + + + ..\packages\Highsoft.Highcharts.7.0.3.11\lib\net40\Highcharts.Web.Mvc.dll + True + + + ..\packages\MailKit.2.1.4\lib\net45\MailKit.dll + True + + + ..\packages\Markdig.0.16.0\lib\net40\Markdig.dll + True + + + ..\packages\Microsoft.AspNet.TelemetryCorrelation.1.0.5\lib\net45\Microsoft.AspNet.TelemetryCorrelation.dll + True + + + ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll + + + + ..\packages\MimeKit.2.1.4\lib\net45\MimeKit.dll + True + + + + ..\packages\MySql.Data.8.0.15\lib\net452\MySql.Data.dll + True + + + ..\packages\MySql.Data.EntityFramework.8.0.15\lib\net452\MySql.Data.EntityFramework.dll + True + + + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + True + + + + + + + ..\packages\System.Diagnostics.DiagnosticSource.4.5.1\lib\net46\System.Diagnostics.DiagnosticSource.dll + True + + + + + + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.7\lib\net45\System.Net.Http.Formatting.dll + True + + + + + + + + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.7\lib\net45\System.Web.Http.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.7\lib\net45\System.Web.Http.WebHost.dll + True + + + ..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll + True + + + ..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll + True + + + + + + + + + + True + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + + + + + + + ..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll + + + True + ..\packages\WebGrease.1.6.0\lib\WebGrease.dll + + + True + ..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll + + + + + + + + + + + + + + + + + + + + + + Global.asax + + + + 201812201613369_InitialMigration.cs + + + + 201812220029427_AddStatistics.cs + + + + 201812221606592_LinkDeviceStatsToReport.cs + + + + 201812231612080_FixUnsignedFields.cs + + + + 201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs + + + + 201812240552109_StoreUsbIdsInDatabase.cs + + + + 201812241719441_FixUsbIdsAndIndexes.cs + + + + 201812250223002_AddCdOffsets.cs + + + + 201812251556377_StoreMmcGetConfigurationResponse.cs + + + + 201812252219066_StoreReadResultsInReportDatabase.cs + + + + 201901022133012_AddMultisessionLeadTest.cs + + + + 201901030344456_AddOptimalReadMultipleCount.cs + + + + 201901081359499_AddChangeableScsiModes.cs + + + + 201905252122267_IdForDensityCode.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dicserver.scss + + + dicserver.css + + + + dicserver_highcharts.scss + + + dicserver_highcharts.css + + + + + + + + + + + + + + + + + + Web.config + + + Web.config + + + + + + + + + + + + + + {f2b84194-26eb-4227-b1c5-6602517e85ae} + DiscImageChef.CommonTypes + + + {0beb3088-b634-4289-ae17-cdf2d25d00d5} + DiscImageChef.Decoders + + + {f4399ff5-9bd0-475a-9ea7-3dae45291fe2} + DiscImageChef.Dto + + + {f8bdf57b-1571-4cd0-84b3-b422088d359a} + DiscImageChef.Helpers + + + + + LICENSE.LGPL + + + 201812201613369_InitialMigration.cs + + + 201812220029427_AddStatistics.cs + + + 201812221606592_LinkDeviceStatsToReport.cs + + + 201812231612080_FixUnsignedFields.cs + + + 201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs + + + 201812240552109_StoreUsbIdsInDatabase.cs + + + 201812241719441_FixUsbIdsAndIndexes.cs + + + 201812250223002_AddCdOffsets.cs + + + 201812251556377_StoreMmcGetConfigurationResponse.cs + + + 201812252219066_StoreReadResultsInReportDatabase.cs + + + 201901022133012_AddMultisessionLeadTest.cs + + + 201901030344456_AddOptimalReadMultipleCount.cs + + + 201901081359499_AddChangeableScsiModes.cs + + + 201905252122267_IdForDensityCode.cs + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + + + + True + True + 22810 + / + http://localhost:22810/ + False + False + + + False + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server/Global.asax b/DiscImageChef.Server/Global.asax new file mode 100644 index 00000000..189743a3 --- /dev/null +++ b/DiscImageChef.Server/Global.asax @@ -0,0 +1 @@ +<%@ Application Inherits="DiscImageChef.Server.Global" %> \ No newline at end of file diff --git a/DiscImageChef.Server/Global.asax.cs b/DiscImageChef.Server/Global.asax.cs new file mode 100644 index 00000000..a13a6894 --- /dev/null +++ b/DiscImageChef.Server/Global.asax.cs @@ -0,0 +1,47 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Global.asax.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// ASP.NET global definitions. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Web; +using System.Web.Http; +using System.Web.Routing; + +namespace DiscImageChef.Server +{ + public class Global : HttpApplication + { + protected void Application_Start() + { + GlobalConfiguration.Configure(WebApiConfig.Register); + RouteConfig.RegisterRoutes(RouteTable.Routes); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.Designer.cs b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.Designer.cs new file mode 100644 index 00000000..129eb91c --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class InitialMigration : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(InitialMigration)); + + string IMigrationMetadata.Id + { + get { return "201812201613369_InitialMigration"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.cs b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.cs new file mode 100644 index 00000000..ddf62c28 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.cs @@ -0,0 +1,584 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class InitialMigration : DbMigration + { + public override void Up() + { + CreateTable("dbo.Devices", + c => new + { + Id = c.Int(false, true), + AddedWhen = c.DateTime(false, 0), + CompactFlash = c.Boolean(false), + Manufacturer = c.String(unicode: false), + Model = c.String(unicode: false), + Revision = c.String(unicode: false), + Type = c.Int(false), + ATA_Id = c.Int(), + ATAPI_Id = c.Int(), + FireWire_Id = c.Int(), + MultiMediaCard_Id = c.Int(), + PCMCIA_Id = c.Int(), + SCSI_Id = c.Int(), + SecureDigital_Id = c.Int(), + USB_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Atas", t => t.ATA_Id) + .ForeignKey("dbo.Atas", t => t.ATAPI_Id).ForeignKey("dbo.FireWires", t => t.FireWire_Id) + .ForeignKey("dbo.MmcSds", t => t.MultiMediaCard_Id) + .ForeignKey("dbo.Pcmcias", t => t.PCMCIA_Id).ForeignKey("dbo.Scsis", t => t.SCSI_Id) + .ForeignKey("dbo.MmcSds", t => t.SecureDigital_Id).ForeignKey("dbo.Usbs", t => t.USB_Id) + .Index(t => t.ATA_Id).Index(t => t.ATAPI_Id).Index(t => t.FireWire_Id) + .Index(t => t.MultiMediaCard_Id).Index(t => t.PCMCIA_Id).Index(t => t.SCSI_Id) + .Index(t => t.SecureDigital_Id).Index(t => t.USB_Id); + + CreateTable("dbo.Atas", + c => new {Id = c.Int(false, true), Identify = c.Binary(), ReadCapabilities_Id = c.Int()}) + .PrimaryKey(t => t.Id).ForeignKey("dbo.TestedMedias", t => t.ReadCapabilities_Id) + .Index(t => t.ReadCapabilities_Id); + + CreateTable("dbo.TestedMedias", + c => new + { + Id = c.Int(false, true), + IdentifyData = c.Binary(), + CanReadAACS = c.Boolean(), + CanReadADIP = c.Boolean(), + CanReadATIP = c.Boolean(), + CanReadBCA = c.Boolean(), + CanReadC2Pointers = c.Boolean(), + CanReadCMI = c.Boolean(), + CanReadCorrectedSubchannel = c.Boolean(), + CanReadCorrectedSubchannelWithC2 = c.Boolean(), + CanReadDCB = c.Boolean(), + CanReadDDS = c.Boolean(), + CanReadDMI = c.Boolean(), + CanReadDiscInformation = c.Boolean(), + CanReadFullTOC = c.Boolean(), + CanReadHDCMI = c.Boolean(), + CanReadLayerCapacity = c.Boolean(), + CanReadFirstTrackPreGap = c.Boolean(), + CanReadLeadIn = c.Boolean(), + CanReadLeadOut = c.Boolean(), + CanReadMediaID = c.Boolean(), + CanReadMediaSerial = c.Boolean(), + CanReadPAC = c.Boolean(), + CanReadPFI = c.Boolean(), + CanReadPMA = c.Boolean(), + CanReadPQSubchannel = c.Boolean(), + CanReadPQSubchannelWithC2 = c.Boolean(), + CanReadPRI = c.Boolean(), + CanReadRWSubchannel = c.Boolean(), + CanReadRWSubchannelWithC2 = c.Boolean(), + CanReadRecordablePFI = c.Boolean(), + CanReadSpareAreaInformation = c.Boolean(), + CanReadTOC = c.Boolean(), + Density = c.Byte(), + Manufacturer = c.String(unicode: false), + MediaIsRecognized = c.Boolean(false), + MediumType = c.Byte(), + MediumTypeName = c.String(unicode: false), + Model = c.String(unicode: false), + SupportsHLDTSTReadRawDVD = c.Boolean(), + SupportsNECReadCDDA = c.Boolean(), + SupportsPioneerReadCDDA = c.Boolean(), + SupportsPioneerReadCDDAMSF = c.Boolean(), + SupportsPlextorReadCDDA = c.Boolean(), + SupportsPlextorReadRawDVD = c.Boolean(), + SupportsRead10 = c.Boolean(), + SupportsRead12 = c.Boolean(), + SupportsRead16 = c.Boolean(), + SupportsRead6 = c.Boolean(), + SupportsReadCapacity16 = c.Boolean(), + SupportsReadCapacity = c.Boolean(), + SupportsReadCd = c.Boolean(), + SupportsReadCdMsf = c.Boolean(), + SupportsReadCdRaw = c.Boolean(), + SupportsReadCdMsfRaw = c.Boolean(), + SupportsReadLong16 = c.Boolean(), + SupportsReadLong = c.Boolean(), + ModeSense6Data = c.Binary(), + ModeSense10Data = c.Binary(), + SolidStateDevice = c.Boolean(), + SupportsReadDmaLba = c.Boolean(), + SupportsReadDmaRetryLba = c.Boolean(), + SupportsReadLba = c.Boolean(), + SupportsReadRetryLba = c.Boolean(), + SupportsReadLongLba = c.Boolean(), + SupportsReadLongRetryLba = c.Boolean(), + SupportsSeekLba = c.Boolean(), + SupportsReadDmaLba48 = c.Boolean(), + SupportsReadLba48 = c.Boolean(), + SupportsReadDma = c.Boolean(), + SupportsReadDmaRetry = c.Boolean(), + SupportsReadRetry = c.Boolean(), + SupportsReadSectors = c.Boolean(), + SupportsReadLongRetry = c.Boolean(), + SupportsSeek = c.Boolean(), + CHS_Id = c.Int(), + CurrentCHS_Id = c.Int(), + Ata_Id = c.Int(), + Mmc_Id = c.Int(), + Scsi_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Chs", t => t.CHS_Id) + .ForeignKey("dbo.Chs", t => t.CurrentCHS_Id).ForeignKey("dbo.Atas", t => t.Ata_Id) + .ForeignKey("dbo.Mmcs", t => t.Mmc_Id).ForeignKey("dbo.Scsis", t => t.Scsi_Id) + .Index(t => t.CHS_Id).Index(t => t.CurrentCHS_Id).Index(t => t.Ata_Id) + .Index(t => t.Mmc_Id).Index(t => t.Scsi_Id); + + CreateTable("dbo.Chs", c => new {Id = c.Int(false, true)}).PrimaryKey(t => t.Id); + + CreateTable("dbo.FireWires", + c => new + { + Id = c.Int(false, true), + Manufacturer = c.String(unicode: false), + Product = c.String(unicode: false), + RemovableMedia = c.Boolean(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.MmcSds", + c => new + { + Id = c.Int(false, true), + CID = c.Binary(), + CSD = c.Binary(), + OCR = c.Binary(), + SCR = c.Binary(), + ExtendedCSD = c.Binary() + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Pcmcias", + c => new + { + Id = c.Int(false, true), + CIS = c.Binary(), + Compliance = c.String(unicode: false), + Manufacturer = c.String(unicode: false), + ProductName = c.String(unicode: false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Scsis", + c => new + { + Id = c.Int(false, true), + InquiryData = c.Binary(), + SupportsModeSense6 = c.Boolean(false), + SupportsModeSense10 = c.Boolean(false), + SupportsModeSubpages = c.Boolean(false), + ModeSense6Data = c.Binary(), + ModeSense10Data = c.Binary(), + ModeSense_Id = c.Int(), + MultiMediaDevice_Id = c.Int(), + ReadCapabilities_Id = c.Int(), + SequentialDevice_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.ScsiModes", t => t.ModeSense_Id) + .ForeignKey("dbo.Mmcs", t => t.MultiMediaDevice_Id) + .ForeignKey("dbo.TestedMedias", t => t.ReadCapabilities_Id) + .ForeignKey("dbo.Sscs", t => t.SequentialDevice_Id).Index(t => t.ModeSense_Id) + .Index(t => t.MultiMediaDevice_Id).Index(t => t.ReadCapabilities_Id) + .Index(t => t.SequentialDevice_Id); + + CreateTable("dbo.ScsiPages", + c => new + { + Id = c.Int(false, true), + page = c.Byte(false), + subpage = c.Byte(), + value = c.Binary(), + Scsi_Id = c.Int(), + ScsiMode_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Scsis", t => t.Scsi_Id) + .ForeignKey("dbo.ScsiModes", t => t.ScsiMode_Id).Index(t => t.Scsi_Id) + .Index(t => t.ScsiMode_Id); + + CreateTable("dbo.ScsiModes", + c => new + { + Id = c.Int(false, true), + MediumType = c.Byte(), + WriteProtected = c.Boolean(false), + Speed = c.Byte(), + BufferedMode = c.Byte(), + BlankCheckEnabled = c.Boolean(false), + DPOandFUA = c.Boolean(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.BlockDescriptors", + c => new {Id = c.Int(false, true), Density = c.Byte(false), ScsiMode_Id = c.Int()}) + .PrimaryKey(t => t.Id).ForeignKey("dbo.ScsiModes", t => t.ScsiMode_Id).Index(t => t.ScsiMode_Id); + + CreateTable("dbo.Mmcs", c => new {Id = c.Int(false, true), Features_Id = c.Int(), ModeSense2A_Id = c.Int()}) + .PrimaryKey(t => t.Id).ForeignKey("dbo.MmcFeatures", t => t.Features_Id) + .ForeignKey("dbo.ModePage_2A", t => t.ModeSense2A_Id).Index(t => t.Features_Id) + .Index(t => t.ModeSense2A_Id); + + CreateTable("dbo.MmcFeatures", + c => new + { + Id = c.Int(false, true), + AACSVersion = c.Byte(), + AGIDs = c.Byte(), + BindingNonceBlocks = c.Byte(), + BufferUnderrunFreeInDVD = c.Boolean(false), + BufferUnderrunFreeInSAO = c.Boolean(false), + BufferUnderrunFreeInTAO = c.Boolean(false), + CanAudioScan = c.Boolean(false), + CanEject = c.Boolean(false), + CanEraseSector = c.Boolean(false), + CanExpandBDRESpareArea = c.Boolean(false), + CanFormat = c.Boolean(false), + CanFormatBDREWithoutSpare = c.Boolean(false), + CanFormatCert = c.Boolean(false), + CanFormatFRF = c.Boolean(false), + CanFormatQCert = c.Boolean(false), + CanFormatRRM = c.Boolean(false), + CanGenerateBindingNonce = c.Boolean(false), + CanLoad = c.Boolean(false), + CanMuteSeparateChannels = c.Boolean(false), + CanOverwriteSAOTrack = c.Boolean(false), + CanOverwriteTAOTrack = c.Boolean(false), + CanPlayCDAudio = c.Boolean(false), + CanPseudoOverwriteBDR = c.Boolean(false), + CanReadAllDualR = c.Boolean(false), + CanReadAllDualRW = c.Boolean(false), + CanReadBD = c.Boolean(false), + CanReadBDR = c.Boolean(false), + CanReadBDRE1 = c.Boolean(false), + CanReadBDRE2 = c.Boolean(false), + CanReadBDROM = c.Boolean(false), + CanReadBluBCA = c.Boolean(false), + CanReadCD = c.Boolean(false), + CanReadCDMRW = c.Boolean(false), + CanReadCPRM_MKB = c.Boolean(false), + CanReadDDCD = c.Boolean(false), + CanReadDVD = c.Boolean(false), + CanReadDVDPlusMRW = c.Boolean(false), + CanReadDVDPlusR = c.Boolean(false), + CanReadDVDPlusRDL = c.Boolean(false), + CanReadDVDPlusRW = c.Boolean(false), + CanReadDVDPlusRWDL = c.Boolean(false), + CanReadDriveAACSCertificate = c.Boolean(false), + CanReadHDDVD = c.Boolean(false), + CanReadHDDVDR = c.Boolean(false), + CanReadHDDVDRAM = c.Boolean(false), + CanReadLeadInCDText = c.Boolean(false), + CanReadOldBDR = c.Boolean(false), + CanReadOldBDRE = c.Boolean(false), + CanReadOldBDROM = c.Boolean(false), + CanReadSpareAreaInformation = c.Boolean(false), + CanReportDriveSerial = c.Boolean(false), + CanReportMediaSerial = c.Boolean(false), + CanTestWriteDDCDR = c.Boolean(false), + CanTestWriteDVD = c.Boolean(false), + CanTestWriteInSAO = c.Boolean(false), + CanTestWriteInTAO = c.Boolean(false), + CanUpgradeFirmware = c.Boolean(false), + CanWriteBD = c.Boolean(false), + CanWriteBDR = c.Boolean(false), + CanWriteBDRE1 = c.Boolean(false), + CanWriteBDRE2 = c.Boolean(false), + CanWriteBusEncryptedBlocks = c.Boolean(false), + CanWriteCDMRW = c.Boolean(false), + CanWriteCDRW = c.Boolean(false), + CanWriteCDRWCAV = c.Boolean(false), + CanWriteCDSAO = c.Boolean(false), + CanWriteCDTAO = c.Boolean(false), + CanWriteCSSManagedDVD = c.Boolean(false), + CanWriteDDCDR = c.Boolean(false), + CanWriteDDCDRW = c.Boolean(false), + CanWriteDVDPlusMRW = c.Boolean(false), + CanWriteDVDPlusR = c.Boolean(false), + CanWriteDVDPlusRDL = c.Boolean(false), + CanWriteDVDPlusRW = c.Boolean(false), + CanWriteDVDPlusRWDL = c.Boolean(false), + CanWriteDVDR = c.Boolean(false), + CanWriteDVDRDL = c.Boolean(false), + CanWriteDVDRW = c.Boolean(false), + CanWriteHDDVDR = c.Boolean(false), + CanWriteHDDVDRAM = c.Boolean(false), + CanWriteOldBDR = c.Boolean(false), + CanWriteOldBDRE = c.Boolean(false), + CanWritePackedSubchannelInTAO = c.Boolean(false), + CanWriteRWSubchannelInSAO = c.Boolean(false), + CanWriteRWSubchannelInTAO = c.Boolean(false), + CanWriteRaw = c.Boolean(false), + CanWriteRawMultiSession = c.Boolean(false), + CanWriteRawSubchannelInTAO = c.Boolean(false), + ChangerIsSideChangeCapable = c.Boolean(false), + ChangerSlots = c.Byte(false), + ChangerSupportsDiscPresent = c.Boolean(false), + CPRMVersion = c.Byte(), + CSSVersion = c.Byte(), + DBML = c.Boolean(false), + DVDMultiRead = c.Boolean(false), + EmbeddedChanger = c.Boolean(false), + ErrorRecoveryPage = c.Boolean(false), + FirmwareDate = c.DateTime(precision: 0), + LoadingMechanismType = c.Byte(), + Locked = c.Boolean(false), + MultiRead = c.Boolean(false), + PreventJumper = c.Boolean(false), + SupportsAACS = c.Boolean(false), + SupportsBusEncryption = c.Boolean(false), + SupportsC2 = c.Boolean(false), + SupportsCPRM = c.Boolean(false), + SupportsCSS = c.Boolean(false), + SupportsDAP = c.Boolean(false), + SupportsDeviceBusyEvent = c.Boolean(false), + SupportsHybridDiscs = c.Boolean(false), + SupportsModePage1Ch = c.Boolean(false), + SupportsOSSC = c.Boolean(false), + SupportsPWP = c.Boolean(false), + SupportsSWPP = c.Boolean(false), + SupportsSecurDisc = c.Boolean(false), + SupportsSeparateVolume = c.Boolean(false), + SupportsVCPS = c.Boolean(false), + SupportsWriteInhibitDCB = c.Boolean(false), + SupportsWriteProtectPAC = c.Boolean(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.ModePage_2A", + c => new + { + Id = c.Int(false, true), + PS = c.Boolean(false), + MultiSession = c.Boolean(false), + Mode2Form2 = c.Boolean(false), + Mode2Form1 = c.Boolean(false), + AudioPlay = c.Boolean(false), + ISRC = c.Boolean(false), + UPC = c.Boolean(false), + C2Pointer = c.Boolean(false), + DeinterlaveSubchannel = c.Boolean(false), + Subchannel = c.Boolean(false), + AccurateCDDA = c.Boolean(false), + CDDACommand = c.Boolean(false), + LoadingMechanism = c.Byte(false), + Eject = c.Boolean(false), + PreventJumper = c.Boolean(false), + LockState = c.Boolean(false), + Lock = c.Boolean(false), + SeparateChannelMute = c.Boolean(false), + SeparateChannelVolume = c.Boolean(false), + Method2 = c.Boolean(false), + ReadCDRW = c.Boolean(false), + ReadCDR = c.Boolean(false), + WriteCDRW = c.Boolean(false), + WriteCDR = c.Boolean(false), + DigitalPort2 = c.Boolean(false), + DigitalPort1 = c.Boolean(false), + Composite = c.Boolean(false), + SSS = c.Boolean(false), + SDP = c.Boolean(false), + Length = c.Byte(false), + LSBF = c.Boolean(false), + RCK = c.Boolean(false), + BCK = c.Boolean(false), + TestWrite = c.Boolean(false), + ReadBarcode = c.Boolean(false), + ReadDVDRAM = c.Boolean(false), + ReadDVDR = c.Boolean(false), + ReadDVDROM = c.Boolean(false), + WriteDVDRAM = c.Boolean(false), + WriteDVDR = c.Boolean(false), + LeadInPW = c.Boolean(false), + SCC = c.Boolean(false), + BUF = c.Boolean(false), + RotationControlSelected = c.Byte(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Sscs", c => new {Id = c.Int(false, true), BlockSizeGranularity = c.Byte()}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.SupportedDensities", + c => new + { + Id = c.Int(false, true), + PrimaryCode = c.Byte(false), + SecondaryCode = c.Byte(false), + Writable = c.Boolean(false), + Duplicate = c.Boolean(false), + DefaultDensity = c.Boolean(false), + Organization = c.String(unicode: false), + Name = c.String(unicode: false), + Description = c.String(unicode: false), + Ssc_Id = c.Int(), + TestedSequentialMedia_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Sscs", t => t.Ssc_Id) + .ForeignKey("dbo.TestedSequentialMedias", t => t.TestedSequentialMedia_Id) + .Index(t => t.Ssc_Id).Index(t => t.TestedSequentialMedia_Id); + + CreateTable("dbo.SscSupportedMedias", + c => new + { + Id = c.Int(false, true), + MediumType = c.Byte(false), + Organization = c.String(unicode: false), + Name = c.String(unicode: false), + Description = c.String(unicode: false), + Ssc_Id = c.Int(), + TestedSequentialMedia_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Sscs", t => t.Ssc_Id) + .ForeignKey("dbo.TestedSequentialMedias", t => t.TestedSequentialMedia_Id) + .Index(t => t.Ssc_Id).Index(t => t.TestedSequentialMedia_Id); + + CreateTable("dbo.DensityCodes", c => new {Code = c.Int(false, true), SscSupportedMedia_Id = c.Int()}) + .PrimaryKey(t => t.Code).ForeignKey("dbo.SscSupportedMedias", t => t.SscSupportedMedia_Id) + .Index(t => t.SscSupportedMedia_Id); + + CreateTable("dbo.TestedSequentialMedias", + c => new + { + Id = c.Int(false, true), + CanReadMediaSerial = c.Boolean(), + Density = c.Byte(), + Manufacturer = c.String(unicode: false), + MediaIsRecognized = c.Boolean(false), + MediumType = c.Byte(), + MediumTypeName = c.String(unicode: false), + Model = c.String(unicode: false), + ModeSense6Data = c.Binary(), + ModeSense10Data = c.Binary(), + Ssc_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Sscs", t => t.Ssc_Id).Index(t => t.Ssc_Id); + + CreateTable("dbo.Usbs", + c => new + { + Id = c.Int(false, true), + Manufacturer = c.String(unicode: false), + Product = c.String(unicode: false), + RemovableMedia = c.Boolean(false), + Descriptors = c.Binary() + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.UploadedReports", + c => new + { + Id = c.Int(false, true), + UploadedWhen = c.DateTime(false, 0), + CompactFlash = c.Boolean(false), + Manufacturer = c.String(unicode: false), + Model = c.String(unicode: false), + Revision = c.String(unicode: false), + Type = c.Int(false), + ATA_Id = c.Int(), + ATAPI_Id = c.Int(), + FireWire_Id = c.Int(), + MultiMediaCard_Id = c.Int(), + PCMCIA_Id = c.Int(), + SCSI_Id = c.Int(), + SecureDigital_Id = c.Int(), + USB_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Atas", t => t.ATA_Id) + .ForeignKey("dbo.Atas", t => t.ATAPI_Id).ForeignKey("dbo.FireWires", t => t.FireWire_Id) + .ForeignKey("dbo.MmcSds", t => t.MultiMediaCard_Id) + .ForeignKey("dbo.Pcmcias", t => t.PCMCIA_Id).ForeignKey("dbo.Scsis", t => t.SCSI_Id) + .ForeignKey("dbo.MmcSds", t => t.SecureDigital_Id).ForeignKey("dbo.Usbs", t => t.USB_Id) + .Index(t => t.ATA_Id).Index(t => t.ATAPI_Id).Index(t => t.FireWire_Id) + .Index(t => t.MultiMediaCard_Id).Index(t => t.PCMCIA_Id).Index(t => t.SCSI_Id) + .Index(t => t.SecureDigital_Id).Index(t => t.USB_Id); + } + + public override void Down() + { + DropForeignKey("dbo.UploadedReports", "USB_Id", "dbo.Usbs"); + DropForeignKey("dbo.UploadedReports", "SecureDigital_Id", "dbo.MmcSds"); + DropForeignKey("dbo.UploadedReports", "SCSI_Id", "dbo.Scsis"); + DropForeignKey("dbo.UploadedReports", "PCMCIA_Id", "dbo.Pcmcias"); + DropForeignKey("dbo.UploadedReports", "MultiMediaCard_Id", "dbo.MmcSds"); + DropForeignKey("dbo.UploadedReports", "FireWire_Id", "dbo.FireWires"); + DropForeignKey("dbo.UploadedReports", "ATAPI_Id", "dbo.Atas"); + DropForeignKey("dbo.UploadedReports", "ATA_Id", "dbo.Atas"); + DropForeignKey("dbo.Devices", "USB_Id", "dbo.Usbs"); + DropForeignKey("dbo.Devices", "SecureDigital_Id", "dbo.MmcSds"); + DropForeignKey("dbo.Devices", "SCSI_Id", "dbo.Scsis"); + DropForeignKey("dbo.Scsis", "SequentialDevice_Id", "dbo.Sscs"); + DropForeignKey("dbo.TestedSequentialMedias", "Ssc_Id", "dbo.Sscs"); + DropForeignKey("dbo.SscSupportedMedias", "TestedSequentialMedia_Id", "dbo.TestedSequentialMedias"); + DropForeignKey("dbo.SupportedDensities", "TestedSequentialMedia_Id", "dbo.TestedSequentialMedias"); + DropForeignKey("dbo.SscSupportedMedias", "Ssc_Id", "dbo.Sscs"); + DropForeignKey("dbo.DensityCodes", "SscSupportedMedia_Id", "dbo.SscSupportedMedias"); + DropForeignKey("dbo.SupportedDensities", "Ssc_Id", "dbo.Sscs"); + DropForeignKey("dbo.TestedMedias", "Scsi_Id", "dbo.Scsis"); + DropForeignKey("dbo.Scsis", "ReadCapabilities_Id", "dbo.TestedMedias"); + DropForeignKey("dbo.Scsis", "MultiMediaDevice_Id", "dbo.Mmcs"); + DropForeignKey("dbo.TestedMedias", "Mmc_Id", "dbo.Mmcs"); + DropForeignKey("dbo.Mmcs", "ModeSense2A_Id", "dbo.ModePage_2A"); + DropForeignKey("dbo.Mmcs", "Features_Id", "dbo.MmcFeatures"); + DropForeignKey("dbo.Scsis", "ModeSense_Id", "dbo.ScsiModes"); + DropForeignKey("dbo.ScsiPages", "ScsiMode_Id", "dbo.ScsiModes"); + DropForeignKey("dbo.BlockDescriptors", "ScsiMode_Id", "dbo.ScsiModes"); + DropForeignKey("dbo.ScsiPages", "Scsi_Id", "dbo.Scsis"); + DropForeignKey("dbo.Devices", "PCMCIA_Id", "dbo.Pcmcias"); + DropForeignKey("dbo.Devices", "MultiMediaCard_Id", "dbo.MmcSds"); + DropForeignKey("dbo.Devices", "FireWire_Id", "dbo.FireWires"); + DropForeignKey("dbo.Devices", "ATAPI_Id", "dbo.Atas"); + DropForeignKey("dbo.Devices", "ATA_Id", "dbo.Atas"); + DropForeignKey("dbo.TestedMedias", "Ata_Id", "dbo.Atas"); + DropForeignKey("dbo.Atas", "ReadCapabilities_Id", "dbo.TestedMedias"); + DropForeignKey("dbo.TestedMedias", "CurrentCHS_Id", "dbo.Chs"); + DropForeignKey("dbo.TestedMedias", "CHS_Id", "dbo.Chs"); + DropIndex("dbo.UploadedReports", new[] {"USB_Id"}); + DropIndex("dbo.UploadedReports", new[] {"SecureDigital_Id"}); + DropIndex("dbo.UploadedReports", new[] {"SCSI_Id"}); + DropIndex("dbo.UploadedReports", new[] {"PCMCIA_Id"}); + DropIndex("dbo.UploadedReports", new[] {"MultiMediaCard_Id"}); + DropIndex("dbo.UploadedReports", new[] {"FireWire_Id"}); + DropIndex("dbo.UploadedReports", new[] {"ATAPI_Id"}); + DropIndex("dbo.UploadedReports", new[] {"ATA_Id"}); + DropIndex("dbo.TestedSequentialMedias", new[] {"Ssc_Id"}); + DropIndex("dbo.DensityCodes", new[] {"SscSupportedMedia_Id"}); + DropIndex("dbo.SscSupportedMedias", new[] {"TestedSequentialMedia_Id"}); + DropIndex("dbo.SscSupportedMedias", new[] {"Ssc_Id"}); + DropIndex("dbo.SupportedDensities", new[] {"TestedSequentialMedia_Id"}); + DropIndex("dbo.SupportedDensities", new[] {"Ssc_Id"}); + DropIndex("dbo.Mmcs", new[] {"ModeSense2A_Id"}); + DropIndex("dbo.Mmcs", new[] {"Features_Id"}); + DropIndex("dbo.BlockDescriptors", new[] {"ScsiMode_Id"}); + DropIndex("dbo.ScsiPages", new[] {"ScsiMode_Id"}); + DropIndex("dbo.ScsiPages", new[] {"Scsi_Id"}); + DropIndex("dbo.Scsis", new[] {"SequentialDevice_Id"}); + DropIndex("dbo.Scsis", new[] {"ReadCapabilities_Id"}); + DropIndex("dbo.Scsis", new[] {"MultiMediaDevice_Id"}); + DropIndex("dbo.Scsis", new[] {"ModeSense_Id"}); + DropIndex("dbo.TestedMedias", new[] {"Scsi_Id"}); + DropIndex("dbo.TestedMedias", new[] {"Mmc_Id"}); + DropIndex("dbo.TestedMedias", new[] {"Ata_Id"}); + DropIndex("dbo.TestedMedias", new[] {"CurrentCHS_Id"}); + DropIndex("dbo.TestedMedias", new[] {"CHS_Id"}); + DropIndex("dbo.Atas", new[] {"ReadCapabilities_Id"}); + DropIndex("dbo.Devices", new[] {"USB_Id"}); + DropIndex("dbo.Devices", new[] {"SecureDigital_Id"}); + DropIndex("dbo.Devices", new[] {"SCSI_Id"}); + DropIndex("dbo.Devices", new[] {"PCMCIA_Id"}); + DropIndex("dbo.Devices", new[] {"MultiMediaCard_Id"}); + DropIndex("dbo.Devices", new[] {"FireWire_Id"}); + DropIndex("dbo.Devices", new[] {"ATAPI_Id"}); + DropIndex("dbo.Devices", new[] {"ATA_Id"}); + DropTable("dbo.UploadedReports"); + DropTable("dbo.Usbs"); + DropTable("dbo.TestedSequentialMedias"); + DropTable("dbo.DensityCodes"); + DropTable("dbo.SscSupportedMedias"); + DropTable("dbo.SupportedDensities"); + DropTable("dbo.Sscs"); + DropTable("dbo.ModePage_2A"); + DropTable("dbo.MmcFeatures"); + DropTable("dbo.Mmcs"); + DropTable("dbo.BlockDescriptors"); + DropTable("dbo.ScsiModes"); + DropTable("dbo.ScsiPages"); + DropTable("dbo.Scsis"); + DropTable("dbo.Pcmcias"); + DropTable("dbo.MmcSds"); + DropTable("dbo.FireWires"); + DropTable("dbo.Chs"); + DropTable("dbo.TestedMedias"); + DropTable("dbo.Atas"); + DropTable("dbo.Devices"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.resx b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.resx new file mode 100644 index 00000000..d6aece3f --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.Designer.cs b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.Designer.cs new file mode 100644 index 00000000..0005e624 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddStatistics : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddStatistics)); + + string IMigrationMetadata.Id + { + get { return "201812220029427_AddStatistics"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.cs b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.cs new file mode 100644 index 00000000..05a482fe --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.cs @@ -0,0 +1,75 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddStatistics : DbMigration + { + public override void Up() + { + CreateTable("dbo.Commands", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.DeviceStats", + c => new + { + Id = c.Int(false, true), + Manufacturer = c.String(unicode: false), + Model = c.String(unicode: false), + Revision = c.String(unicode: false), + Bus = c.String(unicode: false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Filesystems", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.Filters", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.MediaFormats", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.Media", + c => new + { + Id = c.Int(false, true), + Type = c.String(unicode: false), + Real = c.Boolean(false), + Count = c.Long(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.OperatingSystems", + c => new + { + Id = c.Int(false, true), + Name = c.String(unicode: false), + Version = c.String(unicode: false), + Count = c.Long(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Partitions", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.Versions", + c => new {Id = c.Int(false, true), Value = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + } + + public override void Down() + { + DropTable("dbo.Versions"); + DropTable("dbo.Partitions"); + DropTable("dbo.OperatingSystems"); + DropTable("dbo.Media"); + DropTable("dbo.MediaFormats"); + DropTable("dbo.Filters"); + DropTable("dbo.Filesystems"); + DropTable("dbo.DeviceStats"); + DropTable("dbo.Commands"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.resx b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.resx new file mode 100644 index 00000000..94fe9d0f --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.Designer.cs b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.Designer.cs new file mode 100644 index 00000000..903de801 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class LinkDeviceStatsToReport : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(LinkDeviceStatsToReport)); + + string IMigrationMetadata.Id + { + get { return "201812221606592_LinkDeviceStatsToReport"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.cs b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.cs new file mode 100644 index 00000000..256d53bb --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.cs @@ -0,0 +1,21 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class LinkDeviceStatsToReport : DbMigration + { + public override void Up() + { + AddColumn("dbo.DeviceStats", "Report_Id", c => c.Int()); + CreateIndex("dbo.DeviceStats", "Report_Id"); + AddForeignKey("dbo.DeviceStats", "Report_Id", "dbo.Devices", "Id"); + } + + public override void Down() + { + DropForeignKey("dbo.DeviceStats", "Report_Id", "dbo.Devices"); + DropIndex("dbo.DeviceStats", new[] {"Report_Id"}); + DropColumn("dbo.DeviceStats", "Report_Id"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.resx b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.resx new file mode 100644 index 00000000..18422e8e --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.Designer.cs b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.Designer.cs new file mode 100644 index 00000000..7d34e147 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class FixUnsignedFields : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(FixUnsignedFields)); + + string IMigrationMetadata.Id + { + get { return "201812231612080_FixUnsignedFields"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.cs b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.cs new file mode 100644 index 00000000..1133b9de --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.cs @@ -0,0 +1,81 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class FixUnsignedFields : DbMigration + { + public override void Up() + { + AddColumn("dbo.TestedMedias", "BlocksSql", c => c.Long()); + AddColumn("dbo.TestedMedias", "BlockSizeSql", c => c.Int()); + AddColumn("dbo.TestedMedias", "LongBlockSizeSql", c => c.Int()); + AddColumn("dbo.TestedMedias", "LBASectorsSql", c => c.Int()); + AddColumn("dbo.TestedMedias", "LBA48SectorsSql", c => c.Long()); + AddColumn("dbo.TestedMedias", "LogicalAlignmentSql", c => c.Short()); + AddColumn("dbo.TestedMedias", "NominalRotationRateSql", c => c.Short()); + AddColumn("dbo.TestedMedias", "PhysicalBlockSizeSql", c => c.Int()); + AddColumn("dbo.TestedMedias", "UnformattedBPTSql", c => c.Short()); + AddColumn("dbo.TestedMedias", "UnformattedBPSSql", c => c.Short()); + AddColumn("dbo.Chs", "CylindersSql", c => c.Short(false)); + AddColumn("dbo.Chs", "HeadsSql", c => c.Short(false)); + AddColumn("dbo.Chs", "SectorsSql", c => c.Short(false)); + AddColumn("dbo.FireWires", "VendorIDSql", c => c.Int(false)); + AddColumn("dbo.FireWires", "ProductIDSql", c => c.Int(false)); + AddColumn("dbo.Pcmcias", "ManufacturerCodeSql", c => c.Short()); + AddColumn("dbo.Pcmcias", "CardCodeSql", c => c.Short()); + AddColumn("dbo.BlockDescriptors", "BlocksSql", c => c.Long()); + AddColumn("dbo.BlockDescriptors", "BlockLengthSql", c => c.Int()); + AddColumn("dbo.MmcFeatures", "BlocksPerReadableUnitSql", c => c.Short()); + AddColumn("dbo.MmcFeatures", "LogicalBlockSizeSql", c => c.Int()); + AddColumn("dbo.MmcFeatures", "PhysicalInterfaceStandardNumberSql", c => c.Int()); + AddColumn("dbo.MmcFeatures", "VolumeLevelsSql", c => c.Short()); + AddColumn("dbo.Sscs", "MaxBlockLengthSql", c => c.Int()); + AddColumn("dbo.Sscs", "MinBlockLengthSql", c => c.Int()); + AddColumn("dbo.SupportedDensities", "BitsPerMmSql", c => c.Int(false)); + AddColumn("dbo.SupportedDensities", "WidthSql", c => c.Short(false)); + AddColumn("dbo.SupportedDensities", "TracksSql", c => c.Short(false)); + AddColumn("dbo.SupportedDensities", "CapacitySql", c => c.Int(false)); + AddColumn("dbo.SscSupportedMedias", "WidthSql", c => c.Short(false)); + AddColumn("dbo.SscSupportedMedias", "LengthSql", c => c.Short(false)); + AddColumn("dbo.Usbs", "VendorIDSql", c => c.Short(false)); + AddColumn("dbo.Usbs", "ProductIDSql", c => c.Short(false)); + } + + public override void Down() + { + DropColumn("dbo.Usbs", "ProductIDSql"); + DropColumn("dbo.Usbs", "VendorIDSql"); + DropColumn("dbo.SscSupportedMedias", "LengthSql"); + DropColumn("dbo.SscSupportedMedias", "WidthSql"); + DropColumn("dbo.SupportedDensities", "CapacitySql"); + DropColumn("dbo.SupportedDensities", "TracksSql"); + DropColumn("dbo.SupportedDensities", "WidthSql"); + DropColumn("dbo.SupportedDensities", "BitsPerMmSql"); + DropColumn("dbo.Sscs", "MinBlockLengthSql"); + DropColumn("dbo.Sscs", "MaxBlockLengthSql"); + DropColumn("dbo.MmcFeatures", "VolumeLevelsSql"); + DropColumn("dbo.MmcFeatures", "PhysicalInterfaceStandardNumberSql"); + DropColumn("dbo.MmcFeatures", "LogicalBlockSizeSql"); + DropColumn("dbo.MmcFeatures", "BlocksPerReadableUnitSql"); + DropColumn("dbo.BlockDescriptors", "BlockLengthSql"); + DropColumn("dbo.BlockDescriptors", "BlocksSql"); + DropColumn("dbo.Pcmcias", "CardCodeSql"); + DropColumn("dbo.Pcmcias", "ManufacturerCodeSql"); + DropColumn("dbo.FireWires", "ProductIDSql"); + DropColumn("dbo.FireWires", "VendorIDSql"); + DropColumn("dbo.Chs", "SectorsSql"); + DropColumn("dbo.Chs", "HeadsSql"); + DropColumn("dbo.Chs", "CylindersSql"); + DropColumn("dbo.TestedMedias", "UnformattedBPSSql"); + DropColumn("dbo.TestedMedias", "UnformattedBPTSql"); + DropColumn("dbo.TestedMedias", "PhysicalBlockSizeSql"); + DropColumn("dbo.TestedMedias", "NominalRotationRateSql"); + DropColumn("dbo.TestedMedias", "LogicalAlignmentSql"); + DropColumn("dbo.TestedMedias", "LBA48SectorsSql"); + DropColumn("dbo.TestedMedias", "LBASectorsSql"); + DropColumn("dbo.TestedMedias", "LongBlockSizeSql"); + DropColumn("dbo.TestedMedias", "BlockSizeSql"); + DropColumn("dbo.TestedMedias", "BlocksSql"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.resx b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.resx new file mode 100644 index 00000000..30fac7b7 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.Designer.cs b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.Designer.cs new file mode 100644 index 00000000..0232012c --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class UseBinaryDataForIdentifyInquiryAndModesInReports : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(UseBinaryDataForIdentifyInquiryAndModesInReports)); + + string IMigrationMetadata.Id + { + get { return "201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs new file mode 100644 index 00000000..7477669a --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs @@ -0,0 +1,74 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class UseBinaryDataForIdentifyInquiryAndModesInReports : DbMigration + { + public override void Up() + { + DropForeignKey("Mmcs", "ModeSense2A_Id", "ModePage_2A"); + DropIndex("dbo.Mmcs", new[] {"ModeSense2A_Id"}); + AddColumn("dbo.Mmcs", "ModeSense2AData", c => c.Binary()); + DropColumn("dbo.Mmcs", "ModeSense2A_Id"); + DropTable("dbo.ModePage_2A"); + } + + public override void Down() + { + CreateTable("dbo.ModePage_2A", + c => new + { + Id = c.Int(false, true), + PS = c.Boolean(false), + MultiSession = c.Boolean(false), + Mode2Form2 = c.Boolean(false), + Mode2Form1 = c.Boolean(false), + AudioPlay = c.Boolean(false), + ISRC = c.Boolean(false), + UPC = c.Boolean(false), + C2Pointer = c.Boolean(false), + DeinterlaveSubchannel = c.Boolean(false), + Subchannel = c.Boolean(false), + AccurateCDDA = c.Boolean(false), + CDDACommand = c.Boolean(false), + LoadingMechanism = c.Byte(false), + Eject = c.Boolean(false), + PreventJumper = c.Boolean(false), + LockState = c.Boolean(false), + Lock = c.Boolean(false), + SeparateChannelMute = c.Boolean(false), + SeparateChannelVolume = c.Boolean(false), + Method2 = c.Boolean(false), + ReadCDRW = c.Boolean(false), + ReadCDR = c.Boolean(false), + WriteCDRW = c.Boolean(false), + WriteCDR = c.Boolean(false), + DigitalPort2 = c.Boolean(false), + DigitalPort1 = c.Boolean(false), + Composite = c.Boolean(false), + SSS = c.Boolean(false), + SDP = c.Boolean(false), + Length = c.Byte(false), + LSBF = c.Boolean(false), + RCK = c.Boolean(false), + BCK = c.Boolean(false), + TestWrite = c.Boolean(false), + ReadBarcode = c.Boolean(false), + ReadDVDRAM = c.Boolean(false), + ReadDVDR = c.Boolean(false), + ReadDVDROM = c.Boolean(false), + WriteDVDRAM = c.Boolean(false), + WriteDVDR = c.Boolean(false), + LeadInPW = c.Boolean(false), + SCC = c.Boolean(false), + BUF = c.Boolean(false), + RotationControlSelected = c.Byte(false) + }).PrimaryKey(t => t.Id); + + AddColumn("dbo.Mmcs", "ModeSense2A_Id", c => c.Int()); + DropColumn("dbo.Mmcs", "ModeSense2AData"); + CreateIndex("dbo.Mmcs", "ModeSense2A_Id"); + AddForeignKey("dbo.Mmcs", "ModeSense2A_Id", "dbo.ModePage_2A", "Id"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.resx b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.resx new file mode 100644 index 00000000..9952f177 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs new file mode 100644 index 00000000..d65fe029 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class StoreUsbIdsInDatabase : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(StoreUsbIdsInDatabase)); + + string IMigrationMetadata.Id + { + get { return "201812240552109_StoreUsbIdsInDatabase"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs new file mode 100644 index 00000000..79303481 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs @@ -0,0 +1,39 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class StoreUsbIdsInDatabase : DbMigration + { + public override void Up() + { + CreateTable("dbo.UsbProducts", + c => new + { + Id = c.Int(false, true), + ProductId = c.Int(false), + Product = c.String(unicode: false), + AddedWhen = c.DateTime(false, 0), + ModifiedWhen = c.DateTime(false, 0), + VendorId = c.Int(false) + }).PrimaryKey(t => t.Id).ForeignKey("dbo.UsbVendors", t => t.VendorId, true) + .Index(t => t.VendorId); + + CreateTable("dbo.UsbVendors", + c => new + { + Id = c.Int(false, true), + Vendor = c.String(unicode: false), + AddedWhen = c.DateTime(false, 0), + ModifiedWhen = c.DateTime(false, 0) + }).PrimaryKey(t => t.Id); + } + + public override void Down() + { + DropForeignKey("dbo.UsbProducts", "VendorId", "dbo.UsbVendors"); + DropIndex("dbo.UsbProducts", new[] {"VendorId"}); + DropTable("dbo.UsbVendors"); + DropTable("dbo.UsbProducts"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx new file mode 100644 index 00000000..8bf29e47 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO19W3PcOLLm+0bsf1Do8cSsZHl6Ono67HOiRErtOqOyOEXJ2jcFVYQkHrPIapLltmZjf9k+7E/av7AAeMOVxI1VJbeiw24XAXxIJBKJW2bi//2f//vhP76v06NvoCiTPPt4fHby7vgIZKs8TrKnj8fb6vF//HL8H//+3//bh4t4/f3oS5vvrygfLJmVH4+fq2rz6+lpuXoG66g8WSerIi/zx+pkla9Pozg/ff/u3d9Pz85OAYQ4hlhHRx+W26xK1gD/gD+9PFuBTbWN0kUeg7RsvsOUEKMefY7WoNxEK/Dx2E/K1XwdPQHvGTyehKCAxJ/UxY6PZmkSQZJCkD4eH0VZlldRBQn+9bYEYVXk2VO4gR+i9OZlA2C+xygtQdOQX/vsqm169x616bQv2EKttmWVrzUBz/7aMOmULW7E6uOOiZCNF5Dd1QtqNWblx2MvX8MK4uMjtq5fvbRA+QYZfdIU/8uRKNNfOjl5d4L/+8uRt02rbQE+ZmBbFVH6l6Ng+5Amq3+Al5v8K8g+Zts0JQmGJMM06gP8FBT5BhTVyxI8Ns2Ywxac0uVO2YJdMaJM3cJ5Vv31/fHRZ1h59JCCTh4IboRVXoDfQAaKqAJxEFUVKDKEATBHudqZutDfbW1QAOGgOj5aRN+vQPZUPX88hv88PrpMvoO4/dJQcJslcAzCQlWxBWOVeDkcTUSbfv5J0CYS4sNpLw+DUuKDb8kKmApJXfpNRka6bxbHIL57BllbpQ9hbhIkOIO9KBKENdSR1WUalc8t2HmepyDKtLEWUbZ9hGCwR4rJJRgLzOS1LKE8llidTlwRgu8qgVNRMxLqz2P98Dn6ljxhwWLl5GZ2fLQEKU4rn5MNBX6Pky+LfL3M027ooq/3Yb4t0Ci+ybmkm6h4ApUWDcF8hAqUQURHMB+gBCbq0nKZFOAO/hkip8/DUdQmyYjq0nXpWkA9lixAnEReVMRD1LE5ORrpDDJKmVy69AbewpsPilabg6OvTpDR1aTq0hN64aCI1ekcLeizjBKcpk0HWEHl5ydPSRWlgwTRGXnKyHQpiVQmXVpvw/MhCnEyRxf8KqMGJYloUF45zKpIfdmAVpN5htfkJwtQRXFURScQgV06EPn69cNPJ387+fvfT85+/vtf/7xriDrf40s36ydZVLyoTW2qMrYEUexFm+ghSZMqAaVQ4GCv3fMZe9ETpXNCKMykOySWYJ1/Q+zGmnGIWiYfSyyVLKGVzmM1cm5ACSUAI1mOIALpbSTpjiS4CI8cjCZ2hR5lSLBnMy/kFuhqJf15YFjyxrTkuTczK+i9D/Ikg/wvDcsv5oYF86IAK9j94fZh9QyFo99dWAPdJdWz994MzvfODQv6hvLim7IQ64vsMS/WzRGUCcglHKc3155Z4U++cf9fRS+gQLPHCo94I9KToqxuimj1NYDqJNoYEgL/zA2Zh8pebyuzwljrz32LwiEokshw2AQzwz4PLg17PFgY6qjgn7Y6gkSwUQ7B0rDtyzvbJpAINk1YglVexGhmNu7IcBMVYFaAyFr56CseH2QlqTBeqgM7JsODukRcfsqSf4GYa5/uIR8E3K7J4yqlNneldnK8vZvDwXC72eRFVX668m/CGyzM0R/+F10N2sJ8vvDw+sH3dfVSixBAwQegcIuyCC9NgVLwHa6sbcnpUazYiwDO3tkU1tVwVOGfLQrblG2XNFYEGK6LKAhe8+gUXpSPVuWh6NjWbwdxlWdPVn2AADSLIzUYwgkK/DzN1rTDP3s3TQVhniZxCHfpoL1WNGafv46uHiI7gCWoihc7FLvSLgiAYmSPYElICMBX696AAD/9YtcVVuUhCQ7EyVYaLMqHYAUnVt2DFqEoWMiBZtHzNF99LcPfu+VdY72gUCqE61+6IDoYHC6IWmhe+HzW8Nig5E+/CMuOt/Uqf0pWUTpLk6dsDbKKLo/moBEDlHwNFXi6bE5Hl1D76kIEzy8losGYc7fNTq4C8Xlwo1s9VTocLS29D/A+hcI7AOKU/B7n6c//mSTu7J9N172i8LZFAftUiTIiq4TALscwnX02q2sK77m0vJ6ACG/XEqrXEt5LmmQxYBUIGgCae/5PUNXbowjV2SiOsnT1dhtWItbCvMmZqpzt9DwL/oy3q2ryeuj7WdtDsy8gi/Ni7vPToCZQ03xtJOVRtFivQg0TX+EQwhhv40dZTxN3Lu5ujcMJQK+95QR7/ClAL75XcMiB2AEblIdOsFqvrA0wapC3waM+eMIJBk++3qRJlK12cFOxh8lzN1cwRMM8dE6ouYdDdqnj5ZQHZ7gqE8uhiSDeBqayUVT2+zYpJrKJas+P+gNu2xUahyi4KrKB3D5soMzwZ226t6+v7kRfepJx8SXwg5ongoMMNNjuiSz9AQadwh1cMMnalvgtA+RUEVkYqroUMVV9srl/QHsPIiWOy8nSyGSQkMrm0jelVbD8xVUNmf4KM4gp3onxb1OT1PpXlC4jd9z+d4jaEPy+RYo4Ssckgs/J0MtmEBPM5bI6CkSQaIA6mJIRzNu0rDotbzDTScMdzRmorGcyHeOfb1G6BTvbhiGZQJrWgWghmDfRUj4HNLIMuyuSCsBvFbaZtl5zbQABolD9+fbxERQgriVGo1waZV+hQKy+XmSIPmvK/eA6yuLLW95Mytj7E9+++aBcFcmmvuiVzBGo8fd8bnqeEGYSzhXinCYrseH1Ia6HyCagt0uVE9pnsZrRmPZaah8G7U0JqSohoT2u5lC0MDGoJ7Dh226ds3j7k/g30VGev9rt2fvZ1HvfSxAhFotVG+y0+z5Dr9TI75w6oxJ1VS3lPyihiMpDE0XaCojoItOtdCwE6xljOzBapLcBohx1ZOaFDUN0lkqz3+Z+qbW2SjIUS+ozivBU62L9Fd0tsnwottllAcA8E1mN604KAthwdj0F7I09rBdls22c5OEq4l1h9LEu/guseK8yA5wiKkFtB+IC7fsGLpnP/eVF5wHkAPUSm445A0LkIf+ofFthKp0Be/CjM7DLJe/kYYr1T6eULZcLB1it0iNViwPYqzyy3vhBmMW2gqMCSgek0Ktd6qxvCiDs9TdQ/IG211BPYbdUl5g37jCDNHrxfKyvXKCVYBvnHZ1w/DkAxd7waepvo9Q13J0jvHPrKa4DctVEpPvOHGLxDljGWNcutArGSreiYAdmYJ6rPvT8hTPB8oLl4n7xDz4MgRmc7ztrpYNlXY8UpNvSHdMaQFcjqYXzrxwDum7vnTsKi+QbQFsOtJxIHpNVVLmYsuswEe4kB2O56uYabOZKN9WhJDz/Bnx3sSBDkNepw/mhBrtwiuZMsStFFTCBRkYhWLgl4TJMMYdCcOhjokMbfDeD9LWLDu8BnYy9Ds7JNpwGdLMBv908FVEMLpNi/Yebjd9dvaB1h+SiX1soJyu9DszFUq8G25YX2ap42SBnMPowyRLZ1RqrAXOL5c2+uINzM8AaMDeDqwYLw0WURU/A0UrQqb7rwZx1rNNVKonorr0u16kUovMmu1mptpAuOeiWe+4452ypS6A5WetiPGcrUwLNxdK0NnCJVl/JiICu1hgYnAzF5Wo1JAB2SbEglIo5FDZWDUFZulmht7Cu2w6xnkAxL8MkBvUPbK+a2q8Ma+QwzSvmpswQqDFcR/eiQQFKkNnvHoPlwuDqEE7wBqX884W1AoW6CYsV2gnaYl2sHwB6sKFhrzVcUaBwWKv8GyheAtIW0xCw3aH4xAlL/6DEcFl0A5JkTwuAhkpSapv/XeVIMdq2wFlXQXH/BsX9P7frjX1HteNIGLrXEKvfzjhQdi2oIHajKVJgf13XYYXOuObP+DjGplDY+h12w8vFNweKsYsh+PJQJDiCrvX+lPQ7QurhzLN+2aWFvA5DPkCmIVZw56xPwrvAHRZ6VAH1gzvA+mL3S55u19a6ukX94gXORkdz6vWcPCSVKNy0DWxQW3aLovsaWWUGdWBKVO42S7RjGzWxkYzjErWBjeYoRPljtAJhFWVxVMSft3CSL3Thapm4gnNOKoiLYmQjF5a2RqMQ4c0mTtUmrpOk34oItjEqtIMBf1c2HBaUTjKd0nJvsnrIgrg2n5b665Wre1FWwvBemIM3vhdn03aCayHw1QcWz3G6ybwSwvssw5QT+Vyb3KJ6JCa3TJKQRGcmt0wvvdjqFgbuTdGoKpqgSNZR8eJxfkq6szPcOKIZyx4Jze8uji/87SZ1crvvg8cISgfrAmKIdl08wR3tv6h738miZaC/J6+k9SfaRYPOkwqt1RZr65BXd0nMTm0GweewraJ9DLs2EPZU4beg7qZnF/u1HI33pnBt3Vnf1MgO1YibwS9aHqvASFdvzRSDplDpipMed/d0EWo1N5BTtLgbym611iOQLNUOgXQ4Cqdul67KIZdJrpWO5gN/fQgOd0/9MZiH01uHPj1Yv3v19nLQn/floB8ojJfi0ZFQ24wcJqmWkQQvVyg41YHTCAHiIyjlQrrtHTmmUp6FbssHyzkHIrzNMG9xtRHDnMTVpsLVuFai4qDdBtuPQBy0213o+/pOGr2TpD4+4ZrlGyhO8HxXnvQI7Pis8/VD890J/u9tWO5mEbaT5cgS9n65k1PBbem+joGIjmj+E07Qvbzft7n6iZhL5CZcPofVxHqZpKB8gXP42nT89ghv4/cQzsi8fNvbBjXho9zoetjTFdAIL8bJSQW4cGJvMvJjyQheW7VxTMwEhYB4k5Y/gbRYycmbhIzdPhKHXhOu4hw4/k4mZdcbxDvY8tBqocPAvEneIegmxkfjFerAICrgF9wGM7nsAN4k8hAkcjpJud2keRSDuN02mokLjfImMyPd2bLr7hl0Wqb3UNKe49abaFVdplFp7RjxdhhkXhG1KOoPZerPxqYZs5uZ8MSHHnH3OFt/5MOncmc+giy610ewTDBXpA5lHKIvmCtQCDPp0tg/ozpOZp9XSmmbZYzYLp/50zjoxTAVqtkSUtrpjGMtYHLrtiPwFt5cSXTbnFK66wxj9Da5tK9AvVBJhOt8UhpR8hiFOI/+wzgrqIz95Cmp0HZIgVC6gJxiMt8o6VRm3TbchucqlONsUnph6hiVKIvtjXB3cWi4EOoQ3hZBiteIo1Uexk3vLHa1YIOikjwmjsCaW11dJkrHao0nHq7lQ5163/CcMvfgU7ux2A1XPks7ok2Ha0uu8WitAd4Gq5KY/WkGmXxZ00m+iwHCzWfyMWQ0QLqDLLPh0RR/Gxxjg4N8EO41nAHVBqiUtU29TZ2Xl2n0VHZwJtZxCL4kNr8TWcgd4Ucm0hfIbLKfaRYuAHJjb6eL7GuW/wFHA+6vj8fvOI5T2fGWusl6NpoV7W+bzLyjMpW53kk0ef86kpdezDeF+LebqEKLhddl/dtw1s9fFqDLK3DRrwWF/Dgry3yVYGGgjPlrG03vU8j0wEUWH5FWnV2+Xvn1JyaUhzDegCJXSijCH4//jWuIHLlbd/TI3nPJIr47OTljW0y0TqPR26KAikK57V32qVjQV7ADTsyqiH/zVkamKLOIC7NKq/VCWEHbB5jrgAf0M7rDtEqe1B3kAE/iKLAeD/7NmAHNG7pIZcrI67OImtu+5ave5wSeoJVK7DNqIFT04ySRp5luGkkcfU7fzO4gdIQu/jTUQWO5o1MCtD+hdd9o5hx1hErZYaoDBkhOXgnoxXoVxlPwoDmLHSGQPZB10Gbm9JaADFbrlWN1jR8Av/gS+PVDqzLS6Gyi5qIcmlqaARU0uH9L3JV2lr+JO0TlyAO5NMH1e8PanBh+Wpeog3uO1jlv+od3RwkWvMLrjhv8+72Ty8Z95183PBa6bKpjYWjgM4iSxqpxUqO91GukMtrET5NS+lenqcLHTGm4/h1Qx20ll3tD9AkjMA22eESgZS+lTr0UreWqm0KbGWlYCpnc7sSbBRZ3vvvJTXlDJsztrP373JM1BKhtykSZXU74+9qXSSLcSWkdCXdHMKLU1QcjMfJIbC5Gm0N2DIUxGSBdKaYJxR427pEus1TColArbyLYySTiQ3h5K/WxyMHbmQAJfMB12G/OEmXH/+GTOp0oAKyO4OKmaLFRO5jATkameoQBw3YNS+MOGLs3iWVDbw6Nr5FVoNmgVVoFjvDecj3Yo6usB9ncztZDHLBYEqY42cG3TiOHMLQRm4NTHcriTXsZZdBI6rpsjDixAZyLZgut5XZxfodM6EaIo+zoHDSWNLoj8HBwFecNJD3ch+kSuruzza1DTOg2WeQnP8pJq8YLjL1lJA5ZfhO9w3h9qLNgwGx8wnsJoT25Ooni6xiXTNjN9YzMXl2RzqHrGmfM2Pn1zbA5vCLV49c5zhi0j+sdscm9IsHy6x5nPNnp9Y/Isl+RTtkKyRkjdrZiGvQaUCV2bAXlji27X1EJnBMUiZWssJwxY0crLoE1q5TAAdNWisDWjJgm84wGhtDXmQ9SUIGj2QpRhMKTlqtIFO8WEqFBlZhtnQvBWJcswSMo6g2cl2dlVURJVrG0B0WSrZJNlI4yhyl5pGb7ilrd1cGm+GAD64IkjvJApfLeuYAnoauJ6ZAxHkklsDZWhWUqWKKzUPSTVW1vjBLAd5Fjzm0JGrPUsrGkZSUCAYeg6h1mYfG4PD7q7WNb47g6STAWaYh6jS9CaFf/IwBwZSgqjReMI0WJ4xQRBHWPMAKFbQF5JqCvIyXblZyofL/KGwHBSluE0GjzkeL10kBUvl00jACgSVVUvJ5sFQrX9gJigPqaXgFkUYdQF4IsRDG+WRDOqoPH4swnxntG0i8qRfvLbBFCnzrGnFJIBD4gGysqCMTLA3Gn2eME0Ye0EvLYk9xRZUKG0hdoFOJmR0k3MGepci3BHbqOwMPZRASGVx5KGhMdnci1Zn0cM6p52tCAYt3Thx4cB6qAcLS0MenGJL2PKSYUdTJqmQqUFGS0OBNFSATExSsaU65tABihfu3Dy4zA1EtWodAwy+Fx0eudqkQS2C3ixoHqZY0Ep12ijsA0jisikM7rioEg1j3C2Rx7TxwRufgZnXewEFxB8S4WHfHs6oFb1o07VRBYooXCKd1KXQ70rhRjjJA4XcjbwLtdWLOFd7Rwzh2he4WAN+NuGFQzBh0xiEbU69QBfgy6Xigy2JgttHGPlCsDNkCCtoiNgPR5Irb4mY4lhA+GgBMyDw3RlQ55aUDQ2216Bpou8MoY4ZxVS5HX3VBb2VsCCa3E/YBxe4kbgMla3O+spI0W3wmIaOZuA8yazp33EzDELtEVC9hoN1JGDN0DiNohuQEwY4rkjJ8Aa/e+rvjSRtGR8kN05i8inTntN2s/c55PgHSbduuGM14cgpYP+XlQVEs8PQiym6OCgZZLHDsYjIZWJ40Xu3RI+KDg/8E1Z9gDhGlZc4wxwqFhhw8Ckm+XO571rh5DzJI4hIibxLuEmLOH9wCZUIgI3w/ZCJJ4h/DSz/uH6I8g3iNEhZEGjaccQQRNlzuKUEQLXUVoPT/caqFzCA0gPTEzazV1QixuuNRekCNdZDGo23yRgeB062Sxg4hU+Ac9SQTyK/MlMRgKMu+REf6a8kRlm6ngXcI3RGWjqciTPWw1hY4kctaobjYHXU5MGLPr/abEt0TEGQUvFLpFw34oJHfKEf0y4nZCQgna4oJJgw/nCpml7KPCtlTFS4VmHnefMcxKFacUasdAttWtxJGPDo6InMx7QC4oAm8BY6ETGP5r9YHxkarK65SyQ1ZdBxfBGamGiwunpPgbrNEjWQ2PlqkHvcZzmdr8V5JlfV+YSXtgDyOAdXqRqAi1da7MM0ZXJSitc8cYb7qC4VxgZEuYYV8ZfuUh9ZbRX8RI/WNGOG1+bFYHY5MemvG2oaLTLsoq1OzAjLL7HGOcRXPpeHLydsvNQYXUCw1BDTkhNPWc8OQUh52WcoKz+xTRTFp8mrWatOkkEGqDC0ctpZ6HlDVY6mEjoFrkY8M1vzH5GGWByKtmnJcGzBC9nMBzY8zlhmrBgNMN0YTOFmKAFwPuNe5vlcSvNKjwYvBebdD/xpofk96zSR+EGGWKwr3bmDeOHWt2dQ838vrEKKOU7+XUPHTsmLbDezrJqxej/Bq9txv21rHjzy7u8YQPbYyyZWRlNuS3Y8eSqVdqw895jPNFceWm5MpjyamdreRED4mMcmp4ZTfg02PHlWlXeqIQ9AJOjLj20PTLnXto+juzyiFmyH1yaLCefGWetPHOOxeSLu3Dabh6Buuo+fDhFGZZgU21hZtsHOq+TVhEm02SPZV9yebLUbiJVpB+73+Ex0ff12lWfjx+rqrNr6enJYYuT9bJqsjL/LE6WeXr0yjOT9+/e/f307Oz03WNcbqi2Mw6vHQ1VXkRPQEmFbmtxABO5GXlR1X0EKELWy9ec9k4hxmafR2X2+oYnxi+61rr1rYA+nfrmyN/O6D1pGHweo5ewkau4WYftxeQdpOykrBsuIrSqBCE+vfydLvO5C5T8tLob7p8/UUdoQnMT0I0n3iMD6dM81l+n3IMZ8Sf7UCl7m13T656V3wypNC5soLT9C3xnAgJQnzW6WXymUW6s8kUdUT6sUUSkU7RQKxfVKSg6k/qGP17iSRM/1UdCYkSjVJ/OZhRgTeNroYEct3THw/CUtMMhvo1k8cXFqP9ejDdQt1Tu+qegZN+hW4aLD1td6HZXtxldYqGBosyZD4xm3kho8DIBH08fx6I8XCCPt6NDO/GCO/cmwnh8HdtNO99kCdZ7TgmACWT9bEXczEo+q6PlhcFWKEbpe3D6jnKMnZqGMrnora7pHr23qvW2ebWrtn3zoV14O/6aL54cODv+miSHvWNehTrt+wRuxRyM7Qsj3Ytl9s0vbn2hOhdmjbqJ18m3U2KNuJV9AI3ORFceiXVixCZyaHPCbTbuimi1degAL9FGzFLuEz6LYF/5uLubJOMMK+37LaESdNGxTPg3BeidmlmqHC6TiKxhqLStdGDmViW8Xd9tEuxFOPv+mgL8dyEv+uj/XNE1dMZrPAHlLsom35dSwmflyZ8Xt6NcIbOYIU/wBlRNv26wCovYmTqKZNFJod2DeEmKsCsANHYZCPOqF2fbLbRnGm6MA4klCS2wxDOBPtyrBpL1C9PWfIvwGwMBMl62PUzfTxo+90EjT8XY9N2ey7R2IiVn678m/AGi3n0h/+FmYvkufRr+nzh4bWq78/ElVAZ9PEDOFoAKIbr4DJZ17MIL5WqwvkMakvBd7h7HmkVm8mqniFBEGTTrwuVPnsnrqBNM0R9P4CqNTtQJX8eQP3ZFHUA1BizXZ0PUUzmsatlvA7jGuIBbC19TpdclI9DwDjZFBuOhyFsnGxB9wh8m8Oshqs8exqSmTbdHH0YW3f2wy6NP/NneWyaAerZuwHYNlGDD3maxMgYD7R2whQfuFQzDvvr6OohkvO4TTdGX4KqeBmros9kKCdD+Ba448RbUw5leJj6NoM5/ngr6Fz6NYUAfJVW0CXaSOhPv4zJKMphLD1D8FbYkLZBwm1H1viwspL9EcE3xQ7Bqo4lIEPvMlhKvYLIm8q7XNh1EHF4hTL8ndmVEZ81sUK4bxXDdSnqiIhJclQ+VQP5fNb0MQ9LJ2lh/vTLACqdqMOFpwR+n6XJU4ZuJQWMEGTQsHzJ10kWpcsmju4STupcFbI86rUEzy8lolLen+Ic6jXcNodPFYjPgxsOXpBsiB0OY4cS7D1do6P4c86suXgsFUsuUalpbsu9lzTJYiAYgHSKOuInqKx5tP6rhvaWqIZhrbAnqeldBVzJjswzQkGA5EWnkSL3J79dVFJK4YlDlQ7h0OEdWNssOk0dtYnv7nOiSSVot1YASKccjLQ3FuiuRL2OW64v55JyE6lK7v5W89I2ZMuHWuWvvSVdHn/QUKds+VCv/MX3Cj1cEHPtoBIORkRbRxtXMtrExtcXUlnBqaSUtcOZ6xng5OtNmkQZe4BFfj+AiQH9EGrKOsGMQuQpwGlgYQadq9oiFuJSCQczampvLFdjBj8IoT9ixMWmGS/z7PdtUoisRckE/SOH/oBafPBAplugy27XqAyG+NuHTR0wUVpBl+O1H+rvcbTJQmWajzj8gorZqBMXnWbkbfBDL2T5jeDplyGEspY/GqT7qI7zLUq3DErz6aAkZSEJZGYuKfiZHDNJERedaHvp1FTnrkgqAL9V2JCaRmTTNDTnBrBgzSeNA+HtI3oDLK5fL6IOhKkUnSPmKPsKO3/19SJDO12GQkGyhtlYcB1l8eUtY6pCfD6Y0aMQv9lsELHvQ+mPpVGEaYaUK5s/5/chVyB7qp7FgETawYgWDiTr8BzE7BRkZ5q4XUq9nw2ss9rEQ+qkgZDUxn0lw1TrM3npafoOual1TyyRMFSCBt5vc5/ZHDSfNIZ8ksWQTZ9RWIFaZzDDXpCuO5/eoluMYptdFgDMM87gUZrJrp5wdj1eD85kV8+NSj03evV4UTbbxkkOE3n7dSJFC/HivwB7nt9/1UMqohLUl0A8Hpmmh/p9A9ct5/7yorPO59FFebRqad+1Y4DFz90pYSFqkE9Evq0wURJsPptBXR4oZLTXSQaYl8tLCSROMUD85wCZ/zSmc7lcSDBxihbibyBDrwoCUr1x4OJMWvVc5VHM4dYftXAW2woOKig2kByvdsPh3XjFmbTquYbz6x9oCwYVI3YN5CoR5DCr4Wa0hhuzGoI0evF8rCU5bCpND7UE2zjvaIOjmQcXZNF2KZqlqb+NUh6dTjTGvRsEvjNAPhd7VZ6bOFSK2Np9N0G7OJPhXZwZIoo95JoUE8RrXq8RKfqI6VYaOaBJ0sb0xH3smfSx5y8kUtik6CMGy8X94h9ib/o+URvX9yXtrhP08dilL/ndBC1It6WMmWSyKbZ4MPaJxrj+1SAySjbGHmSHFTfuRsi+M6O7SL4BtAVEK6PkMVnB6VtcjTCjdn2ffJkcNilmiGJZaZMMMWdi1dgnauPWcQk8/wZFmBNh0xm08a9T6STWJhliXgyAXhijSiafPlEbd7dO2OguFA8MaRgGLodBDcOBHrgcWjWgEE342gPNKrzksMmG2IIhTyea4QrOWQTJptjc2YogWQv7dvNURDga5foP0VadS9dCv6uX/Rxq990EjZeIO7PdRVtMsCQmk8ww+UUxmWSAuS0vslXxskEG6oJzyaF8+rWJl6RkkgmmHNIc0Zt9kYPiRBNc0Rgmk0wwRWOXTDLADMNFlEVPQLiQFmXRr0Osg431b19QIgttmgGqfPnPpRujy1hhtgOgygrW0ly6OfowU+x4ItoG8BmM8OX8NuX1EJ/NeTzAXzPeSrYQVJopqmATwaTqI0uW+VSaKSq/0KcT9XGDaPWVDFkoXlkNZdWvkwwZJV4lyrLZ1iVtmyCbQV1sdAgqwQgPP+YRgpK/GZZmMqpHjUmCfBq1wXJPoJiXYRKD+gd+9TZl19oD+bRrC9O8YteHVIo+YmNki+wPggKUgIuTPpBPo7ZguRBaBFAJOh4uYgMD8ruGidL5gpk76i8aCF98LLZot88gUSkaPjDrB4CCoDf8Z/xg2EQN3KJAsZZW+TdQvAScTasgWR273U363MEenaKOiG4Qk+xpAdAwTUqBZaY4h04NaBpgMetvGtZK4s436nk4vL7B4fWf2/WG7XcmSd/ano8sTafoI/b7Um4wSrLo18HGaiS/G6AF7P06nWKAGEqYihP08fxZIMbDCQZ4OBAQ7IaXi2+cgpdm0q/n08tDkeD4xhJXDiqDPj6yh0M66cx7FuNTGfTxr8PQEwPXKfqIwZ2kJ3GCPl54F0gA6xQDRPQEFOoRCWyfbIJd22h8QcBsmCpJHv1avniBZPjVKfqIzanrc/KQVFzscmkmw3qC2geAi4EszaRrMh3UASPRkvM2S/gYJfJcOrPo03AEEWEGjTmxCUAyR4H7HyP8FmkWR0X8eQuXQoU0YMlQfvXaa9m8gnNvyhugc4kHY4uM32FmqzJ24ilNDMaFpWRstjM67kTrtyLKtjCdczoQ59BY5EXfhxwHBMka2Ek2iM0nH46YtU/D104diUvPMRr6xUQCRyGmEcegSNZR8eJxDlZUgsacAfdkSIMJEJkkdUw0tfAnFv1Xjf3vdpMK7DmIzxpY4DGC+yaJ3xCdpo56XTzB/eG/BJf0dIo6IvqbRqq/6LS0dsbiSKISNFRgUqF5fLHm53gqRUNCkligjfqv6kjYwJWfPYnPOid9dShgQaQDIuFwFGS56rSQ4zezOGizOXoMYxoV6dbZ9s8wwN0NR8k64xDXF42y95z6pBOgRm9kDpSWai1u4pbN13t91S8Ev2/R63VROsn7fgy88Ut/ozjT6Cxv0veQ3t5HsZ8HDvd9lLeANISywa+pu1ItEMxAkQhLTbTU+ZOFrSQjYAgXPpohvP/0YTDr2xn0rIPrJ8IRpvEz4eLCr2UMHdZj3OdbNiTBVjhG9hZ2OAXlC1x6rV0GHm4xjUIPywtPI4H2G0Iv33IGNvWnQ+pn/Diywz6GeGb9Kyz41rfGfYvn8TqUgMPwND2oSXiaodJvXW3X1Y472bR7d9Wx/BZSd/MI9+4pO5Nr+rkdvmhcb1C0D/g7dDydM8AG4jKKcKgaQWiNamLYevjiE0QF/A7b5TDieQtpEvRcXvZQheUVdHLt6+vwhGaT5lEM4hrX5LBmBGCavm5rvXsGzNimU3T6fr2BW9XLNCqfWREgU972xfqz+v6OMptTI6cnmu1hntHBprTwNOOkPTVjQIjPuz/ZnMXCgUt81hoRyWMigqNTtE80Y3bF0H49JOmuqXIq3DWkmWzLyk4j2k1tgm56fcK4JxFq1sHuBKhdWOuLj7TkRMLDx/v/Iov3/xpWi7OyzFcJtqSRmA/gDf+99yk81jILIIqJ7/uFBwlQgGJ2tUDD3d9ExRMQTaJKvY0QRD2O+NTVrE9UmG+LlcjwxFgEBwny8izGW6Sjefl5m6Yfjx+jtGSNUYRN/XAq7HJDqdgWBZRJU+EgSjuUkQ7VVlR6INcS0yMfpOAMNdxafmZVdI+jGyKn6SSt7csVpUdclpUdmEtBZkRYlhLDwTmQGyGZhyg1Co13JDukDYOm6DBF7bSOANKyZxCiM5mhCbOT7GlERtxcaympLRnuZzczVeEgS4jtIhTEoQexZDZCcCAFBD2HqC/ErXTY+cFcv/tRGQcCEMztRQBiOBUCiHegYiBsqStB6N6z1pOFvpitOLRIlhLRwbgTig7yEOVioL2uRAMH88DTI3pQVVNA2MK2YkLjWQoLA+ZOZBjgQxSc0ba7Ep/AW3hz3SVGW8hWXGocSzFpQNyJRwN4iGIhbau1OKAnLe8vvgR+/RyrxhuaZCnVJ1UFzKehLLmPwRxIBEPUIW4/JE11IhCol++5tyM131cVAGi+ASnpGCG4A8HBuI6ER0zjocqRpOXuZKmNhKQvRERJSyVDwx2ivPTE/RkF5b7zDtOahYhSIgFRnYE6GNvFa4fjahrqEQ9xZTLUXmuxWKxX991roerPkxJlFJ6MFfCdxLDd+bYwDsSBIusQhWGgsU5kgTzh1hAHqpjdqTkDZ9kLCM2RXJBEHeLsIW6qo4mj2zQ3G1Gt+YMrbDWNMGjOjkIaOGeTCgt8iOpEofVuBMj0RldS2EaAXsGlrpjOQxSgXdzqNtwwutYVl7WboUSYh3Sq8hqudic7WylX94L4hOrRtYSldWMMinpGCG0rNqWT1Y2EtoOUG2GLXYgNHRLtngpCZRqcjUHRiCol7qUBdHtJYsDdyNUQxXrypRpNy4mMjfLCraLCtSAZM9NUZHHtYH9j+qAHP0BlRRD3J9JWwoBoFtOeOp6DiVC1MktpE1fjzFBXgf5DFEhVrkwtovoKTwPQhQpUru6ViumBK86dySnS0AZnnlwxo5iVktnN3emnwyn30E8/p9oYoH1q340Gp598YZvDKxbNsi84OFdnEBzwIR5eKbTelTFY6IW65sZ1EVtDMIRiKyQIwp0RGIY7SHEQt9OZCKCXlYCfPCUVijCkJwt0WWuhIOGsVQiJ5VBMKNyDlJeRlrsSnNvwXFNccAlbIYEglqKBENwJBEI7RDEQt9JR56N4q/dNCBztKK9dQfVYrlL2E3jWF2YYxJlgkJQdonxI22stInSIJB2HNlFJvQBMgu7gQQ/D0U1A1yHKyUQOb3zr1R3fxGUnEJTDcYgT0nag4jKNYxzDAV0HOWlx12JzgI5zMgoPUX6mdKBj+GDmSDcC4lqcDtzBbpjaQxSw6R3tGJ7oOdxJCrsWqwNzxBNTd4jiM51DHsMDnaM5YVHXInNAR3Yiyg5RWKY6umPbb3KEN4zhXHgO+WhvkNaDlKupj/gYjmgc9YlKuhamgzkCFNB1iOJiehTYRmGElVRRkoGCzdKFeWy+dL/L9gPqeigotXD05cLVM1hHmAnlJlqB2moOrv3LCr0P9xCVoM5yfARb/i2JQQFXbug93ROUfoL/6aUJQOEn2xyLKEseQVnd5F9B9vH4byd/Oz6apUlUogGTPh4ffV+nWfnraltW+TrKsrzCTf94/FxVm19PT0tcY3myTlZFXuaP1ckqX59GcX76/t3ZX0/Pzk5BvD5lizewSijv/t6ilGWckkJChCDtDAvXsJaYlqQP/wCcCLSisQSPRzIp+nDKFvwgkERU+8fjJGuPZn8DGXoGAcRBVFWgyFAugOk8PkLChoy5O4E7HYRHf7cVpHn2VIHvFQlSFXwwUhajiTZagzxA5ZdVI3SQYUYHmS26hHi1vCaC+da1xBC3SlAHBAVY4cDnH4/faePSgeGbbsjzVBuIjgdvJxRNQHg7kD4cvB1OHRCe6FrdnmvOWgkEVt38Os9i8P3j8f/CRX49mv/P+7rUX46uC6gEfz16d/S/denuD+20a8blbOqmDnz0qieK2lAgOBHQo4MDsKGG2GDqUdEVtKm927Ho1d0Us6qZW9NqksCUt6GlXTDpUVCXUq9XeXbiIsO+2qmpLvj4QirahzR/0FfYAv8+vd4SQEzQdVIXvlffhfU7znbd2LxSPpt5oWxBoQPjzwMXMDdOYM69mQMU732Qw24EbRQmO7DF3AVKXsBVJDIj3j6snuEY69dfblHvkurZe+8A2/fOXaD4LoTUd9IH+AQme8TPVRLrVgvES1jo5tpzgPTJdyNnV9ELKJCGXmE1Zd9CdLpwU0Srr3AX9Fu0cUEi/DN3wX0EdL2tHCDhqWbuu0IKQZFELsZ3MHMhW8GlC8kKFi5Uc/BPpwqQhHOm+YKlC34t75y2lIRz1tIlWOVFjIq5kZFwExVgVoDIrZq1VLGtP2MDsa2S7IU5aFDa8bo8gMEKp0T8f8qSf4FY1j61oyGItl2T5yjGbeyQXJw9Ojlmatzcyk9X/k14g6U2+sP/YqWsW8zPFx5eRvm+lW5r4QIo7gAUE0IuwksnqCnsiNwtoT2ku/5BaGfvnCFZqUwK6WdXSM6A2jWfO9JcrCIpPKmS00dalI/uwKC8OqXMId4VVJruehSh2WB10St/dnGO0aGdvXMBF+ZpEiP/AUA6dtozzV9HVw+RQ7QlqIoXh5AOoZyTBvvSMZxLEkMAvrrtW4j20y8OO9YdmL92LsNOpc4VWAhWffh1hyLnSt5scHCE9DL8vd9Pcvf5yjAh3HUQSAYwiDWuoM5nTb9Z4/z0C49kxqar/ClZReksTZ4y9BorAViuozQ1gPycr5MsSpfNBcsSTlYOUIPnlxJR6qgzbpu9ewXi8+DGAX0UYOgAsH2tUu/uqi5lc8PJPJapWT1Z2MruoHlJT9PqAJeyuvFvYhJrXvPjUlZ33G14Sc2r7brYBNeT3nP5g1xLei9w+EHulCODUgnsE5wunQDxClwRSrkHO0e2H6MbXZ5Mwp/xdlXZwtBxa61ON7+ALM6LuS+f1ZRgmoZp4iiLFNRz4Y9id+r1V2HGRgqhNcS1t7Q+E7CHuPheQfkDsXaDlCUnWK1XP4yhizcPrUUnX2/SJMr6Ixzj+wf3etHJtQhBFrLgd7EijorYCEpZSvnAZq9WRufZ79ukcGKL1e7s+5NRq6mOg5NffujjbR82/ZtipjeNh3wCTD+upLlNIcq6MYsmwtBpksJD2FC0b6tP0fpeEKpPc3PHQ0yw0RM/mfdq9R4a/kMGAkogZa1GbA0NvkXpFlhr3x2dDIhr7l7306+9KTqRyC64Nwherci6s2y5K5IKwG8Vtpe1m1U3oEcwped8+/gIChDjzrLFSqPsq/cMVl8vMlTKrnl+cB1l8eWt1CzEZps8+IbtqxVTBQszJRyXFzxXAO5Onu2uAg5WzXEPU75a0ekWnu9nLtbA1JuSej1GFJ2mx7p3Rn+MnkMOOF9AQbrAmirw2W9zv7SeBZIsTrKnz3m2ArUicTNH3aIbgmKbXRYAzLMByz41FSfADGfXzjFvLDG9KJtt4yQPV5HUhFkV6OK/QH+ibgxSoPgO+GrEGur7Bs7w5/7yojPYtoW8xDe8blAQYcjEPd9WmD43qB4oHNF3uZQa4eoB/dMdTcvlwhaoVY2kHrHFvMoju8UoxFhsKyj3UBAgbV7tAGF3iAUxr7+B4g+0I4CqB3s3OQO8cQQYpNGL52MVZA1Vgm2cdxTC4WWLiD0+09TfRqlTrDsXYOd2E1SH4qRlSJeduQKS2q9rAl1b6woMlG4H3HV1kDwnPeb5CzcC5AXLxf3iH1L3Vx0s33fTONtlVw8TpNvSEaMaNCcDpcXyr1yiOW3mnSPaiuQbQJsHNPsnj8kKzmsucD/5joQEAznp1Bpp5kTd1G7Dnn+Db1zt8a5TVzq+RrpwB+VGP+s4Y6rjovtELMHDTs56gApe06qAKHYIPutFmte6e3s0+6HVYdlveGk0B1vd281TEeFYgus/HOy47up1piMY615scexXYh2S9VKsRtqWF9mqeNkg02jqyMYK1slKqEFyCOTNvjjCcjB+GiQHY6dGCsNFlEVPwMVKzZ3+6pHcdKO79SMJ56iZzlaQFJzbljpYQ7Z4zrjmkGOOuOVmBUpA2S9BMZibNSMBZb1orK+1o9VXMgaUkyUBRiajjjhZtghQndEqd7vWxcEmWCEoSwdL5hbTaZMh0BMo5mWYxKD+ge2zUsuVWw0bpnk1eHekBdaYIKLgW0EBSpBZ7t6C5cLRrRucsx0h+ecLOxUKdRSWObRvswK6WD8AFMm44b4dVlGggB6r/BsoXgLC6MsIrd1b+MRxx3iMZTVHzQhdWCwAGl9J6cRc6CpHKtXOVtZJh0LGfINj5j+3641ld7YjcShwpBZQv3uxVZMtojyolR5MYHkb1gGFbjjlz6TBMfVwsLEr5PvLxTdbRdrFVXp5KBIcG9Fu80namiNlcebZxTtv8a7DUBr9SwsouHPTCeFd4AgIBV9GjHeEVl+RfkFvWNip6hbyixe4kf/moOo5eUiqgbii+phBbdA5ECdRw+4uqONsoXK3WeLC378JIeDIMb/185+j0LaPEX4tN4ujIv68hbN+YQdei80VnGzSMc9bG/Pk8kex2+v69LciyrZpVDiJMPjdmenmIskMsdQ7sx6JIG7NX3+Mng2KZB0VL96IYbaasoKrZzRE3aAhlWe9yfO3m9T+ztEHjxFc3zKGz0ZQ18UTXLb/i7qfMnWtRH/bYrTW6Q7IOU8qNKss1pa+63dJTI1h49AK2DTJSZCGNjqgZcvghGBiXF7aBhWpnxjo3cjwDaQBJTKcKVx7ylWncX+ktxHUfHz+7KrEmQrgFgTmcVrexq76U2l4nvQMPfPq1YPuuCXXHJOMXE4jmYkDhzHZkzJMX/8gCtTt0wNv0dK16DqwaOkHHaBhNxOGsk64LR9+EA3wYwcA692FS1sJFMQSM17+BIKAYq4D1dUH/iiq9ZukTqMwXb1ier4t7UnBD2KbxGdpCk6gJC+TFJQvcPG0/kEk0MVUPeGjypDfsIFvvN4Fr/HU1HiuvjF8Vwz/QVhNbiDMNb6tw8N0fXW9QZxKsqfwTfuzi8jCxYphwr4LogJ+QTS+9doO2H27SfMoBnG9DvtBeN426u4ZdKI+bq+nqLXWG7gHuEyj0s5G6IfdTZCTi8nedHYzM3kjAJeyepvgZhbMzWrG5WzqboO6m4Q+6ou6Cf6J4vFahf5sAGyoCbyFNzcRg66gVYRELzQRhKaYXXjRFdQHPtTwVZQaxRaly9vQchueG1BQl5rmxLM93vsxJqn2DC62UZaOTjxn8TSzJZyYksdkEujmOFRbQNtyMhG1WkyVDzX8DyKiTWN+dOFS7t929/SD9C4bx3i/W5NZWearBA9b6uK7vln3PoUM2y+y+GiZo0rQo0YNBSFIH0/wb7weQeaCsCooAicnZ1xTegSiJgqJ+k4j/hsHBzsbFPUVvZdnZVVEkBm8ZCTZKtlEKUE7k0dRfhAnOzQ2xQcb9PRHVgkaqFJd+04YX2WHzAjzWOs/nBIdrNHv3dNjb92/w+6nX4vbixSgV9/Y6P1SGTDowRGZmFU0Ev49iQzodo6lLKCGqFQjfHxhj5JA3snLBUGh2w5WGaj2zI6VQfto4176vnkjY3Yzm7DL6Ve3MUj76TV3dNMGpT5uDt323MfB/K2Xp+3l5ohzn/0secGy76guA9lV/ceD7nRx4/be89QB8z47nz4mlopA/SQl2WvNl4PufMFDmnvvecHB/j77vz6gl/Z786Ak2WPtp4PuedFDmHvveuIWZS9djh+ruvgS+AF+vE/WV/h5RrKn6g9a/d09d8bi1B8n6XP+Wclpelz8lJukru5dsb31OH45h3krabjzyXekuo6rP2oJAftAEwnJpU0mEvwTZtOIxeBzVAPS0T2KtF8JaWOt7EY09qUfdiUM2jpi/1LQv1u6MwkYnWVeac+rLQSpJ2b30u1wfXwveUmLWvp3eZgNQP9dq+vRi2sM0nQbAHH7pul77ik5STXUy2p763npuaNeVx3s8a1qb+z4+Baxfs+KnnkVesLe36WW31F/qyt40fvd++v1Pd7d7VIKdnx7pywNh3N910iD2v2di8OA/U0BuzoS0BW6PZ8KlKt7JuDakD4IS3oWwL/1xj8b3Y2C4xKnEQU2XOA0kjAcyE4mDuU+lwRc1BQiwsygVDAhpBgZYVM1z4v7IDf0oTHxfSo5GQqNNY3USGP6yAVGEC1n/8oE04K6a1JtYid5r0yfGInjXhWKOBaWxoQjDrDErxy4HK9uUlIIJTWRWJlMU/JgaYcoZwq6aEeCdhD6an+iZqTBDkzWkEJVOS+zn90cyeTrmuXMhXO/S2e0jeupHjlNc7Dy2eWdyY7WN6o7dJbNe7ecQe6lkx6b7NpmZleHJRoWM53n7147mnTifbOQm77TOafrffb+bXgu7XMU9ZHsKvz7oPubi1O5995u3dr32McoJuK9MOCKQUcpdTiOwshj1Z8n6XiNHnHS93ycSUltRKTCvYgAHXBnYscWJroPpTuYpNfsAjEUxEhS414dXngZmNTx5U0KBqRgnw4xjBzs1DFm30KxS0cZA8nYv8MMIxw7dZzZt3DsbJtgIBmH4lDDyMeOHGv2LRm7c7QxEI19O9wwIjH5idG+hWFXJ0gGorDfkyRWEHZ4orRvmTjkqeNATpoY6Zj2xGnf8rCjEygDadjrSVQXqu6+CSEov7Xuo9oxktB+pfvtjG38h+vMBymowNFsVeGAbF5UriLRs2Cw0gEqmGCHLRnd56nkRxTTbyIpkgS5lNTWx0DcgQxd4KhtsEwFS4Cii/8WA7hXKiv0yNJDJHDmQqVCUHX51+sogxRfdEHgmp7sUsLVM1hHH4/jhxx2dR1HrkksBYqGxm8PSTn4NkGEXqeNg+OjFw4ZfxXBwoRxTMoomcOmUkV1EBnG68KR0XjGo69Cpj+PQ/anDxxunyQCb1PHq2hWIRx+810EjpPGkdsdEAfdJoiw67Rx8Ho9zUHXn0XAKEUNtnZaFULXSTL42uFWpYraw1JYRZ0kq2KBrXjHquDcsbmauByiCjk3cwVZEkuSVI6UMHvHRBF2nyqpo88w1jOliHz8VdgfpQL5vOkhXwGXRVgbb3Gp0B7WGE3UOjaPpK10NpW5gjDuFkwYRKp41iDM1tXUPGdEJVH4XD656meyjlOCl/BcvfirqBaYoDrr1teJkpm3TpTPvihdZbrpnvQSTTh9onjKadOVKkJvWQkrwQmSCmCagsYgHm8SaAwyVagx+gyKdclqGcAfBWYf2eGr4HKIKmMyKUza3QMxgnm7TxNO3W2ywihh9qb8gGEyCMcOlUdpaHabGdEI7RIlA7XbyilU1G7eRPW0aZJq6uTxWrrHhrg6uhRRDU0ij09sTITrZxwk+ojIxS+i+TjS1CaTWCDDGoQrYCq/YPGOy1Hf2U0u3QzdJvbxkMdaKomc/AoaLAz9K2jueIhgW+Kp8sT2D5fDvx01lvaOlbZ1wIlWl9Q99CsRzFXQQlmoV6uG0ecBuEj7yWFzgvlwg1jzjkNvUr91l7ZKdn8vNFcgSO0/7reJzH26vKFDF++i+xOC5ubLfhvaXAzLGyi6ORbeHRNEtp/21DQmsqCgbUOxBwX3oASR9YeBhrEnMF2p+qOTxomD6EnaqRBxj2sAeb7TNaD+ONB0ybENBuDS3DGijxU3xAFJRDlHTd9FrxMh0WQiLQma5rCRo4PBoHFU4C9B0+SBwVgNy560tXpWdoTGlmfLOWoctU4St28gZoceiXtYuInDOElldDDek1VzpxJQccQiWQN3uOeYuMGj247x4D2Ws+mOBFgcgkbUYIVgNXSTS1qE8e+hHpWct9eFuUQXTR+KtyJmgXKEFpYV4uP8ljFs6uDykTucb9aQxHe3ckF48I8JhszZ304y7NhnfLKkEDpDetakG3ZDMPYllyKEFuByHNDwUo8Koc9DJSmbhIk7l0Q24IFkAKotonQHniMWmk7DnEe/bB4edv230z0TrTNI53X5EQRvqWy5qtjBuQptVDvQNrnx7Ws4PkLWofLGcbajFHnEVTOmDf/ea3NI11tpq6T+uWbECkqRN+VEyfqzdVMFLqaCto45olqdUYuvT2shYJImaK74OH7c6/K1NnnouF7Jx9DRsf0eWTB+nK/hT2etl/fICPlxv4LDmINj/z02XbbIGHWLslxs7LPJY4sQdU+g1yz0kkXKmKOL1WJlp83lvTVEzR3x6WCbS5sAtY1uvw41nbNTagt3n5Wb3D4H3zkWdGkfTmvroOYD/FnlRfQE0C1GWuKvH06XW1h6XT8k/8EHZfLUQ3yAmBlYUY4MXZ559pi3HhUMRW0W5qn7BaiiOKqiWVElj9GqgskrUJZJ9nR89CVKtzDLxfoBxPPselttthVsMlg/pNQhA/LLGKr/wylH84frDTZZc9EESGYCmwCus/NtksYd3ZdRWjJTuwwCHbz9BjJstAf7soL/B08vHdLnPFMEatjX+ancgPUmhWDldRZG34AJbbcluAJP0eoFfv+WxMhMUwYy3hE02z/4SfRUROuywejLw59QhuP193///9YoAF8yBAMA + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs new file mode 100644 index 00000000..57d3375c --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class FixUsbIdsAndIndexes : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(FixUsbIdsAndIndexes)); + + string IMigrationMetadata.Id + { + get { return "201812241719441_FixUsbIdsAndIndexes"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs new file mode 100644 index 00000000..b90c1908 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs @@ -0,0 +1,25 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class FixUsbIdsAndIndexes : DbMigration + { + public override void Up() + { + AddColumn("dbo.UsbVendors", "VendorId", c => c.Int(false)); + CreateIndex("dbo.UsbProducts", "ProductId"); + CreateIndex("dbo.UsbProducts", "ModifiedWhen"); + CreateIndex("dbo.UsbVendors", "VendorId", true); + CreateIndex("dbo.UsbVendors", "ModifiedWhen"); + } + + public override void Down() + { + DropIndex("dbo.UsbVendors", new[] {"ModifiedWhen"}); + DropIndex("dbo.UsbVendors", new[] {"VendorId"}); + DropIndex("dbo.UsbProducts", new[] {"ModifiedWhen"}); + DropIndex("dbo.UsbProducts", new[] {"ProductId"}); + DropColumn("dbo.UsbVendors", "VendorId"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx new file mode 100644 index 00000000..18616cd2 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs new file mode 100644 index 00000000..5505506e --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddCdOffsets : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddCdOffsets)); + + string IMigrationMetadata.Id + { + get { return "201812250223002_AddCdOffsets"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs new file mode 100644 index 00000000..3a0a7e13 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs @@ -0,0 +1,40 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddCdOffsets : DbMigration + { + public override void Up() + { + CreateTable("dbo.CompactDiscOffsets", + c => new + { + Id = c.Int(false, true), + AddedWhen = c.DateTime(false, 0), + ModifiedWhen = c.DateTime(false, 0), + Manufacturer = c.String(unicode: false), + Model = c.String(unicode: false), + Offset = c.Short(false), + Submissions = c.Int(false), + Agreement = c.Single(false) + }).PrimaryKey(t => t.Id).Index(t => t.ModifiedWhen); + + AddColumn("dbo.Devices", "ModifiedWhen", c => c.DateTime(precision: 0)); + AddColumn("dbo.Devices", "CdOffset_Id", c => c.Int()); + CreateIndex("dbo.Devices", "ModifiedWhen"); + CreateIndex("dbo.Devices", "CdOffset_Id"); + AddForeignKey("dbo.Devices", "CdOffset_Id", "dbo.CompactDiscOffsets", "Id"); + } + + public override void Down() + { + DropForeignKey("dbo.Devices", "CdOffset_Id", "dbo.CompactDiscOffsets"); + DropIndex("dbo.Devices", new[] {"CdOffset_Id"}); + DropIndex("dbo.Devices", new[] {"ModifiedWhen"}); + DropIndex("dbo.CompactDiscOffsets", new[] {"ModifiedWhen"}); + DropColumn("dbo.Devices", "CdOffset_Id"); + DropColumn("dbo.Devices", "ModifiedWhen"); + DropTable("dbo.CompactDiscOffsets"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx new file mode 100644 index 00000000..84ac80a6 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs new file mode 100644 index 00000000..26501faf --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class StoreMmcGetConfigurationResponse : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(StoreMmcGetConfigurationResponse)); + + string IMigrationMetadata.Id + { + get { return "201812251556377_StoreMmcGetConfigurationResponse"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs new file mode 100644 index 00000000..682c8c7f --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs @@ -0,0 +1,17 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class StoreMmcGetConfigurationResponse : DbMigration + { + public override void Up() + { + AddColumn("dbo.MmcFeatures", "BinaryData", c => c.Binary()); + } + + public override void Down() + { + DropColumn("dbo.MmcFeatures", "BinaryData"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx new file mode 100644 index 00000000..18531502 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.Designer.cs b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.Designer.cs new file mode 100644 index 00000000..c732f1da --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class StoreReadResultsInReportDatabase : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(StoreReadResultsInReportDatabase)); + + string IMigrationMetadata.Id + { + get { return "201812252219066_StoreReadResultsInReportDatabase"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.cs b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.cs new file mode 100644 index 00000000..90e4c360 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.cs @@ -0,0 +1,139 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class StoreReadResultsInReportDatabase : DbMigration + { + public override void Up() + { + AddColumn("dbo.TestedMedias", "Read6Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "Read10Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "Read12Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "Read16Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLong10Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLong16Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadSectorsData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadSectorsRetryData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaRetryData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadRetryLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaRetryLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLba48Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaLba48Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLongData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLongRetryData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLongLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLongRetryLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "TocData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "FullTocData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "AtipData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PmaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadCdData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadCdMsfData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadCdFullData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadCdMsfFullData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "Track1PregapData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "LeadInData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "LeadOutData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "C2PointersData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PQSubchannelData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "RWSubchannelData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "CorrectedSubchannelData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PQSubchannelWithC2Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "RWSubchannelWithC2Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "CorrectedSubchannelWithC2Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PfiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DmiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "CmiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdBcaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdAacsData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdDdsData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdSaiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PriData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "EmbossedPfiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "AdipData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DcbData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "HdCmiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdLayerData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluBcaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluDdsData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluSaiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluDiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluPacData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PlextorReadCddaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PioneerReadCddaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PioneerReadCddaMsfData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "NecReadCddaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PlextorReadRawDVDData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "HLDTSTReadRawDVDData", c => c.Binary()); + } + + public override void Down() + { + DropColumn("dbo.TestedMedias", "HLDTSTReadRawDVDData"); + DropColumn("dbo.TestedMedias", "PlextorReadRawDVDData"); + DropColumn("dbo.TestedMedias", "NecReadCddaData"); + DropColumn("dbo.TestedMedias", "PioneerReadCddaMsfData"); + DropColumn("dbo.TestedMedias", "PioneerReadCddaData"); + DropColumn("dbo.TestedMedias", "PlextorReadCddaData"); + DropColumn("dbo.TestedMedias", "BluPacData"); + DropColumn("dbo.TestedMedias", "BluDiData"); + DropColumn("dbo.TestedMedias", "BluSaiData"); + DropColumn("dbo.TestedMedias", "BluDdsData"); + DropColumn("dbo.TestedMedias", "BluBcaData"); + DropColumn("dbo.TestedMedias", "DvdLayerData"); + DropColumn("dbo.TestedMedias", "HdCmiData"); + DropColumn("dbo.TestedMedias", "DcbData"); + DropColumn("dbo.TestedMedias", "AdipData"); + DropColumn("dbo.TestedMedias", "EmbossedPfiData"); + DropColumn("dbo.TestedMedias", "PriData"); + DropColumn("dbo.TestedMedias", "DvdSaiData"); + DropColumn("dbo.TestedMedias", "DvdDdsData"); + DropColumn("dbo.TestedMedias", "DvdAacsData"); + DropColumn("dbo.TestedMedias", "DvdBcaData"); + DropColumn("dbo.TestedMedias", "CmiData"); + DropColumn("dbo.TestedMedias", "DmiData"); + DropColumn("dbo.TestedMedias", "PfiData"); + DropColumn("dbo.TestedMedias", "CorrectedSubchannelWithC2Data"); + DropColumn("dbo.TestedMedias", "RWSubchannelWithC2Data"); + DropColumn("dbo.TestedMedias", "PQSubchannelWithC2Data"); + DropColumn("dbo.TestedMedias", "CorrectedSubchannelData"); + DropColumn("dbo.TestedMedias", "RWSubchannelData"); + DropColumn("dbo.TestedMedias", "PQSubchannelData"); + DropColumn("dbo.TestedMedias", "C2PointersData"); + DropColumn("dbo.TestedMedias", "LeadOutData"); + DropColumn("dbo.TestedMedias", "LeadInData"); + DropColumn("dbo.TestedMedias", "Track1PregapData"); + DropColumn("dbo.TestedMedias", "ReadCdMsfFullData"); + DropColumn("dbo.TestedMedias", "ReadCdFullData"); + DropColumn("dbo.TestedMedias", "ReadCdMsfData"); + DropColumn("dbo.TestedMedias", "ReadCdData"); + DropColumn("dbo.TestedMedias", "PmaData"); + DropColumn("dbo.TestedMedias", "AtipData"); + DropColumn("dbo.TestedMedias", "FullTocData"); + DropColumn("dbo.TestedMedias", "TocData"); + DropColumn("dbo.TestedMedias", "ReadLongRetryLbaData"); + DropColumn("dbo.TestedMedias", "ReadLongLbaData"); + DropColumn("dbo.TestedMedias", "ReadLongRetryData"); + DropColumn("dbo.TestedMedias", "ReadLongData"); + DropColumn("dbo.TestedMedias", "ReadDmaLba48Data"); + DropColumn("dbo.TestedMedias", "ReadLba48Data"); + DropColumn("dbo.TestedMedias", "ReadDmaRetryLbaData"); + DropColumn("dbo.TestedMedias", "ReadDmaLbaData"); + DropColumn("dbo.TestedMedias", "ReadRetryLbaData"); + DropColumn("dbo.TestedMedias", "ReadLbaData"); + DropColumn("dbo.TestedMedias", "ReadDmaRetryData"); + DropColumn("dbo.TestedMedias", "ReadDmaData"); + DropColumn("dbo.TestedMedias", "ReadSectorsRetryData"); + DropColumn("dbo.TestedMedias", "ReadSectorsData"); + DropColumn("dbo.TestedMedias", "ReadLong16Data"); + DropColumn("dbo.TestedMedias", "ReadLong10Data"); + DropColumn("dbo.TestedMedias", "Read16Data"); + DropColumn("dbo.TestedMedias", "Read12Data"); + DropColumn("dbo.TestedMedias", "Read10Data"); + DropColumn("dbo.TestedMedias", "Read6Data"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.resx b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.resx new file mode 100644 index 00000000..7e119a0e --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.Designer.cs b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.Designer.cs new file mode 100644 index 00000000..c9a83ba8 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddMultisessionLeadTest : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddMultisessionLeadTest)); + + string IMigrationMetadata.Id + { + get { return "201901022133012_AddMultisessionLeadTest"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.cs b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.cs new file mode 100644 index 00000000..7052bdf3 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.cs @@ -0,0 +1,23 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddMultisessionLeadTest : DbMigration + { + public override void Up() + { + AddColumn("dbo.TestedMedias", "CanReadingIntersessionLeadIn", c => c.Boolean()); + AddColumn("dbo.TestedMedias", "CanReadingIntersessionLeadOut", c => c.Boolean()); + AddColumn("dbo.TestedMedias", "IntersessionLeadInData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "IntersessionLeadOutData", c => c.Binary()); + } + + public override void Down() + { + DropColumn("dbo.TestedMedias", "IntersessionLeadOutData"); + DropColumn("dbo.TestedMedias", "IntersessionLeadInData"); + DropColumn("dbo.TestedMedias", "CanReadingIntersessionLeadOut"); + DropColumn("dbo.TestedMedias", "CanReadingIntersessionLeadIn"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.resx b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.resx new file mode 100644 index 00000000..cffbecc1 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.Designer.cs b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.Designer.cs new file mode 100644 index 00000000..24c06798 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddOptimalReadMultipleCount : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddOptimalReadMultipleCount)); + + string IMigrationMetadata.Id + { + get { return "201901030344456_AddOptimalReadMultipleCount"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.cs b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.cs new file mode 100644 index 00000000..006d3676 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.cs @@ -0,0 +1,17 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddOptimalReadMultipleCount : DbMigration + { + public override void Up() + { + AddColumn("dbo.Devices", "OptimalMultipleSectorsRead", c => c.Int(false, defaultValue: 0)); + } + + public override void Down() + { + DropColumn("dbo.Devices", "OptimalMultipleSectorsRead"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.resx b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.resx new file mode 100644 index 00000000..c9bff226 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.Designer.cs b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.Designer.cs new file mode 100644 index 00000000..6a8bc447 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddChangeableScsiModes : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddChangeableScsiModes)); + + string IMigrationMetadata.Id + { + get { return "201901081359499_AddChangeableScsiModes"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.cs b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.cs new file mode 100644 index 00000000..b1900d28 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.cs @@ -0,0 +1,23 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddChangeableScsiModes : DbMigration + { + public override void Up() + { + AddColumn("dbo.Scsis", "ModeSense6CurrentData", c => c.Binary()); + AddColumn("dbo.Scsis", "ModeSense10CurrentData", c => c.Binary()); + AddColumn("dbo.Scsis", "ModeSense6ChangeableData", c => c.Binary()); + AddColumn("dbo.Scsis", "ModeSense10ChangeableData", c => c.Binary()); + } + + public override void Down() + { + DropColumn("dbo.Scsis", "ModeSense10ChangeableData"); + DropColumn("dbo.Scsis", "ModeSense6ChangeableData"); + DropColumn("dbo.Scsis", "ModeSense10CurrentData"); + DropColumn("dbo.Scsis", "ModeSense6CurrentData"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.resx b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.resx new file mode 100644 index 00000000..992a39a7 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.Designer.cs b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.Designer.cs new file mode 100644 index 00000000..34fb94d1 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class IdForDensityCode : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(IdForDensityCode)); + + string IMigrationMetadata.Id + { + get { return "201905252122267_IdForDensityCode"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.cs b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.cs new file mode 100644 index 00000000..91b8896f --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.cs @@ -0,0 +1,34 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class IdForDensityCode : DbMigration + { + public override void Up() + { + RenameTable("DensityCodes", "DensityCodes_old"); + + CreateTable("dbo.DensityCodes", + c => new {Code = c.Int(false), SscSupportedMedia_Id = c.Int(), Id = c.Int(false, true)}) + .PrimaryKey(t => t.Id).ForeignKey("dbo.SscSupportedMedias", t => t.SscSupportedMedia_Id) + .Index(t => t.SscSupportedMedia_Id); + + Sql("INSERT INTO DensityCodes (Code, SscSupportedMedia_Id) SELECT Code, SscSupportedMedia_Id FROM DensityCodes_old"); + + DropTable("DensityCodes_old"); + } + + public override void Down() + { + RenameTable("DensityCodes", "DensityCodes_old"); + + CreateTable("dbo.DensityCodes", c => new {Code = c.Int(false, true), SscSupportedMedia_Id = c.Int()}) + .PrimaryKey(t => t.Code).ForeignKey("dbo.SscSupportedMedias", t => t.SscSupportedMedia_Id) + .Index(t => t.SscSupportedMedia_Id); + + Sql("INSERT INTO DensityCodes (Code, SscSupportedMedia_Id) SELECT Code, SscSupportedMedia_Id FROM DensityCodes_old"); + + DropTable("DensityCodes_old"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.resx b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.resx new file mode 100644 index 00000000..42e2995b --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.Designer.cs b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.Designer.cs new file mode 100644 index 00000000..af276328 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class MakeEntityFrameworkHappy : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(MakeEntityFrameworkHappy)); + + string IMigrationMetadata.Id + { + get { return "201905252245072_MakeEntityFrameworkHappy"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.cs b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.cs new file mode 100644 index 00000000..597b4f77 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.cs @@ -0,0 +1,11 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class MakeEntityFrameworkHappy : DbMigration + { + public override void Up() { } + + public override void Down() { } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.resx b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.resx new file mode 100644 index 00000000..3974ce03 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.resx @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +text/microsoft-resx1.3System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=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 + dbo + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/Configuration.cs b/DiscImageChef.Server/Migrations/Configuration.cs new file mode 100644 index 00000000..db98de2a --- /dev/null +++ b/DiscImageChef.Server/Migrations/Configuration.cs @@ -0,0 +1,53 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Configuration.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Provides database context configuration. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Data.Entity.Migrations; +using DiscImageChef.Server.Models; + +namespace DiscImageChef.Server.Migrations +{ + public sealed class Configuration : DbMigrationsConfiguration + { + public Configuration() + { + AutomaticMigrationsEnabled = false; + } + + protected override void Seed(DicServerContext context) + { + // This method will be called after migrating to the latest version. + + // You can use the DbSet.AddOrUpdate() helper extension method + // to avoid creating duplicate seed data. + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/CdOffset.cs b/DiscImageChef.Server/Models/CdOffset.cs new file mode 100644 index 00000000..b17c858a --- /dev/null +++ b/DiscImageChef.Server/Models/CdOffset.cs @@ -0,0 +1,70 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : CdOffset.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing Compact Disc read offsets in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Server.Models +{ + public class CompactDiscOffset : CdOffset + { + public CompactDiscOffset() { } + + public CompactDiscOffset(string manufacturer, string model, short offset, int submissions, float agreement) + { + Manufacturer = manufacturer; + Model = model; + Offset = offset; + Submissions = submissions; + Agreement = agreement; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + public CompactDiscOffset(CdOffset offset) + { + Manufacturer = offset.Manufacturer; + Model = offset.Model; + Offset = offset.Offset; + Submissions = offset.Submissions; + Agreement = offset.Agreement; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + public int Id { get; set; } + public DateTime AddedWhen { get; set; } + [Index] + public DateTime ModifiedWhen { get; set; } + public virtual ICollection Devices { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Command.cs b/DiscImageChef.Server/Models/Command.cs new file mode 100644 index 00000000..fc756d9c --- /dev/null +++ b/DiscImageChef.Server/Models/Command.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Command.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing command statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Command + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Context.cs b/DiscImageChef.Server/Models/Context.cs new file mode 100644 index 00000000..d174b09b --- /dev/null +++ b/DiscImageChef.Server/Models/Context.cs @@ -0,0 +1,56 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Context.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Entity framework database context. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Data.Entity; +using MySql.Data.EntityFramework; + +namespace DiscImageChef.Server.Models +{ + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public sealed class DicServerContext : DbContext + { + public DbSet Devices { get; set; } + public DbSet Reports { get; set; } + public DbSet Commands { get; set; } + public DbSet DeviceStats { get; set; } + public DbSet Filesystems { get; set; } + public DbSet Filters { get; set; } + public DbSet Medias { get; set; } + public DbSet MediaFormats { get; set; } + public DbSet OperatingSystems { get; set; } + public DbSet Partitions { get; set; } + public DbSet Versions { get; set; } + public DbSet UsbVendors { get; set; } + public DbSet UsbProducts { get; set; } + public DbSet CdOffsets { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Device.cs b/DiscImageChef.Server/Models/Device.cs new file mode 100644 index 00000000..68fcf333 --- /dev/null +++ b/DiscImageChef.Server/Models/Device.cs @@ -0,0 +1,73 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Device.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing processed device reports in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations.Schema; +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Server.Models +{ + public class Device : DeviceReportV2 + { + public Device() + { + AddedWhen = DateTime.UtcNow; + } + + public Device(DeviceReportV2 report) + { + ATA = report.ATA; + ATAPI = report.ATAPI; + CompactFlash = report.CompactFlash; + FireWire = report.FireWire; + AddedWhen = DateTime.UtcNow; + ModifiedWhen = DateTime.UtcNow; + MultiMediaCard = report.MultiMediaCard; + PCMCIA = report.PCMCIA; + SCSI = report.SCSI; + SecureDigital = report.SecureDigital; + USB = report.USB; + Manufacturer = report.Manufacturer; + Model = report.Model; + Revision = report.Revision; + Type = report.Type; + } + + public DateTime AddedWhen { get; set; } + [Index] + public DateTime? ModifiedWhen { get; set; } + public virtual CompactDiscOffset CdOffset { get; set; } + [DefaultValue(0)] + public int OptimalMultipleSectorsRead { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/DeviceItem.cs b/DiscImageChef.Server/Models/DeviceItem.cs new file mode 100644 index 00000000..2be4ec8b --- /dev/null +++ b/DiscImageChef.Server/Models/DeviceItem.cs @@ -0,0 +1,43 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : DeviceItem.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for showing device statistics. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +namespace DiscImageChef.Server.Models +{ + public class DeviceItem + { + public string Manufacturer { get; set; } + public string Model { get; set; } + public string Revision { get; set; } + public string Bus { get; set; } + public int ReportId { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/DeviceStat.cs b/DiscImageChef.Server/Models/DeviceStat.cs new file mode 100644 index 00000000..21500617 --- /dev/null +++ b/DiscImageChef.Server/Models/DeviceStat.cs @@ -0,0 +1,47 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : DeviceStat.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing device statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class DeviceStat + { + [Key] + public int Id { get; set; } + public string Manufacturer { get; set; } + public string Model { get; set; } + public string Revision { get; set; } + public string Bus { get; set; } + public virtual Device Report { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Filesystem.cs b/DiscImageChef.Server/Models/Filesystem.cs new file mode 100644 index 00000000..9bcfb744 --- /dev/null +++ b/DiscImageChef.Server/Models/Filesystem.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Filesystem.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing filesystem statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Filesystem + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Filter.cs b/DiscImageChef.Server/Models/Filter.cs new file mode 100644 index 00000000..1d150e66 --- /dev/null +++ b/DiscImageChef.Server/Models/Filter.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Filter.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing filter statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Filter + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Media.cs b/DiscImageChef.Server/Models/Media.cs new file mode 100644 index 00000000..3fc7d393 --- /dev/null +++ b/DiscImageChef.Server/Models/Media.cs @@ -0,0 +1,45 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Media.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing media type statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Media + { + [Key] + public int Id { get; set; } + public string Type { get; set; } + public bool Real { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/MediaFormat.cs b/DiscImageChef.Server/Models/MediaFormat.cs new file mode 100644 index 00000000..83342b81 --- /dev/null +++ b/DiscImageChef.Server/Models/MediaFormat.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : MediaFormat.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing media image format statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class MediaFormat + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/MediaItem.cs b/DiscImageChef.Server/Models/MediaItem.cs new file mode 100644 index 00000000..3063e3a6 --- /dev/null +++ b/DiscImageChef.Server/Models/MediaItem.cs @@ -0,0 +1,41 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : MediaItem.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for showing media type statistics. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +namespace DiscImageChef.Server.Models +{ + public class MediaItem + { + public string Type { get; set; } + public string SubType { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/OperatingSystem.cs b/DiscImageChef.Server/Models/OperatingSystem.cs new file mode 100644 index 00000000..3c2b8be8 --- /dev/null +++ b/DiscImageChef.Server/Models/OperatingSystem.cs @@ -0,0 +1,45 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : OperatingSystem.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing operating system statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class OperatingSystem + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public string Version { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Partition.cs b/DiscImageChef.Server/Models/Partition.cs new file mode 100644 index 00000000..83e64ef3 --- /dev/null +++ b/DiscImageChef.Server/Models/Partition.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Partition.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing partition statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Partition + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UploadedReport.cs b/DiscImageChef.Server/Models/UploadedReport.cs new file mode 100644 index 00000000..3e818be6 --- /dev/null +++ b/DiscImageChef.Server/Models/UploadedReport.cs @@ -0,0 +1,65 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UploadedReport.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing uploaded device reports in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Server.Models +{ + public class UploadedReport : DeviceReportV2 + { + public UploadedReport() + { + UploadedWhen = DateTime.UtcNow; + } + + public UploadedReport(DeviceReportV2 report) + { + ATA = report.ATA; + ATAPI = report.ATAPI; + CompactFlash = report.CompactFlash; + FireWire = report.FireWire; + UploadedWhen = DateTime.UtcNow; + MultiMediaCard = report.MultiMediaCard; + PCMCIA = report.PCMCIA; + SCSI = report.SCSI; + SecureDigital = report.SecureDigital; + USB = report.USB; + Manufacturer = report.Manufacturer; + Model = report.Model; + Revision = report.Revision; + Type = report.Type; + } + + public DateTime UploadedWhen { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UsbProduct.cs b/DiscImageChef.Server/Models/UsbProduct.cs new file mode 100644 index 00000000..5ac8948d --- /dev/null +++ b/DiscImageChef.Server/Models/UsbProduct.cs @@ -0,0 +1,65 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UsbProduct.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing USB product identifiers in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; + +namespace DiscImageChef.Server.Models +{ + public class UsbProduct + { + public UsbProduct() { } + + public UsbProduct(UsbVendor vendor, ushort id, string product) + { + ProductId = id; + Product = product; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + Vendor = vendor; + } + + [Key] + public int Id { get; set; } + [Index] + public int ProductId { get; set; } + public string Product { get; set; } + public DateTime AddedWhen { get; set; } + [Index] + public DateTime ModifiedWhen { get; set; } + [Index] + public int VendorId { get; set; } + [JsonIgnore] + public virtual UsbVendor Vendor { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UsbVendor.cs b/DiscImageChef.Server/Models/UsbVendor.cs new file mode 100644 index 00000000..3ad9766c --- /dev/null +++ b/DiscImageChef.Server/Models/UsbVendor.cs @@ -0,0 +1,64 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UsbVendor.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing USB vendor identifiers in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; + +namespace DiscImageChef.Server.Models +{ + public class UsbVendor + { + public UsbVendor() { } + + public UsbVendor(ushort id, string vendor) + { + VendorId = id; + Vendor = vendor; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + [Key] + public int Id { get; set; } + [Index(IsUnique = true)] + public int VendorId { get; set; } + public string Vendor { get; set; } + public DateTime AddedWhen { get; set; } + [Index] + public DateTime ModifiedWhen { get; set; } + + [JsonIgnore] + public virtual ICollection Products { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Version.cs b/DiscImageChef.Server/Models/Version.cs new file mode 100644 index 00000000..c94b67ef --- /dev/null +++ b/DiscImageChef.Server/Models/Version.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Version.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing version statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Version + { + [Key] + public int Id { get; set; } + public string Value { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Properties/AssemblyInfo.cs b/DiscImageChef.Server/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..2eaab14a --- /dev/null +++ b/DiscImageChef.Server/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DiscImageChef.Server")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DiscImageChef.Server")] +[assembly: AssemblyCopyright("Copyright © 2011-2019 Natalia Portillo")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("A893FA0E-6952-4517-B4AA-658E421737C1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("4.5.99.1693")] +[assembly: AssemblyFileVersion("4.5.99.1693")] \ No newline at end of file diff --git a/DiscImageChef.Server/Reports/.htaccess b/DiscImageChef.Server/Reports/.htaccess new file mode 100644 index 00000000..4114709c --- /dev/null +++ b/DiscImageChef.Server/Reports/.htaccess @@ -0,0 +1 @@ +IndexIgnore * \ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/CODE_OF_CONDUCT.cshtml b/DiscImageChef.Server/Views/Home/CODE_OF_CONDUCT.cshtml new file mode 100644 index 00000000..6b6bda17 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/CODE_OF_CONDUCT.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : CODE_OF_CONDUCT.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders code of conduct. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef's code of conduct: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/CONTRIBUTING.cshtml b/DiscImageChef.Server/Views/Home/CONTRIBUTING.cshtml new file mode 100644 index 00000000..65d75687 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/CONTRIBUTING.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : CONTRIBUTING.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders contributing guidelines. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ How to contribute to DiscImageChef: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/Changelog.cshtml b/DiscImageChef.Server/Views/Home/Changelog.cshtml new file mode 100644 index 00000000..82cd302b --- /dev/null +++ b/DiscImageChef.Server/Views/Home/Changelog.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : Changelog.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders changelog. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef list of changes: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/DONATING.cshtml b/DiscImageChef.Server/Views/Home/DONATING.cshtml new file mode 100644 index 00000000..18538340 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/DONATING.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : DONATING.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders list of needed donations. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef list of things to be donated: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/ISSUE_TEMPLATE.cshtml b/DiscImageChef.Server/Views/Home/ISSUE_TEMPLATE.cshtml new file mode 100644 index 00000000..c29d744d --- /dev/null +++ b/DiscImageChef.Server/Views/Home/ISSUE_TEMPLATE.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : ISSUE_TEMPLATE.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders issue's template. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef's template for issue reports: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/Index.cshtml b/DiscImageChef.Server/Views/Home/Index.cshtml new file mode 100644 index 00000000..9b98e8ab --- /dev/null +++ b/DiscImageChef.Server/Views/Home/Index.cshtml @@ -0,0 +1,47 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : Index.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders readme. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +
+ Welcome to + + + DiscImageChef + + Server version @ViewBag.lblVersion +
+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/PULL_REQUEST_TEMPLATE.cshtml b/DiscImageChef.Server/Views/Home/PULL_REQUEST_TEMPLATE.cshtml new file mode 100644 index 00000000..b613a629 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/PULL_REQUEST_TEMPLATE.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : PULL_REQUEST_TEMPLATE.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders pull request's template. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef's template for pull requests: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/TODO.cshtml b/DiscImageChef.Server/Views/Home/TODO.cshtml new file mode 100644 index 00000000..db382d34 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/TODO.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : TODO.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders todo list. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef list of things to do: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Report/View.cshtml b/DiscImageChef.Server/Views/Report/View.cshtml new file mode 100644 index 00000000..03c594b5 --- /dev/null +++ b/DiscImageChef.Server/Views/Report/View.cshtml @@ -0,0 +1,265 @@ +@using DiscImageChef.CommonTypes.Metadata +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef Device Report"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : View.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders device report. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +
+DiscImageChef Report for +@ViewBag.lblManufacturer +@ViewBag.lblModel +@ViewBag.lblRevision + +@if(ViewBag.UsbItem != null) +{ +
+
+ USB characteristics:
+ Manufacturer: @ViewBag.UsbItem.Manufacturer
+ Product: @ViewBag.UsbItem.Product
+ Vendor ID: @ViewBag.UsbItem.VendorDescription
+ Product ID: @ViewBag.UsbItem.ProductDescription +
+} + +@if(ViewBag.FireWireItem != null) +{ +
+
+ FireWire characteristics:
+ Manufacturer: @ViewBag.FireWire.Manufacturer
+ Product: @ViewBag.FireWire.Product
+ Vendor ID: @ViewBag.FireWire.VendorDescription
+ Product ID: @ViewBag.FireWire.ProductDescription +
+} + +@if(ViewBag.PcmciaItem != null) +{ +
+
+ PCMCIA characteristics:
+ Manufacturer: @ViewBag.PcmciaItem.Manufacturer
+ Product: @ViewBag.PcmciaItem.ProductName
+ Manufacturer code: @ViewBag.PcmciaItem.VendorDescription
+ Card code: @ViewBag.PcmciaItem.CardCode
+ Compliance: @ViewBag.PcmciaItem.Compliance
+ @if(ViewBag.repPcmciaTuples != null) + { + foreach(KeyValuePair kvp in ViewBag.repPcmciaTuples) + { + @kvp.Key: @kvp.Value
+ } + } +
+} + +@if(ViewBag.AtaItem != null) +{ +
+
+ + @ViewBag.AtaItem characteristics: +
+ @ViewBag.lblAtaDeviceType
+ @foreach(KeyValuePair kvp in ViewBag.repAtaTwo) + { + @kvp.Key: @kvp.Value
+ } +
+ @foreach(string item in ViewBag.repAtaOne) + { + @Html.Raw(item)
+ } +
+} +@if(ViewBag.repScsi != null) +{ +
+
+ SCSI characteristics:
+ Vendor: @ViewBag.lblScsiVendor
+ Product: @ViewBag.lblScsiProduct
+ Revision: @ViewBag.lblScsiRevision
+ @foreach(string item in ViewBag.repScsi) + { + @Html.Raw(item)
+ } + @if(ViewBag.repModeSense != null) + { +
+
SCSI mode sense pages: + + + + + + @foreach(KeyValuePair kvp in ViewBag.repModeSense) + { + + + + + } +
ModeContents
+ @kvp.Key + + @Html.Raw(kvp.Value) +
+
+ } + @if(ViewBag.repEvpd != null) + { +
+
SCSI extended vital product data pages: + + + + + + @foreach(KeyValuePair kvp in ViewBag.repEvpd) + { + + + + + } +
EVPDContents
+ @kvp.Key + + @Html.Raw(kvp.Value) +
+
+ } + @if(ViewBag.repScsiMmcMode != null) + { +
+
SCSI CD-ROM capabilities:
+ @foreach(string item in ViewBag.repScsiMmcMode) + { + @Html.Raw(item)
+ } +
+ } + @if(ViewBag.repScsiMmcFeatures != null) + { +
+
SCSI MMC features:
+ @foreach(string item in ViewBag.repScsiMmcFeatures) + { + @Html.Raw(item)
+ } +
+ } + @if(ViewBag.divScsiSscVisible == true) + { +
+
SCSI Streaming device capabilities:
+ Block size granularity: @ViewBag.lblScsiSscGranularity
+ Maximum block length: @ViewBag.lblScsiSscMaxBlock bytes
+ Minimum block length: @ViewBag.lblScsiSscMinBlock bytes
+ @if(ViewBag.repScsiSscDensities != null) + { + foreach(SupportedDensity density in ViewBag.repScsiSscDensities) + { + +
+ + Information for supported density with primary code @($"{density.PrimaryCode:X2h}") and secondary code @($"{density.SecondaryCode:X2h}") +
+ Drive can write this density: @density.Writable
+ Duplicate density: @density.Duplicate
+ Default density: @density.DefaultDensity
+ Density has @density.BitsPerMm bits per mm, with @density.Tracks tracks in a @density.Width mm width tape + Name: @density.Name
+ Organization: @density.Organization
+ Description: @density.Description
+ Maximum capacity: @density.Capacity megabytes
+
+ } + } + @if(ViewBag.repScsiSscMedias != null) + { + foreach(SscSupportedMedia media in ViewBag.repScsiSscMedias) + { + +
+ + Information for supported media with type code @($"{media.MediumType:X2h}") +
+ Media is @media.Length m long in a @media.Width mm width tape + Name: @media.Name
+ Organization: @media.Organization
+ Description: @media.Description
+
+ } + } +
+ } +
+} +@if(ViewBag.repTestedMedia != null) +{ +
+
Tested media:
+ @foreach(string item in ViewBag.repTestedMedia) + { + @Html.Raw(item)
+ } +
+} +@if(ViewBag.repMMC != null) +{ +
+
+ MultiMediaCard device:
+ @foreach(string item in ViewBag.repMMC) + { + @Html.Raw(item)
+ } +
+} +@if(ViewBag.repSD != null) +{ +
+
+ SecureDigital device:
+ @foreach(string item in ViewBag.repSD) + { + @Html.Raw(item)
+ } +
+} +
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Shared/_Layout.cshtml b/DiscImageChef.Server/Views/Shared/_Layout.cshtml new file mode 100644 index 00000000..37f16ec9 --- /dev/null +++ b/DiscImageChef.Server/Views/Shared/_Layout.cshtml @@ -0,0 +1,110 @@ +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : _Layout.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Contains layout. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} + + + + + @switch(DateTime.UtcNow.DayOfYear) + { + // 24th January, Macintosh launch + case 24: + + + break; + default: + + + break; + } + + @ViewBag.Title + + + + + +@RenderBody() + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server/Views/Stats/Index.cshtml b/DiscImageChef.Server/Views/Stats/Index.cshtml new file mode 100644 index 00000000..201becc7 --- /dev/null +++ b/DiscImageChef.Server/Views/Stats/Index.cshtml @@ -0,0 +1,706 @@ +@using System.Collections +@using DiscImageChef.CommonTypes.Metadata +@using DiscImageChef.Server.Models +@using Highsoft.Web.Mvc.Charts +@using Chart = Highsoft.Web.Mvc.Charts.Chart +@using Filter = DiscImageChef.Server.Models.Filter +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : Index.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders statistics. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +@{ + ViewBag.Title = "DiscImageChef Statistics"; + Layout = "~/Views/Shared/_Layout.cshtml"; +} +
+ Welcome to + + + DiscImageChef + + Server version @ViewBag.Version +
+
+@if(ViewBag.repOperatingSystems != null) +{ +
+ +
+
+
+

+ +

+
+ +
+
+ + @foreach(NameValueStats os in ViewBag.repOperatingSystems) + { + + + + } +
+ DiscImageChef has run on @os.name @os.Value times. +
+
+
+
+
+
+
+} +@if(ViewBag.repVersions != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + @foreach(NameValueStats version in ViewBag.repVersions) + { + + + + } +
+ DiscImageChef version @version.name has been used @version.Value times. +
+
+
+
+
+
+
+} +@if(ViewBag.repCommands != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + @foreach(Command command in ViewBag.repCommands) + { + + + + } +
+ @command.Name has been run @command.Count times. +
+
+
+
+
+
+
+} +@if(ViewBag.repFilters != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + @foreach(Filter filter in ViewBag.repFilters) + { + + + + + } +
FilterTimes
+ @filter.Name + + @($"{filter.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repMediaImages != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + @foreach(MediaFormat format in ViewBag.repMediaImages) + { + + + + + } +
Media image formatTimes
+ @format.Name + + @($"{format.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repPartitions != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + @foreach(Partition partition in ViewBag.repPartitions) + { + + + + + } +
Partitioning schemeTimes
+ @partition.Name + + @($"{partition.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repFilesystems != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + @foreach(Filesystem filesystem in ViewBag.repFilesystems) + { + + + + + } +
Filesystem nameTimes
+ @filesystem.Name + + @($"{filesystem.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repVirtualMedia != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + + @foreach(MediaItem media in ViewBag.repVirtualMedia) + { + + + + + + } +
Physical typeLogical typeTimes
+ @media.Type + + @media.SubType + + @($"{media.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repRealMedia != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + + @foreach(MediaItem media in ViewBag.repRealMedia) + { + + + + + + } +
Physical typeLogical typeTimes
+ @media.Type + + @media.SubType + + @($"{media.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repDevices != null) +{ +
+ +
+
+

+

+ All devices found... +

+ +
+
+ + + + + + + + + @foreach(DeviceItem device in ViewBag.repDevices) + { + + + + + + + + } +
ManufacturerModelRevisionBusReport
+ @device.Manufacturer + + @device.Model + + @device.Revision + + @device.Bus + + @if(device.ReportId != 0) + { + @Html.ActionLink("Yes", "View", "Report", new {id = device.ReportId}, new {target = "_blank"}) + } + else + { No } +
+
+
+
+} +
+ + +@{ + string highChartsTitleColor; + string highChartsDataLabelColor; + + switch(DateTime.UtcNow.DayOfYear) + { + // 24th January, Macintosh launch + case 24: + highChartsTitleColor = "#000000"; + highChartsDataLabelColor = "#000000"; + break; + default: + highChartsTitleColor = "#AAAAAA"; + highChartsDataLabelColor = "#FFFFFF"; + break; + } + + Hashtable highChartsTitleStyle = new Hashtable {{"color", highChartsTitleColor}}; + PlotOptionsPieDataLabelsStyle highChartsDataLabelStyle = new PlotOptionsPieDataLabelsStyle {Color = highChartsDataLabelColor, TextOutline = "0px"}; + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Operating system usage", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["osPieData"] as List}}}, "osChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Linux versions", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["linuxPieData"] as List}}}, "linuxChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "macOS versions", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["macosPieData"] as List}}}, "macosChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Windows versions", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["windowsPieData"] as List}}}, "windowsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "DiscImageChef versions", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["versionsPieData"] as List}}}, "versionsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Commands run", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["commandsPieData"] as List}}}, "commandsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Filters found", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["filtersPieData"] as List}}}, "filtersChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 media image formats found", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["formatsPieData"] as List}}}, "formatsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 partitioning schemes found", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["partitionsPieData"] as List}}}, "partitionsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 filesystems found", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["filesystemsPieData"] as List}}}, "filesystemsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 media types found in images", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["virtualMediaPieData"] as List}}}, "virtualMediaChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 media types found in real devices", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["realMediaPieData"] as List}}}, "realMediaChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Devices found by bus", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["devicesBusPieData"] as List}}}, "devicesBusChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Devices found by manufacturer", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["devicesManufacturerPieData"] as List}}}, "devicesManufacturerChart", false)) +} \ No newline at end of file diff --git a/DiscImageChef.Server/Views/Web.config b/DiscImageChef.Server/Views/Web.config new file mode 100644 index 00000000..15e5a56e --- /dev/null +++ b/DiscImageChef.Server/Views/Web.config @@ -0,0 +1,43 @@ + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DiscImageChef.Server/Web.Debug.config b/DiscImageChef.Server/Web.Debug.config new file mode 100644 index 00000000..d7712aaf --- /dev/null +++ b/DiscImageChef.Server/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/DiscImageChef.Server/Web.Release.config b/DiscImageChef.Server/Web.Release.config new file mode 100644 index 00000000..28a4d5fc --- /dev/null +++ b/DiscImageChef.Server/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/DiscImageChef.Server/Web.config b/DiscImageChef.Server/Web.config new file mode 100644 index 00000000..7af7836a --- /dev/null +++ b/DiscImageChef.Server/Web.config @@ -0,0 +1,98 @@ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server/docs/CODE_OF_CONDUCT.md b/DiscImageChef.Server/docs/CODE_OF_CONDUCT.md new file mode 120000 index 00000000..7d5eea0c --- /dev/null +++ b/DiscImageChef.Server/docs/CODE_OF_CONDUCT.md @@ -0,0 +1 @@ +../../.github/CODE_OF_CONDUCT.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/CONTRIBUTING.md b/DiscImageChef.Server/docs/CONTRIBUTING.md new file mode 120000 index 00000000..f939e75f --- /dev/null +++ b/DiscImageChef.Server/docs/CONTRIBUTING.md @@ -0,0 +1 @@ +../../CONTRIBUTING.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/Changelog.md b/DiscImageChef.Server/docs/Changelog.md new file mode 100644 index 00000000..23515063 --- /dev/null +++ b/DiscImageChef.Server/docs/Changelog.md @@ -0,0 +1,857 @@ +# [4.5.1.1692] - 2018-07-19 +## Fixed +### - Alcohol 120% disc image +- Correct writing images of Compact Disc >= 60 min +- Correct writing MODE2 tracks to image +- Correct writing TOC to image +- Generation of multisession images +- Generation of pregaps changing tracks + +# [4.5.0.1663] - 2018-06-24 +## Added +### - Alcohol 120% disc image +- 010editor template. +- Support for creating images. + +### - Apple New Disk Image Format +- Support RLE compressed images. + +### - Blindwrite 4 disc image +- 010editor template. +- Information about why this format cannot support writing. + +### - Blindwrite 5 disc image +- 010editor template. +- Information about why this format cannot support writing. + +### - DART disk image +- Support RLE compressed images. + +### - Decoders +- Added Blu-ray DI decoders. +- Support decoding 2048 bytes PFI. + +### - Devices +- On Linux try to open in read/write and exclusive mode, if not retry in readonly. +- On Linux use direct SG_IO. +- Workaround some Blu-ray drives not reporting correct size on READ DISC STRUCTURE. + +### - DiscJuggler disc image +- Information about why this format cannot support writing. + +### - Dumping +- Added support for CD drives that don't return a TOC. +- Added support for CD drives that don't support READ CD command. +- Added support for Compact Disc that don't report tracks. +- Add support for dumping media in any of the now supported writable formats. +- Dump ISRC. +- Dump MCN. +- Fix reading PW subchannels. +- Separate trimming from error retry. +- When dumping CDs in persistent mode, try disabling L-EC check if drive doesn't support TB bit, or doesn't return data with TB bit enabled. +- When dumping, print bad sectors to dump log. + +### - FAT filesystem +- Add list of known boot sector hashes. +- Support Human68k FAT16 BPB. + +### - Filesystems +- Detecting High Performance Optical File System (HPOFS). +- Detecting Microsoft Resilient filesystem (ReFS). +- Detecting PC-FX executable tracks. +- Detecting Xia filesystem. + +### - Apple 2IMG disk image +- Support for creating images. + +### - Anex86 disk image +- Support for creating images. + +### - Apple II interleaved disk image +- Support for creating images. + +### - Apple Universal Disk Image Format +- Support for creating images. +- Support RLE compressed images. + +### - Apridisk disk image +- Support for creating images. + +### - Basic Lisa Utility disk image +- Support for creating images. + +### - cdrdao disc image +- Support for creating images. + +### - CDRWin cuesheet disc image +- Support for creating images. + +### - CisCopy disk image +- Support for creating images. + +### - CloneCD disc image +- Support for creating images. + +### - Digital Research DISKCOPY disk image +- Support for creating images. + +### - DiskCopy 4.2 disk image +- Support for creating images. + +### - IBM SaveDskF disk image +- Support for creating images. + +### - MaxiDisk disk image +- Support for creating images. + +### - NHDr0 disk image +- Support for creating images. + +### - Parallels disk image +- Support for creating images. + +### - QEMU Copy-On-Write disk image +- Support for creating images. + +### - QEMU Copy-On-Write v2 disk image +- Support for creating images. + +### - QEMU Enhanced Disk image +- Support for creating images. + +### - RAW (sector by sector) disk image +- Added geometry and size for ZIP100 and ZIP250. +- Support 2448 bytes/sector and 2352 bytes/sector CD images. +- Support media tags. + +### - Ray Arachelian's disk image +- Support for creating images. + +### - RS-IDE disk image +- Support for creating images. + +### - T98 Hard Disk Image +- Support for creating images. + +### - Virtual98 disk image +- Support for creating images. + +### - VirtualBox disk image +- Added image type and flags. +- Support for creating images. + +### - VirtualPC disk image +- Support for creating images. + +### - VMware disk image +- Support for creating images. + +## Fixes +### - Apple DOS filesystem +- Use Apple II character set encoding. + +### - Apple ProDOS filesystem +- Use Apple IIc character set encoding. + +### - BlindWrite 4 disc image +- Fix incorrect pregap calculation preventing images from showing correct data. + +### - CICM metadata +- Can now get dump hardware information from images. + +### - cdrdao disc image +- Fix audio track endian. +- Fix when disc catalog number uses whole ASCII and not only numeric digits. + +### - CDRWin disc image +- Fix when disc catalog number uses whole ASCII and not only numeric digits. + +### - CloneCD disc image +- Fix when disc catalog number uses whole ASCII and not only numeric digits. + +### - Checksums +- Correct CD ECC. +- Correct CD EDC. +- Fix CRC16 returning a 32-bit value. +- Fix CRC64 endian. +- Fix Fletcher-16. +- Fix Fletcher-32. + +### - Create sidecar +- Add filesystems only to the appropriate partition and track. +- Fix CD Lead-in, TOC and XGD tags. +- Fix diameter setting. +- Fix SCSI MODE SENSE. +- Fix USB descriptors. + +### - DART disk image +- Fixed endian. + +### - Devices +- Fix sending READ LONG commands to ATA devices. +- Fixed crashing with some rogue SCSI MMC firmwares. + +### - Dumping +- Correctly detect CD-i, CD+ and CD-ROM XA. +- Correctly detect Mode 2 Form 1 and Form 2. +- Do not retry when retry passes are zero. +- Do not try to read multisession lead-out/lead-in as they result in errors that are not really there. +- Get correct track flags. +- Retry only the number of times requested. +- Return drive to previous error correction status. +- Send error recovery MODE before retrying sectors. + +### - HDCopy disk image +- Fix sector calculation. + +### - Image comparison +- Fix when sessions are null. + +### - Image verification +- Corrected status printing. + +### - ISO9660 filesystem +- Do not try to read past partition if El Torito indicates image goes beyond limits. +- Fix when root directory is outside of device. +- Skip null terminated strings in ISO9660 fields. + +### - Lisa filesystem +- Corrected character set encoding. + +### - Macintosh filesystem +- Corrected character set encoding. + +### - PC-98 Partition Table +- Prevent some FAT BPBs to false positive as PC-98 partition tables. + +### - RT-11 filesystem +- Use Radix-50 character set encoding. + +### - System V filesystem +- Fix partition bounds. + +### - VirtualPC disk image +- Corrected reading non-allocated blocks. + +## Changes +- Added command to convert disc images. +- Added command to get information about an image and its contents. +- Added D/CAS-25, D/CAS-85 and D/CAS-103 formats. +- Added IRC notifications for Travis CI. +- Added measured dimensions from an UMD. +- Added media types for NEO GEO CD, PC-FX. +- Added new image format designed to store as much information about media as a drive returns: dicformat. +- Added numeric values to media types. +- Added project to create test filesystems on 16-bit OS/2. +- Added project to create test filesystems on 32-bit OS/2. +- Added project to create test filesystems on DOS. +- Added project to create test filesystems on Mac OS. +- Added size of 640MiB magneto-optical disk. +- Added support for writing disc images. +- Compliant with GDPR. +- Corrected floptical geometry to data according to IRIX. +- Do not assume pointers are 32-bit in several Windows device calls. +- Fixed when statistics settings are null. +- Minimum .NET Framework version is now 4.6.1. +- Sort verbs list. +- Support newest XDG Base Directory Specification for Linux. + +# [4.0.1.0] - 2018-01-06 +## Fixes +### Apple DOS and ProDOS interleaved disk images +- Fixed interleaving values. + +### Apple Nibble disk image +- Fixed detection of DOS vs ProDOS sector order. + +### Apple 2IMG disk image +- Fixed deinterleaving of DOS and ProDOS sector order. +- Fixed denibblizing images. + +### Apple ProDOS filesystem +- Fixed detection on Apple II disks. + +### UCSD Pascal filesystem +- Added support for Apple II variants (two physical sectors per logical sector and little endian fields). + +# [4.0.0.0] - 2017-12-25 +## Added +### - Advanced Disc Filing System +- Added support for ADFS-S, ADFS-M, ADFS-L, ADFS-D, ADFS-E, ADFS-E+, ADFS-F, ADFS-F+ and ADFS-G. + +### - Apple Partition Map +- Added support for decoding Driver Description Map. +- Added support for maps without Driver Description Map. +- Added support for old partition table. + +### - Commands +- Added separate application to debug commands sent to devices. +- list-devices: Lists devices that can be used for device dependent commands. +- list-encodings: Lists supported character encodings. + +### - Create Sidecar command +- Added support for hashing DiscFerret flux images. +- Added support for hashing KryoFlux STREAM flux images. +- Added support for hashing SuperCardPro flux images. +- Added support for tape dumps where each tape-file is a separate dumped file. +- Calculate checksum of contents not only of image file. +- Consider each optical disc track as a separate partition. +- Store superblock modification time on sidecar. +- Support tracks. +- Use dump drive information from images that support it. + +### - Decoders +- Xbox DMI. +- Xbox Security Sectors. + +### - Devices +- MMC. +- PCMCIA block devices. +- SCSI Streaming Devices (aka "tapes"). +- SecureDigital. + +### - Device commands +- Add ATA and SCSI commands support for FreeBSD. +- Add ATA commands support for Windows. +- Add retrieval of USB information on Windows. +- Add SecureDigital/MMC commands support for Windows. + +### - Disc images. +- Alcohol 120%. +- Anex86. +- Apple DOS interleaved (.do). +- Apple New Disk Image Format (aka NDIF, aka img, aka DiskCopy 6). +- Apple Nibble (aka NIB). +- Apple ProDOS interleaved (.po). +- Apple Universal Disk Image Format (aka UDIF, aka dmg). +- BlindWrite 4. +- BlindWrite 5. +- CisCopy (aka DC-File or DCF). +- CloneCD. +- CopyQM. +- CPCEMU Disk File. +- CPCEMU Extended Disk File. +- D64. +- D71. +- D81. +- Digital Research's DiskCopy. +- DiscJuggler. +- HD-Copy. +- IBM SaveDskF. +- IMD. +- MAME Compressed Hunks of Data (aka CHD). +- Parallels Hard Disk Image (aka HDD). +- Partclone disk images +- Partimage disk images +- QEMU Copy-On-Write (aka QCOW). +- QEMU Copy-On-Write v2. +- QEMU Enhanced Disk (aka QED). +- Quasi88 (.D77/.D88). +- Ray Arachelian's Disk IMage (.DIM). +- RS-IDE hard disk images. +- Spectrum floppy disk image (.FDI) +- T98. +- VHDX. +- Virtual98. +- VMware. +- X68k .DIM. + +### - DiskCopy 4.2 disk image +- Added support for invalid images that use little-endian values. +- Added support for images created by macOS that don't have a format byte set. +- Use resource fork to get DiskCopy version used to create them. + +### - Dumping +- Added the ability to resume a partially done dump, even on a separate drive. +- Added the ability to skip dumping the Lead-in. +- Allow creation of a separate subchannel file. +- Create dump log. +- Dumping optical media creates an Alcohol 120% descriptor file. +- Raw dump of DVD with Matshita recorders. +- XGD with Kreon drives. + +### - ext2/3/4 filesystem +- Added new superblock fields. +- Added support for devices with sectors bigger than 512 bytes. + +### - FAT filesystem +- Added DEC Rainbow's hard-wired BPB. +- Added support for volumes with 256 bytes/sector. +- Added support for ACT Apricot BPB. +- Gets volume label, creation time and modification time from root directory if available. + +### - Filesystems +- Apple DOS. +- CP/M. +- Detecting AO-DOS. +- Detecting AtheOS. +- Detecting CD-i. +- Detecting Commodore 1540/1541/1571/1581. +- Detecting cram. +- Detecting Cray UNICOS. +- Detecting dump(8) (Old historic BSD, AIX, UFS and UFS2 types). +- Detecting ECMA-67. +- Detecting exFAT. +- Detecting Extent File System (aka SGI EFS). +- Detecting F2FS. +- Detecting FAT+. +- Detecting fossil. +- Detecting HAMMER. +- Detecting High Sierra Format. +- Detecting HP Logical Interchange Format. +- Detecting IBM JFS. +- Detecting Locus. +- Detecting MicroDOS file system. +- Detecting NILFS2. +- Detecting OS-9 Random Block File (aka RBF). +- Detecting Professional File System (aka PFS). +- Detecting QNX 4. +- Detecting QNX 6. +- Detecting Reiser. +- Detecting Reiser4. +- Detecting RT-11. +- Detecting SmartFileSystem (aka SFS, aka Standard File System). +- Detecting Squash. +- Detecting Universal Disk Format (aka UDF). +- Detecting Veritas. +- Detecting VMware. +- Detecting Xbox. +- Detecting XFS. +- Detecting Zettabyte File System (aka ZFS). +- UCSD Pascal. + +### - Filters +- AppleDouble. +- Apple PCExchange. +- AppleSingle. +- BZIP2. +- GZIP. +- LZIP. +- MacBinary. +- XZ. + +### - GUID Partition Table +- New type GUIDs. + +### - ISO9660 filesystem +- Added detection of AAIP extensions. +- Added detection of Apple extensions. +- Added detection of EFI Platform ID for El Torito. +- Added detection of RRIP extensions. +- Added detection of SUSP extensions. +- Added detection of XA extensions. +- Added detection of ziso extensions. + +### - Lisa filesystem +- Full read-only support. + +### - Media types +- DDS, DDS-2, DDS-3, DDS-4. +- HiFD. +- IOMEGA Clik! (aka PocketZip). +- IOMEGA JAZ. +- LS-120, LS-240, FD32MB. +- NEC floppies. +- Old DEC hard disks +- SHARP floppies. +- XGD3. + +### - Partitions +- Acorn FileCore. +- ACT Apricot. +- BSD disklabels. +- DEC disklabels. +- DragonFly BSD. +- Human68k. +- MINIX subpartitions. +- NEC PC-9800. +- Plan9 partition table. +- Rio Karma. +- SGI Disk Volume Headers. +- UNIX hardwired partition tables. +- UNIX VTOC. +- XENIX partition table. + +### - SCSI decoding +- Handling of EVPDs smaller than length field. +- Handling of modes 02h, 04h and 1Ch smaller than expected. +- Prettyfying of mode 0Bh. + +### - SmartFileSystem +- Added support for version 2. + +### - Statistics +- Added version and operating system statistics. + +### - Sun disklabel +- Added bound checks. +- Added support for 16-entries VTOC. +- Added support for pre-VTOC disklabels. +- Corrected structures for 8-entries VTOC. + +### - System V filesystem +- Added COHERENT offsets. +- Check for it starting on second cylinder. +- Corrected cluster size calculation. +- Corrected detection between Release 2 and Release 4. +- Corrected Release 2 superblock parameters. +- Enlarged NICFREE for Version 7. + +### TeleDisk images +- Added support for Advanced Compression. +- Added support for floppy lead-out. +- Added variable sectors per track support. + +## Fixes +### - AmigaDOS filesystem +- Corrected checksum calculation. +- Corrected cluster size calculation. +- Corrected root block location. +- Corrected support for AROS i386 variant that has a PC bootblock before the AmigaDOS bootblock itself. +- Detection on hard disks or with clusters bigger than 1 sector. +- Tested FFS2. + +### - Apple Partition Map +- Added bound checks. +- Added support for decoding Driver Description Map. +- Added support for maps without Driver Description Map. +- Added support for old partition table. +- Corrected partition start when map it's not on start of device. +- Corrected support for misaligned maps, like on CDs. +- Cut partitions that span outside the device. + +### - cdrdao +- Audio track matching. +- Corrected images that start with comments. +- Prevent reading binary files. + +### - CDRWin +- CD-Text detection. +- CD+G data return. +- Fixed composer parsing. +- Prevent reading binary files. + +### - CP/M filesystem +- Corrected cluster count calculation. +- Corrected directory location on CP/M-86. +- Corrected sector reading. +- Skip media types that were never used as a CP/M disk. + +### - Create Sidecar command +- Corrected creation when path is absolute. + +### - Device commands +- Do not send SCSI INQUIRY to non-SCSI paths on Linux. + +### - Device reports +- Call ATA READ LONG last, as it confuses some drives. +- Try SCSI READ LONG (10) until max block size (65535). + +### - DiskCopy 4.2 +- Corrected track order for Lisa and Macintosh Twiggy. + +### - Dreamcast GDI images +- Prevent reading binary files. + +### - Dumping +- Calculation of streaming device dumping speed. +- Corrected dumping CD-R and CD-RW. +- Optical media with 2048 bytes/sector now get ".iso" file extension. +- Retry when SCSI devices return reset status. +- Streaming Devices now store block size changes in metadata sidecar. +- Wait for SCSI devices to exit ASC 28h (MEDIUM CHANGE) status. + +### - ext2/3/4 filesystem +- Use os type as XML system identifier. + +### - FAT filesystem +- Behaviour with some non-compliant media descriptors. +- Corrected 5.25" MD1DD detection. +- Corrected boot code detection. +- Corrected misaligned volumes on optical media. +- Rewritten to better detect Atari, MSX, *-DOS and ANDOS variants. +- Use OEM name as XML system identifier. + +### - Guid Partition Table +- Added bound checks. +- Corrected misaligned tables on optical media. +- Corrected when table is smaller than one sector. + +### - HFS filesystem +- Corrected detection of a PowerPC only bootable volume (no boot sector). +- Corrected misaligned volumes on optical media. +- Corrected volume serial number case. + +### - HFS+ filesystem +- Corrected misaligned volumes on optical media. +- Corrected misalignment of fields in Volume Header. +- Use last mount version as XML system identifier. + +### - HPFS filesystem +- Corrected cluster size. +- Detect boot code. +- Show NT flags. +- Use OEM name as XML system identifier. + +### - ISO9660 filesystem +- Complete rewrite. +- Check that date fields start with a number. + +### - Master Boot Record partitioning scheme +- Check real presence of a GPT. +- Corrected infinite looping on extended partitions. +- Remove disklabels support. +- Support misaligned MBRs on optical media. +- Support NEC extensions. +- Support OnTrack extensions. + +### - MINIX filesystem +- Added support for v1 and v2 created on MINIX 3. +- Corrected misaligned volumes on optical media. + +### - Nero Burning ROM +- Corrected track handling. +- Corrected typo on parsing v2 images. +- Disc types. +- Do not identify positively if footer version is unknown. +- Lead-In handling. +- Mode2 RAW sectors. +- Session count. + +### - NeXT partition table +- Added missing fields. +- Corrected offsets. +- Cut partitions that span outside the device. + +### - ODS filesystem +- Corrected cluster size calculation. +- Corrected misaligned volumes on optical media. + +### - ProDOS filesystem +- Corrected cluster size calculation. +- Corrected misaligned volumes on optical media. +- Volume size. + +### - Rigid Disk Block partition scheme +- Corrected AMIX mappings. + +### - SCSI decoding +- Handling of EVPDs smaller than length field. +- Handling of modes 02h, 04h and 1Ch smaller than expected. +- Prevented overflow on MMC FEATURES decoding. +- Prevented overflow on SCSI MODE PAGE decoding. + +### - SmartFileSystem +- Added support for version 2. + +### - Sun disklabel +- Added bound checks. +- Corrected structures for 8-entries VTOC. + +### - System V filesystem +- Check for it starting on second cylinder. +- Corrected cluster size calculation. +- Corrected detection between Release 2 and Release 4. +- Corrected Release 2 superblock parameters. +- Enlarged NICFREE for Version 7. + +### - UFS filesystem +- Corrected superblock locations. +- Move superblock to a single structure and marshal it, corrects detection of several variants. + +## Changes +- Added a public changelog. +- Added a side application to create device reports under Linux without a .NET environment. +- Added operating system version statistics. +- Added partitioning scheme name to partition structures. +- Added several internal tests to prevent regression on changes. +- Added support for different character encodings. +- Added support for filters. +- Added support for nested partitioning schemes. +- Added support for propagating disk geometry, needed by PC-98 partitions and old MBRs. +- Better support for decoding multibyte encodings from C, Pascal and space-padded strings. +- Changed handling of compressed files, using temporary files and caching. +- Corrected casting on big-endian marshalling that was failing on some .NET Framework versions. +- Corrected filter list reuse. +- Disabled EDC check on CDs because it is not working (TODO). +- Filesystems now have access to full partition structure. +- Filters no longer return their own extension when requested for filename. +- Moved Claunia.RsrcFork to NuGet. +- Priam tags. +- Support drive firmware inside disc images. +- Support subchannel with only Q channel. + +# [3.0.0.0] - 2016-07-19 +## Added +### - Commands +- benchmark: Tests speed for checksum algorithms. +- create-sidecar: Creates an XML sidecar with metadata. +- decode: Decodes and prints a disk tag present on the image. +- device-info: Prints device information. +- dump-media: Dumps media to a disk image. +- entropy: Calculates disk entropy. +- media-info: Prints media information. +- scan-media: Scans media for errors. + +### - Checksums +- Adler-32 +- SpamSum + +### - Devices +- ATA on Linux. +- ATA on Windows (untested). +- FireWire on Linux. +- SCSI on Linux. +- SCSI on Windows (untested). +- USB on Linux. + +### - Disc images +- Apple 2IMG. +- CDRDAO. +- Dreamcast GDI. +- VirtualPC. + +### - Fast File System (FFS) +- Atari UNIX variant. + +### - Filesystems +- Acorn ADFS. +- AmigaDOS. +- Apple File System, aka APFS. +- Apple ProDOS. +- btrfs. +- Nintendo Gamecube. +- Nintendo Wii. + +### - Partitions +- Amiga Rigid Disk Block (aka RDB). +- Atari. +- Sun. +- (U)EFI GPT. + +## Changes +### - PrintHex command +- Allow to print several sectors. + +## Fixes +### - Be filesystem +- Endianness. +- Support for Be CDs. + +### - CDRWin disk image +- Behaviour on .NET Framework. +- Detection of CD-ROM XA. +- Flags. +- Partition calculations. + +### - Fast File System (FFS) +- False positives with 7th Edition. + +### - ISO9660 +- Dreamcast IP.BIN decoding. +- Sega CD IP.BIN decoding. + +### - System V Filesystem +- Big endian support + +# [2.20] - 2014-08-28 +## Added +### - Checksums +- Reed Solomon. + +## Fixes +### - Apple Partition Map +- Disks with 2048 bytes/sector but a 512 bytes/sector map. + +### - HFS +- Disks with 2048 bytes/sector but a 512 bytes/sector filesystem. + +# [2.10] - 2014-08-25 +## Added +### - Checksums +- CD EDC and ECC. +- CRC16. + +### - Commands +- Verify: Verifies disk image contents, if supported. + +### - Disc images +- Nero Burning ROM. + +# [2.0] - 2014-07-03 +## Added +### - Commands +- analyze: Gives informatio about disk image contents as well as detecting partitions and filesystems. +- checksum: Generates CRC32, CRC64, RIPEMD160, MD5, SHA1, SHA256, SHA384 and SHA512 checksums of disk image contents. +- compare: Compares two media images. +- printhex: Prints a hexadecimal output of a sector. + +### - Disc images +- RAW (sector by sector). + +### - Media types +- BD-R. +- BD-RE XL. +- FDFORMAT. + +## Fixes +### - FAT filesystem +- Workaround FAT12 without BIOS Parameter Block. + +### - MBR partitions +- Do not search for them on disks with less than 512 bytes/sector. + +### - ODS-11 filesystem +- Do not search for them on disks with less than 512 bytes/sector. + +# [1.10] - 2014-04-21 +## Added +### - Disc images +- Sydex TeleDisk. + +# [1.0] - 2014-04-17 +## Added +### - Filesystems +- Detecting BeFS. +- Detecting ext. +- Detecting ext2. +- Detecting ext3. +- Detecting ext4. +- Detecting FAT12. +- Detecting FAT16. +- Detecting FAT32. +- Detecting FFS. +- Detecting HFS+. +- Detecting HFS. +- Detecting HPFS. +- Detecting ISO9660. +- Detecting LisaFS. +- Detecting MFS. +- Detecting MinixFS. +- Detecting NTFS. +- Detecting ODS-11. +- Detecting Opera. +- Detecting PCEngine. +- Detecting SolarFS. +- Detecting System V. +- Detecting UFS. +- Detecting UFS2. +- Detecting UnixWare boot. + +### - Disc images +- Apple DiskCopy 4.2. +- CDRWin. + +### - Partitions +- Apple Partition Map (aka APM). +- Master Boot Record (aka MBR). +- NeXT disklabels. + +[4.5.1.1692]: https://github.com/claunia/DiscImageChef/releases/tag/v4.5.1.1692 +[4.5.0.1663]: https://github.com/claunia/DiscImageChef/releases/tag/v4.5.0.1663 +[4.0.1.0]: https://github.com/claunia/DiscImageChef/releases/tag/v4.0.1.0 +[4.0.0.0]: https://github.com/claunia/DiscImageChef/releases/tag/v4.0.0.0 +[3.0.0.0]: https://github.com/claunia/DiscImageChef/releases/tag/v3.0.0.0 +[2.20]: https://github.com/claunia/DiscImageChef/releases/tag/v2.2 +[2.10]: https://github.com/claunia/DiscImageChef/releases/tag/v2.1 +[2.0]: https://github.com/claunia/DiscImageChef/releases/tag/v2.0 diff --git a/DiscImageChef.Server/docs/DONATING.md b/DiscImageChef.Server/docs/DONATING.md new file mode 100644 index 00000000..0349792f --- /dev/null +++ b/DiscImageChef.Server/docs/DONATING.md @@ -0,0 +1,174 @@ +Hardware donations +================== + +This is a list of hardware that I'm searching but is too rare or too expensive for me to get them. +The reason I want this hardware is because having it is the only way to add enhanced support for them (e.g. media detection, ECC support, raw dumping, etc.). +After adding enhanced support all drives will be given to the Canary Islands Computer Museum. + +- 3.5" magneto-optical media: 540MiB, 1.3GiB +- 5.25" magneto-optical drive and media +- 8" shugart drive +- ADR drive and tapes +- AIT drive and tapes +- Apple twiggy and media +- Caleb UHD144 drive +- Castlewood Orb 2.2 and 5.7 +- DLT drive and tapes +- DiscFerret +- HD-DVD media +- Host-aware and host-controller SAS and SATA zoned hard disks +- Insite floptical drive +- Iomega Bernoulli +- Iomega Ditto drive and tapes +- Iomega JAZ and JAZ 2 +- Iomega REV +- Iomega ZIP750 drive +- LD-ROM drive and media +- LTO drive and tapes +- LV-ROM drive and media +- Mammoth drive and tapes +- Panasonic Blu-ray recorder +- Plasmon UDO and UDO2 drives and media +- SCSI floppy drive (e.g. Teac FD235JS806-U) +- SLR drive and tapes +- Sony Hi-MD and media +- Sony HiFD +- Sony MD-DATA and media +- Sony Professional Disc for DATA +- Stringy floppy +- Syquest EZ135 drive and media +- Syquest EZFlyer drive and media +- Syquest Quest drive and media +- Syquest SQ2542 drive and media +- Syquest SQ306RD drive and SQ100 media +- Syquest SQ3105 drive and SQ310 media +- Syquest SQ312RD drive and SQ200 media +- Syquest SQ319RD drive and SQ300 media +- Syquest SQ3270 drive and SQ327 media +- Syquest SQ5110 drive and SQ800 media +- Syquest SQ5200C drive and SQ2000 media +- Syquest SQ555 drive and SQ400 media +- Syquest SparQ drive and media +- Syquest SyJet drive and media +- T9840, T9940, T10000 drive and tapes +- Travan drive and tapes +- Triton drive and media +- VXA drive and tapes + + +Software donations +================== +This is a list of software whose physical media has some characteristics that needs +to be investigated to allow correct dumping of such characteristics. Usually those +are copy protections. + +- CD-V +- CD-i Ready + - A Christmas Songbook + - Accelerator + - Alien Gate + - Beyond Limits + - Escape + - Lucky Luke + - Louis Armstrong + - Dark Fables of Aesop + - More Dark Fables of Aesop + - Mozart + - Opera Imaginaire + - Pavarotti + - Steel Machine + - The Apprentice + - Dimo's Quest + - The Worlds of... +- SafeDisc + - Age of Wonders II: The Wizard's Throne + - Beowulf + - Black & White 2 + - Brothers in Arms: Road to Hill 30 + - Call of Duty: World at War + - Carmageddon II: Carpocalypse Now + - Close Combat: Invasion Normandy + - Codename: Eagle + - Command & Conquer: Generals + - FIFA Football 2002 + - Football Manager 2007 +- SecuROM + - Arabian Nights + - Arcania: Gothic 4 + - Boiling Point: Road to Hell + - Caesar IV + - Cars 2 + - Clive Barker's Jericho + - Colin McRae Rally 04 + - Colin McRae Rally 2.0 + - Colin McRae Rally 3 + - Command & Conquer: Red Alert 3 - Uprising + - Commandos: Strike Force + - Devil May Cry 4 + - Die Hard: Nakatomi Plaza + - Disney Planes + - Divinity II: Developer's Cut +- StarForce + - Anno 1701 + - Black Mirror 3 + - BloodRayne 2 + - Chronostorm: Siberian Border + - Codename: Outbreak + - Dead to Rights + - Disciples III: Renaissance + - Game of Thrones + - Gothic 3 + - Gothic 3: Forsaken Gods + - Mass Effect + - Mount & Blade + - Pac-Man World 2 +- Tages + - Act of War: High Treason + - Anno 1701 + - Beyond Good & Evil + - Codename: Panzers - Cold War + - Darkstar One + - Desperados 2: Cooper's Revenge + - Driver: Parallel Lines + - Faery: Legends of Avalon + - Fahrenheit + - Fantasy Wars + - Glory of the Roman Empire + - Gothic 3 + - Hard to Be a God + - Helldorado + - Moto Racer 3 + - Nail'd + - Nostradamus: The Last Prophecy + - Rag Doll Kung Fu + - Rayman Origins + - RoboCop (2003) + - Runaway 2: The Dream of the Turtle + - S.T.A.L.K.E.R.: Shadow of Chernobyl + - Secret Files: Tunguska + - Silverfall + - SpellForce 2: Shadow Wars + - Still Life 2 + - The Chronicles of Riddick: Assault on Dark Athena + - War Front: Turning Point + - XIII +- Solidshield + - A-Train 8 + - Anno 2070 + - Assassin's Creed: Brotherhood + - Crysis 2 + - Dead Mountaineer's Hotel + - Dead Space 2 + - Hard to Be a God + - Helldorado + - I Am Alive + - Jack Keane + - James Cameron's Avatar: The Game + - Medal of Honor: Airborne + - Need for Speed: Hot Pursuit + - ObsCure II + - Risen + - Shift 2 Unleashed + - Still Life 2 + - Warfare + - X3: Terran Conflict \ No newline at end of file diff --git a/DiscImageChef.Server/docs/ISSUE_TEMPLATE.md b/DiscImageChef.Server/docs/ISSUE_TEMPLATE.md new file mode 120000 index 00000000..cc358d41 --- /dev/null +++ b/DiscImageChef.Server/docs/ISSUE_TEMPLATE.md @@ -0,0 +1 @@ +../../.github/ISSUE_TEMPLATE.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/NEEDINFO.md b/DiscImageChef.Server/docs/NEEDINFO.md new file mode 120000 index 00000000..2765be7e --- /dev/null +++ b/DiscImageChef.Server/docs/NEEDINFO.md @@ -0,0 +1 @@ +../../NEEDINFO.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/PULL_REQUEST_TEMPLATE.md b/DiscImageChef.Server/docs/PULL_REQUEST_TEMPLATE.md new file mode 120000 index 00000000..2a746206 --- /dev/null +++ b/DiscImageChef.Server/docs/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1 @@ +../../.github/PULL_REQUEST_TEMPLATE.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/README.md b/DiscImageChef.Server/docs/README.md new file mode 100644 index 00000000..e3d58cbb --- /dev/null +++ b/DiscImageChef.Server/docs/README.md @@ -0,0 +1,254 @@ +DiscImageChef v4.5.99.1693 + +Disc Image Chef (because "swiss-army-knife" is used too much) + +Copyright © 2011-2018 Natalia Portillo + +[![Build status](https://dev.azure.com/DiscImageChef/DiscImageChef/_apis/build/status/DiscImageChef-.NET%20Desktop-CI)](https://dev.azure.com/DiscImageChef/DiscImageChef/_build/latest?definitionId=4) +[![Build Status](https://travis-ci.org/claunia/DiscImageChef.svg?branch=master)](https://travis-ci.org/claunia/DiscImageChef) +[![Build status](https://ci.appveyor.com/api/projects/status/vim4c8h028pn5oys?svg=true)](https://ci.appveyor.com/project/claunia/discimagechef) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fclaunia%2FDiscImageChef.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fclaunia%2FDiscImageChef?ref=badge_shield) + +You can see statistics and device reports [here](https://www.discimagechef.app/Statistics.aspx) + +DiscImageChef is a fully featured media dump management solution. You usually know media dumps +as disc images, disk images, tape images, etc. + +With DiscImageChef you can analyze a media dump, extract files from it (for supported +filesystems), compare two of them, create them from real media using the appropriate drive, +create a sidecar metadata with information about the media dump, and a lot of other features +that commonly would require you to use separate applications. + +To see last changes, check the [changelog](Changelog.md). +To see list of pending things to do, check the [TODO list](TODO.md). + +If you want to contribute in any way please read the [contributing guide](CONTRIBUTING.md). + +System requirements +=================== +DiscImageChef should work under any operating system where there is [Mono](http://www.mono-project.com/) +or [.NET Framework](https://www.microsoft.com/net/download). +It has been tested using Mono 5.0 and .NET Framework 4.6.1. However recommended versions are +Mono 5.8 and .NET Framework 4.7.1. .NET Core is unsupported. + +Usage +===== + +DiscImageChef.exe + +And read help. + +Or read the [wiki](https://github.com/claunia/DiscImageChef/wiki). + +Features +======== +* Analyzes a disk image getting information about the disk itself and analyzes partitions and filesystems inside them +* Can checksum the disks (and if optical disc, separate tracks) user-data (tags and metadata coming soon) +* Can compare two disk images, even different formats, for different sectors and/or metadata +* Can list and extract contents from filesystems that support that +* Can read several disk image formats. +* Can read several known sector by sector formats with variable bytes per sector. +* Can read standard sector by sector copies for optical and magnetic discs with constant bytes per sector. +* Can verify sectors or disk images if supported by the underlying format + +Supported disk image formats (read-only) +======================================== +* Apple Disk Archival/Retrieval Tool (DART) +* Apple II nibble images (NIB) +* BlindWrite 4 TOC files (.BWT/.BWI/.BWS) +* BlindWrite 5/6 TOC files (.B5T/.B5I and .B6T/.B6I) +* CopyQM +* CPCEMU Disk file and Extended Disk File +* Dave Dunfield IMD +* DiscJuggler images +* Dreamcast GDI +* HD-Copy disk images +* MAME Compressed Hunks of Data (CHD) +* Microsoft VHDX +* Nero Burning ROM (both image formats) +* Partclone disk images +* Partimage disk images +* Quasi88 disk images (.D77/.D88) +* Spectrum floppy disk image (.FDI) +* TeleDisk +* X68k DIM disk image files (.DIM) + +Supported disk image formats (read and write) +============================================= +* Alcohol 120% Media Descriptor Structure (.MDS/.MDF) +* Anex86 disk images (.FDI for floppies, .HDI for hard disks) +* Any 512 bytes/sector disk image format (sector by sector copy, aka raw) +* Apple 2IMG (used with Apple // emulators) +* Apple DiskCopy 4.2 +* Apple ][ Interleaved Disk Image +* Apple Universal Disk Image Format (UDIF), including obsolete (previous than DiskCopy 6) versions +* Apridisk disk image formats (for ACT Apricot disks) +* Basic Lisa Utility +* CDRDAO TOC sheets +* CDRWin cue/bin cuesheets, including ones with ISOBuster extensions +* CisCopy disk image (aka DC-File, .DCF) +* CloneCD +* DataPackRat's d2f/f2d disk image format ("WC DISK IMAGE") +* Digital Research DiskCopy +* DiscImageChef format +* IBM SaveDskF +* MAXI Disk disk images (HDK) +* Most known sector by sector copies of floppies with 128, 256, 319 and 1024 bytes/sector. +* Most known sector by sector copies with different bytes/sector on track 0. +* Parallels Hard Disk Image (HDD) version 2 +* QEMU Copy-On-Write versions 1, 2 and 3 (QCOW and QCOW2) +* QEMU Enhanced Disk (QED) +* Ray Arachelian's Disk IMage (.DIM) +* RS-IDE hard disk images +* Sector by sector copies of Microsoft's DMF floppies +* T98 hard disk images (.THD) +* T98-Next hard disk images (.NHD) +* Virtual98 disk images +* VirtualBox Disk Image (VDI) +* Virtual PC fixed size, dynamic size and differencing (undo) disk images +* VMware VMDK and COWD images +* XDF disk images (as created by IBM's XDFCOPY) + +Supported partitioning schemes +============================== +* Acorn Linux and RISCiX partitions +* ACT Apricot partitions +* Amiga Rigid Disk Block (RDB) +* Apple Partition Map +* Atari AHDI and ICDPro +* BSD disklabels +* BSD slices inside MBR +* DEC disklabels +* DragonFly BSD 64-bit disklabel +* EFI GUID Partition Table (GPT) +* Human68k (Sharp X68000) partitions table +* Microsoft/IBM/Intel Master Boot Record (MBR) +* Minix subpartitions inside MBR +* NEC PC9800 partitions +* NeXT disklabel +* Plan9 partition table +* Rio Karma partitions +* SGI volume headers +* Solaris slices inside MBR +* Sun disklabel +* UNIX VTOC and disklabel +* UNIX VTOC inside MBR +* Xbox 360 hard coded partitions +* XENIX partition table + +Supported file systems for read-only operations +=============================================== +* Apple DOS file system +* Apple Lisa file system +* Apple Macintosh File System (MFS) +* CP/M file system +* U.C.S.D Pascal file system + +Supported file systems for identification and information only +============================================================== +* 3DO Opera file system +* Acorn Advanced Disc Filing System +* Alexander Osipov DOS (AO-DOS for Electronika BK-0011) file system +* Amiga Fast File System v2, untested +* Amiga Fast File System, with international characters, directory cache and multi-user patches +* Amiga Original File System, with international characters, directory cache and multi-user patches +* Apple File System (preliminary detection until on-disk layout is stable) +* Apple Hierarchical File System (HFS) +* Apple Hierarchical File System+ (HFS+) +* Apple ProDOS / SOS file system +* AtheOS file system +* BeOS filesystem +* BSD Fast File System (FFS) / Unix File System (UFS) +* BSD Unix File System 2 (UFS2) +* B-tree file system (btrfs) +* CD-i file system +* Coherent UNIX file system +* Commodore 1540/1541/1571/1581 filesystems +* Cram file system +* DEC Files-11 (only checked with On Disk Structure 2, ODS-2) +* DEC RT-11 file system +* dump(8) (Old historic BSD, AIX, UFS and UFS2 types) +* ECMA-67: 130mm Flexible Disk Cartridge Labelling and File Structure for Information Interchange +* Flash-Friendly File System (F2FS) +* Fossil file system (from Plan9) +* HAMMER file system +* High Performance Optical File System (HPOFS) +* High Sierra Format +* HP Logical Interchange Format +* IBM Journaling File System (JFS) +* ISO9660 +* Linux extended file system +* Linux extended file system 2 +* Linux extended file system 3 +* Linux extended file system 4 +* Locus file system +* MicroDOS file system +* Microsoft 12-bit File Allocation Table (FAT12), including Atari ST extensions +* Microsoft 16-bit File Allocation Table (FAT16) +* Microsoft 32-bit File Allocation Table (FAT32), including FAT+ extension +* Microsoft Extended File Allocation Table (exFAT) +* Microsoft/IBM High Performance File System (HPFS) +* Microsoft New Technology File System (NTFS) +* Microsoft Resilient File System (ReFS) +* Minix v2 file system +* Minix v3 file system +* NEC PC-Engine executable +* NEC PC-FX executable +* NILFS2 +* Nintendo optical filesystems (GameCube and Wii) +* OS-9 Random Block File +* Professional File System +* QNX4 and QNX6 filesystems +* Reiser file systems +* SGI Extent File System (EFS) +* SGI XFS +* SmartFileSystem +* SolarOS file system +* Squash file system +* UNICOS file system +* Universal Disk Format (UDF) +* UNIX System V file system +* UNIX Version 7 file system +* UnixWare boot file system +* Veritas file system +* VMware file system (VMFS) +* Xbox filesystems +* Xenix file system +* Xia filesystem +* Zettabyte File System (ZFS) + +Supported checksums +=================== +* Adler-32 +* CRC-16 +* CRC-32 +* CRC-64 +* Fletcher-16 +* Fletcher-32 +* MD5 +* RMD160 +* SHA-1 +* SHA-2 (256, 384 and 512 bits) +* SpamSum (fuzzy hashing) + +Supported filters +================= +* Apple PCExchange (FINDER.DAT & RESOURCE.FRK) +* AppleDouble +* AppleSingle +* BZip2 +* GZip +* LZip +* MacBinary I, II, III +* XZ + +Partially supported disk image formats +====================================== +These disk image formats cannot be read, but their contents can be checksummed on sidecar creation +* DiscFerret +* KryoFlux STREAM +* SuperCardPro + + +## License +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fclaunia%2FDiscImageChef.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fclaunia%2FDiscImageChef?ref=badge_large) \ No newline at end of file diff --git a/DiscImageChef.Server/docs/TODO.md b/DiscImageChef.Server/docs/TODO.md new file mode 100644 index 00000000..1a4f4fb3 --- /dev/null +++ b/DiscImageChef.Server/docs/TODO.md @@ -0,0 +1,83 @@ +* Add checksum support for Apple NIB images. (https://github.com/claunia/DiscImageChef/issues/105) +* Add checksum support for NDIF images. (https://github.com/claunia/DiscImageChef/issues/88) +* Add checksum support for partclone images. (https://github.com/claunia/DiscImageChef/issues/89) +* Add checksum support for partimage images. (https://github.com/claunia/DiscImageChef/issues/90) +* Add detection of bootable UDF filesystems. (https://github.com/claunia/DiscImageChef/issues/91) +* Add filter for 7-Zip archives. (https://github.com/claunia/DiscImageChef/issues/92) +* Add filter for ZIP archives. (https://github.com/claunia/DiscImageChef/issues/93) +* Add flux decoding for DiscFerret images. (https://github.com/claunia/DiscImageChef/issues/49) +* Add flux decoding for KryoFlux images. (https://github.com/claunia/DiscImageChef/issues/50) +* Add flux decoding for SuperCardPro images. (https://github.com/claunia/DiscImageChef/issues/99) +* Add interface for floppy bitstream decoding. (https://github.com/claunia/DiscImageChef/issues/94) +* Add raw dump for Plextor recorders. (https://github.com/claunia/DiscImageChef/issues/100) +* Add support for 82077 floppy controllers. (https://github.com/claunia/DiscImageChef/issues/101) +* Add support for AIX partitioning scheme. (https://github.com/claunia/DiscImageChef/issues/7) +* Add support for CD-Text in Nero images. (https://github.com/claunia/DiscImageChef/issues/104) +* Add support for compressed Ciscopy images. (https://github.com/claunia/DiscImageChef/issues/127) +* Add support for compressed DART images. (https://github.com/claunia/DiscImageChef/issues/68) +* Add support for compressed MAME CHD version 5 images. (https://github.com/claunia/DiscImageChef/issues/106) +* Add support for compressed MAME CompactDisc images. (https://github.com/claunia/DiscImageChef/issues/107) +* Add support for compressed NDIF images. (https://github.com/claunia/DiscImageChef/issues/68) +* Add support for compressed SaveDskF images. (https://github.com/claunia/DiscImageChef/issues/108) +* Add support for compressed UDIF images. (https://github.com/claunia/DiscImageChef/issues/70) +* Add support for compressed VMware images. (https://github.com/claunia/DiscImageChef/issues/109) +* Add support for CSS encrypted DVD dumping. (https://github.com/claunia/DiscImageChef/issues/110) +* Add support for decoding Apple GCR bitstreams. (https://github.com/claunia/DiscImageChef/issues/95) +* Add support for decoding Commodore GCR bitstreams. (https://github.com/claunia/DiscImageChef/issues/96) +* Add support for decoding FM bitstreams. (https://github.com/claunia/DiscImageChef/issues/97) +* Add support for decoding MFM bitstreams. (https://github.com/claunia/DiscImageChef/issues/98) +* Add support for detecting FireWire devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/111) +* Add support for detecting FireWire devices in Windows. (https://github.com/claunia/DiscImageChef/issues/125) +* Add support for detecting USB devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/112) +* Add support for differencing QCOW2 images. (https://github.com/claunia/DiscImageChef/issues/142) +* Add support for differencing QCOW images. (https://github.com/claunia/DiscImageChef/issues/143) +* Add support for differencing QED images. (https://github.com/claunia/DiscImageChef/issues/144) +* Add support for DiscFerret devices. (https://github.com/claunia/DiscImageChef/issues/140) +* Add support for dumping CD Lead-In in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/113) +* Add support for encrypted NDIF images. (https://github.com/claunia/DiscImageChef/issues/149) +* Add support for encrypted QCOW2 images. (https://github.com/claunia/DiscImageChef/issues/145) +* Add support for encrypted QCOW images. (https://github.com/claunia/DiscImageChef/issues/146) +* Add support for encrypted VMware images. (https://github.com/claunia/DiscImageChef/issues/147) +* Add support for KryoFlux devices. (https://github.com/claunia/DiscImageChef/issues/141) +* Add support for Linear Media PCMCIA devices. (https://github.com/claunia/DiscImageChef/issues/148) +* Add support for MAME CHD images of PCMCIA devices. (https://github.com/claunia/DiscImageChef/issues/150) +* Add support for NetApp WAFL filesystem. (https://github.com/claunia/DiscImageChef/issues/61) +* Add support for NetWare 286 filesystem. (https://github.com/claunia/DiscImageChef/issues/117) +* Add support for NetWare 386 filesystem. (https://github.com/claunia/DiscImageChef/issues/118) +* Add support for Novell Storage Services filesystem. (https://github.com/claunia/DiscImageChef/issues/119) +* Add support for NVMe devices. (https://github.com/claunia/DiscImageChef/issues/151) +* Add support for OCFS2 filesystem. (https://github.com/claunia/DiscImageChef/issues/153) +* Add support for packed subchannel in BlindWrite 4 images. (https://github.com/claunia/DiscImageChef/issues/154) +* Add support for packed subchannel in BlindWrite 5 images. (https://github.com/claunia/DiscImageChef/issues/155) +* Add support for Parallel ATA devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/114) +* Add support for PCMCIA devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/115) +* Add support for PCMCIA devices in Windows. (https://github.com/claunia/DiscImageChef/issues/126) +* Add support for reading resource fork in macOS. (https://github.com/claunia/DiscImageChef/issues/156) +* Add support for reading resource fork in Windows. (https://github.com/claunia/DiscImageChef/issues/157) +* Add support for SecureDigital and MultiMediaCard devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/116) +* Add support for SuperCardPro devices. (https://github.com/claunia/DiscImageChef/issues/139) +* Add support for XPACK images. (https://github.com/claunia/DiscImageChef/issues/45) +* Checksum disk tags +* Checksum long sectors +* Checksum sector tags +* Compare sector tags +* Finish support for reading sectors of variable bytes/sector images +* Graphical User Interface +* Handle UDIF image comments. (https://github.com/claunia/DiscImageChef/issues/137) +* Implement Apple KenCode compression algorithm. (https://github.com/claunia/DiscImageChef/issues/122) +* Implement Apple LZFSE compression algorithm. (https://github.com/claunia/DiscImageChef/issues/124) +* Implement Apple LZH compression algorithm. (https://github.com/claunia/DiscImageChef/issues/121) +* Implement COLUMBIA ordering in CP/M filesystem. (https://github.com/claunia/DiscImageChef/issues/133) +* Implement CYLINDERS ordering in CP/M filesystem. (https://github.com/claunia/DiscImageChef/issues/132) +* Implement dumping GameCube discs. (https://github.com/claunia/DiscImageChef/issues/135) +* Implement dumping Wii discs. (https://github.com/claunia/DiscImageChef/issues/136) +* Implement EAGLE ordering in CP/M filesystem. (https://github.com/claunia/DiscImageChef/issues/131) +* Implement ODS checksum. (https://github.com/claunia/DiscImageChef/issues/130) +* Implement StuffIt compression algorithm. (https://github.com/claunia/DiscImageChef/issues/123) +* Offer the option to see differing values +* Optimize and multithread image comparison +* Optimize current checksum multithreading +* Support AAP extensions in MBR. (https://github.com/claunia/DiscImageChef/issues/159) +* Support IBM boot manager in MBR. (https://github.com/claunia/DiscImageChef/issues/128) +* Support MMC feature codes FF33h +* Support SCSI mode pages 18h, 1Dh, 20h, 31h, 32h \ No newline at end of file diff --git a/DiscImageChef.Server/fonts/.htaccess b/DiscImageChef.Server/fonts/.htaccess new file mode 100644 index 00000000..4114709c --- /dev/null +++ b/DiscImageChef.Server/fonts/.htaccess @@ -0,0 +1 @@ +IndexIgnore * \ No newline at end of file diff --git a/DiscImageChef.Server/fonts/ChicagoFLF.eot b/DiscImageChef.Server/fonts/ChicagoFLF.eot new file mode 100644 index 00000000..d4b6a6ef Binary files /dev/null and b/DiscImageChef.Server/fonts/ChicagoFLF.eot differ diff --git a/DiscImageChef.Server/fonts/ChicagoFLF.ttf b/DiscImageChef.Server/fonts/ChicagoFLF.ttf new file mode 100644 index 00000000..b77813c7 Binary files /dev/null and b/DiscImageChef.Server/fonts/ChicagoFLF.ttf differ diff --git a/DiscImageChef.Server/fonts/ChicagoFLF.woff b/DiscImageChef.Server/fonts/ChicagoFLF.woff new file mode 100644 index 00000000..f7206026 Binary files /dev/null and b/DiscImageChef.Server/fonts/ChicagoFLF.woff differ diff --git a/DiscImageChef.Server/fonts/ChicagoFLF.woff2 b/DiscImageChef.Server/fonts/ChicagoFLF.woff2 new file mode 100644 index 00000000..bb1dd4b3 Binary files /dev/null and b/DiscImageChef.Server/fonts/ChicagoFLF.woff2 differ diff --git a/DiscImageChef.Server/fonts/vga_squarepx.eot b/DiscImageChef.Server/fonts/vga_squarepx.eot new file mode 100644 index 00000000..3d744610 Binary files /dev/null and b/DiscImageChef.Server/fonts/vga_squarepx.eot differ diff --git a/DiscImageChef.Server/fonts/vga_squarepx.ttf b/DiscImageChef.Server/fonts/vga_squarepx.ttf new file mode 100644 index 00000000..9fe3e4ae Binary files /dev/null and b/DiscImageChef.Server/fonts/vga_squarepx.ttf differ diff --git a/DiscImageChef.Server/fonts/vga_squarepx.woff b/DiscImageChef.Server/fonts/vga_squarepx.woff new file mode 100644 index 00000000..20ea3254 Binary files /dev/null and b/DiscImageChef.Server/fonts/vga_squarepx.woff differ diff --git a/DiscImageChef.Server/fonts/vga_squarepx.woff2 b/DiscImageChef.Server/fonts/vga_squarepx.woff2 new file mode 100644 index 00000000..a7a5b60a Binary files /dev/null and b/DiscImageChef.Server/fonts/vga_squarepx.woff2 differ diff --git a/DiscImageChef.Server/package-lock.json b/DiscImageChef.Server/package-lock.json new file mode 100644 index 00000000..7699daa2 --- /dev/null +++ b/DiscImageChef.Server/package-lock.json @@ -0,0 +1,12 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "bootstrap": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.2.1.tgz", + "integrity": "sha512-tt/7vIv3Gm2mnd/WeDx36nfGGHleil0Wg8IeB7eMrVkY0fZ5iTaBisSh8oNANc2IBsCc6vCgCNTIM/IEN0+50Q==", + "dev": true + } + } +} diff --git a/DiscImageChef.Server/package.json b/DiscImageChef.Server/package.json new file mode 100644 index 00000000..efc3d42f --- /dev/null +++ b/DiscImageChef.Server/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "bootstrap": "4.2.1" + } +} diff --git a/DiscImageChef.Server/packages.config b/DiscImageChef.Server/packages.config new file mode 100644 index 00000000..e678a976 --- /dev/null +++ b/DiscImageChef.Server/packages.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server/styles/_highcharts.scss b/DiscImageChef.Server/styles/_highcharts.scss new file mode 100644 index 00000000..c3f6b965 --- /dev/null +++ b/DiscImageChef.Server/styles/_highcharts.scss @@ -0,0 +1,788 @@ +/** + * @license Highcharts + * + * (c) 2009-2016 Torstein Honsi + * + * License: www.highcharts.com/license + */ + +// Colors for data series and points. +$colors: #7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1 !default; + +// Chart background, point stroke for markers and columns etc +$background-color: #ffffff !default; + +// Neutral colors, grayscale by default. The default colors are defined by mixing the +// background-color with neutral, with a weight corresponding to the number in the name. +$neutral-color-100: #000000 !default; // Strong text. +$neutral-color-80: #333333 !default; // Main text and some strokes. +$neutral-color-60: #666666 !default; // Axis labels, axis title, connector fallback. +$neutral-color-40: #999999 !default; // Credits text, export menu stroke. +$neutral-color-20: #cccccc !default; // Disabled texts, button strokes, crosshair etc. +$neutral-color-10: #e6e6e6 !default; // Grid lines etc. +$neutral-color-5: #f2f2f2 !default; // Minor grid lines etc. +$neutral-color-3: #f7f7f7 !default; // Tooltip backgroud, button fills, map null points. + +// Colored, shades of blue by default +$highlight-color-100: #003399 !default; // Drilldown clickable labels, color axis max color. +$highlight-color-80: #335cad !default; // Selection marker, menu hover, button hover, chart border, navigator series. +$highlight-color-60: #6685c2 !default; // Navigator mask fill. +$highlight-color-20: #ccd6eb !default; // Ticks and axis line. +$highlight-color-10: #e6ebf5 !default; // Pressed button, color axis min color. + +// Fonts +$font-family: "Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif !default; +$title-font-size: 1.5em !default; +$subtitle-font-size: 1em !default; +$legend-font-size: 1em !default; +$axis-labels-font-size: 0.9em !default; + +// Tooltip +$tooltip-border: 1px !default; +$tooltip-background: $neutral-color-3 !default; + +// Axes +$xaxis-grid-line: 0px !default; + +// Range-selector +$range-selector-button-border: 0px !default; +$range-selector-input-text: $neutral-color-80 !default; +$range-selector-input-border: $neutral-color-20 !default; + +// Data-labels +$data-label-color: $neutral-color-80 !default; + +// Buttons +$context-button-background: $background-color !default; + +$highcharts-button-background: $neutral-color-3 !default; +$highcharts-button-border: $neutral-color-20 !default; +$highcharts-button-text: $neutral-color-80 !default; + +$highcharts-button-pressed-background: $highlight-color-10 !default; +$highcharts-button-pressed-border: $neutral-color-20 !default; +$highcharts-button-pressed-text: $neutral-color-80 !default; + +$highcharts-button-hover-background: $neutral-color-10 !default; +$highcharts-button-hover-border: $neutral-color-20 !default; +$highcharts-button-hover-text: $neutral-color-80 !default; + +// Navigator +$navigator-series-fill: $highlight-color-80 !default; +$navigator-series-border: $highlight-color-80 !default; + +// Scrollbar +$scrollbar-track-background: $neutral-color-5 !default; +$scrollbar-track-border: $neutral-color-5 !default; + +// Indicators +$indicator-positive-line: #06B535; +$indicator-negative-line: #F21313; + +.highcharts-container { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; + text-align: left; + line-height: normal; + z-index: 0; /* #1072 */ + -webkit-tap-highlight-color: rgba(0,0,0,0); + font-family: $font-family; + font-size: 12px; +} +.highcharts-root { + display: block; +} +.highcharts-root text { + stroke-width: 0; +} +.highcharts-strong { + font-weight: bold; +} +.highcharts-emphasized { + font-style: italic; +} +.highcharts-anchor { + cursor: pointer; +} +.highcharts-background { + fill: $background-color; +} +.highcharts-plot-border, .highcharts-plot-background { + fill: none; +} +.highcharts-label-box { + fill: none; +} +.highcharts-button-box { + fill: inherit; +} +.highcharts-tracker-line { + stroke-linejoin: round; + stroke: rgba(192, 192, 192, 0.0001); + stroke-width: 22; + fill: none; +} +.highcharts-tracker-area { + fill: rgba(192, 192, 192, 0.0001); + stroke-width: 0; +} + +/* Titles */ +.highcharts-title { + fill: $neutral-color-80; + font-size: $title-font-size; +} +.highcharts-subtitle { + fill: $neutral-color-60; +} + +/* Axes */ +.highcharts-axis-line { + fill: none; + stroke: $highlight-color-20; +} +.highcharts-yaxis .highcharts-axis-line { + stroke-width: 0; +} +.highcharts-axis-title { + fill: $neutral-color-60; +} +.highcharts-axis-labels { + fill: $neutral-color-60; + cursor: default; + font-size: $axis-labels-font-size; +} +.highcharts-grid-line { + fill: none; + stroke: $neutral-color-10; +} +.highcharts-xaxis-grid .highcharts-grid-line { + stroke-width: $xaxis-grid-line; +} +.highcharts-tick { + stroke: $highlight-color-20; +} +.highcharts-yaxis .highcharts-tick { + stroke-width: 0; +} +.highcharts-minor-grid-line { + stroke: $neutral-color-5; +} +.highcharts-crosshair-thin { + stroke-width: 1px; + stroke: $neutral-color-20; +} +.highcharts-crosshair-category { + stroke: $highlight-color-20; + stroke-opacity: 0.25; +} + + +/* Credits */ +.highcharts-credits { + cursor: pointer; + fill: $neutral-color-40; + font-size: 0.7em; + transition: fill 250ms, font-size 250ms; +} +.highcharts-credits:hover { + fill: black; + font-size: 1em; +} + +/* Tooltip */ +.highcharts-tooltip { + cursor: default; + pointer-events: none; + white-space: nowrap; + transition: stroke 150ms; +} +.highcharts-tooltip text { + fill: $neutral-color-80; +} +.highcharts-tooltip .highcharts-header { + font-size: 0.85em; +} +.highcharts-tooltip-box { + stroke-width: $tooltip-border; + fill: $tooltip-background; + fill-opacity: 0.85; +} +.highcharts-tooltip-box .highcharts-label-box { + fill: $tooltip-background; + fill-opacity: 0.85; +} + +.highcharts-selection-marker { + fill: $highlight-color-80; + fill-opacity: 0.25; +} + +.highcharts-graph { + fill: none; + stroke-width: 2px; + stroke-linecap: round; + stroke-linejoin: round; +} +.highcharts-state-hover .highcharts-graph { + stroke-width: 3; +} +.highcharts-state-hover path { + transition: stroke-width 50; /* quick in */ +} +.highcharts-state-normal path { + transition: stroke-width 250ms; /* slow out */ +} + +/* Legend hover affects points and series */ +g.highcharts-series, +.highcharts-point, +.highcharts-markers, +.highcharts-data-labels { + transition: opacity 250ms; +} +.highcharts-legend-series-active g.highcharts-series:not(.highcharts-series-hover), +.highcharts-legend-point-active .highcharts-point:not(.highcharts-point-hover), +.highcharts-legend-series-active .highcharts-markers:not(.highcharts-series-hover), +.highcharts-legend-series-active .highcharts-data-labels:not(.highcharts-series-hover) { + opacity: 0.2; +} + +/* Series options */ + +/* Default colors */ +@for $i from 1 through length($colors) { + $color: nth($colors, $i); + .highcharts-color-#{$i - 1} { + fill: $color; + stroke: $color; + } +} + +.highcharts-area { + fill-opacity: 0.75; + stroke-width: 0; +} +.highcharts-markers { + stroke-width: 1px; + stroke: $background-color; +} +.highcharts-point { + stroke-width: 1px; +} +.highcharts-dense-data .highcharts-point { + stroke-width: 0; +} + +.highcharts-data-label { + font-size: 0.9em; + font-weight: bold; +} +.highcharts-data-label-box { + fill: none; + stroke-width: 0; +} +.highcharts-data-label text, text.highcharts-data-label { + fill: $data-label-color; +} +.highcharts-data-label-connector { + fill: none; +} +.highcharts-halo { + fill-opacity: 0.25; + stroke-width: 0; +} +.highcharts-series:not(.highcharts-pie-series) .highcharts-point-select, +.highcharts-markers .highcharts-point-select { + fill: $neutral-color-20; + stroke: $neutral-color-100; +} +.highcharts-column-series rect.highcharts-point { + // rect to prevent stroke on 3D columns + stroke: $background-color; +} +.highcharts-column-series .highcharts-point { + transition: fill-opacity 250ms; +} +.highcharts-column-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} +.highcharts-pie-series .highcharts-point { + stroke-linejoin: round; + stroke: $background-color; +} +.highcharts-pie-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} +.highcharts-funnel-series .highcharts-point { + stroke-linejoin: round; + stroke: $background-color; +} +.highcharts-funnel-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} +.highcharts-funnel-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} +.highcharts-pyramid-series .highcharts-point { + stroke-linejoin: round; + stroke: $background-color; +} +.highcharts-pyramid-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} +.highcharts-pyramid-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} +.highcharts-solidgauge-series .highcharts-point { + stroke-width: 0; +} +.highcharts-treemap-series .highcharts-point { + stroke-width: 1px; + stroke: $neutral-color-10; + transition: stroke 250ms, fill 250ms, fill-opacity 250ms; +} +.highcharts-treemap-series .highcharts-point-hover { + stroke: $neutral-color-40; + transition: stroke 25ms, fill 25ms, fill-opacity 25ms; +} + +.highcharts-treemap-series .highcharts-above-level { + display: none; +} +.highcharts-treemap-series .highcharts-internal-node { + fill: none; +} +.highcharts-treemap-series .highcharts-internal-node-interactive { + fill-opacity: 0.15; + cursor: pointer; +} +.highcharts-treemap-series .highcharts-internal-node-interactive:hover { + fill-opacity: 0.75; +} + + + +/* Legend */ +.highcharts-legend-box { + fill: none; + stroke-width: 0; +} +.highcharts-legend-item > text { + fill: $neutral-color-80; + font-weight: bold; + font-size: $legend-font-size; + cursor: pointer; + stroke-width: 0; +} +.highcharts-legend-item:hover text { + fill: $neutral-color-100; +} +.highcharts-legend-item-hidden * { + fill: $neutral-color-20 !important; + stroke: $neutral-color-20 !important; + transition: fill 250ms; +} +.highcharts-legend-nav-active { + fill: $highlight-color-100; + cursor: pointer; +} +.highcharts-legend-nav-inactive { + fill: $neutral-color-20; +} +.highcharts-legend-title-box { + fill: none; + stroke-width: 0; +} + +/* Bubble legend */ +.highcharts-bubble-legend-symbol { + stroke-width: 2; + fill-opacity: 0.5; +} +.highcharts-bubble-legend-connectors { + stroke-width: 1; +} +.highcharts-bubble-legend-labels { + fill: $neutral-color-80; +} + +/* Loading */ +.highcharts-loading { + position: absolute; + background-color: $background-color; + opacity: 0.5; + text-align: center; + z-index: 10; + transition: opacity 250ms; +} +.highcharts-loading-hidden { + height: 0 !important; + opacity: 0; + overflow: hidden; + transition: opacity 250ms, height 250ms step-end; +} +.highcharts-loading-inner { + font-weight: bold; + position: relative; + top: 45%; +} + +/* Plot bands and polar pane backgrounds */ +.highcharts-plot-band, .highcharts-pane { + fill: $neutral-color-100; + fill-opacity: 0.05; +} +.highcharts-plot-line { + fill: none; + stroke: $neutral-color-40; + stroke-width: 1px; +} + +/* Highcharts More and modules */ +.highcharts-boxplot-box { + fill: $background-color; +} +.highcharts-boxplot-median { + stroke-width: 2px; +} +.highcharts-bubble-series .highcharts-point { + fill-opacity: 0.5; +} +.highcharts-errorbar-series .highcharts-point { + stroke: $neutral-color-100; +} +.highcharts-gauge-series .highcharts-data-label-box { + stroke: $neutral-color-20; + stroke-width: 1px; +} +.highcharts-gauge-series .highcharts-dial { + fill: $neutral-color-100; + stroke-width: 0; +} +.highcharts-polygon-series .highcharts-graph { + fill: inherit; + stroke-width: 0; +} +.highcharts-waterfall-series .highcharts-graph { + stroke: $neutral-color-80; + stroke-dasharray: 1, 3; +} +.highcharts-sankey-series .highcharts-point { + stroke-width: 0; +} +.highcharts-sankey-series .highcharts-link { + transition: fill 250ms, fill-opacity 250ms; + fill-opacity: 0.5; +} +.highcharts-sankey-series .highcharts-point-hover.highcharts-link { + transition: fill 50ms, fill-opacity 50ms; + fill-opacity: 1; +} +.highcharts-venn-series .highcharts-point { + fill-opacity: 0.75; + stroke: $neutral-color-20; + transition: stroke 250ms, fill-opacity 250ms; +} +.highcharts-venn-series .highcharts-point-hover { + fill-opacity: 1; + stroke: $neutral-color-20; +} + +/* Highstock */ +.highcharts-navigator-mask-outside { + fill-opacity: 0; +} +.highcharts-navigator-mask-inside { + fill: $highlight-color-60; /* navigator.maskFill option */ + fill-opacity: 0.25; + cursor: ew-resize; +} +.highcharts-navigator-outline { + stroke: $neutral-color-20; + fill: none; +} +.highcharts-navigator-handle { + stroke: $neutral-color-20; + fill: $neutral-color-5; + cursor: ew-resize; +} +.highcharts-navigator-series { + fill: $navigator-series-fill; + stroke: $navigator-series-border; +} +.highcharts-navigator-series .highcharts-graph { + stroke-width: 1px; +} +.highcharts-navigator-series .highcharts-area { + fill-opacity: 0.05; +} +.highcharts-navigator-xaxis .highcharts-axis-line { + stroke-width: 0; +} +.highcharts-navigator-xaxis .highcharts-grid-line { + stroke-width: 1px; + stroke: $neutral-color-10; +} +.highcharts-navigator-xaxis.highcharts-axis-labels { + fill: $neutral-color-40; +} +.highcharts-navigator-yaxis .highcharts-grid-line { + stroke-width: 0; +} +.highcharts-scrollbar-thumb { + fill: $neutral-color-20; + stroke: $neutral-color-20; + stroke-width: 1px; +} +.highcharts-scrollbar-button { + fill: $neutral-color-10; + stroke: $neutral-color-20; + stroke-width: 1px; +} +.highcharts-scrollbar-arrow { + fill: $neutral-color-60; +} +.highcharts-scrollbar-rifles { + stroke: $neutral-color-60; + stroke-width: 1px; +} +.highcharts-scrollbar-track { + fill: $scrollbar-track-background; + stroke: $scrollbar-track-border; + stroke-width: 1px; +} +.highcharts-button { + fill: $highcharts-button-background; + stroke: $highcharts-button-border; + cursor: default; + stroke-width: 1px; + transition: fill 250ms; +} +.highcharts-button text { + fill: $highcharts-button-text; +} +.highcharts-button-hover { + transition: fill 0ms; + fill: $highcharts-button-hover-background; + stroke: $highcharts-button-hover-border; +} +.highcharts-button-hover text { + fill: $highcharts-button-hover-text; +} +.highcharts-button-pressed { + font-weight: bold; + fill: $highcharts-button-pressed-background; + stroke: $highcharts-button-pressed-border; +} +.highcharts-button-pressed text { + fill: $highcharts-button-pressed-text; + font-weight: bold; +} +.highcharts-button-disabled text { + fill: $highcharts-button-text; +} +.highcharts-range-selector-buttons .highcharts-button { + stroke-width: $range-selector-button-border; +} +.highcharts-range-label rect { + fill: none; +} +.highcharts-range-label text { + fill: $neutral-color-60; +} +.highcharts-range-input rect { + fill: none; +} +.highcharts-range-input text { + fill: $range-selector-input-text; +} +.highcharts-range-input { + stroke-width:1px; + stroke: $range-selector-input-border; +} +input.highcharts-range-selector { + position: absolute; + border: 0; + width: 1px; /* Chrome needs a pixel to see it */ + height: 1px; + padding: 0; + text-align: center; + left: -9em; /* #4798 */ +} +.highcharts-crosshair-label text { + fill: $background-color; + font-size: 1.1em; +} +.highcharts-crosshair-label .highcharts-label-box { + fill: inherit; +} + + +.highcharts-candlestick-series .highcharts-point { + stroke: $neutral-color-100; + stroke-width: 1px; +} +.highcharts-candlestick-series .highcharts-point-up { + fill: $background-color; +} +.highcharts-ohlc-series .highcharts-point-hover { + stroke-width: 3px; +} +.highcharts-flags-series .highcharts-point .highcharts-label-box { + stroke: $neutral-color-40; + fill: $background-color; + transition: fill 250ms; +} +.highcharts-flags-series .highcharts-point-hover .highcharts-label-box { + stroke: $neutral-color-100; + fill: $highlight-color-20; +} +.highcharts-flags-series .highcharts-point text { + fill: $neutral-color-100; + font-size: 0.9em; + font-weight: bold; +} + +/* Highmaps */ +.highcharts-map-series .highcharts-point { + transition: fill 500ms, fill-opacity 500ms, stroke-width 250ms; + stroke: $neutral-color-20; +} +.highcharts-map-series .highcharts-point-hover { + transition: fill 0ms, fill-opacity 0ms; + fill-opacity: 0.5; + stroke-width: 2px; +} +.highcharts-mapline-series .highcharts-point { + fill: none; +} +.highcharts-heatmap-series .highcharts-point { + stroke-width: 0; +} +.highcharts-map-navigation { + font-size: 1.3em; + font-weight: bold; + text-align: center; +} +.highcharts-coloraxis { + stroke-width: 0; +} +.highcharts-coloraxis-marker { + fill: $neutral-color-40; +} +.highcharts-null-point { + fill: $neutral-color-3; +} + +/* 3d charts */ +.highcharts-3d-frame { + fill: transparent; +} + +/* Exporting module */ +.highcharts-contextbutton { + fill: $context-button-background; /* needed to capture hover */ + stroke: none; + stroke-linecap: round; +} +.highcharts-contextbutton:hover { + fill: $neutral-color-10; + stroke: $neutral-color-10; +} +.highcharts-button-symbol { + stroke: $neutral-color-60; + stroke-width: 3px; +} +.highcharts-menu { + border: 1px solid $neutral-color-40; + background: $background-color; + padding: 5px 0; + box-shadow: 3px 3px 10px #888; +} +.highcharts-menu-item { + padding: 0.5em 1em; + background: none; + color: $neutral-color-80; + cursor: pointer; + transition: background 250ms, color 250ms; +} +.highcharts-menu-item:hover { + background: $highlight-color-80; + color: $background-color; +} + +/* Drilldown module */ +.highcharts-drilldown-point { + cursor: pointer; +} +.highcharts-drilldown-data-label text, +text.highcharts-drilldown-data-label, +.highcharts-drilldown-axis-label { + cursor: pointer; + fill: $highlight-color-100; + font-weight: bold; + text-decoration: underline; +} + +/* No-data module */ +.highcharts-no-data text { + font-weight: bold; + font-size: 12px; + fill: $neutral-color-60; +} + +/* Drag-panes module */ +.highcharts-axis-resizer { + cursor: ns-resize; + stroke: black; + stroke-width: 2px; +} + +/* Bullet type series */ +.highcharts-bullet-target { + stroke-width: 0; +} + +/* Lineargauge type series */ +.highcharts-lineargauge-target { + stroke-width: 1px; + stroke: $neutral-color-80; +} +.highcharts-lineargauge-target-line { + stroke-width: 1px; + stroke: $neutral-color-80; +} + +/* Annotations module */ +.highcharts-annotation-label-box { + stroke-width: 1px; + stroke: $neutral-color-100; + fill: $neutral-color-100; + fill-opacity: 0.75; +} +.highcharts-annotation-label text { + fill: $neutral-color-10; +} + +/* Gantt */ +.highcharts-treegrid-node-collapsed, .highcharts-treegrid-node-expanded { + cursor: pointer; +} +.highcharts-point-connecting-path { + fill: none; +} +.highcharts-grid-axis .highcharts-tick { + stroke-width: 1px; +} +.highcharts-grid-axis .highcharts-axis-line { + stroke-width: 1px; +} \ No newline at end of file diff --git a/DiscImageChef.Server/styles/dos/_colors.scss b/DiscImageChef.Server/styles/dos/_colors.scss new file mode 100644 index 00000000..81d0f725 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/_colors.scss @@ -0,0 +1,90 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _colors.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets colors for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +/* Sets the grayscale for Bootstrap */ +$white: #AAAAAA; +$darkgray: #555555; +$gray-100: #AAAAAA; +$gray-200: #AAAAAA; +$gray-300: #AAAAAA; +$gray-400: #AAAAAA; +$gray-500: #555555; +$gray-600: #555555; +$gray-700: #555555; +$gray-800: #555555; +$gray-900: #555555; +$black: #000; + +/* Sets color palette, using EGA colors */ +$blue: #0000AA; +$indigo: #AA55AA; +$purple: #AA00FF; +$pink: #FF55FF; +$red: #AA0000; +$orange: #FF5555; +$yellow: #FFFF55; +$green: #00AA00; +$teal: #55FFFF; +$cyan: #00AAAA; +$brown: #AA5500; +$brightwhite: #FFFFFF; + +/* Bootstrap color aliases */ +$primary: $blue; +$secondary: $gray-600; +$success: $green; +$info: $cyan; +$warning: $yellow; +$danger: $red; +$light: $gray-100; +$dark: $gray-800; + +/* Colors for */ +$body-bg: $black; +$body-color: $white; + +/* Colors for */ +$link-color: $teal; +$link-hover-color: $yellow; + +/* Colors for cards */ +$card-border-color: rgba($darkgray, .125); +$card-cap-bg: rgba($darkgray, .03); +$card-cap-color: inherit; +$card-bg: $blue; + +/* Colors for tables */ +$table-dark-bg: $cyan; +$table-dark-accent-bg: rgba($white, .05) !default; +$table-dark-hover-bg: rgba($white, .075) !default; +$table-dark-border-color: lighten($yellow, 7.5%) !default; +$table-dark-color: $yellow !default; diff --git a/DiscImageChef.Server/styles/dos/_font.scss b/DiscImageChef.Server/styles/dos/_font.scss new file mode 100644 index 00000000..5bc8a839 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/_font.scss @@ -0,0 +1,51 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _font.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets font for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +/* Sets font to VGA square */ +@font-face +{ + font-family: 'VGAsquarePx'; + src: url(../../fonts/vga_squarepx.eot); + src: url(../../fonts/vga_squarepx.eot?#iefix) format('embedded-opentype'), + url(../../fonts/vga_squarepx.woff2) format('woff2'), + url(../../fonts/vga_squarepx.woff) format('woff'), + url(../../fonts/vga_squarepx.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} + +$font-family-sans-serif: 'VGAsquarePx'; +$font-family-monospace: 'VGAsquarePx'; +$font-family-base: 'VGAsquarePx'; +$font-size-base: 1.75rem; + +$line-height-base: 1; diff --git a/DiscImageChef.Server/styles/dos/_fontstyles.scss b/DiscImageChef.Server/styles/dos/_fontstyles.scss new file mode 100644 index 00000000..b0338784 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/_fontstyles.scss @@ -0,0 +1,51 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _fontstyles.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets font styles for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; + +/* Sets the style for emphasis/italics */ +em, i +{ + color: $green; + font-style: normal; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong +{ + color: $brightwhite; + font-size: 1em; + font-style: normal; + font-weight: normal; + margin: 0; +} diff --git a/DiscImageChef.Server/styles/dos/dicserver.css b/DiscImageChef.Server/styles/dos/dicserver.css new file mode 100644 index 00000000..b26517b6 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/dicserver.css @@ -0,0 +1,9596 @@ +@charset "UTF-8"; +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using EGA colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets font to VGA square */ +@font-face { + font-family: "VGAsquarePx"; + src: url(../../fonts/vga_squarepx.eot); + src: url(../../fonts/vga_squarepx.eot?#iefix) format("embedded-opentype"), url(../../fonts/vga_squarepx.woff2) format("woff2"), url(../../fonts/vga_squarepx.woff) format("woff"), url(../../fonts/vga_squarepx.ttf) format("truetype"); + font-weight: normal; + font-style: normal; +} +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using EGA colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets the style for emphasis/italics */ +em, i { + color: #00AA00; + font-style: normal; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong { + color: #FFFFFF; + font-size: 1em; + font-style: normal; + font-weight: normal; + margin: 0; +} + +/*! + * Bootstrap v4.2.1 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #0000AA; + --indigo: #AA55AA; + --purple: #AA00FF; + --pink: #FF55FF; + --red: #AA0000; + --orange: #FF5555; + --yellow: #FFFF55; + --green: #00AA00; + --teal: #55FFFF; + --cyan: #00AAAA; + --white: #AAAAAA; + --gray: #555555; + --gray-dark: #555555; + --primary: #0000AA; + --secondary: #555555; + --success: #00AA00; + --info: #00AAAA; + --warning: #FFFF55; + --danger: #AA0000; + --light: #AAAAAA; + --dark: #555555; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: "VGAsquarePx"; + --font-family-monospace: "VGAsquarePx"; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: "VGAsquarePx"; + font-size: 1.75rem; + font-weight: 400; + line-height: 1; + color: #AAAAAA; + text-align: left; + background-color: #000; +} + +[tabindex="-1"]:focus { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: #55FFFF; + text-decoration: none; + background-color: transparent; +} +a:hover { + color: #FFFF55; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: "VGAsquarePx"; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #555555; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type=radio], +input[type=checkbox] { + box-sizing: border-box; + padding: 0; +} + +input[type=date], +input[type=time], +input[type=datetime-local], +input[type=month] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 500; + line-height: 1.2; + color: inherit; +} + +h1, .h1 { + font-size: 4.375rem; +} + +h2, .h2 { + font-size: 3.5rem; +} + +h3, .h3 { + font-size: 3.0625rem; +} + +h4, .h4 { + font-size: 2.625rem; +} + +h5, .h5 { + font-size: 2.1875rem; +} + +h6, .h6 { + font-size: 1.75rem; +} + +.lead { + font-size: 2.1875rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 2.1875rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #555555; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #000; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #555555; +} + +code { + font-size: 87.5%; + color: #FF55FF; + word-break: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #AAAAAA; + background-color: #555555; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #555555; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.row { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} +.no-gutters > .col, +.no-gutters > [class*=col-] { + padding-right: 0; + padding-left: 0; +} + +.col-xl, +.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg, +.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md, +.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm, +.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col, +.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; +} + +.col-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; +} + +.col-3 { + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; +} + +.col-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; +} + +.col-6 { + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; +} + +.col-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; +} + +.col-9 { + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; +} + +.col-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; +} + +.col-12 { + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + order: -1; +} + +.order-last { + order: 13; +} + +.order-0 { + order: 0; +} + +.order-1 { + order: 1; +} + +.order-2 { + order: 2; +} + +.order-3 { + order: 3; +} + +.order-4 { + order: 4; +} + +.order-5 { + order: 5; +} + +.order-6 { + order: 6; +} + +.order-7 { + order: 7; +} + +.order-8 { + order: 8; +} + +.order-9 { + order: 9; +} + +.order-10 { + order: 10; +} + +.order-11 { + order: 11; +} + +.order-12 { + order: 12; +} + +.offset-1 { + margin-left: 8.3333333333%; +} + +.offset-2 { + margin-left: 16.6666666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.3333333333%; +} + +.offset-5 { + margin-left: 41.6666666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.3333333333%; +} + +.offset-8 { + margin-left: 66.6666666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.3333333333%; +} + +.offset-11 { + margin-left: 91.6666666667%; +} + +@media (min-width: 576px) { + .col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-sm-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-sm-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-sm-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-sm-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-sm-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-sm-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-sm-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-sm-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-sm-first { + order: -1; + } + + .order-sm-last { + order: 13; + } + + .order-sm-0 { + order: 0; + } + + .order-sm-1 { + order: 1; + } + + .order-sm-2 { + order: 2; + } + + .order-sm-3 { + order: 3; + } + + .order-sm-4 { + order: 4; + } + + .order-sm-5 { + order: 5; + } + + .order-sm-6 { + order: 6; + } + + .order-sm-7 { + order: 7; + } + + .order-sm-8 { + order: 8; + } + + .order-sm-9 { + order: 9; + } + + .order-sm-10 { + order: 10; + } + + .order-sm-11 { + order: 11; + } + + .order-sm-12 { + order: 12; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.3333333333%; + } + + .offset-sm-2 { + margin-left: 16.6666666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.3333333333%; + } + + .offset-sm-5 { + margin-left: 41.6666666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.3333333333%; + } + + .offset-sm-8 { + margin-left: 66.6666666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.3333333333%; + } + + .offset-sm-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 768px) { + .col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-md-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-md-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-md-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-md-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-md-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-md-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-md-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-md-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-md-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-md-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-md-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-md-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-md-first { + order: -1; + } + + .order-md-last { + order: 13; + } + + .order-md-0 { + order: 0; + } + + .order-md-1 { + order: 1; + } + + .order-md-2 { + order: 2; + } + + .order-md-3 { + order: 3; + } + + .order-md-4 { + order: 4; + } + + .order-md-5 { + order: 5; + } + + .order-md-6 { + order: 6; + } + + .order-md-7 { + order: 7; + } + + .order-md-8 { + order: 8; + } + + .order-md-9 { + order: 9; + } + + .order-md-10 { + order: 10; + } + + .order-md-11 { + order: 11; + } + + .order-md-12 { + order: 12; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.3333333333%; + } + + .offset-md-2 { + margin-left: 16.6666666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.3333333333%; + } + + .offset-md-5 { + margin-left: 41.6666666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.3333333333%; + } + + .offset-md-8 { + margin-left: 66.6666666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.3333333333%; + } + + .offset-md-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 992px) { + .col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-lg-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-lg-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-lg-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-lg-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-lg-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-lg-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-lg-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-lg-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-lg-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-lg-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-lg-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-lg-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-lg-first { + order: -1; + } + + .order-lg-last { + order: 13; + } + + .order-lg-0 { + order: 0; + } + + .order-lg-1 { + order: 1; + } + + .order-lg-2 { + order: 2; + } + + .order-lg-3 { + order: 3; + } + + .order-lg-4 { + order: 4; + } + + .order-lg-5 { + order: 5; + } + + .order-lg-6 { + order: 6; + } + + .order-lg-7 { + order: 7; + } + + .order-lg-8 { + order: 8; + } + + .order-lg-9 { + order: 9; + } + + .order-lg-10 { + order: 10; + } + + .order-lg-11 { + order: 11; + } + + .order-lg-12 { + order: 12; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.3333333333%; + } + + .offset-lg-2 { + margin-left: 16.6666666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.3333333333%; + } + + .offset-lg-5 { + margin-left: 41.6666666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.3333333333%; + } + + .offset-lg-8 { + margin-left: 66.6666666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.3333333333%; + } + + .offset-lg-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 1200px) { + .col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-xl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-xl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-xl-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-xl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-xl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-xl-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-xl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-xl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-xl-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-xl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-xl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-xl-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-xl-first { + order: -1; + } + + .order-xl-last { + order: 13; + } + + .order-xl-0 { + order: 0; + } + + .order-xl-1 { + order: 1; + } + + .order-xl-2 { + order: 2; + } + + .order-xl-3 { + order: 3; + } + + .order-xl-4 { + order: 4; + } + + .order-xl-5 { + order: 5; + } + + .order-xl-6 { + order: 6; + } + + .order-xl-7 { + order: 7; + } + + .order-xl-8 { + order: 8; + } + + .order-xl-9 { + order: 9; + } + + .order-xl-10 { + order: 10; + } + + .order-xl-11 { + order: 11; + } + + .order-xl-12 { + order: 12; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.3333333333%; + } + + .offset-xl-2 { + margin-left: 16.6666666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.3333333333%; + } + + .offset-xl-5 { + margin-left: 41.6666666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.3333333333%; + } + + .offset-xl-8 { + margin-left: 66.6666666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.3333333333%; + } + + .offset-xl-11 { + margin-left: 91.6666666667%; + } +} +.table { + width: 100%; + margin-bottom: 1rem; + background-color: transparent; +} +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #AAAAAA; +} +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #AAAAAA; +} +.table tbody + tbody { + border-top: 2px solid #AAAAAA; +} +.table .table { + background-color: #000; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #AAAAAA; +} +.table-bordered th, +.table-bordered td { + border: 1px solid #AAAAAA; +} +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #7a7aaa; +} +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #5252aa; +} + +.table-hover .table-primary:hover { + background-color: #6a6aa0; +} +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #6a6aa0; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #929292; +} +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #7e7e7e; +} + +.table-hover .table-secondary:hover { + background-color: #858585; +} +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #858585; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #7aaa7a; +} +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #52aa52; +} + +.table-hover .table-success:hover { + background-color: #6aa06a; +} +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #6aa06a; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #7aaaaa; +} +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #52aaaa; +} + +.table-hover .table-info:hover { + background-color: #6aa0a0; +} +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #6aa0a0; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #c2c292; +} +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #d6d67e; +} + +.table-hover .table-warning:hover { + background-color: #b9b982; +} +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #b9b982; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #aa7a7a; +} +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #aa5252; +} + +.table-hover .table-danger:hover { + background-color: #a06a6a; +} +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #a06a6a; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #aaaaaa; +} +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #aaaaaa; +} + +.table-hover .table-light:hover { + background-color: #9d9d9d; +} +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #9d9d9d; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #929292; +} +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #7e7e7e; +} + +.table-hover .table-dark:hover { + background-color: #858585; +} +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #858585; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #FFFF55; + background-color: #00AAAA; + border-color: #ffff7b; +} +.table .thead-light th { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} + +.table-dark { + color: #FFFF55; + background-color: #00AAAA; +} +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #ffff7b; +} +.table-dark.table-bordered { + border: 0; +} +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(170, 170, 170, 0.05); +} +.table-dark.table-hover tbody tr:hover { + background-color: rgba(170, 170, 170, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; +} +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + height: calc(2.5rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1.75rem; + font-weight: 400; + line-height: 1; + color: #555555; + background-color: #AAAAAA; + background-clip: padding-box; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control:focus { + color: #555555; + background-color: #AAAAAA; + border-color: #2b2bff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.form-control::placeholder { + color: #555555; + opacity: 1; +} +.form-control:disabled, .form-control[readonly] { + background-color: #AAAAAA; + opacity: 1; +} + +select.form-control:focus::-ms-value { + color: #555555; + background-color: #AAAAAA; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 2.1875rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 1.53125rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1; + color: #AAAAAA; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(2.796875rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 1.53125rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.form-control-lg { + height: calc(4.28125rem + 2px); + padding: 0.5rem 1rem; + font-size: 2.1875rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} +.form-row > .col, +.form-row > [class*=col-] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} +.form-check-input:disabled ~ .form-check-label { + color: #555555; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #00AA00; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 1.53125rem; + line-height: 1; + color: #AAAAAA; + background-color: rgba(0, 170, 0, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #00AA00; + padding-right: 2.5rem; + background-repeat: no-repeat; + background-position: center right calc(2.5rem / 4); + background-size: calc(2.5rem / 2) calc(2.5rem / 2); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300AA00' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #00AA00; + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.25); +} +.was-validated .form-control:valid ~ .valid-feedback, +.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, +.form-control.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: 2.5rem; + background-position: top calc(2.5rem / 4) right calc(2.5rem / 4); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #00AA00; + padding-right: 3.625rem; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23555555' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300AA00' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") no-repeat center right 1.75rem/1.25rem 1.25rem; +} +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #00AA00; + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.25); +} +.was-validated .custom-select:valid ~ .valid-feedback, +.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, +.custom-select.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control-file:valid ~ .valid-feedback, +.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback, +.form-control-file.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #00AA00; +} +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #00AA00; +} +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #00AA00; +} +.was-validated .custom-control-input:valid ~ .valid-feedback, +.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, +.custom-control-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #00dd00; + background-color: #00dd00; +} +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.25); +} +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #00AA00; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #00AA00; +} +.was-validated .custom-file-input:valid ~ .valid-feedback, +.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, +.custom-file-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #00AA00; + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #AA0000; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 1.53125rem; + line-height: 1; + color: #AAAAAA; + background-color: rgba(170, 0, 0, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #AA0000; + padding-right: 2.5rem; + background-repeat: no-repeat; + background-position: center right calc(2.5rem / 4); + background-size: calc(2.5rem / 2) calc(2.5rem / 2); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23AA0000' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #AA0000; + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.25); +} +.was-validated .form-control:invalid ~ .invalid-feedback, +.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, +.form-control.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: 2.5rem; + background-position: top calc(2.5rem / 4) right calc(2.5rem / 4); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #AA0000; + padding-right: 3.625rem; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23555555' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23AA0000' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") no-repeat center right 1.75rem/1.25rem 1.25rem; +} +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #AA0000; + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.25); +} +.was-validated .custom-select:invalid ~ .invalid-feedback, +.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, +.custom-select.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control-file:invalid ~ .invalid-feedback, +.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback, +.form-control-file.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #AA0000; +} +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #AA0000; +} +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #AA0000; +} +.was-validated .custom-control-input:invalid ~ .invalid-feedback, +.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, +.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #dd0000; + background-color: #dd0000; +} +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.25); +} +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #AA0000; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #AA0000; +} +.was-validated .custom-file-input:invalid ~ .invalid-feedback, +.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, +.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #AA0000; + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.25); +} + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center; +} +.form-inline .form-check { + width: 100%; +} +@media (min-width: 576px) { + .form-inline label { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, +.form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + align-items: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #AAAAAA; + text-align: center; + vertical-align: middle; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1.75rem; + line-height: 1; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: #AAAAAA; + text-decoration: none; +} +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.btn.disabled, .btn:disabled { + opacity: 0.65; +} +.btn:not(:disabled):not(.disabled) { + cursor: pointer; +} +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.btn-primary:hover { + color: #AAAAAA; + background-color: #000084; + border-color: #000077; +} +.btn-primary:focus, .btn-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(26, 26, 170, 0.5); +} +.btn-primary.disabled, .btn-primary:disabled { + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { + color: #AAAAAA; + background-color: #000077; + border-color: #00006a; +} +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(26, 26, 170, 0.5); +} + +.btn-secondary { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-secondary:hover { + color: #AAAAAA; + background-color: #424242; + border-color: #3c3c3c; +} +.btn-secondary:focus, .btn-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(98, 98, 98, 0.5); +} +.btn-secondary.disabled, .btn-secondary:disabled { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { + color: #AAAAAA; + background-color: #3c3c3c; + border-color: #353535; +} +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(98, 98, 98, 0.5); +} + +.btn-success { + color: #AAAAAA; + background-color: #00AA00; + border-color: #00AA00; +} +.btn-success:hover { + color: #AAAAAA; + background-color: #008400; + border-color: #007700; +} +.btn-success:focus, .btn-success.focus { + box-shadow: 0 0 0 0.2rem rgba(26, 170, 26, 0.5); +} +.btn-success.disabled, .btn-success:disabled { + color: #AAAAAA; + background-color: #00AA00; + border-color: #00AA00; +} +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { + color: #AAAAAA; + background-color: #007700; + border-color: #006a00; +} +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(26, 170, 26, 0.5); +} + +.btn-info { + color: #AAAAAA; + background-color: #00AAAA; + border-color: #00AAAA; +} +.btn-info:hover { + color: #AAAAAA; + background-color: #008484; + border-color: #007777; +} +.btn-info:focus, .btn-info.focus { + box-shadow: 0 0 0 0.2rem rgba(26, 170, 170, 0.5); +} +.btn-info.disabled, .btn-info:disabled { + color: #AAAAAA; + background-color: #00AAAA; + border-color: #00AAAA; +} +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { + color: #AAAAAA; + background-color: #007777; + border-color: #006a6a; +} +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(26, 170, 170, 0.5); +} + +.btn-warning { + color: #555555; + background-color: #FFFF55; + border-color: #FFFF55; +} +.btn-warning:hover { + color: #555555; + background-color: #ffff2f; + border-color: #ffff22; +} +.btn-warning:focus, .btn-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(230, 230, 85, 0.5); +} +.btn-warning.disabled, .btn-warning:disabled { + color: #555555; + background-color: #FFFF55; + border-color: #FFFF55; +} +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle { + color: #555555; + background-color: #ffff22; + border-color: #ffff15; +} +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(230, 230, 85, 0.5); +} + +.btn-danger { + color: #AAAAAA; + background-color: #AA0000; + border-color: #AA0000; +} +.btn-danger:hover { + color: #AAAAAA; + background-color: #840000; + border-color: #770000; +} +.btn-danger:focus, .btn-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(170, 26, 26, 0.5); +} +.btn-danger.disabled, .btn-danger:disabled { + color: #AAAAAA; + background-color: #AA0000; + border-color: #AA0000; +} +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { + color: #AAAAAA; + background-color: #770000; + border-color: #6a0000; +} +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(170, 26, 26, 0.5); +} + +.btn-light { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-light:hover { + color: #555555; + background-color: #979797; + border-color: #919191; +} +.btn-light:focus, .btn-light.focus { + box-shadow: 0 0 0 0.2rem rgba(157, 157, 157, 0.5); +} +.btn-light.disabled, .btn-light:disabled { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { + color: #AAAAAA; + background-color: #919191; + border-color: #8a8a8a; +} +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(157, 157, 157, 0.5); +} + +.btn-dark { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-dark:hover { + color: #AAAAAA; + background-color: #424242; + border-color: #3c3c3c; +} +.btn-dark:focus, .btn-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(98, 98, 98, 0.5); +} +.btn-dark.disabled, .btn-dark:disabled { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { + color: #AAAAAA; + background-color: #3c3c3c; + border-color: #353535; +} +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(98, 98, 98, 0.5); +} + +.btn-outline-primary { + color: #0000AA; + border-color: #0000AA; +} +.btn-outline-primary:hover { + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.5); +} +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #0000AA; + background-color: transparent; +} +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.5); +} + +.btn-outline-secondary { + color: #555555; + border-color: #555555; +} +.btn-outline-secondary:hover { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(85, 85, 85, 0.5); +} +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #555555; + background-color: transparent; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(85, 85, 85, 0.5); +} + +.btn-outline-success { + color: #00AA00; + border-color: #00AA00; +} +.btn-outline-success:hover { + color: #AAAAAA; + background-color: #00AA00; + border-color: #00AA00; +} +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.5); +} +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #00AA00; + background-color: transparent; +} +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { + color: #AAAAAA; + background-color: #00AA00; + border-color: #00AA00; +} +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.5); +} + +.btn-outline-info { + color: #00AAAA; + border-color: #00AAAA; +} +.btn-outline-info:hover { + color: #AAAAAA; + background-color: #00AAAA; + border-color: #00AAAA; +} +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 170, 0.5); +} +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #00AAAA; + background-color: transparent; +} +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { + color: #AAAAAA; + background-color: #00AAAA; + border-color: #00AAAA; +} +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 170, 0.5); +} + +.btn-outline-warning { + color: #FFFF55; + border-color: #FFFF55; +} +.btn-outline-warning:hover { + color: #555555; + background-color: #FFFF55; + border-color: #FFFF55; +} +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(255, 255, 85, 0.5); +} +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #FFFF55; + background-color: transparent; +} +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { + color: #555555; + background-color: #FFFF55; + border-color: #FFFF55; +} +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 255, 85, 0.5); +} + +.btn-outline-danger { + color: #AA0000; + border-color: #AA0000; +} +.btn-outline-danger:hover { + color: #AAAAAA; + background-color: #AA0000; + border-color: #AA0000; +} +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.5); +} +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #AA0000; + background-color: transparent; +} +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { + color: #AAAAAA; + background-color: #AA0000; + border-color: #AA0000; +} +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.5); +} + +.btn-outline-light { + color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-outline-light:hover { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(170, 170, 170, 0.5); +} +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #AAAAAA; + background-color: transparent; +} +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(170, 170, 170, 0.5); +} + +.btn-outline-dark { + color: #555555; + border-color: #555555; +} +.btn-outline-dark:hover { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(85, 85, 85, 0.5); +} +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #555555; + background-color: transparent; +} +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(85, 85, 85, 0.5); +} + +.btn-link { + font-weight: 400; + color: #55FFFF; +} +.btn-link:hover { + color: #FFFF55; + text-decoration: underline; +} +.btn-link:focus, .btn-link.focus { + text-decoration: underline; + box-shadow: none; +} +.btn-link:disabled, .btn-link.disabled { + color: #555555; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 2.1875rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 1.53125rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type=submit].btn-block, +input[type=reset].btn-block, +input[type=button].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} +@media screen and (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1.75rem; + color: #AAAAAA; + text-align: left; + list-style: none; + background-color: #AAAAAA; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} +.dropdown-menu-left { + right: auto; + left: 0; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } +} +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropleft .dropdown-toggle::after { + display: none; +} +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^=top], .dropdown-menu[x-placement^=right], .dropdown-menu[x-placement^=bottom], .dropdown-menu[x-placement^=left] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #AAAAAA; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #555555; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:first-child { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.dropdown-item:last-child { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.dropdown-item:hover, .dropdown-item:focus { + color: #484848; + text-decoration: none; + background-color: #AAAAAA; +} +.dropdown-item.active, .dropdown-item:active { + color: #AAAAAA; + text-decoration: none; + background-color: #0000AA; +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: #555555; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 1.53125rem; + color: #555555; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #555555; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after { + margin-left: 0; +} +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} +.btn-group-toggle > .btn input[type=radio], +.btn-group-toggle > .btn input[type=checkbox], +.btn-group-toggle > .btn-group > .btn input[type=radio], +.btn-group-toggle > .btn-group > .btn input[type=checkbox] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; +} +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} +.input-group > .form-control:not(:last-child), +.input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .custom-file { + display: flex; + align-items: center; +} +.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: flex; +} +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1.75rem; + font-weight: 400; + line-height: 1; + color: #555555; + text-align: center; + white-space: nowrap; + background-color: #AAAAAA; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; +} +.input-group-text input[type=radio], +.input-group-text input[type=checkbox] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(4.28125rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 2.1875rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(2.796875rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 1.53125rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + display: block; + min-height: 1.75rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; +} +.custom-control-input:checked ~ .custom-control-label::before { + color: #AAAAAA; + border-color: #0000AA; + background-color: #0000AA; +} +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #2b2bff; +} +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #AAAAAA; + background-color: #5e5eff; + border-color: #5e5eff; +} +.custom-control-input:disabled ~ .custom-control-label { + color: #555555; +} +.custom-control-input:disabled ~ .custom-control-label::before { + background-color: #AAAAAA; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} +.custom-control-label::before { + position: absolute; + top: 0.375rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #AAAAAA; + border: #555555 solid 1px; +} +.custom-control-label::after { + position: absolute; + top: 0.375rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background-repeat: no-repeat; + background-position: center center; + background-size: 50% 50%; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; +} +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23AAAAAA' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #0000AA; + background-color: #0000AA; +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23AAAAAA' d='M0 2h4'/%3e%3c/svg%3e"); +} +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 170, 0.5); +} +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 0, 170, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23AAAAAA'/%3e%3c/svg%3e"); +} +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 170, 0.5); +} + +.custom-switch { + padding-left: 2.25rem; +} +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} +.custom-switch .custom-control-label::after { + top: calc(0.375rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #555555; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #AAAAAA; + transform: translateX(0.75rem); +} +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 170, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(2.5rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-weight: 400; + line-height: 1; + color: #555555; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23555555' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #AAAAAA; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; + appearance: none; +} +.custom-select:focus { + border-color: #2b2bff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(43, 43, 255, 0.5); +} +.custom-select:focus::-ms-value { + color: #555555; + background-color: #AAAAAA; +} +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} +.custom-select:disabled { + color: #555555; + background-color: #AAAAAA; +} +.custom-select::-ms-expand { + opacity: 0; +} + +.custom-select-sm { + height: calc(2.796875rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 1.53125rem; +} + +.custom-select-lg { + height: calc(4.28125rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 2.1875rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(2.5rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(2.5rem + 2px); + margin: 0; + opacity: 0; +} +.custom-file-input:focus ~ .custom-file-label { + border-color: #2b2bff; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-file-input:disabled ~ .custom-file-label { + background-color: #AAAAAA; +} +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(2.5rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1; + color: #555555; + background-color: #AAAAAA; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; +} +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: 2.5rem; + padding: 0.375rem 0.75rem; + line-height: 1; + color: #555555; + content: "Browse"; + background-color: #AAAAAA; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; +} + +.custom-range { + width: 100%; + height: calc(1rem + 0.4rem); + padding: 0; + background-color: transparent; + appearance: none; +} +.custom-range:focus { + outline: none; +} +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #000, 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #000, 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #000, 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-range::-moz-focus-outer { + border: 0; +} +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0000AA; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; + } +} +.custom-range::-webkit-slider-thumb:active { + background-color: #5e5eff; +} +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #AAAAAA; + border-color: transparent; + border-radius: 1rem; +} +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0000AA; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; + } +} +.custom-range::-moz-range-thumb:active { + background-color: #5e5eff; +} +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #AAAAAA; + border-color: transparent; + border-radius: 1rem; +} +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #0000AA; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; + } +} +.custom-range::-ms-thumb:active { + background-color: #5e5eff; +} +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; +} +.custom-range::-ms-fill-lower { + background-color: #AAAAAA; + border-radius: 1rem; +} +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #AAAAAA; + border-radius: 1rem; +} +.custom-range:disabled::-webkit-slider-thumb { + background-color: #555555; +} +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} +.custom-range:disabled::-moz-range-thumb { + background-color: #555555; +} +.custom-range:disabled::-moz-range-track { + cursor: default; +} +.custom-range:disabled::-ms-thumb { + background-color: #555555; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-control-label::before, +.custom-file-label, +.custom-select { + transition: none; + } +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} +.nav-link.disabled { + color: #555555; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #AAAAAA; +} +.nav-tabs .nav-item { + margin-bottom: -1px; +} +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #AAAAAA #AAAAAA #AAAAAA; +} +.nav-tabs .nav-link.disabled { + color: #555555; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #555555; + background-color: #000; + border-color: #AAAAAA #AAAAAA #000; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #AAAAAA; + background-color: #0000AA; +} + +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 0.5rem 1rem; +} +.navbar > .container, +.navbar > .container-fluid { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.28125rem; + padding-bottom: 0.28125rem; + margin-right: 1rem; + font-size: 2.1875rem; + line-height: inherit; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 2.1875rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} +.navbar-toggler:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, +.navbar-expand-sm > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, +.navbar-expand-sm > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} +@media (max-width: 767.98px) { + .navbar-expand-md > .container, +.navbar-expand-md > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, +.navbar-expand-md > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, +.navbar-expand-lg > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, +.navbar-expand-lg > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, +.navbar-expand-xl > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, +.navbar-expand-xl > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + padding-right: 0; + padding-left: 0; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + flex-wrap: nowrap; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #AAAAAA; +} +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #AAAAAA; +} +.navbar-dark .navbar-nav .nav-link { + color: rgba(170, 170, 170, 0.5); +} +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(170, 170, 170, 0.75); +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(170, 170, 170, 0.25); +} +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #AAAAAA; +} +.navbar-dark .navbar-toggler { + color: rgba(170, 170, 170, 0.5); + border-color: rgba(170, 170, 170, 0.1); +} +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(170, 170, 170, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-dark .navbar-text { + color: rgba(170, 170, 170, 0.5); +} +.navbar-dark .navbar-text a { + color: #AAAAAA; +} +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #AAAAAA; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #0000AA; + background-clip: border-box; + border: 1px solid rgba(85, 85, 85, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-body { + flex: 1 1 auto; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + color: inherit; + background-color: rgba(85, 85, 85, 0.03); + border-bottom: 1px solid rgba(85, 85, 85, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(85, 85, 85, 0.03); + border-top: 1px solid rgba(85, 85, 85, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img { + width: 100%; + border-radius: calc(0.25rem - 1px); +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck { + display: flex; + flex-direction: column; +} +.card-deck .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-deck { + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + display: flex; + flex: 1 0 0%; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group { + display: flex; + flex-direction: column; +} +.card-group > .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-group { + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:first-child .card-img-top, +.card-group > .card:first-child .card-header { + border-top-right-radius: 0; + } + .card-group > .card:first-child .card-img-bottom, +.card-group > .card:first-child .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:last-child .card-img-top, +.card-group > .card:last-child .card-header { + border-top-left-radius: 0; + } + .card-group > .card:last-child .card-img-bottom, +.card-group > .card:last-child .card-footer { + border-bottom-left-radius: 0; + } + .card-group > .card:only-child { + border-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-top, +.card-group > .card:only-child .card-header { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-bottom, +.card-group > .card:only-child .card-footer { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) { + border-radius: 0; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer { + border-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-columns { + column-count: 3; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion .card { + overflow: hidden; +} +.accordion .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; +} +.accordion .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; +} +.accordion .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.accordion .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.accordion .card .card-header { + margin-bottom: -1px; +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #AAAAAA; + border-radius: 0.25rem; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #555555; + content: "/"; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} +.breadcrumb-item.active { + color: #555555; +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #55FFFF; + background-color: #AAAAAA; + border: 1px solid #AAAAAA; +} +.page-link:hover { + z-index: 2; + color: #FFFF55; + text-decoration: none; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.page-link:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} +.page-item.active .page-link { + z-index: 1; + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.page-item.disabled .page-link { + color: #555555; + pointer-events: none; + cursor: auto; + background-color: #AAAAAA; + border-color: #AAAAAA; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 2.1875rem; + line-height: 1.5; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 1.53125rem; + line-height: 1.5; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #AAAAAA; + background-color: #0000AA; +} +a.badge-primary:hover, a.badge-primary:focus { + color: #AAAAAA; + background-color: #000077; +} + +.badge-secondary { + color: #AAAAAA; + background-color: #555555; +} +a.badge-secondary:hover, a.badge-secondary:focus { + color: #AAAAAA; + background-color: #3c3c3c; +} + +.badge-success { + color: #AAAAAA; + background-color: #00AA00; +} +a.badge-success:hover, a.badge-success:focus { + color: #AAAAAA; + background-color: #007700; +} + +.badge-info { + color: #AAAAAA; + background-color: #00AAAA; +} +a.badge-info:hover, a.badge-info:focus { + color: #AAAAAA; + background-color: #007777; +} + +.badge-warning { + color: #555555; + background-color: #FFFF55; +} +a.badge-warning:hover, a.badge-warning:focus { + color: #555555; + background-color: #ffff22; +} + +.badge-danger { + color: #AAAAAA; + background-color: #AA0000; +} +a.badge-danger:hover, a.badge-danger:focus { + color: #AAAAAA; + background-color: #770000; +} + +.badge-light { + color: #555555; + background-color: #AAAAAA; +} +a.badge-light:hover, a.badge-light:focus { + color: #555555; + background-color: #919191; +} + +.badge-dark { + color: #AAAAAA; + background-color: #555555; +} +a.badge-dark:hover, a.badge-dark:focus { + color: #AAAAAA; + background-color: #3c3c3c; +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #AAAAAA; + border-radius: 0.3rem; +} +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 5.125rem; +} +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #000058; + background-color: #8888aa; + border-color: #7a7aaa; +} +.alert-primary hr { + border-top-color: #6a6aa0; +} +.alert-primary .alert-link { + color: #000025; +} + +.alert-secondary { + color: #2c2c2c; + background-color: #999999; + border-color: #929292; +} +.alert-secondary hr { + border-top-color: #858585; +} +.alert-secondary .alert-link { + color: #131313; +} + +.alert-success { + color: #005800; + background-color: #88aa88; + border-color: #7aaa7a; +} +.alert-success hr { + border-top-color: #6aa06a; +} +.alert-success .alert-link { + color: #002500; +} + +.alert-info { + color: #005858; + background-color: #88aaaa; + border-color: #7aaaaa; +} +.alert-info hr { + border-top-color: #6aa0a0; +} +.alert-info .alert-link { + color: #002525; +} + +.alert-warning { + color: #85852c; + background-color: #bbbb99; + border-color: #c2c292; +} +.alert-warning hr { + border-top-color: #b9b982; +} +.alert-warning .alert-link { + color: #5f5f1f; +} + +.alert-danger { + color: #580000; + background-color: #aa8888; + border-color: #aa7a7a; +} +.alert-danger hr { + border-top-color: #a06a6a; +} +.alert-danger .alert-link { + color: #250000; +} + +.alert-light { + color: #585858; + background-color: #aaaaaa; + border-color: #aaaaaa; +} +.alert-light hr { + border-top-color: #9d9d9d; +} +.alert-light .alert-link { + color: #3f3f3f; +} + +.alert-dark { + color: #2c2c2c; + background-color: #999999; + border-color: #929292; +} +.alert-dark hr { + border-top-color: #858585; +} +.alert-dark .alert-link { + color: #131313; +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 1.3125rem; + background-color: #AAAAAA; + border-radius: 0.25rem; +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + color: #AAAAAA; + text-align: center; + white-space: nowrap; + background-color: #0000AA; + transition: width 0.6s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(170, 170, 170, 0.15) 25%, transparent 25%, transparent 50%, rgba(170, 170, 170, 0.15) 50%, rgba(170, 170, 170, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + animation: progress-bar-stripes 1s linear infinite; +} + +.media { + display: flex; + align-items: flex-start; +} + +.media-body { + flex: 1; +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #555555; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + color: #555555; + text-decoration: none; + background-color: #AAAAAA; +} +.list-group-item-action:active { + color: #AAAAAA; + background-color: #AAAAAA; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #AAAAAA; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.list-group-item:hover, .list-group-item:focus { + z-index: 1; + text-decoration: none; +} +.list-group-item.disabled, .list-group-item:disabled { + color: #555555; + pointer-events: none; + background-color: #AAAAAA; +} +.list-group-item.active { + z-index: 2; + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.list-group-flush .list-group-item:last-child { + margin-bottom: -1px; +} +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; +} +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0; +} + +.list-group-item-primary { + color: #000058; + background-color: #7a7aaa; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #000058; + background-color: #6a6aa0; +} +.list-group-item-primary.list-group-item-action.active { + color: #AAAAAA; + background-color: #000058; + border-color: #000058; +} + +.list-group-item-secondary { + color: #2c2c2c; + background-color: #929292; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #2c2c2c; + background-color: #858585; +} +.list-group-item-secondary.list-group-item-action.active { + color: #AAAAAA; + background-color: #2c2c2c; + border-color: #2c2c2c; +} + +.list-group-item-success { + color: #005800; + background-color: #7aaa7a; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #005800; + background-color: #6aa06a; +} +.list-group-item-success.list-group-item-action.active { + color: #AAAAAA; + background-color: #005800; + border-color: #005800; +} + +.list-group-item-info { + color: #005858; + background-color: #7aaaaa; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #005858; + background-color: #6aa0a0; +} +.list-group-item-info.list-group-item-action.active { + color: #AAAAAA; + background-color: #005858; + border-color: #005858; +} + +.list-group-item-warning { + color: #85852c; + background-color: #c2c292; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #85852c; + background-color: #b9b982; +} +.list-group-item-warning.list-group-item-action.active { + color: #AAAAAA; + background-color: #85852c; + border-color: #85852c; +} + +.list-group-item-danger { + color: #580000; + background-color: #aa7a7a; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #580000; + background-color: #a06a6a; +} +.list-group-item-danger.list-group-item-action.active { + color: #AAAAAA; + background-color: #580000; + border-color: #580000; +} + +.list-group-item-light { + color: #585858; + background-color: #aaaaaa; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #585858; + background-color: #9d9d9d; +} +.list-group-item-light.list-group-item-action.active { + color: #AAAAAA; + background-color: #585858; + border-color: #585858; +} + +.list-group-item-dark { + color: #2c2c2c; + background-color: #929292; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #2c2c2c; + background-color: #858585; +} +.list-group-item-dark.list-group-item-action.active { + color: #AAAAAA; + background-color: #2c2c2c; + border-color: #2c2c2c; +} + +.close { + float: right; + font-size: 2.625rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #AAAAAA; + opacity: 0.5; +} +.close:hover { + color: #000; + text-decoration: none; +} +.close:not(:disabled):not(.disabled) { + cursor: pointer; +} +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: 0.75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + appearance: none; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(170, 170, 170, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + opacity: 0; +} +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} +.toast.showing { + opacity: 1; +} +.toast.show { + display: block; + opacity: 1; +} +.toast.hide { + display: none; +} + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #555555; + background-color: rgba(170, 170, 170, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media screen and (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - (0.5rem * 2)); +} +.modal-dialog-centered::before { + display: block; + height: calc(100vh - (0.5rem * 2)); + content: ""; +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #AAAAAA; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #AAAAAA; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem; +} +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1; +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #AAAAAA; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.modal-footer > :not(:first-child) { + margin-left: 0.25rem; +} +.modal-footer > :not(:last-child) { + margin-right: 0.25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + + .modal-dialog-centered { + min-height: calc(100% - (1.75rem * 2)); + } + .modal-dialog-centered::before { + height: calc(100vh - (1.75rem * 2)); + } + + .modal-sm { + max-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, +.modal-xl { + max-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: "VGAsquarePx"; + font-style: normal; + font-weight: 400; + line-height: 1; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 1.53125rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top] { + padding: 0.4rem 0; +} +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow { + bottom: 0; +} +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right] { + padding: 0 0.4rem; +} +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom] { + padding: 0.4rem 0; +} +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow { + top: 0; +} +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left] { + padding: 0 0.4rem; +} +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #AAAAAA; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: "VGAsquarePx"; + font-style: normal; + font-weight: 400; + line-height: 1; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 1.53125rem; + word-wrap: break-word; + background-color: #AAAAAA; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^=top] { + margin-bottom: 0.5rem; +} +.bs-popover-top .arrow, .bs-popover-auto[x-placement^=top] .arrow { + bottom: calc((0.5rem + 1px) * -1); +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=top] .arrow::before, +.bs-popover-top .arrow::after, +.bs-popover-auto[x-placement^=top] .arrow::after { + border-width: 0.5rem 0.5rem 0; +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=top] .arrow::before { + bottom: 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-top .arrow::after, .bs-popover-auto[x-placement^=top] .arrow::after { + bottom: 1px; + border-top-color: #AAAAAA; +} + +.bs-popover-right, .bs-popover-auto[x-placement^=right] { + margin-left: 0.5rem; +} +.bs-popover-right .arrow, .bs-popover-auto[x-placement^=right] .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=right] .arrow::before, +.bs-popover-right .arrow::after, +.bs-popover-auto[x-placement^=right] .arrow::after { + border-width: 0.5rem 0.5rem 0.5rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=right] .arrow::before { + left: 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-right .arrow::after, .bs-popover-auto[x-placement^=right] .arrow::after { + left: 1px; + border-right-color: #AAAAAA; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^=bottom] { + margin-top: 0.5rem; +} +.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^=bottom] .arrow { + top: calc((0.5rem + 1px) * -1); +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=bottom] .arrow::before, +.bs-popover-bottom .arrow::after, +.bs-popover-auto[x-placement^=bottom] .arrow::after { + border-width: 0 0.5rem 0.5rem 0.5rem; +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=bottom] .arrow::before { + top: 0; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-bottom .arrow::after, .bs-popover-auto[x-placement^=bottom] .arrow::after { + top: 1px; + border-bottom-color: #AAAAAA; +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #a2a2a2; +} + +.bs-popover-left, .bs-popover-auto[x-placement^=left] { + margin-right: 0.5rem; +} +.bs-popover-left .arrow, .bs-popover-auto[x-placement^=left] .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=left] .arrow::before, +.bs-popover-left .arrow::after, +.bs-popover-auto[x-placement^=left] .arrow::after { + border-width: 0.5rem 0 0.5rem 0.5rem; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=left] .arrow::before { + right: 0; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-left .arrow::after, .bs-popover-auto[x-placement^=left] .arrow::after { + right: 1px; + border-left-color: #AAAAAA; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1.75rem; + color: inherit; + background-color: #a2a2a2; + border-bottom: 1px solid #969696; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #AAAAAA; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: 0s 0.6s opacity; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + color: #AAAAAA; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-control-prev, +.carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #AAAAAA; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: transparent no-repeat center center; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23AAAAAA' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23AAAAAA' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} +.carousel-indicators li { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #AAAAAA; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #AAAAAA; + text-align: center; +} + +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: spinner-border 0.75s linear infinite; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + } +} +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + animation: spinner-grow 0.75s linear infinite; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #0000AA !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #000077 !important; +} + +.bg-secondary { + background-color: #555555 !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #3c3c3c !important; +} + +.bg-success { + background-color: #00AA00 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #007700 !important; +} + +.bg-info { + background-color: #00AAAA !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #007777 !important; +} + +.bg-warning { + background-color: #FFFF55 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #ffff22 !important; +} + +.bg-danger { + background-color: #AA0000 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #770000 !important; +} + +.bg-light { + background-color: #AAAAAA !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #919191 !important; +} + +.bg-dark { + background-color: #555555 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #3c3c3c !important; +} + +.bg-white { + background-color: #AAAAAA !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #AAAAAA !important; +} + +.border-top { + border-top: 1px solid #AAAAAA !important; +} + +.border-right { + border-right: 1px solid #AAAAAA !important; +} + +.border-bottom { + border-bottom: 1px solid #AAAAAA !important; +} + +.border-left { + border-left: 1px solid #AAAAAA !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #0000AA !important; +} + +.border-secondary { + border-color: #555555 !important; +} + +.border-success { + border-color: #00AA00 !important; +} + +.border-info { + border-color: #00AAAA !important; +} + +.border-warning { + border-color: #FFFF55 !important; +} + +.border-danger { + border-color: #AA0000 !important; +} + +.border-light { + border-color: #AAAAAA !important; +} + +.border-dark { + border-color: #555555 !important; +} + +.border-white { + border-color: #AAAAAA !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: flex !important; + } + + .d-sm-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: flex !important; + } + + .d-md-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: flex !important; + } + + .d-lg-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: flex !important; + } + + .d-xl-inline-flex { + display: inline-flex !important; + } +} +@media print { + .d-print-none { + display: none !important; + } + + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: flex !important; + } + + .d-print-inline-flex { + display: inline-flex !important; + } +} +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} +.embed-responsive::before { + display: block; + content: ""; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.8571428571%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-3by4::before { + padding-top: 133.3333333333%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction: row !important; + } + + .flex-sm-column { + flex-direction: column !important; + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-sm-wrap { + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-sm-fill { + flex: 1 1 auto !important; + } + + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-sm-start { + justify-content: flex-start !important; + } + + .justify-content-sm-end { + justify-content: flex-end !important; + } + + .justify-content-sm-center { + justify-content: center !important; + } + + .justify-content-sm-between { + justify-content: space-between !important; + } + + .justify-content-sm-around { + justify-content: space-around !important; + } + + .align-items-sm-start { + align-items: flex-start !important; + } + + .align-items-sm-end { + align-items: flex-end !important; + } + + .align-items-sm-center { + align-items: center !important; + } + + .align-items-sm-baseline { + align-items: baseline !important; + } + + .align-items-sm-stretch { + align-items: stretch !important; + } + + .align-content-sm-start { + align-content: flex-start !important; + } + + .align-content-sm-end { + align-content: flex-end !important; + } + + .align-content-sm-center { + align-content: center !important; + } + + .align-content-sm-between { + align-content: space-between !important; + } + + .align-content-sm-around { + align-content: space-around !important; + } + + .align-content-sm-stretch { + align-content: stretch !important; + } + + .align-self-sm-auto { + align-self: auto !important; + } + + .align-self-sm-start { + align-self: flex-start !important; + } + + .align-self-sm-end { + align-self: flex-end !important; + } + + .align-self-sm-center { + align-self: center !important; + } + + .align-self-sm-baseline { + align-self: baseline !important; + } + + .align-self-sm-stretch { + align-self: stretch !important; + } +} +@media (min-width: 768px) { + .flex-md-row { + flex-direction: row !important; + } + + .flex-md-column { + flex-direction: column !important; + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-md-wrap { + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-md-fill { + flex: 1 1 auto !important; + } + + .flex-md-grow-0 { + flex-grow: 0 !important; + } + + .flex-md-grow-1 { + flex-grow: 1 !important; + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-md-start { + justify-content: flex-start !important; + } + + .justify-content-md-end { + justify-content: flex-end !important; + } + + .justify-content-md-center { + justify-content: center !important; + } + + .justify-content-md-between { + justify-content: space-between !important; + } + + .justify-content-md-around { + justify-content: space-around !important; + } + + .align-items-md-start { + align-items: flex-start !important; + } + + .align-items-md-end { + align-items: flex-end !important; + } + + .align-items-md-center { + align-items: center !important; + } + + .align-items-md-baseline { + align-items: baseline !important; + } + + .align-items-md-stretch { + align-items: stretch !important; + } + + .align-content-md-start { + align-content: flex-start !important; + } + + .align-content-md-end { + align-content: flex-end !important; + } + + .align-content-md-center { + align-content: center !important; + } + + .align-content-md-between { + align-content: space-between !important; + } + + .align-content-md-around { + align-content: space-around !important; + } + + .align-content-md-stretch { + align-content: stretch !important; + } + + .align-self-md-auto { + align-self: auto !important; + } + + .align-self-md-start { + align-self: flex-start !important; + } + + .align-self-md-end { + align-self: flex-end !important; + } + + .align-self-md-center { + align-self: center !important; + } + + .align-self-md-baseline { + align-self: baseline !important; + } + + .align-self-md-stretch { + align-self: stretch !important; + } +} +@media (min-width: 992px) { + .flex-lg-row { + flex-direction: row !important; + } + + .flex-lg-column { + flex-direction: column !important; + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-lg-wrap { + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-lg-fill { + flex: 1 1 auto !important; + } + + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-lg-start { + justify-content: flex-start !important; + } + + .justify-content-lg-end { + justify-content: flex-end !important; + } + + .justify-content-lg-center { + justify-content: center !important; + } + + .justify-content-lg-between { + justify-content: space-between !important; + } + + .justify-content-lg-around { + justify-content: space-around !important; + } + + .align-items-lg-start { + align-items: flex-start !important; + } + + .align-items-lg-end { + align-items: flex-end !important; + } + + .align-items-lg-center { + align-items: center !important; + } + + .align-items-lg-baseline { + align-items: baseline !important; + } + + .align-items-lg-stretch { + align-items: stretch !important; + } + + .align-content-lg-start { + align-content: flex-start !important; + } + + .align-content-lg-end { + align-content: flex-end !important; + } + + .align-content-lg-center { + align-content: center !important; + } + + .align-content-lg-between { + align-content: space-between !important; + } + + .align-content-lg-around { + align-content: space-around !important; + } + + .align-content-lg-stretch { + align-content: stretch !important; + } + + .align-self-lg-auto { + align-self: auto !important; + } + + .align-self-lg-start { + align-self: flex-start !important; + } + + .align-self-lg-end { + align-self: flex-end !important; + } + + .align-self-lg-center { + align-self: center !important; + } + + .align-self-lg-baseline { + align-self: baseline !important; + } + + .align-self-lg-stretch { + align-self: stretch !important; + } +} +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction: row !important; + } + + .flex-xl-column { + flex-direction: column !important; + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xl-wrap { + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-xl-fill { + flex: 1 1 auto !important; + } + + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-xl-start { + justify-content: flex-start !important; + } + + .justify-content-xl-end { + justify-content: flex-end !important; + } + + .justify-content-xl-center { + justify-content: center !important; + } + + .justify-content-xl-between { + justify-content: space-between !important; + } + + .justify-content-xl-around { + justify-content: space-around !important; + } + + .align-items-xl-start { + align-items: flex-start !important; + } + + .align-items-xl-end { + align-items: flex-end !important; + } + + .align-items-xl-center { + align-items: center !important; + } + + .align-items-xl-baseline { + align-items: baseline !important; + } + + .align-items-xl-stretch { + align-items: stretch !important; + } + + .align-content-xl-start { + align-content: flex-start !important; + } + + .align-content-xl-end { + align-content: flex-end !important; + } + + .align-content-xl-center { + align-content: center !important; + } + + .align-content-xl-between { + align-content: space-between !important; + } + + .align-content-xl-around { + align-content: space-around !important; + } + + .align-content-xl-stretch { + align-content: stretch !important; + } + + .align-self-xl-auto { + align-self: auto !important; + } + + .align-self-xl-start { + align-self: flex-start !important; + } + + .align-self-xl-end { + align-self: flex-end !important; + } + + .align-self-xl-center { + align-self: center !important; + } + + .align-self-xl-baseline { + align-self: baseline !important; + } + + .align-self-xl-stretch { + align-self: stretch !important; + } +} +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + + .float-sm-right { + float: right !important; + } + + .float-sm-none { + float: none !important; + } +} +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + + .float-md-right { + float: right !important; + } + + .float-md-none { + float: none !important; + } +} +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + + .float-lg-right { + float: right !important; + } + + .float-lg-none { + float: none !important; + } +} +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + + .float-xl-right { + float: right !important; + } + + .float-xl-none { + float: none !important; + } +} +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports (position: sticky) { + .sticky-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + + .mt-sm-0, +.my-sm-0 { + margin-top: 0 !important; + } + + .mr-sm-0, +.mx-sm-0 { + margin-right: 0 !important; + } + + .mb-sm-0, +.my-sm-0 { + margin-bottom: 0 !important; + } + + .ml-sm-0, +.mx-sm-0 { + margin-left: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .mt-sm-1, +.my-sm-1 { + margin-top: 0.25rem !important; + } + + .mr-sm-1, +.mx-sm-1 { + margin-right: 0.25rem !important; + } + + .mb-sm-1, +.my-sm-1 { + margin-bottom: 0.25rem !important; + } + + .ml-sm-1, +.mx-sm-1 { + margin-left: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .mt-sm-2, +.my-sm-2 { + margin-top: 0.5rem !important; + } + + .mr-sm-2, +.mx-sm-2 { + margin-right: 0.5rem !important; + } + + .mb-sm-2, +.my-sm-2 { + margin-bottom: 0.5rem !important; + } + + .ml-sm-2, +.mx-sm-2 { + margin-left: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .mt-sm-3, +.my-sm-3 { + margin-top: 1rem !important; + } + + .mr-sm-3, +.mx-sm-3 { + margin-right: 1rem !important; + } + + .mb-sm-3, +.my-sm-3 { + margin-bottom: 1rem !important; + } + + .ml-sm-3, +.mx-sm-3 { + margin-left: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .mt-sm-4, +.my-sm-4 { + margin-top: 1.5rem !important; + } + + .mr-sm-4, +.mx-sm-4 { + margin-right: 1.5rem !important; + } + + .mb-sm-4, +.my-sm-4 { + margin-bottom: 1.5rem !important; + } + + .ml-sm-4, +.mx-sm-4 { + margin-left: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .mt-sm-5, +.my-sm-5 { + margin-top: 3rem !important; + } + + .mr-sm-5, +.mx-sm-5 { + margin-right: 3rem !important; + } + + .mb-sm-5, +.my-sm-5 { + margin-bottom: 3rem !important; + } + + .ml-sm-5, +.mx-sm-5 { + margin-left: 3rem !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .pt-sm-0, +.py-sm-0 { + padding-top: 0 !important; + } + + .pr-sm-0, +.px-sm-0 { + padding-right: 0 !important; + } + + .pb-sm-0, +.py-sm-0 { + padding-bottom: 0 !important; + } + + .pl-sm-0, +.px-sm-0 { + padding-left: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .pt-sm-1, +.py-sm-1 { + padding-top: 0.25rem !important; + } + + .pr-sm-1, +.px-sm-1 { + padding-right: 0.25rem !important; + } + + .pb-sm-1, +.py-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pl-sm-1, +.px-sm-1 { + padding-left: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .pt-sm-2, +.py-sm-2 { + padding-top: 0.5rem !important; + } + + .pr-sm-2, +.px-sm-2 { + padding-right: 0.5rem !important; + } + + .pb-sm-2, +.py-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pl-sm-2, +.px-sm-2 { + padding-left: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .pt-sm-3, +.py-sm-3 { + padding-top: 1rem !important; + } + + .pr-sm-3, +.px-sm-3 { + padding-right: 1rem !important; + } + + .pb-sm-3, +.py-sm-3 { + padding-bottom: 1rem !important; + } + + .pl-sm-3, +.px-sm-3 { + padding-left: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .pt-sm-4, +.py-sm-4 { + padding-top: 1.5rem !important; + } + + .pr-sm-4, +.px-sm-4 { + padding-right: 1.5rem !important; + } + + .pb-sm-4, +.py-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pl-sm-4, +.px-sm-4 { + padding-left: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .pt-sm-5, +.py-sm-5 { + padding-top: 3rem !important; + } + + .pr-sm-5, +.px-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-5, +.py-sm-5 { + padding-bottom: 3rem !important; + } + + .pl-sm-5, +.px-sm-5 { + padding-left: 3rem !important; + } + + .m-sm-n1 { + margin: -0.25rem !important; + } + + .mt-sm-n1, +.my-sm-n1 { + margin-top: -0.25rem !important; + } + + .mr-sm-n1, +.mx-sm-n1 { + margin-right: -0.25rem !important; + } + + .mb-sm-n1, +.my-sm-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-sm-n1, +.mx-sm-n1 { + margin-left: -0.25rem !important; + } + + .m-sm-n2 { + margin: -0.5rem !important; + } + + .mt-sm-n2, +.my-sm-n2 { + margin-top: -0.5rem !important; + } + + .mr-sm-n2, +.mx-sm-n2 { + margin-right: -0.5rem !important; + } + + .mb-sm-n2, +.my-sm-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-sm-n2, +.mx-sm-n2 { + margin-left: -0.5rem !important; + } + + .m-sm-n3 { + margin: -1rem !important; + } + + .mt-sm-n3, +.my-sm-n3 { + margin-top: -1rem !important; + } + + .mr-sm-n3, +.mx-sm-n3 { + margin-right: -1rem !important; + } + + .mb-sm-n3, +.my-sm-n3 { + margin-bottom: -1rem !important; + } + + .ml-sm-n3, +.mx-sm-n3 { + margin-left: -1rem !important; + } + + .m-sm-n4 { + margin: -1.5rem !important; + } + + .mt-sm-n4, +.my-sm-n4 { + margin-top: -1.5rem !important; + } + + .mr-sm-n4, +.mx-sm-n4 { + margin-right: -1.5rem !important; + } + + .mb-sm-n4, +.my-sm-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-sm-n4, +.mx-sm-n4 { + margin-left: -1.5rem !important; + } + + .m-sm-n5 { + margin: -3rem !important; + } + + .mt-sm-n5, +.my-sm-n5 { + margin-top: -3rem !important; + } + + .mr-sm-n5, +.mx-sm-n5 { + margin-right: -3rem !important; + } + + .mb-sm-n5, +.my-sm-n5 { + margin-bottom: -3rem !important; + } + + .ml-sm-n5, +.mx-sm-n5 { + margin-left: -3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mt-sm-auto, +.my-sm-auto { + margin-top: auto !important; + } + + .mr-sm-auto, +.mx-sm-auto { + margin-right: auto !important; + } + + .mb-sm-auto, +.my-sm-auto { + margin-bottom: auto !important; + } + + .ml-sm-auto, +.mx-sm-auto { + margin-left: auto !important; + } +} +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + + .mt-md-0, +.my-md-0 { + margin-top: 0 !important; + } + + .mr-md-0, +.mx-md-0 { + margin-right: 0 !important; + } + + .mb-md-0, +.my-md-0 { + margin-bottom: 0 !important; + } + + .ml-md-0, +.mx-md-0 { + margin-left: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .mt-md-1, +.my-md-1 { + margin-top: 0.25rem !important; + } + + .mr-md-1, +.mx-md-1 { + margin-right: 0.25rem !important; + } + + .mb-md-1, +.my-md-1 { + margin-bottom: 0.25rem !important; + } + + .ml-md-1, +.mx-md-1 { + margin-left: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .mt-md-2, +.my-md-2 { + margin-top: 0.5rem !important; + } + + .mr-md-2, +.mx-md-2 { + margin-right: 0.5rem !important; + } + + .mb-md-2, +.my-md-2 { + margin-bottom: 0.5rem !important; + } + + .ml-md-2, +.mx-md-2 { + margin-left: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .mt-md-3, +.my-md-3 { + margin-top: 1rem !important; + } + + .mr-md-3, +.mx-md-3 { + margin-right: 1rem !important; + } + + .mb-md-3, +.my-md-3 { + margin-bottom: 1rem !important; + } + + .ml-md-3, +.mx-md-3 { + margin-left: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .mt-md-4, +.my-md-4 { + margin-top: 1.5rem !important; + } + + .mr-md-4, +.mx-md-4 { + margin-right: 1.5rem !important; + } + + .mb-md-4, +.my-md-4 { + margin-bottom: 1.5rem !important; + } + + .ml-md-4, +.mx-md-4 { + margin-left: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .mt-md-5, +.my-md-5 { + margin-top: 3rem !important; + } + + .mr-md-5, +.mx-md-5 { + margin-right: 3rem !important; + } + + .mb-md-5, +.my-md-5 { + margin-bottom: 3rem !important; + } + + .ml-md-5, +.mx-md-5 { + margin-left: 3rem !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .pt-md-0, +.py-md-0 { + padding-top: 0 !important; + } + + .pr-md-0, +.px-md-0 { + padding-right: 0 !important; + } + + .pb-md-0, +.py-md-0 { + padding-bottom: 0 !important; + } + + .pl-md-0, +.px-md-0 { + padding-left: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .pt-md-1, +.py-md-1 { + padding-top: 0.25rem !important; + } + + .pr-md-1, +.px-md-1 { + padding-right: 0.25rem !important; + } + + .pb-md-1, +.py-md-1 { + padding-bottom: 0.25rem !important; + } + + .pl-md-1, +.px-md-1 { + padding-left: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .pt-md-2, +.py-md-2 { + padding-top: 0.5rem !important; + } + + .pr-md-2, +.px-md-2 { + padding-right: 0.5rem !important; + } + + .pb-md-2, +.py-md-2 { + padding-bottom: 0.5rem !important; + } + + .pl-md-2, +.px-md-2 { + padding-left: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .pt-md-3, +.py-md-3 { + padding-top: 1rem !important; + } + + .pr-md-3, +.px-md-3 { + padding-right: 1rem !important; + } + + .pb-md-3, +.py-md-3 { + padding-bottom: 1rem !important; + } + + .pl-md-3, +.px-md-3 { + padding-left: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .pt-md-4, +.py-md-4 { + padding-top: 1.5rem !important; + } + + .pr-md-4, +.px-md-4 { + padding-right: 1.5rem !important; + } + + .pb-md-4, +.py-md-4 { + padding-bottom: 1.5rem !important; + } + + .pl-md-4, +.px-md-4 { + padding-left: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .pt-md-5, +.py-md-5 { + padding-top: 3rem !important; + } + + .pr-md-5, +.px-md-5 { + padding-right: 3rem !important; + } + + .pb-md-5, +.py-md-5 { + padding-bottom: 3rem !important; + } + + .pl-md-5, +.px-md-5 { + padding-left: 3rem !important; + } + + .m-md-n1 { + margin: -0.25rem !important; + } + + .mt-md-n1, +.my-md-n1 { + margin-top: -0.25rem !important; + } + + .mr-md-n1, +.mx-md-n1 { + margin-right: -0.25rem !important; + } + + .mb-md-n1, +.my-md-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-md-n1, +.mx-md-n1 { + margin-left: -0.25rem !important; + } + + .m-md-n2 { + margin: -0.5rem !important; + } + + .mt-md-n2, +.my-md-n2 { + margin-top: -0.5rem !important; + } + + .mr-md-n2, +.mx-md-n2 { + margin-right: -0.5rem !important; + } + + .mb-md-n2, +.my-md-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-md-n2, +.mx-md-n2 { + margin-left: -0.5rem !important; + } + + .m-md-n3 { + margin: -1rem !important; + } + + .mt-md-n3, +.my-md-n3 { + margin-top: -1rem !important; + } + + .mr-md-n3, +.mx-md-n3 { + margin-right: -1rem !important; + } + + .mb-md-n3, +.my-md-n3 { + margin-bottom: -1rem !important; + } + + .ml-md-n3, +.mx-md-n3 { + margin-left: -1rem !important; + } + + .m-md-n4 { + margin: -1.5rem !important; + } + + .mt-md-n4, +.my-md-n4 { + margin-top: -1.5rem !important; + } + + .mr-md-n4, +.mx-md-n4 { + margin-right: -1.5rem !important; + } + + .mb-md-n4, +.my-md-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-md-n4, +.mx-md-n4 { + margin-left: -1.5rem !important; + } + + .m-md-n5 { + margin: -3rem !important; + } + + .mt-md-n5, +.my-md-n5 { + margin-top: -3rem !important; + } + + .mr-md-n5, +.mx-md-n5 { + margin-right: -3rem !important; + } + + .mb-md-n5, +.my-md-n5 { + margin-bottom: -3rem !important; + } + + .ml-md-n5, +.mx-md-n5 { + margin-left: -3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mt-md-auto, +.my-md-auto { + margin-top: auto !important; + } + + .mr-md-auto, +.mx-md-auto { + margin-right: auto !important; + } + + .mb-md-auto, +.my-md-auto { + margin-bottom: auto !important; + } + + .ml-md-auto, +.mx-md-auto { + margin-left: auto !important; + } +} +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + + .mt-lg-0, +.my-lg-0 { + margin-top: 0 !important; + } + + .mr-lg-0, +.mx-lg-0 { + margin-right: 0 !important; + } + + .mb-lg-0, +.my-lg-0 { + margin-bottom: 0 !important; + } + + .ml-lg-0, +.mx-lg-0 { + margin-left: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .mt-lg-1, +.my-lg-1 { + margin-top: 0.25rem !important; + } + + .mr-lg-1, +.mx-lg-1 { + margin-right: 0.25rem !important; + } + + .mb-lg-1, +.my-lg-1 { + margin-bottom: 0.25rem !important; + } + + .ml-lg-1, +.mx-lg-1 { + margin-left: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .mt-lg-2, +.my-lg-2 { + margin-top: 0.5rem !important; + } + + .mr-lg-2, +.mx-lg-2 { + margin-right: 0.5rem !important; + } + + .mb-lg-2, +.my-lg-2 { + margin-bottom: 0.5rem !important; + } + + .ml-lg-2, +.mx-lg-2 { + margin-left: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .mt-lg-3, +.my-lg-3 { + margin-top: 1rem !important; + } + + .mr-lg-3, +.mx-lg-3 { + margin-right: 1rem !important; + } + + .mb-lg-3, +.my-lg-3 { + margin-bottom: 1rem !important; + } + + .ml-lg-3, +.mx-lg-3 { + margin-left: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .mt-lg-4, +.my-lg-4 { + margin-top: 1.5rem !important; + } + + .mr-lg-4, +.mx-lg-4 { + margin-right: 1.5rem !important; + } + + .mb-lg-4, +.my-lg-4 { + margin-bottom: 1.5rem !important; + } + + .ml-lg-4, +.mx-lg-4 { + margin-left: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .mt-lg-5, +.my-lg-5 { + margin-top: 3rem !important; + } + + .mr-lg-5, +.mx-lg-5 { + margin-right: 3rem !important; + } + + .mb-lg-5, +.my-lg-5 { + margin-bottom: 3rem !important; + } + + .ml-lg-5, +.mx-lg-5 { + margin-left: 3rem !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .pt-lg-0, +.py-lg-0 { + padding-top: 0 !important; + } + + .pr-lg-0, +.px-lg-0 { + padding-right: 0 !important; + } + + .pb-lg-0, +.py-lg-0 { + padding-bottom: 0 !important; + } + + .pl-lg-0, +.px-lg-0 { + padding-left: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .pt-lg-1, +.py-lg-1 { + padding-top: 0.25rem !important; + } + + .pr-lg-1, +.px-lg-1 { + padding-right: 0.25rem !important; + } + + .pb-lg-1, +.py-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pl-lg-1, +.px-lg-1 { + padding-left: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .pt-lg-2, +.py-lg-2 { + padding-top: 0.5rem !important; + } + + .pr-lg-2, +.px-lg-2 { + padding-right: 0.5rem !important; + } + + .pb-lg-2, +.py-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pl-lg-2, +.px-lg-2 { + padding-left: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .pt-lg-3, +.py-lg-3 { + padding-top: 1rem !important; + } + + .pr-lg-3, +.px-lg-3 { + padding-right: 1rem !important; + } + + .pb-lg-3, +.py-lg-3 { + padding-bottom: 1rem !important; + } + + .pl-lg-3, +.px-lg-3 { + padding-left: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .pt-lg-4, +.py-lg-4 { + padding-top: 1.5rem !important; + } + + .pr-lg-4, +.px-lg-4 { + padding-right: 1.5rem !important; + } + + .pb-lg-4, +.py-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pl-lg-4, +.px-lg-4 { + padding-left: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .pt-lg-5, +.py-lg-5 { + padding-top: 3rem !important; + } + + .pr-lg-5, +.px-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-5, +.py-lg-5 { + padding-bottom: 3rem !important; + } + + .pl-lg-5, +.px-lg-5 { + padding-left: 3rem !important; + } + + .m-lg-n1 { + margin: -0.25rem !important; + } + + .mt-lg-n1, +.my-lg-n1 { + margin-top: -0.25rem !important; + } + + .mr-lg-n1, +.mx-lg-n1 { + margin-right: -0.25rem !important; + } + + .mb-lg-n1, +.my-lg-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-lg-n1, +.mx-lg-n1 { + margin-left: -0.25rem !important; + } + + .m-lg-n2 { + margin: -0.5rem !important; + } + + .mt-lg-n2, +.my-lg-n2 { + margin-top: -0.5rem !important; + } + + .mr-lg-n2, +.mx-lg-n2 { + margin-right: -0.5rem !important; + } + + .mb-lg-n2, +.my-lg-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-lg-n2, +.mx-lg-n2 { + margin-left: -0.5rem !important; + } + + .m-lg-n3 { + margin: -1rem !important; + } + + .mt-lg-n3, +.my-lg-n3 { + margin-top: -1rem !important; + } + + .mr-lg-n3, +.mx-lg-n3 { + margin-right: -1rem !important; + } + + .mb-lg-n3, +.my-lg-n3 { + margin-bottom: -1rem !important; + } + + .ml-lg-n3, +.mx-lg-n3 { + margin-left: -1rem !important; + } + + .m-lg-n4 { + margin: -1.5rem !important; + } + + .mt-lg-n4, +.my-lg-n4 { + margin-top: -1.5rem !important; + } + + .mr-lg-n4, +.mx-lg-n4 { + margin-right: -1.5rem !important; + } + + .mb-lg-n4, +.my-lg-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-lg-n4, +.mx-lg-n4 { + margin-left: -1.5rem !important; + } + + .m-lg-n5 { + margin: -3rem !important; + } + + .mt-lg-n5, +.my-lg-n5 { + margin-top: -3rem !important; + } + + .mr-lg-n5, +.mx-lg-n5 { + margin-right: -3rem !important; + } + + .mb-lg-n5, +.my-lg-n5 { + margin-bottom: -3rem !important; + } + + .ml-lg-n5, +.mx-lg-n5 { + margin-left: -3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mt-lg-auto, +.my-lg-auto { + margin-top: auto !important; + } + + .mr-lg-auto, +.mx-lg-auto { + margin-right: auto !important; + } + + .mb-lg-auto, +.my-lg-auto { + margin-bottom: auto !important; + } + + .ml-lg-auto, +.mx-lg-auto { + margin-left: auto !important; + } +} +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + + .mt-xl-0, +.my-xl-0 { + margin-top: 0 !important; + } + + .mr-xl-0, +.mx-xl-0 { + margin-right: 0 !important; + } + + .mb-xl-0, +.my-xl-0 { + margin-bottom: 0 !important; + } + + .ml-xl-0, +.mx-xl-0 { + margin-left: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .mt-xl-1, +.my-xl-1 { + margin-top: 0.25rem !important; + } + + .mr-xl-1, +.mx-xl-1 { + margin-right: 0.25rem !important; + } + + .mb-xl-1, +.my-xl-1 { + margin-bottom: 0.25rem !important; + } + + .ml-xl-1, +.mx-xl-1 { + margin-left: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .mt-xl-2, +.my-xl-2 { + margin-top: 0.5rem !important; + } + + .mr-xl-2, +.mx-xl-2 { + margin-right: 0.5rem !important; + } + + .mb-xl-2, +.my-xl-2 { + margin-bottom: 0.5rem !important; + } + + .ml-xl-2, +.mx-xl-2 { + margin-left: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .mt-xl-3, +.my-xl-3 { + margin-top: 1rem !important; + } + + .mr-xl-3, +.mx-xl-3 { + margin-right: 1rem !important; + } + + .mb-xl-3, +.my-xl-3 { + margin-bottom: 1rem !important; + } + + .ml-xl-3, +.mx-xl-3 { + margin-left: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .mt-xl-4, +.my-xl-4 { + margin-top: 1.5rem !important; + } + + .mr-xl-4, +.mx-xl-4 { + margin-right: 1.5rem !important; + } + + .mb-xl-4, +.my-xl-4 { + margin-bottom: 1.5rem !important; + } + + .ml-xl-4, +.mx-xl-4 { + margin-left: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .mt-xl-5, +.my-xl-5 { + margin-top: 3rem !important; + } + + .mr-xl-5, +.mx-xl-5 { + margin-right: 3rem !important; + } + + .mb-xl-5, +.my-xl-5 { + margin-bottom: 3rem !important; + } + + .ml-xl-5, +.mx-xl-5 { + margin-left: 3rem !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .pt-xl-0, +.py-xl-0 { + padding-top: 0 !important; + } + + .pr-xl-0, +.px-xl-0 { + padding-right: 0 !important; + } + + .pb-xl-0, +.py-xl-0 { + padding-bottom: 0 !important; + } + + .pl-xl-0, +.px-xl-0 { + padding-left: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .pt-xl-1, +.py-xl-1 { + padding-top: 0.25rem !important; + } + + .pr-xl-1, +.px-xl-1 { + padding-right: 0.25rem !important; + } + + .pb-xl-1, +.py-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pl-xl-1, +.px-xl-1 { + padding-left: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .pt-xl-2, +.py-xl-2 { + padding-top: 0.5rem !important; + } + + .pr-xl-2, +.px-xl-2 { + padding-right: 0.5rem !important; + } + + .pb-xl-2, +.py-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pl-xl-2, +.px-xl-2 { + padding-left: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .pt-xl-3, +.py-xl-3 { + padding-top: 1rem !important; + } + + .pr-xl-3, +.px-xl-3 { + padding-right: 1rem !important; + } + + .pb-xl-3, +.py-xl-3 { + padding-bottom: 1rem !important; + } + + .pl-xl-3, +.px-xl-3 { + padding-left: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .pt-xl-4, +.py-xl-4 { + padding-top: 1.5rem !important; + } + + .pr-xl-4, +.px-xl-4 { + padding-right: 1.5rem !important; + } + + .pb-xl-4, +.py-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pl-xl-4, +.px-xl-4 { + padding-left: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .pt-xl-5, +.py-xl-5 { + padding-top: 3rem !important; + } + + .pr-xl-5, +.px-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-5, +.py-xl-5 { + padding-bottom: 3rem !important; + } + + .pl-xl-5, +.px-xl-5 { + padding-left: 3rem !important; + } + + .m-xl-n1 { + margin: -0.25rem !important; + } + + .mt-xl-n1, +.my-xl-n1 { + margin-top: -0.25rem !important; + } + + .mr-xl-n1, +.mx-xl-n1 { + margin-right: -0.25rem !important; + } + + .mb-xl-n1, +.my-xl-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-xl-n1, +.mx-xl-n1 { + margin-left: -0.25rem !important; + } + + .m-xl-n2 { + margin: -0.5rem !important; + } + + .mt-xl-n2, +.my-xl-n2 { + margin-top: -0.5rem !important; + } + + .mr-xl-n2, +.mx-xl-n2 { + margin-right: -0.5rem !important; + } + + .mb-xl-n2, +.my-xl-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-xl-n2, +.mx-xl-n2 { + margin-left: -0.5rem !important; + } + + .m-xl-n3 { + margin: -1rem !important; + } + + .mt-xl-n3, +.my-xl-n3 { + margin-top: -1rem !important; + } + + .mr-xl-n3, +.mx-xl-n3 { + margin-right: -1rem !important; + } + + .mb-xl-n3, +.my-xl-n3 { + margin-bottom: -1rem !important; + } + + .ml-xl-n3, +.mx-xl-n3 { + margin-left: -1rem !important; + } + + .m-xl-n4 { + margin: -1.5rem !important; + } + + .mt-xl-n4, +.my-xl-n4 { + margin-top: -1.5rem !important; + } + + .mr-xl-n4, +.mx-xl-n4 { + margin-right: -1.5rem !important; + } + + .mb-xl-n4, +.my-xl-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-xl-n4, +.mx-xl-n4 { + margin-left: -1.5rem !important; + } + + .m-xl-n5 { + margin: -3rem !important; + } + + .mt-xl-n5, +.my-xl-n5 { + margin-top: -3rem !important; + } + + .mr-xl-n5, +.mx-xl-n5 { + margin-right: -3rem !important; + } + + .mb-xl-n5, +.my-xl-n5 { + margin-bottom: -3rem !important; + } + + .ml-xl-n5, +.mx-xl-n5 { + margin-left: -3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mt-xl-auto, +.my-xl-auto { + margin-top: auto !important; + } + + .mr-xl-auto, +.mx-xl-auto { + margin-right: auto !important; + } + + .mb-xl-auto, +.my-xl-auto { + margin-bottom: auto !important; + } + + .ml-xl-auto, +.mx-xl-auto { + margin-left: auto !important; + } +} +.text-monospace { + font-family: "VGAsquarePx"; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + + .text-sm-right { + text-align: right !important; + } + + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + + .text-md-right { + text-align: right !important; + } + + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + + .text-lg-right { + text-align: right !important; + } + + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + + .text-xl-right { + text-align: right !important; + } + + .text-xl-center { + text-align: center !important; + } +} +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #AAAAAA !important; +} + +.text-primary { + color: #0000AA !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #00005e !important; +} + +.text-secondary { + color: #555555 !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #2f2f2f !important; +} + +.text-success { + color: #00AA00 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #005e00 !important; +} + +.text-info { + color: #00AAAA !important; +} + +a.text-info:hover, a.text-info:focus { + color: #005e5e !important; +} + +.text-warning { + color: #FFFF55 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #ffff09 !important; +} + +.text-danger { + color: #AA0000 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #5e0000 !important; +} + +.text-light { + color: #AAAAAA !important; +} + +a.text-light:hover, a.text-light:focus { + color: #848484 !important; +} + +.text-dark { + color: #555555 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #2f2f2f !important; +} + +.text-body { + color: #AAAAAA !important; +} + +.text-muted { + color: #555555 !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(170, 170, 170, 0.5) !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, +*::before, +*::after { + text-shadow: none !important; + box-shadow: none !important; + } + + a:not(.btn) { + text-decoration: underline; + } + + abbr[title]::after { + content: " (" attr(title) ")"; + } + + pre { + white-space: pre-wrap !important; + } + + pre, +blockquote { + border: 1px solid #555555; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, +img { + page-break-inside: avoid; + } + + p, +h2, +h3 { + orphans: 3; + widows: 3; + } + + h2, +h3 { + page-break-after: avoid; + } + + @page { + size: a3; + } + body { + min-width: 992px !important; + } + + .container { + min-width: 992px !important; + } + + .navbar { + display: none; + } + + .badge { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + } + .table td, +.table th { + background-color: #AAAAAA !important; + } + + .table-bordered th, +.table-bordered td { + border: 1px solid #AAAAAA !important; + } + + .table-dark { + color: inherit; + } + .table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #AAAAAA; + } + + .table .thead-dark th { + color: inherit; + border-color: #AAAAAA; + } +} +footer { + background-color: #AA5500; + color: #000; +} + +header { + background-color: #55FFFF; + color: #000; + text-align: center; +} + +header a { + color: #FF55FF; +} + +header a:hover { + color: #FF5555; + text-decoration: none; +} + +footer a:hover { + text-decoration: none; +} + +.table-centered { + margin-left: auto; + margin-right: auto; +} + +.card-button { + color: #FFFF55; +} + +.table-dark-em { + color: #AA5500; + font-style: normal; +} + +.table-dark-header { + color: #AA5500; + font-style: normal; + text-align: center; +} + +/*# sourceMappingURL=dicserver.css.map */ diff --git a/DiscImageChef.Server/styles/dos/dicserver.scss b/DiscImageChef.Server/styles/dos/dicserver.scss new file mode 100644 index 00000000..3821099f --- /dev/null +++ b/DiscImageChef.Server/styles/dos/dicserver.scss @@ -0,0 +1,87 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : dicserver.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; +@import "_font"; +@import "_fontstyles"; + +@import "../../node_modules/bootstrap/scss/bootstrap"; + +footer +{ + background-color: $brown; + color: $black; +} + +header +{ + background-color: $teal; + color: $black; + text-align: center; +} + +header a +{ + color: $pink; +} + +header a:hover +{ + color: $orange; + text-decoration: none; +} + +footer a:hover +{ + text-decoration: none; +} + +.table-centered +{ + margin-left:auto; + margin-right:auto; +} + +.card-button{color:$yellow} + +.table-dark-em +{ + color: $brown; + font-style: normal; +} + +.table-dark-header +{ + color: $brown; + font-style: normal; + text-align: center; +} \ No newline at end of file diff --git a/DiscImageChef.Server/styles/dos/dicserver_highcharts.css b/DiscImageChef.Server/styles/dos/dicserver_highcharts.css new file mode 100644 index 00000000..f82985aa --- /dev/null +++ b/DiscImageChef.Server/styles/dos/dicserver_highcharts.css @@ -0,0 +1,930 @@ +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using EGA colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets font to VGA square */ +@font-face { + font-family: "VGAsquarePx"; + src: url(../../fonts/vga_squarepx.eot); + src: url(../../fonts/vga_squarepx.eot?#iefix) format("embedded-opentype"), url(../../fonts/vga_squarepx.woff2) format("woff2"), url(../../fonts/vga_squarepx.woff) format("woff"), url(../../fonts/vga_squarepx.ttf) format("truetype"); + font-weight: normal; + font-style: normal; +} +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using EGA colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets the style for emphasis/italics */ +em, i { + color: #00AA00; + font-style: normal; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong { + color: #FFFFFF; + font-size: 1em; + font-style: normal; + font-weight: normal; + margin: 0; +} + +/** + * @license Highcharts + * + * (c) 2009-2016 Torstein Honsi + * + * License: www.highcharts.com/license + */ +.highcharts-container { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; + text-align: left; + line-height: normal; + z-index: 0; + /* #1072 */ + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-family: "VGAsquarePx"; + font-size: 12px; +} + +.highcharts-root { + display: block; +} + +.highcharts-root text { + stroke-width: 0; +} + +.highcharts-strong { + font-weight: bold; +} + +.highcharts-emphasized { + font-style: italic; +} + +.highcharts-anchor { + cursor: pointer; +} + +.highcharts-background { + fill: #000; +} + +.highcharts-plot-border, .highcharts-plot-background { + fill: none; +} + +.highcharts-label-box { + fill: none; +} + +.highcharts-button-box { + fill: inherit; +} + +.highcharts-tracker-line { + stroke-linejoin: round; + stroke: rgba(192, 192, 192, 0.0001); + stroke-width: 22; + fill: none; +} + +.highcharts-tracker-area { + fill: rgba(192, 192, 192, 0.0001); + stroke-width: 0; +} + +/* Titles */ +.highcharts-title { + fill: #AAAAAA; + font-size: 1.5em; +} + +.highcharts-subtitle { + fill: #AAAAAA; +} + +/* Axes */ +.highcharts-axis-line { + fill: none; + stroke: #ccd6eb; +} + +.highcharts-yaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-axis-title { + fill: #AAAAAA; +} + +.highcharts-axis-labels { + fill: #AAAAAA; + cursor: default; + font-size: 0.9em; +} + +.highcharts-grid-line { + fill: none; + stroke: #555555; +} + +.highcharts-xaxis-grid .highcharts-grid-line { + stroke-width: 0px; +} + +.highcharts-tick { + stroke: #ccd6eb; +} + +.highcharts-yaxis .highcharts-tick { + stroke-width: 0; +} + +.highcharts-minor-grid-line { + stroke: #555555; +} + +.highcharts-crosshair-thin { + stroke-width: 1px; + stroke: #555555; +} + +.highcharts-crosshair-category { + stroke: #ccd6eb; + stroke-opacity: 0.25; +} + +/* Credits */ +.highcharts-credits { + cursor: pointer; + fill: #AAAAAA; + font-size: 0.7em; + transition: fill 250ms, font-size 250ms; +} + +.highcharts-credits:hover { + fill: black; + font-size: 1em; +} + +/* Tooltip */ +.highcharts-tooltip { + cursor: default; + pointer-events: none; + white-space: nowrap; + transition: stroke 150ms; +} + +.highcharts-tooltip text { + fill: #AAAAAA; +} + +.highcharts-tooltip .highcharts-header { + font-size: 0.85em; +} + +.highcharts-tooltip-box { + stroke-width: 1px; + fill: #FFFFFF; + fill-opacity: 0.85; +} + +.highcharts-tooltip-box .highcharts-label-box { + fill: #FFFFFF; + fill-opacity: 0.85; +} + +.highcharts-selection-marker { + fill: #335cad; + fill-opacity: 0.25; +} + +.highcharts-graph { + fill: none; + stroke-width: 2px; + stroke-linecap: round; + stroke-linejoin: round; +} + +.highcharts-state-hover .highcharts-graph { + stroke-width: 3; +} + +.highcharts-state-hover path { + transition: stroke-width 50; + /* quick in */ +} + +.highcharts-state-normal path { + transition: stroke-width 250ms; + /* slow out */ +} + +/* Legend hover affects points and series */ +g.highcharts-series, +.highcharts-point, +.highcharts-markers, +.highcharts-data-labels { + transition: opacity 250ms; +} + +.highcharts-legend-series-active g.highcharts-series:not(.highcharts-series-hover), +.highcharts-legend-point-active .highcharts-point:not(.highcharts-point-hover), +.highcharts-legend-series-active .highcharts-markers:not(.highcharts-series-hover), +.highcharts-legend-series-active .highcharts-data-labels:not(.highcharts-series-hover) { + opacity: 0.2; +} + +/* Series options */ +/* Default colors */ +.highcharts-color-0 { + fill: #FF5555; + stroke: #FF5555; +} + +.highcharts-color-1 { + fill: #00AA00; + stroke: #00AA00; +} + +.highcharts-color-2 { + fill: #AA5500; + stroke: #AA5500; +} + +.highcharts-color-3 { + fill: #AA55AA; + stroke: #AA55AA; +} + +.highcharts-color-4 { + fill: #FF55FF; + stroke: #FF55FF; +} + +.highcharts-color-5 { + fill: #55FFFF; + stroke: #55FFFF; +} + +.highcharts-color-6 { + fill: #FFFF55; + stroke: #FFFF55; +} + +.highcharts-color-7 { + fill: #AA00FF; + stroke: #AA00FF; +} + +.highcharts-color-8 { + fill: #00AAAA; + stroke: #00AAAA; +} + +.highcharts-color-9 { + fill: #AAAAAA; + stroke: #AAAAAA; +} + +.highcharts-area { + fill-opacity: 0.75; + stroke-width: 0; +} + +.highcharts-markers { + stroke-width: 1px; + stroke: #000; +} + +.highcharts-point { + stroke-width: 1px; +} + +.highcharts-dense-data .highcharts-point { + stroke-width: 0; +} + +.highcharts-data-label { + font-size: 0.9em; + font-weight: bold; +} + +.highcharts-data-label-box { + fill: none; + stroke-width: 0; +} + +.highcharts-data-label text, text.highcharts-data-label { + fill: #FFFF55; +} + +.highcharts-data-label-connector { + fill: none; +} + +.highcharts-halo { + fill-opacity: 0.25; + stroke-width: 0; +} + +.highcharts-series:not(.highcharts-pie-series) .highcharts-point-select, +.highcharts-markers .highcharts-point-select { + fill: #555555; + stroke: #FFFFFF; +} + +.highcharts-column-series rect.highcharts-point { + stroke: #000; +} + +.highcharts-column-series .highcharts-point { + transition: fill-opacity 250ms; +} + +.highcharts-column-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pie-series .highcharts-point { + stroke-linejoin: round; + stroke: #000; +} + +.highcharts-pie-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point { + stroke-linejoin: round; + stroke: #000; +} + +.highcharts-funnel-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-pyramid-series .highcharts-point { + stroke-linejoin: round; + stroke: #000; +} + +.highcharts-pyramid-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pyramid-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-solidgauge-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-treemap-series .highcharts-point { + stroke-width: 1px; + stroke: #555555; + transition: stroke 250ms, fill 250ms, fill-opacity 250ms; +} + +.highcharts-treemap-series .highcharts-point-hover { + stroke: #AAAAAA; + transition: stroke 25ms, fill 25ms, fill-opacity 25ms; +} + +.highcharts-treemap-series .highcharts-above-level { + display: none; +} + +.highcharts-treemap-series .highcharts-internal-node { + fill: none; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive { + fill-opacity: 0.15; + cursor: pointer; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive:hover { + fill-opacity: 0.75; +} + +/* Legend */ +.highcharts-legend-box { + fill: none; + stroke-width: 0; +} + +.highcharts-legend-item > text { + fill: #AAAAAA; + font-weight: bold; + font-size: 1em; + cursor: pointer; + stroke-width: 0; +} + +.highcharts-legend-item:hover text { + fill: #FFFFFF; +} + +.highcharts-legend-item-hidden * { + fill: #555555 !important; + stroke: #555555 !important; + transition: fill 250ms; +} + +.highcharts-legend-nav-active { + fill: #003399; + cursor: pointer; +} + +.highcharts-legend-nav-inactive { + fill: #555555; +} + +.highcharts-legend-title-box { + fill: none; + stroke-width: 0; +} + +/* Bubble legend */ +.highcharts-bubble-legend-symbol { + stroke-width: 2; + fill-opacity: 0.5; +} + +.highcharts-bubble-legend-connectors { + stroke-width: 1; +} + +.highcharts-bubble-legend-labels { + fill: #AAAAAA; +} + +/* Loading */ +.highcharts-loading { + position: absolute; + background-color: #000; + opacity: 0.5; + text-align: center; + z-index: 10; + transition: opacity 250ms; +} + +.highcharts-loading-hidden { + height: 0 !important; + opacity: 0; + overflow: hidden; + transition: opacity 250ms, height 250ms step-end; +} + +.highcharts-loading-inner { + font-weight: bold; + position: relative; + top: 45%; +} + +/* Plot bands and polar pane backgrounds */ +.highcharts-plot-band, .highcharts-pane { + fill: #FFFFFF; + fill-opacity: 0.05; +} + +.highcharts-plot-line { + fill: none; + stroke: #AAAAAA; + stroke-width: 1px; +} + +/* Highcharts More and modules */ +.highcharts-boxplot-box { + fill: #000; +} + +.highcharts-boxplot-median { + stroke-width: 2px; +} + +.highcharts-bubble-series .highcharts-point { + fill-opacity: 0.5; +} + +.highcharts-errorbar-series .highcharts-point { + stroke: #FFFFFF; +} + +.highcharts-gauge-series .highcharts-data-label-box { + stroke: #555555; + stroke-width: 1px; +} + +.highcharts-gauge-series .highcharts-dial { + fill: #FFFFFF; + stroke-width: 0; +} + +.highcharts-polygon-series .highcharts-graph { + fill: inherit; + stroke-width: 0; +} + +.highcharts-waterfall-series .highcharts-graph { + stroke: #AAAAAA; + stroke-dasharray: 1, 3; +} + +.highcharts-sankey-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-sankey-series .highcharts-link { + transition: fill 250ms, fill-opacity 250ms; + fill-opacity: 0.5; +} + +.highcharts-sankey-series .highcharts-point-hover.highcharts-link { + transition: fill 50ms, fill-opacity 50ms; + fill-opacity: 1; +} + +.highcharts-venn-series .highcharts-point { + fill-opacity: 0.75; + stroke: #555555; + transition: stroke 250ms, fill-opacity 250ms; +} + +.highcharts-venn-series .highcharts-point-hover { + fill-opacity: 1; + stroke: #555555; +} + +/* Highstock */ +.highcharts-navigator-mask-outside { + fill-opacity: 0; +} + +.highcharts-navigator-mask-inside { + fill: #6685c2; + /* navigator.maskFill option */ + fill-opacity: 0.25; + cursor: ew-resize; +} + +.highcharts-navigator-outline { + stroke: #555555; + fill: none; +} + +.highcharts-navigator-handle { + stroke: #555555; + fill: #555555; + cursor: ew-resize; +} + +.highcharts-navigator-series { + fill: #335cad; + stroke: #335cad; +} + +.highcharts-navigator-series .highcharts-graph { + stroke-width: 1px; +} + +.highcharts-navigator-series .highcharts-area { + fill-opacity: 0.05; +} + +.highcharts-navigator-xaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-navigator-xaxis .highcharts-grid-line { + stroke-width: 1px; + stroke: #555555; +} + +.highcharts-navigator-xaxis.highcharts-axis-labels { + fill: #AAAAAA; +} + +.highcharts-navigator-yaxis .highcharts-grid-line { + stroke-width: 0; +} + +.highcharts-scrollbar-thumb { + fill: #555555; + stroke: #555555; + stroke-width: 1px; +} + +.highcharts-scrollbar-button { + fill: #555555; + stroke: #555555; + stroke-width: 1px; +} + +.highcharts-scrollbar-arrow { + fill: #AAAAAA; +} + +.highcharts-scrollbar-rifles { + stroke: #AAAAAA; + stroke-width: 1px; +} + +.highcharts-scrollbar-track { + fill: #555555; + stroke: #555555; + stroke-width: 1px; +} + +.highcharts-button { + fill: #555555; + stroke: #555555; + cursor: default; + stroke-width: 1px; + transition: fill 250ms; +} + +.highcharts-button text { + fill: #AAAAAA; +} + +.highcharts-button-hover { + transition: fill 0ms; + fill: #555555; + stroke: #555555; +} + +.highcharts-button-hover text { + fill: #AAAAAA; +} + +.highcharts-button-pressed { + font-weight: bold; + fill: #e6ebf5; + stroke: #555555; +} + +.highcharts-button-pressed text { + fill: #AAAAAA; + font-weight: bold; +} + +.highcharts-button-disabled text { + fill: #AAAAAA; +} + +.highcharts-range-selector-buttons .highcharts-button { + stroke-width: 0px; +} + +.highcharts-range-label rect { + fill: none; +} + +.highcharts-range-label text { + fill: #AAAAAA; +} + +.highcharts-range-input rect { + fill: none; +} + +.highcharts-range-input text { + fill: #AAAAAA; +} + +.highcharts-range-input { + stroke-width: 1px; + stroke: #555555; +} + +input.highcharts-range-selector { + position: absolute; + border: 0; + width: 1px; + /* Chrome needs a pixel to see it */ + height: 1px; + padding: 0; + text-align: center; + left: -9em; + /* #4798 */ +} + +.highcharts-crosshair-label text { + fill: #000; + font-size: 1.1em; +} + +.highcharts-crosshair-label .highcharts-label-box { + fill: inherit; +} + +.highcharts-candlestick-series .highcharts-point { + stroke: #FFFFFF; + stroke-width: 1px; +} + +.highcharts-candlestick-series .highcharts-point-up { + fill: #000; +} + +.highcharts-ohlc-series .highcharts-point-hover { + stroke-width: 3px; +} + +.highcharts-flags-series .highcharts-point .highcharts-label-box { + stroke: #AAAAAA; + fill: #000; + transition: fill 250ms; +} + +.highcharts-flags-series .highcharts-point-hover .highcharts-label-box { + stroke: #FFFFFF; + fill: #ccd6eb; +} + +.highcharts-flags-series .highcharts-point text { + fill: #FFFFFF; + font-size: 0.9em; + font-weight: bold; +} + +/* Highmaps */ +.highcharts-map-series .highcharts-point { + transition: fill 500ms, fill-opacity 500ms, stroke-width 250ms; + stroke: #555555; +} + +.highcharts-map-series .highcharts-point-hover { + transition: fill 0ms, fill-opacity 0ms; + fill-opacity: 0.5; + stroke-width: 2px; +} + +.highcharts-mapline-series .highcharts-point { + fill: none; +} + +.highcharts-heatmap-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-map-navigation { + font-size: 1.3em; + font-weight: bold; + text-align: center; +} + +.highcharts-coloraxis { + stroke-width: 0; +} + +.highcharts-coloraxis-marker { + fill: #AAAAAA; +} + +.highcharts-null-point { + fill: #555555; +} + +/* 3d charts */ +.highcharts-3d-frame { + fill: transparent; +} + +/* Exporting module */ +.highcharts-contextbutton { + fill: #000; + /* needed to capture hover */ + stroke: none; + stroke-linecap: round; +} + +.highcharts-contextbutton:hover { + fill: #555555; + stroke: #555555; +} + +.highcharts-button-symbol { + stroke: #AAAAAA; + stroke-width: 3px; +} + +.highcharts-menu { + border: 1px solid #AAAAAA; + background: #000; + padding: 5px 0; + box-shadow: 3px 3px 10px #888; +} + +.highcharts-menu-item { + padding: 0.5em 1em; + background: none; + color: #AAAAAA; + cursor: pointer; + transition: background 250ms, color 250ms; +} + +.highcharts-menu-item:hover { + background: #335cad; + color: #000; +} + +/* Drilldown module */ +.highcharts-drilldown-point { + cursor: pointer; +} + +.highcharts-drilldown-data-label text, +text.highcharts-drilldown-data-label, +.highcharts-drilldown-axis-label { + cursor: pointer; + fill: #003399; + font-weight: bold; + text-decoration: underline; +} + +/* No-data module */ +.highcharts-no-data text { + font-weight: bold; + font-size: 12px; + fill: #AAAAAA; +} + +/* Drag-panes module */ +.highcharts-axis-resizer { + cursor: ns-resize; + stroke: black; + stroke-width: 2px; +} + +/* Bullet type series */ +.highcharts-bullet-target { + stroke-width: 0; +} + +/* Lineargauge type series */ +.highcharts-lineargauge-target { + stroke-width: 1px; + stroke: #AAAAAA; +} + +.highcharts-lineargauge-target-line { + stroke-width: 1px; + stroke: #AAAAAA; +} + +/* Annotations module */ +.highcharts-annotation-label-box { + stroke-width: 1px; + stroke: #FFFFFF; + fill: #FFFFFF; + fill-opacity: 0.75; +} + +.highcharts-annotation-label text { + fill: #555555; +} + +/* Gantt */ +.highcharts-treegrid-node-collapsed, .highcharts-treegrid-node-expanded { + cursor: pointer; +} + +.highcharts-point-connecting-path { + fill: none; +} + +.highcharts-grid-axis .highcharts-tick { + stroke-width: 1px; +} + +.highcharts-grid-axis .highcharts-axis-line { + stroke-width: 1px; +} + +/*# sourceMappingURL=dicserver_highcharts.css.map */ diff --git a/DiscImageChef.Server/styles/dos/dicserver_highcharts.scss b/DiscImageChef.Server/styles/dos/dicserver_highcharts.scss new file mode 100644 index 00000000..13da6985 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/dicserver_highcharts.scss @@ -0,0 +1,55 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : dicserver_highcharts.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets style for server's charts. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; +@import "_font"; +@import "_fontstyles"; + +$colors: $orange $green $brown $indigo $pink $teal $yellow $purple $cyan $white; +$background-color: $body-bg; + +$neutral-color-100: $brightwhite; // Strong text. +$neutral-color-80: $white; // Main text and some strokes. +$neutral-color-60: $white; // Axis labels, axis title, connector fallback. +$neutral-color-40: $white; // Credits text, export menu stroke. +$neutral-color-20: $darkgray; // Disabled texts, button strokes, crosshair etc. +$neutral-color-10: $darkgray; // Grid lines etc. +$neutral-color-5: $darkgray; // Minor grid lines etc. +$neutral-color-3: $darkgray; // Tooltip backgroud, button fills, map null points. + +$font-family: $font-family-base; + +$tooltip-background: $brightwhite; + +$data-label-color: $yellow; + +@import "../_highcharts"; \ No newline at end of file diff --git a/DiscImageChef.Server/styles/mac/_colors.scss b/DiscImageChef.Server/styles/mac/_colors.scss new file mode 100644 index 00000000..87c9aa0a --- /dev/null +++ b/DiscImageChef.Server/styles/mac/_colors.scss @@ -0,0 +1,89 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _colors.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets colors for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +/* Sets the grayscale for Bootstrap */ +$white: #FFFFFF; +$darkgray: #404040; +$gray-100: #C0C0C0; +$gray-200: #C0C0C0; +$gray-300: #C0C0C0; +$gray-400: #808080; +$gray-500: #808080; +$gray-600: #808080; +$gray-700: #404040; +$gray-800: #404040; +$gray-900: #404040; +$black: #000000; + +/* Sets color palette, using Macintosh II colors */ +$green: #1FB714; +$yellow: #FBF305; +$darkgreen: #006412; +$orange: #FF6403; +$brown: #562C05; +$red: #DD0907; +$tan:#90713A; +$magenta:#F20884; +$purple:#4700A5; +$blue:#0000D3; +$cyan:#02ABEA; + +/* Bootstrap color aliases */ +$primary: $blue; +$secondary: $gray-600; +$success: $green; +$info: $cyan; +$warning: $yellow; +$danger: $red; +$light: $gray-100; +$dark: $gray-800; + +/* Colors for */ +$body-bg: $white; +$body-color: $black; + +/* Colors for */ +$link-color: $cyan; +$link-hover-color: $magenta; + +/* Colors for cards */ +$card-border-color: rgba($gray-300, .125); +$card-cap-bg: rgba($gray-300, .03); +$card-cap-color: inherit; +$card-bg: $gray-300; + +/* Colors for tables */ +$table-dark-bg: $gray-300; +$table-dark-accent-bg: rgba($white, .05); +$table-dark-hover-bg: rgba($white, .075); +$table-dark-border-color: lighten($tan, 7.5%); +$table-dark-color: $darkgray; diff --git a/DiscImageChef.Server/styles/mac/_font.scss b/DiscImageChef.Server/styles/mac/_font.scss new file mode 100644 index 00000000..5ba7c7db --- /dev/null +++ b/DiscImageChef.Server/styles/mac/_font.scss @@ -0,0 +1,51 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _font.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets font for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +/* Sets font to Macintosh Chicago clone font */ +@font-face +{ + font-family: 'ChicagoFLF'; + src: url(../../fonts/ChicagoFLF.eot); + src: url(../../fonts/ChicagoFLF.eot?#iefix) format('embedded-opentype'), + url(../../fonts/ChicagoFLF.woff2) format('woff2'), + url(../../fonts/ChicagoFLF.woff) format('woff'), + url(../../fonts/ChicagoFLF.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} + +$font-family-sans-serif: 'ChicagoFLF'; +$font-family-monospace: 'ChicagoFLF'; +$font-family-base: 'ChicagoFLF'; +$font-size-base: 1rem; + +$line-height-base: 1; diff --git a/DiscImageChef.Server/styles/mac/_fontstyles.scss b/DiscImageChef.Server/styles/mac/_fontstyles.scss new file mode 100644 index 00000000..71a5a78c --- /dev/null +++ b/DiscImageChef.Server/styles/mac/_fontstyles.scss @@ -0,0 +1,49 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _fontstyles.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets font styles for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; + +/* Sets the style for emphasis/italics */ +em, i +{ + font-style: italic; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong +{ + font-size: 1em; + font-style: normal; + font-weight: bold; + margin: 0; +} diff --git a/DiscImageChef.Server/styles/mac/dicserver.css b/DiscImageChef.Server/styles/mac/dicserver.css new file mode 100644 index 00000000..d0d7b4ef --- /dev/null +++ b/DiscImageChef.Server/styles/mac/dicserver.css @@ -0,0 +1,9595 @@ +@charset "UTF-8"; +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using Macintosh II colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets font to Macintosh Chicago clone font */ +@font-face { + font-family: "ChicagoFLF"; + src: url(../../fonts/ChicagoFLF.eot); + src: url(../../fonts/ChicagoFLF.eot?#iefix) format("embedded-opentype"), url(../../fonts/ChicagoFLF.woff2) format("woff2"), url(../../fonts/ChicagoFLF.woff) format("woff"), url(../../fonts/ChicagoFLF.ttf) format("truetype"); + font-weight: normal; + font-style: normal; +} +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using Macintosh II colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets the style for emphasis/italics */ +em, i { + font-style: italic; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong { + font-size: 1em; + font-style: normal; + font-weight: bold; + margin: 0; +} + +/*! + * Bootstrap v4.2.1 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #0000D3; + --indigo: #6610f2; + --purple: #4700A5; + --pink: #e83e8c; + --red: #DD0907; + --orange: #FF6403; + --yellow: #FBF305; + --green: #1FB714; + --teal: #20c997; + --cyan: #02ABEA; + --white: #FFFFFF; + --gray: #808080; + --gray-dark: #404040; + --primary: #0000D3; + --secondary: #808080; + --success: #1FB714; + --info: #02ABEA; + --warning: #FBF305; + --danger: #DD0907; + --light: #C0C0C0; + --dark: #404040; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: "ChicagoFLF"; + --font-family-monospace: "ChicagoFLF"; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: "ChicagoFLF"; + font-size: 1rem; + font-weight: 400; + line-height: 1; + color: #000000; + text-align: left; + background-color: #FFFFFF; +} + +[tabindex="-1"]:focus { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: #02ABEA; + text-decoration: none; + background-color: transparent; +} +a:hover { + color: #F20884; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: "ChicagoFLF"; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #808080; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type=radio], +input[type=checkbox] { + box-sizing: border-box; + padding: 0; +} + +input[type=date], +input[type=time], +input[type=datetime-local], +input[type=month] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 500; + line-height: 1.2; + color: inherit; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #808080; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #FFFFFF; + border: 1px solid #C0C0C0; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #808080; +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-break: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #FFFFFF; + background-color: #404040; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #404040; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.row { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} +.no-gutters > .col, +.no-gutters > [class*=col-] { + padding-right: 0; + padding-left: 0; +} + +.col-xl, +.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg, +.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md, +.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm, +.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col, +.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; +} + +.col-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; +} + +.col-3 { + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; +} + +.col-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; +} + +.col-6 { + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; +} + +.col-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; +} + +.col-9 { + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; +} + +.col-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; +} + +.col-12 { + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + order: -1; +} + +.order-last { + order: 13; +} + +.order-0 { + order: 0; +} + +.order-1 { + order: 1; +} + +.order-2 { + order: 2; +} + +.order-3 { + order: 3; +} + +.order-4 { + order: 4; +} + +.order-5 { + order: 5; +} + +.order-6 { + order: 6; +} + +.order-7 { + order: 7; +} + +.order-8 { + order: 8; +} + +.order-9 { + order: 9; +} + +.order-10 { + order: 10; +} + +.order-11 { + order: 11; +} + +.order-12 { + order: 12; +} + +.offset-1 { + margin-left: 8.3333333333%; +} + +.offset-2 { + margin-left: 16.6666666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.3333333333%; +} + +.offset-5 { + margin-left: 41.6666666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.3333333333%; +} + +.offset-8 { + margin-left: 66.6666666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.3333333333%; +} + +.offset-11 { + margin-left: 91.6666666667%; +} + +@media (min-width: 576px) { + .col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-sm-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-sm-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-sm-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-sm-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-sm-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-sm-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-sm-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-sm-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-sm-first { + order: -1; + } + + .order-sm-last { + order: 13; + } + + .order-sm-0 { + order: 0; + } + + .order-sm-1 { + order: 1; + } + + .order-sm-2 { + order: 2; + } + + .order-sm-3 { + order: 3; + } + + .order-sm-4 { + order: 4; + } + + .order-sm-5 { + order: 5; + } + + .order-sm-6 { + order: 6; + } + + .order-sm-7 { + order: 7; + } + + .order-sm-8 { + order: 8; + } + + .order-sm-9 { + order: 9; + } + + .order-sm-10 { + order: 10; + } + + .order-sm-11 { + order: 11; + } + + .order-sm-12 { + order: 12; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.3333333333%; + } + + .offset-sm-2 { + margin-left: 16.6666666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.3333333333%; + } + + .offset-sm-5 { + margin-left: 41.6666666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.3333333333%; + } + + .offset-sm-8 { + margin-left: 66.6666666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.3333333333%; + } + + .offset-sm-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 768px) { + .col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-md-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-md-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-md-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-md-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-md-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-md-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-md-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-md-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-md-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-md-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-md-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-md-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-md-first { + order: -1; + } + + .order-md-last { + order: 13; + } + + .order-md-0 { + order: 0; + } + + .order-md-1 { + order: 1; + } + + .order-md-2 { + order: 2; + } + + .order-md-3 { + order: 3; + } + + .order-md-4 { + order: 4; + } + + .order-md-5 { + order: 5; + } + + .order-md-6 { + order: 6; + } + + .order-md-7 { + order: 7; + } + + .order-md-8 { + order: 8; + } + + .order-md-9 { + order: 9; + } + + .order-md-10 { + order: 10; + } + + .order-md-11 { + order: 11; + } + + .order-md-12 { + order: 12; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.3333333333%; + } + + .offset-md-2 { + margin-left: 16.6666666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.3333333333%; + } + + .offset-md-5 { + margin-left: 41.6666666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.3333333333%; + } + + .offset-md-8 { + margin-left: 66.6666666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.3333333333%; + } + + .offset-md-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 992px) { + .col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-lg-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-lg-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-lg-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-lg-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-lg-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-lg-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-lg-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-lg-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-lg-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-lg-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-lg-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-lg-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-lg-first { + order: -1; + } + + .order-lg-last { + order: 13; + } + + .order-lg-0 { + order: 0; + } + + .order-lg-1 { + order: 1; + } + + .order-lg-2 { + order: 2; + } + + .order-lg-3 { + order: 3; + } + + .order-lg-4 { + order: 4; + } + + .order-lg-5 { + order: 5; + } + + .order-lg-6 { + order: 6; + } + + .order-lg-7 { + order: 7; + } + + .order-lg-8 { + order: 8; + } + + .order-lg-9 { + order: 9; + } + + .order-lg-10 { + order: 10; + } + + .order-lg-11 { + order: 11; + } + + .order-lg-12 { + order: 12; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.3333333333%; + } + + .offset-lg-2 { + margin-left: 16.6666666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.3333333333%; + } + + .offset-lg-5 { + margin-left: 41.6666666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.3333333333%; + } + + .offset-lg-8 { + margin-left: 66.6666666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.3333333333%; + } + + .offset-lg-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 1200px) { + .col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-xl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-xl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-xl-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-xl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-xl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-xl-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-xl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-xl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-xl-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-xl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-xl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-xl-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-xl-first { + order: -1; + } + + .order-xl-last { + order: 13; + } + + .order-xl-0 { + order: 0; + } + + .order-xl-1 { + order: 1; + } + + .order-xl-2 { + order: 2; + } + + .order-xl-3 { + order: 3; + } + + .order-xl-4 { + order: 4; + } + + .order-xl-5 { + order: 5; + } + + .order-xl-6 { + order: 6; + } + + .order-xl-7 { + order: 7; + } + + .order-xl-8 { + order: 8; + } + + .order-xl-9 { + order: 9; + } + + .order-xl-10 { + order: 10; + } + + .order-xl-11 { + order: 11; + } + + .order-xl-12 { + order: 12; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.3333333333%; + } + + .offset-xl-2 { + margin-left: 16.6666666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.3333333333%; + } + + .offset-xl-5 { + margin-left: 41.6666666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.3333333333%; + } + + .offset-xl-8 { + margin-left: 66.6666666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.3333333333%; + } + + .offset-xl-11 { + margin-left: 91.6666666667%; + } +} +.table { + width: 100%; + margin-bottom: 1rem; + background-color: transparent; +} +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #C0C0C0; +} +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #C0C0C0; +} +.table tbody + tbody { + border-top: 2px solid #C0C0C0; +} +.table .table { + background-color: #FFFFFF; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #C0C0C0; +} +.table-bordered th, +.table-bordered td { + border: 1px solid #C0C0C0; +} +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #b8b8f3; +} +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #7a7ae8; +} + +.table-hover .table-primary:hover { + background-color: #a2a2ef; +} +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #a2a2ef; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #dbdbdb; +} +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #bdbdbd; +} + +.table-hover .table-secondary:hover { + background-color: #cecece; +} +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #cecece; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #c0ebbd; +} +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8bda85; +} + +.table-hover .table-success:hover { + background-color: #ade5a9; +} +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #ade5a9; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #b8e7f9; +} +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #7bd3f4; +} + +.table-hover .table-info:hover { + background-color: #a0dff7; +} +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #a0dff7; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #fefcb9; +} +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #fdf97d; +} + +.table-hover .table-warning:hover { + background-color: #fefba0; +} +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #fefba0; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f5baba; +} +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ed7f7e; +} + +.table-hover .table-danger:hover { + background-color: #f2a4a4; +} +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #f2a4a4; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #ededed; +} +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #dedede; +} + +.table-hover .table-light:hover { + background-color: #e0e0e0; +} +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #e0e0e0; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #cacaca; +} +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #9c9c9c; +} + +.table-hover .table-dark:hover { + background-color: #bdbdbd; +} +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #bdbdbd; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #404040; + background-color: #C0C0C0; + border-color: #ab8645; +} +.table .thead-light th { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} + +.table-dark { + color: #404040; + background-color: #C0C0C0; +} +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #ab8645; +} +.table-dark.table-bordered { + border: 0; +} +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); +} +.table-dark.table-hover tbody tr:hover { + background-color: rgba(255, 255, 255, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; +} +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + height: calc(1.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1; + color: #404040; + background-color: #FFFFFF; + background-clip: padding-box; + border: 1px solid #808080; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control:focus { + color: #404040; + background-color: #FFFFFF; + border-color: #5454ff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.form-control::placeholder { + color: #808080; + opacity: 1; +} +.form-control:disabled, .form-control[readonly] { + background-color: #C0C0C0; + opacity: 1; +} + +select.form-control:focus::-ms-value { + color: #404040; + background-color: #FFFFFF; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1; + color: #000000; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(1.8125rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.form-control-lg { + height: calc(2.875rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} +.form-row > .col, +.form-row > [class*=col-] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} +.form-check-input:disabled ~ .form-check-label { + color: #808080; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #1FB714; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + line-height: 1; + color: #FFFFFF; + background-color: rgba(31, 183, 20, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #1FB714; + padding-right: 1.75rem; + background-repeat: no-repeat; + background-position: center right calc(1.75rem / 4); + background-size: calc(1.75rem / 2) calc(1.75rem / 2); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231FB714' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #1FB714; + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.25); +} +.was-validated .form-control:valid ~ .valid-feedback, +.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, +.form-control.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: 1.75rem; + background-position: top calc(1.75rem / 4) right calc(1.75rem / 4); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #1FB714; + padding-right: 3.0625rem; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23404040' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231FB714' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") no-repeat center right 1.75rem/0.875rem 0.875rem; +} +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #1FB714; + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.25); +} +.was-validated .custom-select:valid ~ .valid-feedback, +.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, +.custom-select.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control-file:valid ~ .valid-feedback, +.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback, +.form-control-file.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #1FB714; +} +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #1FB714; +} +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #1FB714; +} +.was-validated .custom-control-input:valid ~ .valid-feedback, +.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, +.custom-control-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #27e519; + background-color: #27e519; +} +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.25); +} +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #1FB714; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #1FB714; +} +.was-validated .custom-file-input:valid ~ .valid-feedback, +.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, +.custom-file-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #1FB714; + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #DD0907; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + line-height: 1; + color: #FFFFFF; + background-color: rgba(221, 9, 7, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #DD0907; + padding-right: 1.75rem; + background-repeat: no-repeat; + background-position: center right calc(1.75rem / 4); + background-size: calc(1.75rem / 2) calc(1.75rem / 2); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23DD0907' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #DD0907; + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.25); +} +.was-validated .form-control:invalid ~ .invalid-feedback, +.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, +.form-control.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: 1.75rem; + background-position: top calc(1.75rem / 4) right calc(1.75rem / 4); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #DD0907; + padding-right: 3.0625rem; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23404040' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23DD0907' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") no-repeat center right 1.75rem/0.875rem 0.875rem; +} +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #DD0907; + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.25); +} +.was-validated .custom-select:invalid ~ .invalid-feedback, +.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, +.custom-select.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control-file:invalid ~ .invalid-feedback, +.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback, +.form-control-file.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #DD0907; +} +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #DD0907; +} +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #DD0907; +} +.was-validated .custom-control-input:invalid ~ .invalid-feedback, +.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, +.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #f8211f; + background-color: #f8211f; +} +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.25); +} +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #DD0907; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #DD0907; +} +.was-validated .custom-file-input:invalid ~ .invalid-feedback, +.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, +.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #DD0907; + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.25); +} + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center; +} +.form-inline .form-check { + width: 100%; +} +@media (min-width: 576px) { + .form-inline label { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, +.form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + align-items: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #000000; + text-align: center; + vertical-align: middle; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: #000000; + text-decoration: none; +} +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.btn.disabled, .btn:disabled { + opacity: 0.65; +} +.btn:not(:disabled):not(.disabled) { + cursor: pointer; +} +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.btn-primary:hover { + color: #FFFFFF; + background-color: #0000ad; + border-color: #0000a0; +} +.btn-primary:focus, .btn-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(38, 38, 218, 0.5); +} +.btn-primary.disabled, .btn-primary:disabled { + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { + color: #FFFFFF; + background-color: #0000a0; + border-color: #000093; +} +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(38, 38, 218, 0.5); +} + +.btn-secondary { + color: #FFFFFF; + background-color: #808080; + border-color: #808080; +} +.btn-secondary:hover { + color: #FFFFFF; + background-color: #6d6d6d; + border-color: #676767; +} +.btn-secondary:focus, .btn-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(147, 147, 147, 0.5); +} +.btn-secondary.disabled, .btn-secondary:disabled { + color: #FFFFFF; + background-color: #808080; + border-color: #808080; +} +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { + color: #FFFFFF; + background-color: #676767; + border-color: #606060; +} +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(147, 147, 147, 0.5); +} + +.btn-success { + color: #FFFFFF; + background-color: #1FB714; + border-color: #1FB714; +} +.btn-success:hover { + color: #FFFFFF; + background-color: #199510; + border-color: #17890f; +} +.btn-success:focus, .btn-success.focus { + box-shadow: 0 0 0 0.2rem rgba(65, 194, 55, 0.5); +} +.btn-success.disabled, .btn-success:disabled { + color: #FFFFFF; + background-color: #1FB714; + border-color: #1FB714; +} +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { + color: #FFFFFF; + background-color: #17890f; + border-color: #157e0e; +} +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(65, 194, 55, 0.5); +} + +.btn-info { + color: #FFFFFF; + background-color: #02ABEA; + border-color: #02ABEA; +} +.btn-info:hover { + color: #FFFFFF; + background-color: #028fc4; + border-color: #0286b7; +} +.btn-info:focus, .btn-info.focus { + box-shadow: 0 0 0 0.2rem rgba(40, 184, 237, 0.5); +} +.btn-info.disabled, .btn-info:disabled { + color: #FFFFFF; + background-color: #02ABEA; + border-color: #02ABEA; +} +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { + color: #FFFFFF; + background-color: #0286b7; + border-color: #017dab; +} +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(40, 184, 237, 0.5); +} + +.btn-warning { + color: #404040; + background-color: #FBF305; + border-color: #FBF305; +} +.btn-warning:hover { + color: #404040; + background-color: #d6cf03; + border-color: #cac303; +} +.btn-warning:focus, .btn-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(223, 216, 14, 0.5); +} +.btn-warning.disabled, .btn-warning:disabled { + color: #404040; + background-color: #FBF305; + border-color: #FBF305; +} +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle { + color: #404040; + background-color: #cac303; + border-color: #bdb703; +} +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(223, 216, 14, 0.5); +} + +.btn-danger { + color: #FFFFFF; + background-color: #DD0907; + border-color: #DD0907; +} +.btn-danger:hover { + color: #FFFFFF; + background-color: #b80706; + border-color: #ac0705; +} +.btn-danger:focus, .btn-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(226, 46, 44, 0.5); +} +.btn-danger.disabled, .btn-danger:disabled { + color: #FFFFFF; + background-color: #DD0907; + border-color: #DD0907; +} +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { + color: #FFFFFF; + background-color: #ac0705; + border-color: #9f0605; +} +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(226, 46, 44, 0.5); +} + +.btn-light { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-light:hover { + color: #404040; + background-color: #adadad; + border-color: #a7a7a7; +} +.btn-light:focus, .btn-light.focus { + box-shadow: 0 0 0 0.2rem rgba(173, 173, 173, 0.5); +} +.btn-light.disabled, .btn-light:disabled { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { + color: #404040; + background-color: #a7a7a7; + border-color: #a0a0a0; +} +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(173, 173, 173, 0.5); +} + +.btn-dark { + color: #FFFFFF; + background-color: #404040; + border-color: #404040; +} +.btn-dark:hover { + color: #FFFFFF; + background-color: #2d2d2d; + border-color: #272727; +} +.btn-dark:focus, .btn-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(93, 93, 93, 0.5); +} +.btn-dark.disabled, .btn-dark:disabled { + color: #FFFFFF; + background-color: #404040; + border-color: #404040; +} +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { + color: #FFFFFF; + background-color: #272727; + border-color: #202020; +} +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(93, 93, 93, 0.5); +} + +.btn-outline-primary { + color: #0000D3; + border-color: #0000D3; +} +.btn-outline-primary:hover { + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.5); +} +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #0000D3; + background-color: transparent; +} +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.5); +} + +.btn-outline-secondary { + color: #808080; + border-color: #808080; +} +.btn-outline-secondary:hover { + color: #FFFFFF; + background-color: #808080; + border-color: #808080; +} +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(128, 128, 128, 0.5); +} +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #808080; + background-color: transparent; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { + color: #FFFFFF; + background-color: #808080; + border-color: #808080; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(128, 128, 128, 0.5); +} + +.btn-outline-success { + color: #1FB714; + border-color: #1FB714; +} +.btn-outline-success:hover { + color: #FFFFFF; + background-color: #1FB714; + border-color: #1FB714; +} +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.5); +} +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #1FB714; + background-color: transparent; +} +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { + color: #FFFFFF; + background-color: #1FB714; + border-color: #1FB714; +} +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.5); +} + +.btn-outline-info { + color: #02ABEA; + border-color: #02ABEA; +} +.btn-outline-info:hover { + color: #FFFFFF; + background-color: #02ABEA; + border-color: #02ABEA; +} +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(2, 171, 234, 0.5); +} +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #02ABEA; + background-color: transparent; +} +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { + color: #FFFFFF; + background-color: #02ABEA; + border-color: #02ABEA; +} +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(2, 171, 234, 0.5); +} + +.btn-outline-warning { + color: #FBF305; + border-color: #FBF305; +} +.btn-outline-warning:hover { + color: #404040; + background-color: #FBF305; + border-color: #FBF305; +} +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(251, 243, 5, 0.5); +} +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #FBF305; + background-color: transparent; +} +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { + color: #404040; + background-color: #FBF305; + border-color: #FBF305; +} +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(251, 243, 5, 0.5); +} + +.btn-outline-danger { + color: #DD0907; + border-color: #DD0907; +} +.btn-outline-danger:hover { + color: #FFFFFF; + background-color: #DD0907; + border-color: #DD0907; +} +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.5); +} +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #DD0907; + background-color: transparent; +} +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { + color: #FFFFFF; + background-color: #DD0907; + border-color: #DD0907; +} +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.5); +} + +.btn-outline-light { + color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-outline-light:hover { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(192, 192, 192, 0.5); +} +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #C0C0C0; + background-color: transparent; +} +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(192, 192, 192, 0.5); +} + +.btn-outline-dark { + color: #404040; + border-color: #404040; +} +.btn-outline-dark:hover { + color: #FFFFFF; + background-color: #404040; + border-color: #404040; +} +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(64, 64, 64, 0.5); +} +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #404040; + background-color: transparent; +} +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { + color: #FFFFFF; + background-color: #404040; + border-color: #404040; +} +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(64, 64, 64, 0.5); +} + +.btn-link { + font-weight: 400; + color: #02ABEA; +} +.btn-link:hover { + color: #F20884; + text-decoration: underline; +} +.btn-link:focus, .btn-link.focus { + text-decoration: underline; + box-shadow: none; +} +.btn-link:disabled, .btn-link.disabled { + color: #808080; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type=submit].btn-block, +input[type=reset].btn-block, +input[type=button].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} +@media screen and (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #000000; + text-align: left; + list-style: none; + background-color: #FFFFFF; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} +.dropdown-menu-left { + right: auto; + left: 0; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } +} +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropleft .dropdown-toggle::after { + display: none; +} +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^=top], .dropdown-menu[x-placement^=right], .dropdown-menu[x-placement^=bottom], .dropdown-menu[x-placement^=left] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #C0C0C0; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #404040; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:first-child { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.dropdown-item:last-child { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.dropdown-item:hover, .dropdown-item:focus { + color: #333333; + text-decoration: none; + background-color: #C0C0C0; +} +.dropdown-item.active, .dropdown-item:active { + color: #FFFFFF; + text-decoration: none; + background-color: #0000D3; +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: #808080; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #808080; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #404040; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after { + margin-left: 0; +} +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} +.btn-group-toggle > .btn input[type=radio], +.btn-group-toggle > .btn input[type=checkbox], +.btn-group-toggle > .btn-group > .btn input[type=radio], +.btn-group-toggle > .btn-group > .btn input[type=checkbox] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; +} +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} +.input-group > .form-control:not(:last-child), +.input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .custom-file { + display: flex; + align-items: center; +} +.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: flex; +} +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1; + color: #404040; + text-align: center; + white-space: nowrap; + background-color: #C0C0C0; + border: 1px solid #808080; + border-radius: 0.25rem; +} +.input-group-text input[type=radio], +.input-group-text input[type=checkbox] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(2.875rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.8125rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + display: block; + min-height: 1rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; +} +.custom-control-input:checked ~ .custom-control-label::before { + color: #FFFFFF; + border-color: #0000D3; + background-color: #0000D3; +} +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #5454ff; +} +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #FFFFFF; + background-color: #8787ff; + border-color: #8787ff; +} +.custom-control-input:disabled ~ .custom-control-label { + color: #808080; +} +.custom-control-input:disabled ~ .custom-control-label::before { + background-color: #C0C0C0; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} +.custom-control-label::before { + position: absolute; + top: 0rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #FFFFFF; + border: #808080 solid 1px; +} +.custom-control-label::after { + position: absolute; + top: 0rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background-repeat: no-repeat; + background-position: center center; + background-size: 50% 50%; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; +} +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23FFFFFF' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #0000D3; + background-color: #0000D3; +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23FFFFFF' d='M0 2h4'/%3e%3c/svg%3e"); +} +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 211, 0.5); +} +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 0, 211, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23FFFFFF'/%3e%3c/svg%3e"); +} +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 211, 0.5); +} + +.custom-switch { + padding-left: 2.25rem; +} +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} +.custom-switch .custom-control-label::after { + top: calc(0rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #808080; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #FFFFFF; + transform: translateX(0.75rem); +} +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 211, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-weight: 400; + line-height: 1; + color: #404040; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23404040' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #FFFFFF; + border: 1px solid #808080; + border-radius: 0.25rem; + appearance: none; +} +.custom-select:focus { + border-color: #5454ff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(84, 84, 255, 0.5); +} +.custom-select:focus::-ms-value { + color: #404040; + background-color: #FFFFFF; +} +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} +.custom-select:disabled { + color: #808080; + background-color: #C0C0C0; +} +.custom-select::-ms-expand { + opacity: 0; +} + +.custom-select-sm { + height: calc(1.8125rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.custom-select-lg { + height: calc(2.875rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.75rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.75rem + 2px); + margin: 0; + opacity: 0; +} +.custom-file-input:focus ~ .custom-file-label { + border-color: #5454ff; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-file-input:disabled ~ .custom-file-label { + background-color: #C0C0C0; +} +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.75rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1; + color: #404040; + background-color: #FFFFFF; + border: 1px solid #808080; + border-radius: 0.25rem; +} +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: 1.75rem; + padding: 0.375rem 0.75rem; + line-height: 1; + color: #404040; + content: "Browse"; + background-color: #C0C0C0; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; +} + +.custom-range { + width: 100%; + height: calc(1rem + 0.4rem); + padding: 0; + background-color: transparent; + appearance: none; +} +.custom-range:focus { + outline: none; +} +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #FFFFFF, 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #FFFFFF, 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #FFFFFF, 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-range::-moz-focus-outer { + border: 0; +} +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0000D3; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; + } +} +.custom-range::-webkit-slider-thumb:active { + background-color: #8787ff; +} +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #C0C0C0; + border-color: transparent; + border-radius: 1rem; +} +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0000D3; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; + } +} +.custom-range::-moz-range-thumb:active { + background-color: #8787ff; +} +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #C0C0C0; + border-color: transparent; + border-radius: 1rem; +} +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #0000D3; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; + } +} +.custom-range::-ms-thumb:active { + background-color: #8787ff; +} +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; +} +.custom-range::-ms-fill-lower { + background-color: #C0C0C0; + border-radius: 1rem; +} +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #C0C0C0; + border-radius: 1rem; +} +.custom-range:disabled::-webkit-slider-thumb { + background-color: #808080; +} +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} +.custom-range:disabled::-moz-range-thumb { + background-color: #808080; +} +.custom-range:disabled::-moz-range-track { + cursor: default; +} +.custom-range:disabled::-ms-thumb { + background-color: #808080; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-control-label::before, +.custom-file-label, +.custom-select { + transition: none; + } +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} +.nav-link.disabled { + color: #808080; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #C0C0C0; +} +.nav-tabs .nav-item { + margin-bottom: -1px; +} +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #C0C0C0 #C0C0C0 #C0C0C0; +} +.nav-tabs .nav-link.disabled { + color: #808080; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #404040; + background-color: #FFFFFF; + border-color: #C0C0C0 #C0C0C0 #FFFFFF; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #FFFFFF; + background-color: #0000D3; +} + +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 0.5rem 1rem; +} +.navbar > .container, +.navbar > .container-fluid { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} +.navbar-toggler:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, +.navbar-expand-sm > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, +.navbar-expand-sm > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} +@media (max-width: 767.98px) { + .navbar-expand-md > .container, +.navbar-expand-md > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, +.navbar-expand-md > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, +.navbar-expand-lg > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, +.navbar-expand-lg > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, +.navbar-expand-xl > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, +.navbar-expand-xl > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + padding-right: 0; + padding-left: 0; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + flex-wrap: nowrap; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #FFFFFF; +} +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #FFFFFF; +} +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #FFFFFF; +} +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} +.navbar-dark .navbar-text a { + color: #FFFFFF; +} +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #FFFFFF; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #C0C0C0; + background-clip: border-box; + border: 1px solid rgba(192, 192, 192, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-body { + flex: 1 1 auto; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + color: inherit; + background-color: rgba(192, 192, 192, 0.03); + border-bottom: 1px solid rgba(192, 192, 192, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(192, 192, 192, 0.03); + border-top: 1px solid rgba(192, 192, 192, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img { + width: 100%; + border-radius: calc(0.25rem - 1px); +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck { + display: flex; + flex-direction: column; +} +.card-deck .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-deck { + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + display: flex; + flex: 1 0 0%; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group { + display: flex; + flex-direction: column; +} +.card-group > .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-group { + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:first-child .card-img-top, +.card-group > .card:first-child .card-header { + border-top-right-radius: 0; + } + .card-group > .card:first-child .card-img-bottom, +.card-group > .card:first-child .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:last-child .card-img-top, +.card-group > .card:last-child .card-header { + border-top-left-radius: 0; + } + .card-group > .card:last-child .card-img-bottom, +.card-group > .card:last-child .card-footer { + border-bottom-left-radius: 0; + } + .card-group > .card:only-child { + border-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-top, +.card-group > .card:only-child .card-header { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-bottom, +.card-group > .card:only-child .card-footer { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) { + border-radius: 0; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer { + border-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-columns { + column-count: 3; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion .card { + overflow: hidden; +} +.accordion .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; +} +.accordion .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; +} +.accordion .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.accordion .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.accordion .card .card-header { + margin-bottom: -1px; +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #C0C0C0; + border-radius: 0.25rem; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #808080; + content: "/"; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} +.breadcrumb-item.active { + color: #808080; +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #02ABEA; + background-color: #FFFFFF; + border: 1px solid #C0C0C0; +} +.page-link:hover { + z-index: 2; + color: #F20884; + text-decoration: none; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.page-link:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} +.page-item.active .page-link { + z-index: 1; + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.page-item.disabled .page-link { + color: #808080; + pointer-events: none; + cursor: auto; + background-color: #FFFFFF; + border-color: #C0C0C0; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #FFFFFF; + background-color: #0000D3; +} +a.badge-primary:hover, a.badge-primary:focus { + color: #FFFFFF; + background-color: #0000a0; +} + +.badge-secondary { + color: #FFFFFF; + background-color: #808080; +} +a.badge-secondary:hover, a.badge-secondary:focus { + color: #FFFFFF; + background-color: #676767; +} + +.badge-success { + color: #FFFFFF; + background-color: #1FB714; +} +a.badge-success:hover, a.badge-success:focus { + color: #FFFFFF; + background-color: #17890f; +} + +.badge-info { + color: #FFFFFF; + background-color: #02ABEA; +} +a.badge-info:hover, a.badge-info:focus { + color: #FFFFFF; + background-color: #0286b7; +} + +.badge-warning { + color: #404040; + background-color: #FBF305; +} +a.badge-warning:hover, a.badge-warning:focus { + color: #404040; + background-color: #cac303; +} + +.badge-danger { + color: #FFFFFF; + background-color: #DD0907; +} +a.badge-danger:hover, a.badge-danger:focus { + color: #FFFFFF; + background-color: #ac0705; +} + +.badge-light { + color: #404040; + background-color: #C0C0C0; +} +a.badge-light:hover, a.badge-light:focus { + color: #404040; + background-color: #a7a7a7; +} + +.badge-dark { + color: #FFFFFF; + background-color: #404040; +} +a.badge-dark:hover, a.badge-dark:focus { + color: #FFFFFF; + background-color: #272727; +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #C0C0C0; + border-radius: 0.3rem; +} +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 4rem; +} +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #00006e; + background-color: #ccccf6; + border-color: #b8b8f3; +} +.alert-primary hr { + border-top-color: #a2a2ef; +} +.alert-primary .alert-link { + color: #00003b; +} + +.alert-secondary { + color: #434343; + background-color: #e6e6e6; + border-color: #dbdbdb; +} +.alert-secondary hr { + border-top-color: #cecece; +} +.alert-secondary .alert-link { + color: #2a2a2a; +} + +.alert-success { + color: #105f0a; + background-color: #d2f1d0; + border-color: #c0ebbd; +} +.alert-success hr { + border-top-color: #ade5a9; +} +.alert-success .alert-link { + color: #083105; +} + +.alert-info { + color: #01597a; + background-color: #cceefb; + border-color: #b8e7f9; +} +.alert-info hr { + border-top-color: #a0dff7; +} +.alert-info .alert-link { + color: #013447; +} + +.alert-warning { + color: #837e03; + background-color: #fefdcd; + border-color: #fefcb9; +} +.alert-warning hr { + border-top-color: #fefba0; +} +.alert-warning .alert-link { + color: #514e02; +} + +.alert-danger { + color: #730504; + background-color: #f8cecd; + border-color: #f5baba; +} +.alert-danger hr { + border-top-color: #f2a4a4; +} +.alert-danger .alert-link { + color: #420302; +} + +.alert-light { + color: #646464; + background-color: #f2f2f2; + border-color: #ededed; +} +.alert-light hr { + border-top-color: #e0e0e0; +} +.alert-light .alert-link { + color: #4b4b4b; +} + +.alert-dark { + color: #212121; + background-color: #d9d9d9; + border-color: #cacaca; +} +.alert-dark hr { + border-top-color: #bdbdbd; +} +.alert-dark .alert-link { + color: #080808; +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #C0C0C0; + border-radius: 0.25rem; +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + color: #FFFFFF; + text-align: center; + white-space: nowrap; + background-color: #0000D3; + transition: width 0.6s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + animation: progress-bar-stripes 1s linear infinite; +} + +.media { + display: flex; + align-items: flex-start; +} + +.media-body { + flex: 1; +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #404040; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + color: #404040; + text-decoration: none; + background-color: #C0C0C0; +} +.list-group-item-action:active { + color: #000000; + background-color: #C0C0C0; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #FFFFFF; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.list-group-item:hover, .list-group-item:focus { + z-index: 1; + text-decoration: none; +} +.list-group-item.disabled, .list-group-item:disabled { + color: #808080; + pointer-events: none; + background-color: #FFFFFF; +} +.list-group-item.active { + z-index: 2; + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.list-group-flush .list-group-item:last-child { + margin-bottom: -1px; +} +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; +} +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0; +} + +.list-group-item-primary { + color: #00006e; + background-color: #b8b8f3; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #00006e; + background-color: #a2a2ef; +} +.list-group-item-primary.list-group-item-action.active { + color: #FFFFFF; + background-color: #00006e; + border-color: #00006e; +} + +.list-group-item-secondary { + color: #434343; + background-color: #dbdbdb; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #434343; + background-color: #cecece; +} +.list-group-item-secondary.list-group-item-action.active { + color: #FFFFFF; + background-color: #434343; + border-color: #434343; +} + +.list-group-item-success { + color: #105f0a; + background-color: #c0ebbd; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #105f0a; + background-color: #ade5a9; +} +.list-group-item-success.list-group-item-action.active { + color: #FFFFFF; + background-color: #105f0a; + border-color: #105f0a; +} + +.list-group-item-info { + color: #01597a; + background-color: #b8e7f9; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #01597a; + background-color: #a0dff7; +} +.list-group-item-info.list-group-item-action.active { + color: #FFFFFF; + background-color: #01597a; + border-color: #01597a; +} + +.list-group-item-warning { + color: #837e03; + background-color: #fefcb9; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #837e03; + background-color: #fefba0; +} +.list-group-item-warning.list-group-item-action.active { + color: #FFFFFF; + background-color: #837e03; + border-color: #837e03; +} + +.list-group-item-danger { + color: #730504; + background-color: #f5baba; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #730504; + background-color: #f2a4a4; +} +.list-group-item-danger.list-group-item-action.active { + color: #FFFFFF; + background-color: #730504; + border-color: #730504; +} + +.list-group-item-light { + color: #646464; + background-color: #ededed; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #646464; + background-color: #e0e0e0; +} +.list-group-item-light.list-group-item-action.active { + color: #FFFFFF; + background-color: #646464; + border-color: #646464; +} + +.list-group-item-dark { + color: #212121; + background-color: #cacaca; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #212121; + background-color: #bdbdbd; +} +.list-group-item-dark.list-group-item-action.active { + color: #FFFFFF; + background-color: #212121; + border-color: #212121; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #FFFFFF; + opacity: 0.5; +} +.close:hover { + color: #000000; + text-decoration: none; +} +.close:not(:disabled):not(.disabled) { + cursor: pointer; +} +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: 0.75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + appearance: none; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + opacity: 0; +} +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} +.toast.showing { + opacity: 1; +} +.toast.show { + display: block; + opacity: 1; +} +.toast.hide { + display: none; +} + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #808080; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media screen and (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - (0.5rem * 2)); +} +.modal-dialog-centered::before { + display: block; + height: calc(100vh - (0.5rem * 2)); + content: ""; +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #FFFFFF; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #C0C0C0; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem; +} +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1; +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #C0C0C0; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.modal-footer > :not(:first-child) { + margin-left: 0.25rem; +} +.modal-footer > :not(:last-child) { + margin-right: 0.25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + + .modal-dialog-centered { + min-height: calc(100% - (1.75rem * 2)); + } + .modal-dialog-centered::before { + height: calc(100vh - (1.75rem * 2)); + } + + .modal-sm { + max-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, +.modal-xl { + max-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: "ChicagoFLF"; + font-style: normal; + font-weight: 400; + line-height: 1; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top] { + padding: 0.4rem 0; +} +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow { + bottom: 0; +} +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right] { + padding: 0 0.4rem; +} +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom] { + padding: 0.4rem 0; +} +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow { + top: 0; +} +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left] { + padding: 0 0.4rem; +} +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #FFFFFF; + text-align: center; + background-color: #000000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: "ChicagoFLF"; + font-style: normal; + font-weight: 400; + line-height: 1; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #FFFFFF; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^=top] { + margin-bottom: 0.5rem; +} +.bs-popover-top .arrow, .bs-popover-auto[x-placement^=top] .arrow { + bottom: calc((0.5rem + 1px) * -1); +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=top] .arrow::before, +.bs-popover-top .arrow::after, +.bs-popover-auto[x-placement^=top] .arrow::after { + border-width: 0.5rem 0.5rem 0; +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=top] .arrow::before { + bottom: 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-top .arrow::after, .bs-popover-auto[x-placement^=top] .arrow::after { + bottom: 1px; + border-top-color: #FFFFFF; +} + +.bs-popover-right, .bs-popover-auto[x-placement^=right] { + margin-left: 0.5rem; +} +.bs-popover-right .arrow, .bs-popover-auto[x-placement^=right] .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=right] .arrow::before, +.bs-popover-right .arrow::after, +.bs-popover-auto[x-placement^=right] .arrow::after { + border-width: 0.5rem 0.5rem 0.5rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=right] .arrow::before { + left: 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-right .arrow::after, .bs-popover-auto[x-placement^=right] .arrow::after { + left: 1px; + border-right-color: #FFFFFF; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^=bottom] { + margin-top: 0.5rem; +} +.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^=bottom] .arrow { + top: calc((0.5rem + 1px) * -1); +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=bottom] .arrow::before, +.bs-popover-bottom .arrow::after, +.bs-popover-auto[x-placement^=bottom] .arrow::after { + border-width: 0 0.5rem 0.5rem 0.5rem; +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=bottom] .arrow::before { + top: 0; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-bottom .arrow::after, .bs-popover-auto[x-placement^=bottom] .arrow::after { + top: 1px; + border-bottom-color: #FFFFFF; +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.bs-popover-left, .bs-popover-auto[x-placement^=left] { + margin-right: 0.5rem; +} +.bs-popover-left .arrow, .bs-popover-auto[x-placement^=left] .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=left] .arrow::before, +.bs-popover-left .arrow::after, +.bs-popover-auto[x-placement^=left] .arrow::after { + border-width: 0.5rem 0 0.5rem 0.5rem; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=left] .arrow::before { + right: 0; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-left .arrow::after, .bs-popover-auto[x-placement^=left] .arrow::after { + right: 1px; + border-left-color: #FFFFFF; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + color: inherit; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #000000; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: 0s 0.6s opacity; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + color: #FFFFFF; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-control-prev, +.carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #FFFFFF; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: transparent no-repeat center center; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFFFFF' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFFFFF' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} +.carousel-indicators li { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #FFFFFF; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #FFFFFF; + text-align: center; +} + +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: spinner-border 0.75s linear infinite; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + } +} +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + animation: spinner-grow 0.75s linear infinite; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #0000D3 !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #0000a0 !important; +} + +.bg-secondary { + background-color: #808080 !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #676767 !important; +} + +.bg-success { + background-color: #1FB714 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #17890f !important; +} + +.bg-info { + background-color: #02ABEA !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #0286b7 !important; +} + +.bg-warning { + background-color: #FBF305 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #cac303 !important; +} + +.bg-danger { + background-color: #DD0907 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #ac0705 !important; +} + +.bg-light { + background-color: #C0C0C0 !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #a7a7a7 !important; +} + +.bg-dark { + background-color: #404040 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #272727 !important; +} + +.bg-white { + background-color: #FFFFFF !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #C0C0C0 !important; +} + +.border-top { + border-top: 1px solid #C0C0C0 !important; +} + +.border-right { + border-right: 1px solid #C0C0C0 !important; +} + +.border-bottom { + border-bottom: 1px solid #C0C0C0 !important; +} + +.border-left { + border-left: 1px solid #C0C0C0 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #0000D3 !important; +} + +.border-secondary { + border-color: #808080 !important; +} + +.border-success { + border-color: #1FB714 !important; +} + +.border-info { + border-color: #02ABEA !important; +} + +.border-warning { + border-color: #FBF305 !important; +} + +.border-danger { + border-color: #DD0907 !important; +} + +.border-light { + border-color: #C0C0C0 !important; +} + +.border-dark { + border-color: #404040 !important; +} + +.border-white { + border-color: #FFFFFF !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: flex !important; + } + + .d-sm-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: flex !important; + } + + .d-md-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: flex !important; + } + + .d-lg-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: flex !important; + } + + .d-xl-inline-flex { + display: inline-flex !important; + } +} +@media print { + .d-print-none { + display: none !important; + } + + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: flex !important; + } + + .d-print-inline-flex { + display: inline-flex !important; + } +} +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} +.embed-responsive::before { + display: block; + content: ""; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.8571428571%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-3by4::before { + padding-top: 133.3333333333%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction: row !important; + } + + .flex-sm-column { + flex-direction: column !important; + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-sm-wrap { + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-sm-fill { + flex: 1 1 auto !important; + } + + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-sm-start { + justify-content: flex-start !important; + } + + .justify-content-sm-end { + justify-content: flex-end !important; + } + + .justify-content-sm-center { + justify-content: center !important; + } + + .justify-content-sm-between { + justify-content: space-between !important; + } + + .justify-content-sm-around { + justify-content: space-around !important; + } + + .align-items-sm-start { + align-items: flex-start !important; + } + + .align-items-sm-end { + align-items: flex-end !important; + } + + .align-items-sm-center { + align-items: center !important; + } + + .align-items-sm-baseline { + align-items: baseline !important; + } + + .align-items-sm-stretch { + align-items: stretch !important; + } + + .align-content-sm-start { + align-content: flex-start !important; + } + + .align-content-sm-end { + align-content: flex-end !important; + } + + .align-content-sm-center { + align-content: center !important; + } + + .align-content-sm-between { + align-content: space-between !important; + } + + .align-content-sm-around { + align-content: space-around !important; + } + + .align-content-sm-stretch { + align-content: stretch !important; + } + + .align-self-sm-auto { + align-self: auto !important; + } + + .align-self-sm-start { + align-self: flex-start !important; + } + + .align-self-sm-end { + align-self: flex-end !important; + } + + .align-self-sm-center { + align-self: center !important; + } + + .align-self-sm-baseline { + align-self: baseline !important; + } + + .align-self-sm-stretch { + align-self: stretch !important; + } +} +@media (min-width: 768px) { + .flex-md-row { + flex-direction: row !important; + } + + .flex-md-column { + flex-direction: column !important; + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-md-wrap { + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-md-fill { + flex: 1 1 auto !important; + } + + .flex-md-grow-0 { + flex-grow: 0 !important; + } + + .flex-md-grow-1 { + flex-grow: 1 !important; + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-md-start { + justify-content: flex-start !important; + } + + .justify-content-md-end { + justify-content: flex-end !important; + } + + .justify-content-md-center { + justify-content: center !important; + } + + .justify-content-md-between { + justify-content: space-between !important; + } + + .justify-content-md-around { + justify-content: space-around !important; + } + + .align-items-md-start { + align-items: flex-start !important; + } + + .align-items-md-end { + align-items: flex-end !important; + } + + .align-items-md-center { + align-items: center !important; + } + + .align-items-md-baseline { + align-items: baseline !important; + } + + .align-items-md-stretch { + align-items: stretch !important; + } + + .align-content-md-start { + align-content: flex-start !important; + } + + .align-content-md-end { + align-content: flex-end !important; + } + + .align-content-md-center { + align-content: center !important; + } + + .align-content-md-between { + align-content: space-between !important; + } + + .align-content-md-around { + align-content: space-around !important; + } + + .align-content-md-stretch { + align-content: stretch !important; + } + + .align-self-md-auto { + align-self: auto !important; + } + + .align-self-md-start { + align-self: flex-start !important; + } + + .align-self-md-end { + align-self: flex-end !important; + } + + .align-self-md-center { + align-self: center !important; + } + + .align-self-md-baseline { + align-self: baseline !important; + } + + .align-self-md-stretch { + align-self: stretch !important; + } +} +@media (min-width: 992px) { + .flex-lg-row { + flex-direction: row !important; + } + + .flex-lg-column { + flex-direction: column !important; + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-lg-wrap { + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-lg-fill { + flex: 1 1 auto !important; + } + + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-lg-start { + justify-content: flex-start !important; + } + + .justify-content-lg-end { + justify-content: flex-end !important; + } + + .justify-content-lg-center { + justify-content: center !important; + } + + .justify-content-lg-between { + justify-content: space-between !important; + } + + .justify-content-lg-around { + justify-content: space-around !important; + } + + .align-items-lg-start { + align-items: flex-start !important; + } + + .align-items-lg-end { + align-items: flex-end !important; + } + + .align-items-lg-center { + align-items: center !important; + } + + .align-items-lg-baseline { + align-items: baseline !important; + } + + .align-items-lg-stretch { + align-items: stretch !important; + } + + .align-content-lg-start { + align-content: flex-start !important; + } + + .align-content-lg-end { + align-content: flex-end !important; + } + + .align-content-lg-center { + align-content: center !important; + } + + .align-content-lg-between { + align-content: space-between !important; + } + + .align-content-lg-around { + align-content: space-around !important; + } + + .align-content-lg-stretch { + align-content: stretch !important; + } + + .align-self-lg-auto { + align-self: auto !important; + } + + .align-self-lg-start { + align-self: flex-start !important; + } + + .align-self-lg-end { + align-self: flex-end !important; + } + + .align-self-lg-center { + align-self: center !important; + } + + .align-self-lg-baseline { + align-self: baseline !important; + } + + .align-self-lg-stretch { + align-self: stretch !important; + } +} +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction: row !important; + } + + .flex-xl-column { + flex-direction: column !important; + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xl-wrap { + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-xl-fill { + flex: 1 1 auto !important; + } + + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-xl-start { + justify-content: flex-start !important; + } + + .justify-content-xl-end { + justify-content: flex-end !important; + } + + .justify-content-xl-center { + justify-content: center !important; + } + + .justify-content-xl-between { + justify-content: space-between !important; + } + + .justify-content-xl-around { + justify-content: space-around !important; + } + + .align-items-xl-start { + align-items: flex-start !important; + } + + .align-items-xl-end { + align-items: flex-end !important; + } + + .align-items-xl-center { + align-items: center !important; + } + + .align-items-xl-baseline { + align-items: baseline !important; + } + + .align-items-xl-stretch { + align-items: stretch !important; + } + + .align-content-xl-start { + align-content: flex-start !important; + } + + .align-content-xl-end { + align-content: flex-end !important; + } + + .align-content-xl-center { + align-content: center !important; + } + + .align-content-xl-between { + align-content: space-between !important; + } + + .align-content-xl-around { + align-content: space-around !important; + } + + .align-content-xl-stretch { + align-content: stretch !important; + } + + .align-self-xl-auto { + align-self: auto !important; + } + + .align-self-xl-start { + align-self: flex-start !important; + } + + .align-self-xl-end { + align-self: flex-end !important; + } + + .align-self-xl-center { + align-self: center !important; + } + + .align-self-xl-baseline { + align-self: baseline !important; + } + + .align-self-xl-stretch { + align-self: stretch !important; + } +} +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + + .float-sm-right { + float: right !important; + } + + .float-sm-none { + float: none !important; + } +} +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + + .float-md-right { + float: right !important; + } + + .float-md-none { + float: none !important; + } +} +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + + .float-lg-right { + float: right !important; + } + + .float-lg-none { + float: none !important; + } +} +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + + .float-xl-right { + float: right !important; + } + + .float-xl-none { + float: none !important; + } +} +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports (position: sticky) { + .sticky-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + + .mt-sm-0, +.my-sm-0 { + margin-top: 0 !important; + } + + .mr-sm-0, +.mx-sm-0 { + margin-right: 0 !important; + } + + .mb-sm-0, +.my-sm-0 { + margin-bottom: 0 !important; + } + + .ml-sm-0, +.mx-sm-0 { + margin-left: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .mt-sm-1, +.my-sm-1 { + margin-top: 0.25rem !important; + } + + .mr-sm-1, +.mx-sm-1 { + margin-right: 0.25rem !important; + } + + .mb-sm-1, +.my-sm-1 { + margin-bottom: 0.25rem !important; + } + + .ml-sm-1, +.mx-sm-1 { + margin-left: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .mt-sm-2, +.my-sm-2 { + margin-top: 0.5rem !important; + } + + .mr-sm-2, +.mx-sm-2 { + margin-right: 0.5rem !important; + } + + .mb-sm-2, +.my-sm-2 { + margin-bottom: 0.5rem !important; + } + + .ml-sm-2, +.mx-sm-2 { + margin-left: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .mt-sm-3, +.my-sm-3 { + margin-top: 1rem !important; + } + + .mr-sm-3, +.mx-sm-3 { + margin-right: 1rem !important; + } + + .mb-sm-3, +.my-sm-3 { + margin-bottom: 1rem !important; + } + + .ml-sm-3, +.mx-sm-3 { + margin-left: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .mt-sm-4, +.my-sm-4 { + margin-top: 1.5rem !important; + } + + .mr-sm-4, +.mx-sm-4 { + margin-right: 1.5rem !important; + } + + .mb-sm-4, +.my-sm-4 { + margin-bottom: 1.5rem !important; + } + + .ml-sm-4, +.mx-sm-4 { + margin-left: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .mt-sm-5, +.my-sm-5 { + margin-top: 3rem !important; + } + + .mr-sm-5, +.mx-sm-5 { + margin-right: 3rem !important; + } + + .mb-sm-5, +.my-sm-5 { + margin-bottom: 3rem !important; + } + + .ml-sm-5, +.mx-sm-5 { + margin-left: 3rem !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .pt-sm-0, +.py-sm-0 { + padding-top: 0 !important; + } + + .pr-sm-0, +.px-sm-0 { + padding-right: 0 !important; + } + + .pb-sm-0, +.py-sm-0 { + padding-bottom: 0 !important; + } + + .pl-sm-0, +.px-sm-0 { + padding-left: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .pt-sm-1, +.py-sm-1 { + padding-top: 0.25rem !important; + } + + .pr-sm-1, +.px-sm-1 { + padding-right: 0.25rem !important; + } + + .pb-sm-1, +.py-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pl-sm-1, +.px-sm-1 { + padding-left: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .pt-sm-2, +.py-sm-2 { + padding-top: 0.5rem !important; + } + + .pr-sm-2, +.px-sm-2 { + padding-right: 0.5rem !important; + } + + .pb-sm-2, +.py-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pl-sm-2, +.px-sm-2 { + padding-left: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .pt-sm-3, +.py-sm-3 { + padding-top: 1rem !important; + } + + .pr-sm-3, +.px-sm-3 { + padding-right: 1rem !important; + } + + .pb-sm-3, +.py-sm-3 { + padding-bottom: 1rem !important; + } + + .pl-sm-3, +.px-sm-3 { + padding-left: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .pt-sm-4, +.py-sm-4 { + padding-top: 1.5rem !important; + } + + .pr-sm-4, +.px-sm-4 { + padding-right: 1.5rem !important; + } + + .pb-sm-4, +.py-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pl-sm-4, +.px-sm-4 { + padding-left: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .pt-sm-5, +.py-sm-5 { + padding-top: 3rem !important; + } + + .pr-sm-5, +.px-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-5, +.py-sm-5 { + padding-bottom: 3rem !important; + } + + .pl-sm-5, +.px-sm-5 { + padding-left: 3rem !important; + } + + .m-sm-n1 { + margin: -0.25rem !important; + } + + .mt-sm-n1, +.my-sm-n1 { + margin-top: -0.25rem !important; + } + + .mr-sm-n1, +.mx-sm-n1 { + margin-right: -0.25rem !important; + } + + .mb-sm-n1, +.my-sm-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-sm-n1, +.mx-sm-n1 { + margin-left: -0.25rem !important; + } + + .m-sm-n2 { + margin: -0.5rem !important; + } + + .mt-sm-n2, +.my-sm-n2 { + margin-top: -0.5rem !important; + } + + .mr-sm-n2, +.mx-sm-n2 { + margin-right: -0.5rem !important; + } + + .mb-sm-n2, +.my-sm-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-sm-n2, +.mx-sm-n2 { + margin-left: -0.5rem !important; + } + + .m-sm-n3 { + margin: -1rem !important; + } + + .mt-sm-n3, +.my-sm-n3 { + margin-top: -1rem !important; + } + + .mr-sm-n3, +.mx-sm-n3 { + margin-right: -1rem !important; + } + + .mb-sm-n3, +.my-sm-n3 { + margin-bottom: -1rem !important; + } + + .ml-sm-n3, +.mx-sm-n3 { + margin-left: -1rem !important; + } + + .m-sm-n4 { + margin: -1.5rem !important; + } + + .mt-sm-n4, +.my-sm-n4 { + margin-top: -1.5rem !important; + } + + .mr-sm-n4, +.mx-sm-n4 { + margin-right: -1.5rem !important; + } + + .mb-sm-n4, +.my-sm-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-sm-n4, +.mx-sm-n4 { + margin-left: -1.5rem !important; + } + + .m-sm-n5 { + margin: -3rem !important; + } + + .mt-sm-n5, +.my-sm-n5 { + margin-top: -3rem !important; + } + + .mr-sm-n5, +.mx-sm-n5 { + margin-right: -3rem !important; + } + + .mb-sm-n5, +.my-sm-n5 { + margin-bottom: -3rem !important; + } + + .ml-sm-n5, +.mx-sm-n5 { + margin-left: -3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mt-sm-auto, +.my-sm-auto { + margin-top: auto !important; + } + + .mr-sm-auto, +.mx-sm-auto { + margin-right: auto !important; + } + + .mb-sm-auto, +.my-sm-auto { + margin-bottom: auto !important; + } + + .ml-sm-auto, +.mx-sm-auto { + margin-left: auto !important; + } +} +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + + .mt-md-0, +.my-md-0 { + margin-top: 0 !important; + } + + .mr-md-0, +.mx-md-0 { + margin-right: 0 !important; + } + + .mb-md-0, +.my-md-0 { + margin-bottom: 0 !important; + } + + .ml-md-0, +.mx-md-0 { + margin-left: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .mt-md-1, +.my-md-1 { + margin-top: 0.25rem !important; + } + + .mr-md-1, +.mx-md-1 { + margin-right: 0.25rem !important; + } + + .mb-md-1, +.my-md-1 { + margin-bottom: 0.25rem !important; + } + + .ml-md-1, +.mx-md-1 { + margin-left: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .mt-md-2, +.my-md-2 { + margin-top: 0.5rem !important; + } + + .mr-md-2, +.mx-md-2 { + margin-right: 0.5rem !important; + } + + .mb-md-2, +.my-md-2 { + margin-bottom: 0.5rem !important; + } + + .ml-md-2, +.mx-md-2 { + margin-left: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .mt-md-3, +.my-md-3 { + margin-top: 1rem !important; + } + + .mr-md-3, +.mx-md-3 { + margin-right: 1rem !important; + } + + .mb-md-3, +.my-md-3 { + margin-bottom: 1rem !important; + } + + .ml-md-3, +.mx-md-3 { + margin-left: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .mt-md-4, +.my-md-4 { + margin-top: 1.5rem !important; + } + + .mr-md-4, +.mx-md-4 { + margin-right: 1.5rem !important; + } + + .mb-md-4, +.my-md-4 { + margin-bottom: 1.5rem !important; + } + + .ml-md-4, +.mx-md-4 { + margin-left: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .mt-md-5, +.my-md-5 { + margin-top: 3rem !important; + } + + .mr-md-5, +.mx-md-5 { + margin-right: 3rem !important; + } + + .mb-md-5, +.my-md-5 { + margin-bottom: 3rem !important; + } + + .ml-md-5, +.mx-md-5 { + margin-left: 3rem !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .pt-md-0, +.py-md-0 { + padding-top: 0 !important; + } + + .pr-md-0, +.px-md-0 { + padding-right: 0 !important; + } + + .pb-md-0, +.py-md-0 { + padding-bottom: 0 !important; + } + + .pl-md-0, +.px-md-0 { + padding-left: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .pt-md-1, +.py-md-1 { + padding-top: 0.25rem !important; + } + + .pr-md-1, +.px-md-1 { + padding-right: 0.25rem !important; + } + + .pb-md-1, +.py-md-1 { + padding-bottom: 0.25rem !important; + } + + .pl-md-1, +.px-md-1 { + padding-left: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .pt-md-2, +.py-md-2 { + padding-top: 0.5rem !important; + } + + .pr-md-2, +.px-md-2 { + padding-right: 0.5rem !important; + } + + .pb-md-2, +.py-md-2 { + padding-bottom: 0.5rem !important; + } + + .pl-md-2, +.px-md-2 { + padding-left: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .pt-md-3, +.py-md-3 { + padding-top: 1rem !important; + } + + .pr-md-3, +.px-md-3 { + padding-right: 1rem !important; + } + + .pb-md-3, +.py-md-3 { + padding-bottom: 1rem !important; + } + + .pl-md-3, +.px-md-3 { + padding-left: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .pt-md-4, +.py-md-4 { + padding-top: 1.5rem !important; + } + + .pr-md-4, +.px-md-4 { + padding-right: 1.5rem !important; + } + + .pb-md-4, +.py-md-4 { + padding-bottom: 1.5rem !important; + } + + .pl-md-4, +.px-md-4 { + padding-left: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .pt-md-5, +.py-md-5 { + padding-top: 3rem !important; + } + + .pr-md-5, +.px-md-5 { + padding-right: 3rem !important; + } + + .pb-md-5, +.py-md-5 { + padding-bottom: 3rem !important; + } + + .pl-md-5, +.px-md-5 { + padding-left: 3rem !important; + } + + .m-md-n1 { + margin: -0.25rem !important; + } + + .mt-md-n1, +.my-md-n1 { + margin-top: -0.25rem !important; + } + + .mr-md-n1, +.mx-md-n1 { + margin-right: -0.25rem !important; + } + + .mb-md-n1, +.my-md-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-md-n1, +.mx-md-n1 { + margin-left: -0.25rem !important; + } + + .m-md-n2 { + margin: -0.5rem !important; + } + + .mt-md-n2, +.my-md-n2 { + margin-top: -0.5rem !important; + } + + .mr-md-n2, +.mx-md-n2 { + margin-right: -0.5rem !important; + } + + .mb-md-n2, +.my-md-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-md-n2, +.mx-md-n2 { + margin-left: -0.5rem !important; + } + + .m-md-n3 { + margin: -1rem !important; + } + + .mt-md-n3, +.my-md-n3 { + margin-top: -1rem !important; + } + + .mr-md-n3, +.mx-md-n3 { + margin-right: -1rem !important; + } + + .mb-md-n3, +.my-md-n3 { + margin-bottom: -1rem !important; + } + + .ml-md-n3, +.mx-md-n3 { + margin-left: -1rem !important; + } + + .m-md-n4 { + margin: -1.5rem !important; + } + + .mt-md-n4, +.my-md-n4 { + margin-top: -1.5rem !important; + } + + .mr-md-n4, +.mx-md-n4 { + margin-right: -1.5rem !important; + } + + .mb-md-n4, +.my-md-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-md-n4, +.mx-md-n4 { + margin-left: -1.5rem !important; + } + + .m-md-n5 { + margin: -3rem !important; + } + + .mt-md-n5, +.my-md-n5 { + margin-top: -3rem !important; + } + + .mr-md-n5, +.mx-md-n5 { + margin-right: -3rem !important; + } + + .mb-md-n5, +.my-md-n5 { + margin-bottom: -3rem !important; + } + + .ml-md-n5, +.mx-md-n5 { + margin-left: -3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mt-md-auto, +.my-md-auto { + margin-top: auto !important; + } + + .mr-md-auto, +.mx-md-auto { + margin-right: auto !important; + } + + .mb-md-auto, +.my-md-auto { + margin-bottom: auto !important; + } + + .ml-md-auto, +.mx-md-auto { + margin-left: auto !important; + } +} +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + + .mt-lg-0, +.my-lg-0 { + margin-top: 0 !important; + } + + .mr-lg-0, +.mx-lg-0 { + margin-right: 0 !important; + } + + .mb-lg-0, +.my-lg-0 { + margin-bottom: 0 !important; + } + + .ml-lg-0, +.mx-lg-0 { + margin-left: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .mt-lg-1, +.my-lg-1 { + margin-top: 0.25rem !important; + } + + .mr-lg-1, +.mx-lg-1 { + margin-right: 0.25rem !important; + } + + .mb-lg-1, +.my-lg-1 { + margin-bottom: 0.25rem !important; + } + + .ml-lg-1, +.mx-lg-1 { + margin-left: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .mt-lg-2, +.my-lg-2 { + margin-top: 0.5rem !important; + } + + .mr-lg-2, +.mx-lg-2 { + margin-right: 0.5rem !important; + } + + .mb-lg-2, +.my-lg-2 { + margin-bottom: 0.5rem !important; + } + + .ml-lg-2, +.mx-lg-2 { + margin-left: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .mt-lg-3, +.my-lg-3 { + margin-top: 1rem !important; + } + + .mr-lg-3, +.mx-lg-3 { + margin-right: 1rem !important; + } + + .mb-lg-3, +.my-lg-3 { + margin-bottom: 1rem !important; + } + + .ml-lg-3, +.mx-lg-3 { + margin-left: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .mt-lg-4, +.my-lg-4 { + margin-top: 1.5rem !important; + } + + .mr-lg-4, +.mx-lg-4 { + margin-right: 1.5rem !important; + } + + .mb-lg-4, +.my-lg-4 { + margin-bottom: 1.5rem !important; + } + + .ml-lg-4, +.mx-lg-4 { + margin-left: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .mt-lg-5, +.my-lg-5 { + margin-top: 3rem !important; + } + + .mr-lg-5, +.mx-lg-5 { + margin-right: 3rem !important; + } + + .mb-lg-5, +.my-lg-5 { + margin-bottom: 3rem !important; + } + + .ml-lg-5, +.mx-lg-5 { + margin-left: 3rem !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .pt-lg-0, +.py-lg-0 { + padding-top: 0 !important; + } + + .pr-lg-0, +.px-lg-0 { + padding-right: 0 !important; + } + + .pb-lg-0, +.py-lg-0 { + padding-bottom: 0 !important; + } + + .pl-lg-0, +.px-lg-0 { + padding-left: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .pt-lg-1, +.py-lg-1 { + padding-top: 0.25rem !important; + } + + .pr-lg-1, +.px-lg-1 { + padding-right: 0.25rem !important; + } + + .pb-lg-1, +.py-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pl-lg-1, +.px-lg-1 { + padding-left: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .pt-lg-2, +.py-lg-2 { + padding-top: 0.5rem !important; + } + + .pr-lg-2, +.px-lg-2 { + padding-right: 0.5rem !important; + } + + .pb-lg-2, +.py-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pl-lg-2, +.px-lg-2 { + padding-left: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .pt-lg-3, +.py-lg-3 { + padding-top: 1rem !important; + } + + .pr-lg-3, +.px-lg-3 { + padding-right: 1rem !important; + } + + .pb-lg-3, +.py-lg-3 { + padding-bottom: 1rem !important; + } + + .pl-lg-3, +.px-lg-3 { + padding-left: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .pt-lg-4, +.py-lg-4 { + padding-top: 1.5rem !important; + } + + .pr-lg-4, +.px-lg-4 { + padding-right: 1.5rem !important; + } + + .pb-lg-4, +.py-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pl-lg-4, +.px-lg-4 { + padding-left: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .pt-lg-5, +.py-lg-5 { + padding-top: 3rem !important; + } + + .pr-lg-5, +.px-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-5, +.py-lg-5 { + padding-bottom: 3rem !important; + } + + .pl-lg-5, +.px-lg-5 { + padding-left: 3rem !important; + } + + .m-lg-n1 { + margin: -0.25rem !important; + } + + .mt-lg-n1, +.my-lg-n1 { + margin-top: -0.25rem !important; + } + + .mr-lg-n1, +.mx-lg-n1 { + margin-right: -0.25rem !important; + } + + .mb-lg-n1, +.my-lg-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-lg-n1, +.mx-lg-n1 { + margin-left: -0.25rem !important; + } + + .m-lg-n2 { + margin: -0.5rem !important; + } + + .mt-lg-n2, +.my-lg-n2 { + margin-top: -0.5rem !important; + } + + .mr-lg-n2, +.mx-lg-n2 { + margin-right: -0.5rem !important; + } + + .mb-lg-n2, +.my-lg-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-lg-n2, +.mx-lg-n2 { + margin-left: -0.5rem !important; + } + + .m-lg-n3 { + margin: -1rem !important; + } + + .mt-lg-n3, +.my-lg-n3 { + margin-top: -1rem !important; + } + + .mr-lg-n3, +.mx-lg-n3 { + margin-right: -1rem !important; + } + + .mb-lg-n3, +.my-lg-n3 { + margin-bottom: -1rem !important; + } + + .ml-lg-n3, +.mx-lg-n3 { + margin-left: -1rem !important; + } + + .m-lg-n4 { + margin: -1.5rem !important; + } + + .mt-lg-n4, +.my-lg-n4 { + margin-top: -1.5rem !important; + } + + .mr-lg-n4, +.mx-lg-n4 { + margin-right: -1.5rem !important; + } + + .mb-lg-n4, +.my-lg-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-lg-n4, +.mx-lg-n4 { + margin-left: -1.5rem !important; + } + + .m-lg-n5 { + margin: -3rem !important; + } + + .mt-lg-n5, +.my-lg-n5 { + margin-top: -3rem !important; + } + + .mr-lg-n5, +.mx-lg-n5 { + margin-right: -3rem !important; + } + + .mb-lg-n5, +.my-lg-n5 { + margin-bottom: -3rem !important; + } + + .ml-lg-n5, +.mx-lg-n5 { + margin-left: -3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mt-lg-auto, +.my-lg-auto { + margin-top: auto !important; + } + + .mr-lg-auto, +.mx-lg-auto { + margin-right: auto !important; + } + + .mb-lg-auto, +.my-lg-auto { + margin-bottom: auto !important; + } + + .ml-lg-auto, +.mx-lg-auto { + margin-left: auto !important; + } +} +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + + .mt-xl-0, +.my-xl-0 { + margin-top: 0 !important; + } + + .mr-xl-0, +.mx-xl-0 { + margin-right: 0 !important; + } + + .mb-xl-0, +.my-xl-0 { + margin-bottom: 0 !important; + } + + .ml-xl-0, +.mx-xl-0 { + margin-left: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .mt-xl-1, +.my-xl-1 { + margin-top: 0.25rem !important; + } + + .mr-xl-1, +.mx-xl-1 { + margin-right: 0.25rem !important; + } + + .mb-xl-1, +.my-xl-1 { + margin-bottom: 0.25rem !important; + } + + .ml-xl-1, +.mx-xl-1 { + margin-left: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .mt-xl-2, +.my-xl-2 { + margin-top: 0.5rem !important; + } + + .mr-xl-2, +.mx-xl-2 { + margin-right: 0.5rem !important; + } + + .mb-xl-2, +.my-xl-2 { + margin-bottom: 0.5rem !important; + } + + .ml-xl-2, +.mx-xl-2 { + margin-left: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .mt-xl-3, +.my-xl-3 { + margin-top: 1rem !important; + } + + .mr-xl-3, +.mx-xl-3 { + margin-right: 1rem !important; + } + + .mb-xl-3, +.my-xl-3 { + margin-bottom: 1rem !important; + } + + .ml-xl-3, +.mx-xl-3 { + margin-left: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .mt-xl-4, +.my-xl-4 { + margin-top: 1.5rem !important; + } + + .mr-xl-4, +.mx-xl-4 { + margin-right: 1.5rem !important; + } + + .mb-xl-4, +.my-xl-4 { + margin-bottom: 1.5rem !important; + } + + .ml-xl-4, +.mx-xl-4 { + margin-left: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .mt-xl-5, +.my-xl-5 { + margin-top: 3rem !important; + } + + .mr-xl-5, +.mx-xl-5 { + margin-right: 3rem !important; + } + + .mb-xl-5, +.my-xl-5 { + margin-bottom: 3rem !important; + } + + .ml-xl-5, +.mx-xl-5 { + margin-left: 3rem !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .pt-xl-0, +.py-xl-0 { + padding-top: 0 !important; + } + + .pr-xl-0, +.px-xl-0 { + padding-right: 0 !important; + } + + .pb-xl-0, +.py-xl-0 { + padding-bottom: 0 !important; + } + + .pl-xl-0, +.px-xl-0 { + padding-left: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .pt-xl-1, +.py-xl-1 { + padding-top: 0.25rem !important; + } + + .pr-xl-1, +.px-xl-1 { + padding-right: 0.25rem !important; + } + + .pb-xl-1, +.py-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pl-xl-1, +.px-xl-1 { + padding-left: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .pt-xl-2, +.py-xl-2 { + padding-top: 0.5rem !important; + } + + .pr-xl-2, +.px-xl-2 { + padding-right: 0.5rem !important; + } + + .pb-xl-2, +.py-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pl-xl-2, +.px-xl-2 { + padding-left: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .pt-xl-3, +.py-xl-3 { + padding-top: 1rem !important; + } + + .pr-xl-3, +.px-xl-3 { + padding-right: 1rem !important; + } + + .pb-xl-3, +.py-xl-3 { + padding-bottom: 1rem !important; + } + + .pl-xl-3, +.px-xl-3 { + padding-left: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .pt-xl-4, +.py-xl-4 { + padding-top: 1.5rem !important; + } + + .pr-xl-4, +.px-xl-4 { + padding-right: 1.5rem !important; + } + + .pb-xl-4, +.py-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pl-xl-4, +.px-xl-4 { + padding-left: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .pt-xl-5, +.py-xl-5 { + padding-top: 3rem !important; + } + + .pr-xl-5, +.px-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-5, +.py-xl-5 { + padding-bottom: 3rem !important; + } + + .pl-xl-5, +.px-xl-5 { + padding-left: 3rem !important; + } + + .m-xl-n1 { + margin: -0.25rem !important; + } + + .mt-xl-n1, +.my-xl-n1 { + margin-top: -0.25rem !important; + } + + .mr-xl-n1, +.mx-xl-n1 { + margin-right: -0.25rem !important; + } + + .mb-xl-n1, +.my-xl-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-xl-n1, +.mx-xl-n1 { + margin-left: -0.25rem !important; + } + + .m-xl-n2 { + margin: -0.5rem !important; + } + + .mt-xl-n2, +.my-xl-n2 { + margin-top: -0.5rem !important; + } + + .mr-xl-n2, +.mx-xl-n2 { + margin-right: -0.5rem !important; + } + + .mb-xl-n2, +.my-xl-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-xl-n2, +.mx-xl-n2 { + margin-left: -0.5rem !important; + } + + .m-xl-n3 { + margin: -1rem !important; + } + + .mt-xl-n3, +.my-xl-n3 { + margin-top: -1rem !important; + } + + .mr-xl-n3, +.mx-xl-n3 { + margin-right: -1rem !important; + } + + .mb-xl-n3, +.my-xl-n3 { + margin-bottom: -1rem !important; + } + + .ml-xl-n3, +.mx-xl-n3 { + margin-left: -1rem !important; + } + + .m-xl-n4 { + margin: -1.5rem !important; + } + + .mt-xl-n4, +.my-xl-n4 { + margin-top: -1.5rem !important; + } + + .mr-xl-n4, +.mx-xl-n4 { + margin-right: -1.5rem !important; + } + + .mb-xl-n4, +.my-xl-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-xl-n4, +.mx-xl-n4 { + margin-left: -1.5rem !important; + } + + .m-xl-n5 { + margin: -3rem !important; + } + + .mt-xl-n5, +.my-xl-n5 { + margin-top: -3rem !important; + } + + .mr-xl-n5, +.mx-xl-n5 { + margin-right: -3rem !important; + } + + .mb-xl-n5, +.my-xl-n5 { + margin-bottom: -3rem !important; + } + + .ml-xl-n5, +.mx-xl-n5 { + margin-left: -3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mt-xl-auto, +.my-xl-auto { + margin-top: auto !important; + } + + .mr-xl-auto, +.mx-xl-auto { + margin-right: auto !important; + } + + .mb-xl-auto, +.my-xl-auto { + margin-bottom: auto !important; + } + + .ml-xl-auto, +.mx-xl-auto { + margin-left: auto !important; + } +} +.text-monospace { + font-family: "ChicagoFLF"; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + + .text-sm-right { + text-align: right !important; + } + + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + + .text-md-right { + text-align: right !important; + } + + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + + .text-lg-right { + text-align: right !important; + } + + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + + .text-xl-right { + text-align: right !important; + } + + .text-xl-center { + text-align: center !important; + } +} +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #FFFFFF !important; +} + +.text-primary { + color: #0000D3 !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #000087 !important; +} + +.text-secondary { + color: #808080 !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #5a5a5a !important; +} + +.text-success { + color: #1FB714 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #13720c !important; +} + +.text-info { + color: #02ABEA !important; +} + +a.text-info:hover, a.text-info:focus { + color: #01749e !important; +} + +.text-warning { + color: #FBF305 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #b1ab03 !important; +} + +.text-danger { + color: #DD0907 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #930605 !important; +} + +.text-light { + color: #C0C0C0 !important; +} + +a.text-light:hover, a.text-light:focus { + color: #9a9a9a !important; +} + +.text-dark { + color: #404040 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #1a1a1a !important; +} + +.text-body { + color: #000000 !important; +} + +.text-muted { + color: #808080 !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, +*::before, +*::after { + text-shadow: none !important; + box-shadow: none !important; + } + + a:not(.btn) { + text-decoration: underline; + } + + abbr[title]::after { + content: " (" attr(title) ")"; + } + + pre { + white-space: pre-wrap !important; + } + + pre, +blockquote { + border: 1px solid #808080; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, +img { + page-break-inside: avoid; + } + + p, +h2, +h3 { + orphans: 3; + widows: 3; + } + + h2, +h3 { + page-break-after: avoid; + } + + @page { + size: a3; + } + body { + min-width: 992px !important; + } + + .container { + min-width: 992px !important; + } + + .navbar { + display: none; + } + + .badge { + border: 1px solid #000000; + } + + .table { + border-collapse: collapse !important; + } + .table td, +.table th { + background-color: #FFFFFF !important; + } + + .table-bordered th, +.table-bordered td { + border: 1px solid #C0C0C0 !important; + } + + .table-dark { + color: inherit; + } + .table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #C0C0C0; + } + + .table .thead-dark th { + color: inherit; + border-color: #C0C0C0; + } +} +footer { + background-color: #C0C0C0; + color: #000000; +} + +header { + background-color: #C0C0C0; + color: #000000; + text-align: center; +} + +header a { + color: #4700A5; +} + +header a:hover { + color: #02ABEA; + text-decoration: none; +} + +footer a:hover { + text-decoration: none; +} + +.table-centered { + margin-left: auto; + margin-right: auto; +} + +.card-button { + color: #000000; +} + +.table-dark-em { + color: #404040; + font-style: normal; + font-weight: bold; +} + +.table-dark-header { + color: #000000; + font-style: normal; + text-align: center; +} + +/*# sourceMappingURL=dicserver.css.map */ diff --git a/DiscImageChef.Server/styles/mac/dicserver.scss b/DiscImageChef.Server/styles/mac/dicserver.scss new file mode 100644 index 00000000..cddfa3e4 --- /dev/null +++ b/DiscImageChef.Server/styles/mac/dicserver.scss @@ -0,0 +1,88 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : dicserver.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; +@import "_font"; +@import "_fontstyles"; + +@import "../../node_modules/bootstrap/scss/bootstrap"; + +footer +{ + background-color: $gray-100; + color: $black; +} + +header +{ + background-color: $gray-100; + color: $black; + text-align: center; +} + +header a +{ + color: $purple; +} + +header a:hover +{ + color: $cyan; + text-decoration: none; +} + +footer a:hover +{ + text-decoration: none; +} + +.table-centered +{ + margin-left:auto; + margin-right:auto; +} + +.card-button{color:$black} + +.table-dark-em +{ + color: $darkgray; + font-style: normal; + font-weight: bold; +} + +.table-dark-header +{ + color: $black; + font-style: normal; + text-align: center; +} \ No newline at end of file diff --git a/DiscImageChef.Server/styles/mac/dicserver_highcharts.css b/DiscImageChef.Server/styles/mac/dicserver_highcharts.css new file mode 100644 index 00000000..039a4774 --- /dev/null +++ b/DiscImageChef.Server/styles/mac/dicserver_highcharts.css @@ -0,0 +1,933 @@ +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using Macintosh II colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets font to Macintosh Chicago clone font */ +@font-face { + font-family: "ChicagoFLF"; + src: url(../../fonts/ChicagoFLF.eot); + src: url(../../fonts/ChicagoFLF.eot?#iefix) format("embedded-opentype"), url(../../fonts/ChicagoFLF.woff2) format("woff2"), url(../../fonts/ChicagoFLF.woff) format("woff"), url(../../fonts/ChicagoFLF.ttf) format("truetype"); + font-weight: normal; + font-style: normal; +} +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using Macintosh II colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets the style for emphasis/italics */ +em, i { + font-style: italic; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong { + font-size: 1em; + font-style: normal; + font-weight: bold; + margin: 0; +} + +/** + * @license Highcharts + * + * (c) 2009-2016 Torstein Honsi + * + * License: www.highcharts.com/license + */ +.highcharts-container { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; + text-align: left; + line-height: normal; + z-index: 0; + /* #1072 */ + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-family: "ChicagoFLF"; + font-size: 12px; +} + +.highcharts-root { + display: block; +} + +.highcharts-root text { + stroke-width: 0; +} + +.highcharts-strong { + font-weight: bold; +} + +.highcharts-emphasized { + font-style: italic; +} + +.highcharts-anchor { + cursor: pointer; +} + +.highcharts-background { + fill: #FFFFFF; +} + +.highcharts-plot-border, .highcharts-plot-background { + fill: none; +} + +.highcharts-label-box { + fill: none; +} + +.highcharts-button-box { + fill: inherit; +} + +.highcharts-tracker-line { + stroke-linejoin: round; + stroke: rgba(192, 192, 192, 0.0001); + stroke-width: 22; + fill: none; +} + +.highcharts-tracker-area { + fill: rgba(192, 192, 192, 0.0001); + stroke-width: 0; +} + +/* Titles */ +.highcharts-title { + fill: #404040; + font-size: 1.5em; +} + +.highcharts-subtitle { + fill: #808080; +} + +/* Axes */ +.highcharts-axis-line { + fill: none; + stroke: #ccd6eb; +} + +.highcharts-yaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-axis-title { + fill: #808080; +} + +.highcharts-axis-labels { + fill: #808080; + cursor: default; + font-size: 0.9em; +} + +.highcharts-grid-line { + fill: none; + stroke: #C0C0C0; +} + +.highcharts-xaxis-grid .highcharts-grid-line { + stroke-width: 0px; +} + +.highcharts-tick { + stroke: #ccd6eb; +} + +.highcharts-yaxis .highcharts-tick { + stroke-width: 0; +} + +.highcharts-minor-grid-line { + stroke: #C0C0C0; +} + +.highcharts-crosshair-thin { + stroke-width: 1px; + stroke: #C0C0C0; +} + +.highcharts-crosshair-category { + stroke: #ccd6eb; + stroke-opacity: 0.25; +} + +/* Credits */ +.highcharts-credits { + cursor: pointer; + fill: #808080; + font-size: 0.7em; + transition: fill 250ms, font-size 250ms; +} + +.highcharts-credits:hover { + fill: black; + font-size: 1em; +} + +/* Tooltip */ +.highcharts-tooltip { + cursor: default; + pointer-events: none; + white-space: nowrap; + transition: stroke 150ms; +} + +.highcharts-tooltip text { + fill: #404040; +} + +.highcharts-tooltip .highcharts-header { + font-size: 0.85em; +} + +.highcharts-tooltip-box { + stroke-width: 1px; + fill: #FFFFFF; + fill-opacity: 0.85; +} + +.highcharts-tooltip-box .highcharts-label-box { + fill: #FFFFFF; + fill-opacity: 0.85; +} + +.highcharts-selection-marker { + fill: #335cad; + fill-opacity: 0.25; +} + +.highcharts-graph { + fill: none; + stroke-width: 2px; + stroke-linecap: round; + stroke-linejoin: round; +} + +.highcharts-state-hover .highcharts-graph { + stroke-width: 3; +} + +.highcharts-state-hover path { + transition: stroke-width 50; + /* quick in */ +} + +.highcharts-state-normal path { + transition: stroke-width 250ms; + /* slow out */ +} + +/* Legend hover affects points and series */ +g.highcharts-series, +.highcharts-point, +.highcharts-markers, +.highcharts-data-labels { + transition: opacity 250ms; +} + +.highcharts-legend-series-active g.highcharts-series:not(.highcharts-series-hover), +.highcharts-legend-point-active .highcharts-point:not(.highcharts-point-hover), +.highcharts-legend-series-active .highcharts-markers:not(.highcharts-series-hover), +.highcharts-legend-series-active .highcharts-data-labels:not(.highcharts-series-hover) { + opacity: 0.2; +} + +/* Series options */ +/* Default colors */ +.highcharts-color-0 { + fill: #1FB714; + stroke: #1FB714; +} + +.highcharts-color-1 { + fill: #FBF305; + stroke: #FBF305; +} + +.highcharts-color-2 { + fill: #FF6403; + stroke: #FF6403; +} + +.highcharts-color-3 { + fill: #562C05; + stroke: #562C05; +} + +.highcharts-color-4 { + fill: #DD0907; + stroke: #DD0907; +} + +.highcharts-color-5 { + fill: #F20884; + stroke: #F20884; +} + +.highcharts-color-6 { + fill: #4700A5; + stroke: #4700A5; +} + +.highcharts-color-7 { + fill: #0000D3; + stroke: #0000D3; +} + +.highcharts-color-8 { + fill: #02ABEA; + stroke: #02ABEA; +} + +.highcharts-color-9 { + fill: #90713A; + stroke: #90713A; +} + +.highcharts-color-10 { + fill: #006412; + stroke: #006412; +} + +.highcharts-area { + fill-opacity: 0.75; + stroke-width: 0; +} + +.highcharts-markers { + stroke-width: 1px; + stroke: #FFFFFF; +} + +.highcharts-point { + stroke-width: 1px; +} + +.highcharts-dense-data .highcharts-point { + stroke-width: 0; +} + +.highcharts-data-label { + font-size: 0.9em; + font-weight: bold; +} + +.highcharts-data-label-box { + fill: none; + stroke-width: 0; +} + +.highcharts-data-label text, text.highcharts-data-label { + fill: #FBF305; +} + +.highcharts-data-label-connector { + fill: none; +} + +.highcharts-halo { + fill-opacity: 0.25; + stroke-width: 0; +} + +.highcharts-series:not(.highcharts-pie-series) .highcharts-point-select, +.highcharts-markers .highcharts-point-select { + fill: #C0C0C0; + stroke: #000000; +} + +.highcharts-column-series rect.highcharts-point { + stroke: #FFFFFF; +} + +.highcharts-column-series .highcharts-point { + transition: fill-opacity 250ms; +} + +.highcharts-column-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pie-series .highcharts-point { + stroke-linejoin: round; + stroke: #FFFFFF; +} + +.highcharts-pie-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point { + stroke-linejoin: round; + stroke: #FFFFFF; +} + +.highcharts-funnel-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-pyramid-series .highcharts-point { + stroke-linejoin: round; + stroke: #FFFFFF; +} + +.highcharts-pyramid-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pyramid-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-solidgauge-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-treemap-series .highcharts-point { + stroke-width: 1px; + stroke: #C0C0C0; + transition: stroke 250ms, fill 250ms, fill-opacity 250ms; +} + +.highcharts-treemap-series .highcharts-point-hover { + stroke: #808080; + transition: stroke 25ms, fill 25ms, fill-opacity 25ms; +} + +.highcharts-treemap-series .highcharts-above-level { + display: none; +} + +.highcharts-treemap-series .highcharts-internal-node { + fill: none; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive { + fill-opacity: 0.15; + cursor: pointer; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive:hover { + fill-opacity: 0.75; +} + +/* Legend */ +.highcharts-legend-box { + fill: none; + stroke-width: 0; +} + +.highcharts-legend-item > text { + fill: #404040; + font-weight: bold; + font-size: 1em; + cursor: pointer; + stroke-width: 0; +} + +.highcharts-legend-item:hover text { + fill: #000000; +} + +.highcharts-legend-item-hidden * { + fill: #C0C0C0 !important; + stroke: #C0C0C0 !important; + transition: fill 250ms; +} + +.highcharts-legend-nav-active { + fill: #003399; + cursor: pointer; +} + +.highcharts-legend-nav-inactive { + fill: #C0C0C0; +} + +.highcharts-legend-title-box { + fill: none; + stroke-width: 0; +} + +/* Bubble legend */ +.highcharts-bubble-legend-symbol { + stroke-width: 2; + fill-opacity: 0.5; +} + +.highcharts-bubble-legend-connectors { + stroke-width: 1; +} + +.highcharts-bubble-legend-labels { + fill: #404040; +} + +/* Loading */ +.highcharts-loading { + position: absolute; + background-color: #FFFFFF; + opacity: 0.5; + text-align: center; + z-index: 10; + transition: opacity 250ms; +} + +.highcharts-loading-hidden { + height: 0 !important; + opacity: 0; + overflow: hidden; + transition: opacity 250ms, height 250ms step-end; +} + +.highcharts-loading-inner { + font-weight: bold; + position: relative; + top: 45%; +} + +/* Plot bands and polar pane backgrounds */ +.highcharts-plot-band, .highcharts-pane { + fill: #000000; + fill-opacity: 0.05; +} + +.highcharts-plot-line { + fill: none; + stroke: #808080; + stroke-width: 1px; +} + +/* Highcharts More and modules */ +.highcharts-boxplot-box { + fill: #FFFFFF; +} + +.highcharts-boxplot-median { + stroke-width: 2px; +} + +.highcharts-bubble-series .highcharts-point { + fill-opacity: 0.5; +} + +.highcharts-errorbar-series .highcharts-point { + stroke: #000000; +} + +.highcharts-gauge-series .highcharts-data-label-box { + stroke: #C0C0C0; + stroke-width: 1px; +} + +.highcharts-gauge-series .highcharts-dial { + fill: #000000; + stroke-width: 0; +} + +.highcharts-polygon-series .highcharts-graph { + fill: inherit; + stroke-width: 0; +} + +.highcharts-waterfall-series .highcharts-graph { + stroke: #404040; + stroke-dasharray: 1, 3; +} + +.highcharts-sankey-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-sankey-series .highcharts-link { + transition: fill 250ms, fill-opacity 250ms; + fill-opacity: 0.5; +} + +.highcharts-sankey-series .highcharts-point-hover.highcharts-link { + transition: fill 50ms, fill-opacity 50ms; + fill-opacity: 1; +} + +.highcharts-venn-series .highcharts-point { + fill-opacity: 0.75; + stroke: #C0C0C0; + transition: stroke 250ms, fill-opacity 250ms; +} + +.highcharts-venn-series .highcharts-point-hover { + fill-opacity: 1; + stroke: #C0C0C0; +} + +/* Highstock */ +.highcharts-navigator-mask-outside { + fill-opacity: 0; +} + +.highcharts-navigator-mask-inside { + fill: #6685c2; + /* navigator.maskFill option */ + fill-opacity: 0.25; + cursor: ew-resize; +} + +.highcharts-navigator-outline { + stroke: #C0C0C0; + fill: none; +} + +.highcharts-navigator-handle { + stroke: #C0C0C0; + fill: #C0C0C0; + cursor: ew-resize; +} + +.highcharts-navigator-series { + fill: #335cad; + stroke: #335cad; +} + +.highcharts-navigator-series .highcharts-graph { + stroke-width: 1px; +} + +.highcharts-navigator-series .highcharts-area { + fill-opacity: 0.05; +} + +.highcharts-navigator-xaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-navigator-xaxis .highcharts-grid-line { + stroke-width: 1px; + stroke: #C0C0C0; +} + +.highcharts-navigator-xaxis.highcharts-axis-labels { + fill: #808080; +} + +.highcharts-navigator-yaxis .highcharts-grid-line { + stroke-width: 0; +} + +.highcharts-scrollbar-thumb { + fill: #C0C0C0; + stroke: #C0C0C0; + stroke-width: 1px; +} + +.highcharts-scrollbar-button { + fill: #C0C0C0; + stroke: #C0C0C0; + stroke-width: 1px; +} + +.highcharts-scrollbar-arrow { + fill: #808080; +} + +.highcharts-scrollbar-rifles { + stroke: #808080; + stroke-width: 1px; +} + +.highcharts-scrollbar-track { + fill: #C0C0C0; + stroke: #C0C0C0; + stroke-width: 1px; +} + +.highcharts-button { + fill: #C0C0C0; + stroke: #C0C0C0; + cursor: default; + stroke-width: 1px; + transition: fill 250ms; +} + +.highcharts-button text { + fill: #404040; +} + +.highcharts-button-hover { + transition: fill 0ms; + fill: #C0C0C0; + stroke: #C0C0C0; +} + +.highcharts-button-hover text { + fill: #404040; +} + +.highcharts-button-pressed { + font-weight: bold; + fill: #e6ebf5; + stroke: #C0C0C0; +} + +.highcharts-button-pressed text { + fill: #404040; + font-weight: bold; +} + +.highcharts-button-disabled text { + fill: #404040; +} + +.highcharts-range-selector-buttons .highcharts-button { + stroke-width: 0px; +} + +.highcharts-range-label rect { + fill: none; +} + +.highcharts-range-label text { + fill: #808080; +} + +.highcharts-range-input rect { + fill: none; +} + +.highcharts-range-input text { + fill: #404040; +} + +.highcharts-range-input { + stroke-width: 1px; + stroke: #C0C0C0; +} + +input.highcharts-range-selector { + position: absolute; + border: 0; + width: 1px; + /* Chrome needs a pixel to see it */ + height: 1px; + padding: 0; + text-align: center; + left: -9em; + /* #4798 */ +} + +.highcharts-crosshair-label text { + fill: #FFFFFF; + font-size: 1.1em; +} + +.highcharts-crosshair-label .highcharts-label-box { + fill: inherit; +} + +.highcharts-candlestick-series .highcharts-point { + stroke: #000000; + stroke-width: 1px; +} + +.highcharts-candlestick-series .highcharts-point-up { + fill: #FFFFFF; +} + +.highcharts-ohlc-series .highcharts-point-hover { + stroke-width: 3px; +} + +.highcharts-flags-series .highcharts-point .highcharts-label-box { + stroke: #808080; + fill: #FFFFFF; + transition: fill 250ms; +} + +.highcharts-flags-series .highcharts-point-hover .highcharts-label-box { + stroke: #000000; + fill: #ccd6eb; +} + +.highcharts-flags-series .highcharts-point text { + fill: #000000; + font-size: 0.9em; + font-weight: bold; +} + +/* Highmaps */ +.highcharts-map-series .highcharts-point { + transition: fill 500ms, fill-opacity 500ms, stroke-width 250ms; + stroke: #C0C0C0; +} + +.highcharts-map-series .highcharts-point-hover { + transition: fill 0ms, fill-opacity 0ms; + fill-opacity: 0.5; + stroke-width: 2px; +} + +.highcharts-mapline-series .highcharts-point { + fill: none; +} + +.highcharts-heatmap-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-map-navigation { + font-size: 1.3em; + font-weight: bold; + text-align: center; +} + +.highcharts-coloraxis { + stroke-width: 0; +} + +.highcharts-coloraxis-marker { + fill: #808080; +} + +.highcharts-null-point { + fill: #C0C0C0; +} + +/* 3d charts */ +.highcharts-3d-frame { + fill: transparent; +} + +/* Exporting module */ +.highcharts-contextbutton { + fill: #FFFFFF; + /* needed to capture hover */ + stroke: none; + stroke-linecap: round; +} + +.highcharts-contextbutton:hover { + fill: #C0C0C0; + stroke: #C0C0C0; +} + +.highcharts-button-symbol { + stroke: #808080; + stroke-width: 3px; +} + +.highcharts-menu { + border: 1px solid #808080; + background: #FFFFFF; + padding: 5px 0; + box-shadow: 3px 3px 10px #888; +} + +.highcharts-menu-item { + padding: 0.5em 1em; + background: none; + color: #404040; + cursor: pointer; + transition: background 250ms, color 250ms; +} + +.highcharts-menu-item:hover { + background: #335cad; + color: #FFFFFF; +} + +/* Drilldown module */ +.highcharts-drilldown-point { + cursor: pointer; +} + +.highcharts-drilldown-data-label text, +text.highcharts-drilldown-data-label, +.highcharts-drilldown-axis-label { + cursor: pointer; + fill: #003399; + font-weight: bold; + text-decoration: underline; +} + +/* No-data module */ +.highcharts-no-data text { + font-weight: bold; + font-size: 12px; + fill: #808080; +} + +/* Drag-panes module */ +.highcharts-axis-resizer { + cursor: ns-resize; + stroke: black; + stroke-width: 2px; +} + +/* Bullet type series */ +.highcharts-bullet-target { + stroke-width: 0; +} + +/* Lineargauge type series */ +.highcharts-lineargauge-target { + stroke-width: 1px; + stroke: #404040; +} + +.highcharts-lineargauge-target-line { + stroke-width: 1px; + stroke: #404040; +} + +/* Annotations module */ +.highcharts-annotation-label-box { + stroke-width: 1px; + stroke: #000000; + fill: #000000; + fill-opacity: 0.75; +} + +.highcharts-annotation-label text { + fill: #C0C0C0; +} + +/* Gantt */ +.highcharts-treegrid-node-collapsed, .highcharts-treegrid-node-expanded { + cursor: pointer; +} + +.highcharts-point-connecting-path { + fill: none; +} + +.highcharts-grid-axis .highcharts-tick { + stroke-width: 1px; +} + +.highcharts-grid-axis .highcharts-axis-line { + stroke-width: 1px; +} + +/*# sourceMappingURL=dicserver_highcharts.css.map */ diff --git a/DiscImageChef.Server/styles/mac/dicserver_highcharts.scss b/DiscImageChef.Server/styles/mac/dicserver_highcharts.scss new file mode 100644 index 00000000..0238da74 --- /dev/null +++ b/DiscImageChef.Server/styles/mac/dicserver_highcharts.scss @@ -0,0 +1,55 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : dicserver_highcharts.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets style for server's charts. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; +@import "_font"; +@import "_fontstyles"; + +$colors: $green $yellow $orange $brown $red $magenta $purple $blue $cyan $tan $darkgreen; +$background-color: $body-bg; + +$neutral-color-100: $black; // Strong text. +$neutral-color-80: $gray-800; // Main text and some strokes. +$neutral-color-60: $gray-600; // Axis labels, axis title, connector fallback. +$neutral-color-40: $gray-400; // Credits text, export menu stroke. +$neutral-color-20: $gray-200; // Disabled texts, button strokes, crosshair etc. +$neutral-color-10: $gray-100; // Grid lines etc. +$neutral-color-5: $gray-100; // Minor grid lines etc. +$neutral-color-3: $gray-100; // Tooltip backgroud, button fills, map null points. + +$font-family: $font-family-base; + +$tooltip-background: $white; + +$data-label-color: $yellow; + +@import "../_highcharts"; \ No newline at end of file