diff --git a/.github/workflows/dotnet-test.yml b/.github/workflows/dotnet-test.yml new file mode 100644 index 00000000..b607f03d --- /dev/null +++ b/.github/workflows/dotnet-test.yml @@ -0,0 +1,46 @@ +name: .NET Test + +on: + workflow_dispatch: + push: + branches: [ develop, main ] + pull_request: + branches: [ develop, main ] + +jobs: + build-and-test: + runs-on: ubuntu-latest + env: + AZUREDEVOPS__PERSONALACCESSTOKEN: ${{ secrets.AZUREDEVOPS__PERSONALACCESSTOKEN }} + CONNECTIONSTRINGS__POSTGRESCONNECTIONSTRING: ${{ secrets.CONNECTIONSTRINGS__POSTGRESCONNECTIONSTRING }} + GitHub__GitHubAccessToken : ${{ secrets.GITHUBACCESSTOKEN }} + steps: + - name: Checkout source code + uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + global-json-file: global.json + + - uses: actions/setup-node@v4 + with: + node-version: 23 + + - name: Install wasm + run: cd src && dotnet workload install wasm-tools + + - name: Restore dependencies + run: dotnet restore CrystaLearn.TestOnly.sln + + - name: Build + run: dotnet build CrystaLearn.TestOnly.sln --no-restore + + - name: Install Playwright Browsers + run: | + cd src/Test/CrystaLearn.Test + dotnet tool restore + dotnet playwright install + + - name: Run tests + run: dotnet test CrystaLearn.TestOnly.sln --no-build --verbosity normal diff --git a/CrystaLearn.TestOnly.sln b/CrystaLearn.TestOnly.sln new file mode 100644 index 00000000..21e8eb34 --- /dev/null +++ b/CrystaLearn.TestOnly.sln @@ -0,0 +1,153 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31611.283 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrystaLearn.Server.Web", "src\Server\CrystaLearn.Server.Web\CrystaLearn.Server.Web.csproj", "{8CC3E410-B716-4F4D-89C7-3392CA624439}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Server.Shared", "src\Server\CrystaLearn.Server.Shared\CrystaLearn.Server.Shared.csproj", "{AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".SolutionItems", ".SolutionItems", "{5CF43F76-BB71-4B5B-B4DF-1C753E042A8F}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitignore = .gitignore + .vsconfig = .vsconfig + Bit.ResxTranslator.json = Bit.ResxTranslator.json + Clean.bat = Clean.bat + src\Directory.Build.props = src\Directory.Build.props + src\Directory.Packages.props = src\Directory.Packages.props + Dockerfile = Dockerfile + global.json = global.json + .vscode\mcp.json = .vscode\mcp.json + README.md = README.md + settings.VisualStudio.json = settings.VisualStudio.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{248D8229-BABD-4F0A-A9C6-0417B464507B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrystaLearn.Client.Core", "src\Client\CrystaLearn.Client.Core\CrystaLearn.Client.Core.csproj", "{FC60C68D-8E8D-494B-8D60-0C8D83A472E7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrystaLearn.Client.Web", "src\Client\CrystaLearn.Client.Web\CrystaLearn.Client.Web.csproj", "{13D6A40B-8B8B-41F0-AB62-3F5F1CB58A1B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{3E577755-186F-4E63-8153-B8DE890015C9}" + ProjectSection(SolutionItems) = preProject + .github\copilot-instructions.md = .github\copilot-instructions.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "prompts", "prompts", "{4A5D6E7F-8B9C-1A2B-3C4D-5E6F7A8B9C0D}" + ProjectSection(SolutionItems) = preProject + .github\prompts\resx.prompt.md = .github\prompts\resx.prompt.md + .github\prompts\scaffold.prompt.md = .github\prompts\scaffold.prompt.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{2347E3B2-FDDE-427E-A0AE-E4DCD47C2989}" + ProjectSection(SolutionItems) = preProject + .github\workflows\cd-develop.yml = .github\workflows\cd-develop.yml + .github\workflows\cd-production.yml = .github\workflows\cd-production.yml + .github\workflows\cd-template.yml = .github\workflows\cd-template.yml + .github\workflows\ci.yml = .github\workflows\ci.yml + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrystaLearn.Client.Windows", "src\Client\CrystaLearn.Client.Windows\CrystaLearn.Client.Windows.csproj", "{E3CB3C34-F5DE-4A96-B552-7D52BCAD1E1F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrystaLearn.Server.Api", "src\Server\CrystaLearn.Server.Api\CrystaLearn.Server.Api.csproj", "{3D93B170-BDCD-4890-92B3-F5ABE48F3D3A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{723683EA-193C-45FD-A64D-7830A2867E4F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{EAB56593-7B10-4CC4-A3B8-E62ACDD1E6DD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{B38FF18E-11BC-4AF6-8FA3-648B3952DCAF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Console", "Console", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{C36CFF28-CAFE-4DD4-8819-2B72613691A8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Core", "src\Core\CrystaLearn.Core\CrystaLearn.Core.csproj", "{50DBE157-AA16-7B4F-BC02-CD74DAE45AA2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Core.Test", "src\Core\CrystaLearn.Core.Test\CrystaLearn.Core.Test.csproj", "{DFF2B3BF-3F9B-4016-944E-885962FF1AE6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".azure", ".azure", "{6F2F419F-1348-4115-9082-46DFDD9D5347}" + ProjectSection(SolutionItems) = preProject + .azure\ci.yml = .azure\ci.yml + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Shared", "src\Shared\CrystaLearn.Shared\CrystaLearn.Shared.csproj", "{A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Console", "src\Console\CrystaLearn.Console\CrystaLearn.Console.csproj", "{0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Test", "src\Test\CrystaLearn.Test\CrystaLearn.Test.csproj", "{56CF1939-AE5C-7203-3425-919867BB5F04}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8CC3E410-B716-4F4D-89C7-3392CA624439}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8CC3E410-B716-4F4D-89C7-3392CA624439}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8CC3E410-B716-4F4D-89C7-3392CA624439}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8CC3E410-B716-4F4D-89C7-3392CA624439}.Release|Any CPU.Build.0 = Release|Any CPU + {AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2}.Release|Any CPU.Build.0 = Release|Any CPU + {FC60C68D-8E8D-494B-8D60-0C8D83A472E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC60C68D-8E8D-494B-8D60-0C8D83A472E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC60C68D-8E8D-494B-8D60-0C8D83A472E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC60C68D-8E8D-494B-8D60-0C8D83A472E7}.Release|Any CPU.Build.0 = Release|Any CPU + {13D6A40B-8B8B-41F0-AB62-3F5F1CB58A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {13D6A40B-8B8B-41F0-AB62-3F5F1CB58A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {13D6A40B-8B8B-41F0-AB62-3F5F1CB58A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {13D6A40B-8B8B-41F0-AB62-3F5F1CB58A1B}.Release|Any CPU.Build.0 = Release|Any CPU + {E3CB3C34-F5DE-4A96-B552-7D52BCAD1E1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3CB3C34-F5DE-4A96-B552-7D52BCAD1E1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3CB3C34-F5DE-4A96-B552-7D52BCAD1E1F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3CB3C34-F5DE-4A96-B552-7D52BCAD1E1F}.Release|Any CPU.Build.0 = Release|Any CPU + {3D93B170-BDCD-4890-92B3-F5ABE48F3D3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D93B170-BDCD-4890-92B3-F5ABE48F3D3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D93B170-BDCD-4890-92B3-F5ABE48F3D3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D93B170-BDCD-4890-92B3-F5ABE48F3D3A}.Release|Any CPU.Build.0 = Release|Any CPU + {50DBE157-AA16-7B4F-BC02-CD74DAE45AA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50DBE157-AA16-7B4F-BC02-CD74DAE45AA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50DBE157-AA16-7B4F-BC02-CD74DAE45AA2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50DBE157-AA16-7B4F-BC02-CD74DAE45AA2}.Release|Any CPU.Build.0 = Release|Any CPU + {DFF2B3BF-3F9B-4016-944E-885962FF1AE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DFF2B3BF-3F9B-4016-944E-885962FF1AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFF2B3BF-3F9B-4016-944E-885962FF1AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DFF2B3BF-3F9B-4016-944E-885962FF1AE6}.Release|Any CPU.Build.0 = Release|Any CPU + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}.Release|Any CPU.Build.0 = Release|Any CPU + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}.Release|Any CPU.Build.0 = Release|Any CPU + {56CF1939-AE5C-7203-3425-919867BB5F04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56CF1939-AE5C-7203-3425-919867BB5F04}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56CF1939-AE5C-7203-3425-919867BB5F04}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56CF1939-AE5C-7203-3425-919867BB5F04}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {8CC3E410-B716-4F4D-89C7-3392CA624439} = {723683EA-193C-45FD-A64D-7830A2867E4F} + {AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2} = {723683EA-193C-45FD-A64D-7830A2867E4F} + {FC60C68D-8E8D-494B-8D60-0C8D83A472E7} = {248D8229-BABD-4F0A-A9C6-0417B464507B} + {13D6A40B-8B8B-41F0-AB62-3F5F1CB58A1B} = {248D8229-BABD-4F0A-A9C6-0417B464507B} + {3E577755-186F-4E63-8153-B8DE890015C9} = {5CF43F76-BB71-4B5B-B4DF-1C753E042A8F} + {4A5D6E7F-8B9C-1A2B-3C4D-5E6F7A8B9C0D} = {3E577755-186F-4E63-8153-B8DE890015C9} + {2347E3B2-FDDE-427E-A0AE-E4DCD47C2989} = {3E577755-186F-4E63-8153-B8DE890015C9} + {E3CB3C34-F5DE-4A96-B552-7D52BCAD1E1F} = {248D8229-BABD-4F0A-A9C6-0417B464507B} + {3D93B170-BDCD-4890-92B3-F5ABE48F3D3A} = {723683EA-193C-45FD-A64D-7830A2867E4F} + {50DBE157-AA16-7B4F-BC02-CD74DAE45AA2} = {C36CFF28-CAFE-4DD4-8819-2B72613691A8} + {DFF2B3BF-3F9B-4016-944E-885962FF1AE6} = {C36CFF28-CAFE-4DD4-8819-2B72613691A8} + {6F2F419F-1348-4115-9082-46DFDD9D5347} = {5CF43F76-BB71-4B5B-B4DF-1C753E042A8F} + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57} = {EAB56593-7B10-4CC4-A3B8-E62ACDD1E6DD} + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {56CF1939-AE5C-7203-3425-919867BB5F04} = {B38FF18E-11BC-4AF6-8FA3-648B3952DCAF} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E82D1976-7A33-41F5-8B81-2F6B4034CFE3} + EndGlobalSection +EndGlobal diff --git a/CrystaLearn.sln b/CrystaLearn.sln index 5c06f1cf..3e497670 100644 --- a/CrystaLearn.sln +++ b/CrystaLearn.sln @@ -24,8 +24,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".SolutionItems", ".Solution EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{248D8229-BABD-4F0A-A9C6-0417B464507B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrystaLearn.Shared", "src\Shared\CrystaLearn.Shared.csproj", "{26430D8C-32CB-4142-AC1A-33486A58DA01}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrystaLearn.Client.Core", "src\Client\CrystaLearn.Client.Core\CrystaLearn.Client.Core.csproj", "{FC60C68D-8E8D-494B-8D60-0C8D83A472E7}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrystaLearn.Client.Web", "src\Client\CrystaLearn.Client.Web\CrystaLearn.Client.Web.csproj", "{13D6A40B-8B8B-41F0-AB62-3F5F1CB58A1B}" @@ -59,14 +57,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{723683 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{EAB56593-7B10-4CC4-A3B8-E62ACDD1E6DD}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{B38FF18E-11BC-4AF6-8FA3-648B3952DCAF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrystaLearn.Tests", "src\Tests\CrystaLearn.Tests.csproj", "{47F82CD8-D6DA-4F03-9DD6-F67AF3621C93}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{B38FF18E-11BC-4AF6-8FA3-648B3952DCAF}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Console", "Console", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Console", "src\Console\CrystaLearn.Console.csproj", "{6C8EDFC0-69D1-8076-B327-B819E911EC55}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{C36CFF28-CAFE-4DD4-8819-2B72613691A8}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Core", "src\Core\CrystaLearn.Core\CrystaLearn.Core.csproj", "{50DBE157-AA16-7B4F-BC02-CD74DAE45AA2}" @@ -78,6 +72,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".azure", ".azure", "{6F2F41 .azure\ci.yml = .azure\ci.yml EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Shared", "src\Shared\CrystaLearn.Shared\CrystaLearn.Shared.csproj", "{A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Console", "src\Console\CrystaLearn.Console\CrystaLearn.Console.csproj", "{0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystaLearn.Test", "src\Test\CrystaLearn.Test\CrystaLearn.Test.csproj", "{56CF1939-AE5C-7203-3425-919867BB5F04}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -92,10 +92,6 @@ Global {AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2}.Debug|Any CPU.Build.0 = Debug|Any CPU {AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2}.Release|Any CPU.Build.0 = Release|Any CPU - {26430D8C-32CB-4142-AC1A-33486A58DA01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {26430D8C-32CB-4142-AC1A-33486A58DA01}.Debug|Any CPU.Build.0 = Debug|Any CPU - {26430D8C-32CB-4142-AC1A-33486A58DA01}.Release|Any CPU.ActiveCfg = Release|Any CPU - {26430D8C-32CB-4142-AC1A-33486A58DA01}.Release|Any CPU.Build.0 = Release|Any CPU {FC60C68D-8E8D-494B-8D60-0C8D83A472E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FC60C68D-8E8D-494B-8D60-0C8D83A472E7}.Debug|Any CPU.Build.0 = Debug|Any CPU {FC60C68D-8E8D-494B-8D60-0C8D83A472E7}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -118,14 +114,6 @@ Global {3D93B170-BDCD-4890-92B3-F5ABE48F3D3A}.Debug|Any CPU.Build.0 = Debug|Any CPU {3D93B170-BDCD-4890-92B3-F5ABE48F3D3A}.Release|Any CPU.ActiveCfg = Release|Any CPU {3D93B170-BDCD-4890-92B3-F5ABE48F3D3A}.Release|Any CPU.Build.0 = Release|Any CPU - {47F82CD8-D6DA-4F03-9DD6-F67AF3621C93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47F82CD8-D6DA-4F03-9DD6-F67AF3621C93}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47F82CD8-D6DA-4F03-9DD6-F67AF3621C93}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47F82CD8-D6DA-4F03-9DD6-F67AF3621C93}.Release|Any CPU.Build.0 = Release|Any CPU - {6C8EDFC0-69D1-8076-B327-B819E911EC55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C8EDFC0-69D1-8076-B327-B819E911EC55}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C8EDFC0-69D1-8076-B327-B819E911EC55}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C8EDFC0-69D1-8076-B327-B819E911EC55}.Release|Any CPU.Build.0 = Release|Any CPU {50DBE157-AA16-7B4F-BC02-CD74DAE45AA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {50DBE157-AA16-7B4F-BC02-CD74DAE45AA2}.Debug|Any CPU.Build.0 = Debug|Any CPU {50DBE157-AA16-7B4F-BC02-CD74DAE45AA2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -134,6 +122,18 @@ Global {DFF2B3BF-3F9B-4016-944E-885962FF1AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU {DFF2B3BF-3F9B-4016-944E-885962FF1AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU {DFF2B3BF-3F9B-4016-944E-885962FF1AE6}.Release|Any CPU.Build.0 = Release|Any CPU + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57}.Release|Any CPU.Build.0 = Release|Any CPU + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF}.Release|Any CPU.Build.0 = Release|Any CPU + {56CF1939-AE5C-7203-3425-919867BB5F04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56CF1939-AE5C-7203-3425-919867BB5F04}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56CF1939-AE5C-7203-3425-919867BB5F04}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56CF1939-AE5C-7203-3425-919867BB5F04}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -141,7 +141,6 @@ Global GlobalSection(NestedProjects) = preSolution {8CC3E410-B716-4F4D-89C7-3392CA624439} = {723683EA-193C-45FD-A64D-7830A2867E4F} {AA97E5DE-1021-2739-ED90-9EDEEAEB5CA2} = {723683EA-193C-45FD-A64D-7830A2867E4F} - {26430D8C-32CB-4142-AC1A-33486A58DA01} = {EAB56593-7B10-4CC4-A3B8-E62ACDD1E6DD} {FC60C68D-8E8D-494B-8D60-0C8D83A472E7} = {248D8229-BABD-4F0A-A9C6-0417B464507B} {13D6A40B-8B8B-41F0-AB62-3F5F1CB58A1B} = {248D8229-BABD-4F0A-A9C6-0417B464507B} {22816913-64D5-4AE8-9B34-6F188B71FAD1} = {248D8229-BABD-4F0A-A9C6-0417B464507B} @@ -150,11 +149,12 @@ Global {2347E3B2-FDDE-427E-A0AE-E4DCD47C2989} = {3E577755-186F-4E63-8153-B8DE890015C9} {E3CB3C34-F5DE-4A96-B552-7D52BCAD1E1F} = {248D8229-BABD-4F0A-A9C6-0417B464507B} {3D93B170-BDCD-4890-92B3-F5ABE48F3D3A} = {723683EA-193C-45FD-A64D-7830A2867E4F} - {47F82CD8-D6DA-4F03-9DD6-F67AF3621C93} = {B38FF18E-11BC-4AF6-8FA3-648B3952DCAF} - {6C8EDFC0-69D1-8076-B327-B819E911EC55} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {50DBE157-AA16-7B4F-BC02-CD74DAE45AA2} = {C36CFF28-CAFE-4DD4-8819-2B72613691A8} {DFF2B3BF-3F9B-4016-944E-885962FF1AE6} = {C36CFF28-CAFE-4DD4-8819-2B72613691A8} {6F2F419F-1348-4115-9082-46DFDD9D5347} = {5CF43F76-BB71-4B5B-B4DF-1C753E042A8F} + {A354538E-3FE9-E7E1-5549-BDE3CC8B4E57} = {EAB56593-7B10-4CC4-A3B8-E62ACDD1E6DD} + {0C7A0635-96D1-CC2E-6DE7-55FCEB6645BF} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {56CF1939-AE5C-7203-3425-919867BB5F04} = {B38FF18E-11BC-4AF6-8FA3-648B3952DCAF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E82D1976-7A33-41F5-8B81-2F6B4034CFE3} diff --git a/docs/technical/setup-dev-environment.md b/docs/technical/setup-dev-environment.md index f0854c3e..b0cc8cd8 100644 --- a/docs/technical/setup-dev-environment.md +++ b/docs/technical/setup-dev-environment.md @@ -69,23 +69,32 @@ https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-person ### Initialize and set the secrets ```bash -cd /src/CrystaLearn/src/Server/CrystaLearn.Server.Web +cd src/Server/CrystaLearn.Server.Web dotnet user-secrets init -dotnet user-secrets set "ConnectionStrings:SqlServerConnectionString" "Your SQL Server Connection String" +dotnet user-secrets set "ConnectionStrings:PostgresConnectionString" "Your SQL Server Connection String" dotnet user-secrets set "GitHub:GitHubAccessToken" "Your GitHub Access Token" dotnet user-secrets set "AzureDevOps:PersonalAccessToken" "Your Azure DevOps Personal Access Token" +dotnet user-secrets set "Authentication:Microsoft:TenantId" "Crysta Learn TenantId" +dotnet user-secrets set "Authentication:Microsoft:ClientId" "Crysta Learn ClientId" +dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "Crysta Learn Client Secret" -cd /src/CrystaLearn/src/Console/CrystaLearn.Console +cd src/Console/CrystaLearn.Console dotnet user-secrets init -dotnet user-secrets set "ConnectionStrings:SqlServerConnectionString" "Your SQL Server Connection String" +dotnet user-secrets set "ConnectionStrings:PostgresConnectionString" "Your SQL Server Connection String" dotnet user-secrets set "GitHub:GitHubAccessToken" "Your GitHub Access Token" dotnet user-secrets set "AzureDevOps:PersonalAccessToken" "Your Azure DevOps Personal Access Token" +dotnet user-secrets set "Authentication:Microsoft:TenantId" "Crysta Learn TenantId" +dotnet user-secrets set "Authentication:Microsoft:ClientId" "Crysta Learn ClientId" +dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "Crysta Learn Client Secret" -cd /src/CrystaLearn/src/Core/CrystaLearn.Core.Tests +cd src/Core/CrystaLearn.Core.Test dotnet user-secrets init -dotnet user-secrets set "ConnectionStrings:SqlServerConnectionString" "Your SQL Server Connection String" +dotnet user-secrets set "ConnectionStrings:PostgresConnectionString" "Your SQL Server Connection String" dotnet user-secrets set "GitHub:GitHubAccessToken" "Your GitHub Access Token" dotnet user-secrets set "AzureDevOps:PersonalAccessToken" "Your Azure DevOps Personal Access Token" +dotnet user-secrets set "Authentication:Microsoft:TenantId" "Crysta Learn TenantId" +dotnet user-secrets set "Authentication:Microsoft:ClientId" "Crysta Learn ClientId" +dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "Crysta Learn Client Secret" ``` Remember to replace `"Your SQL Server Connection String"` and `"Your GitHub Access Token"` with your actual connection string and access token. diff --git a/src/Client/CrystaLearn.Client.Core/ComponentMetadata.cs b/src/Client/CrystaLearn.Client.Core/ComponentMetadata.cs new file mode 100644 index 00000000..b6a1a387 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/ComponentMetadata.cs @@ -0,0 +1,7 @@ +namespace CrystaLearn.Client.Core; + +public class ComponentMetadata +{ + public Type? Type { get; set; } + public Dictionary Parameters { get; set; } = []; +} diff --git a/src/Client/CrystaLearn.Client.Core/Components/AppComponentBase.cs b/src/Client/CrystaLearn.Client.Core/Components/AppComponentBase.cs index ab60d838..f77eac2f 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/AppComponentBase.cs +++ b/src/Client/CrystaLearn.Client.Core/Components/AppComponentBase.cs @@ -1,5 +1,4 @@ using System.Runtime.CompilerServices; - namespace CrystaLearn.Client.Core.Components; public partial class AppComponentBase : ComponentBase, IAsyncDisposable diff --git a/src/Client/CrystaLearn.Client.Core/Components/AuthenticatingModal.razor b/src/Client/CrystaLearn.Client.Core/Components/AuthenticatingModal.razor new file mode 100644 index 00000000..b23a3ba5 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/AuthenticatingModal.razor @@ -0,0 +1,14 @@ +@inherits AppComponentBase; + + +
+ + + + + @Localizer[nameof(AppStrings.AuthenticatingModal)] + @Localizer[nameof(AppStrings.WillTakeSeconds)] + + + +
\ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/AuthenticatingModal.razor.cs b/src/Client/CrystaLearn.Client.Core/Components/AuthenticatingModal.razor.cs new file mode 100644 index 00000000..9ed2fe0d --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/AuthenticatingModal.razor.cs @@ -0,0 +1,5 @@ +namespace CrystaLearn.Client.Core.Components; + +public partial class AuthenticatingModal +{ +} diff --git a/src/Client/CrystaLearn.Client.Core/Components/AuthenticatingModal.razor.scss b/src/Client/CrystaLearn.Client.Core/Components/AuthenticatingModal.razor.scss new file mode 100644 index 00000000..cb0d1533 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/AuthenticatingModal.razor.scss @@ -0,0 +1,75 @@ +@import '../Styles/abstracts/_vars.scss'; +@import '../Styles/abstracts/_colors.scss'; + +section { + margin: 0 auto; +} + +::deep { + + .loading-color { + margin: 0 auto; + --bit-ldn-color: var(--bit-ckr-thmb-sld-4) !important; + } + + .cslearn-modal-container { + width: 100%; + align-items: center !important; + border-radius: 1.6rem 1.6rem 0.8rem 0.8rem; + background-color: var(--bit-clr-bg-ter-3); + } + + .cslearn-close-icon { + font-size: 2.4rem; + cursor: pointer; + + &::before { + color: var(--bit-clr-fg-pri-3); + } + } + + .cslearn-header-text { + font: var(--font-subtitle-1); + color: var(--bit-clr-fg-pre-2); + } + + .cslearn-desc-text { + font: var(--font-body-2); + color: var(--bit-clr-inf-dark); + } +} + +.page-heading { + background-repeat: no-repeat; + background-position: center; + background-size: contain; + height: 12rem; + min-height: 12rem; + width: 12rem; + margin: 0 auto; +} + +.cslearn-dark-theme { + * ::deep .light-theme { + display: none; + } + + .page-heading { + background-image: url('images/backgrounds/Authenticating-dark.png'); + } +} + +.cslearn-light-theme { + * ::deep .dark-theme { + display: none; + } + + .page-heading { + background-image: url('images/backgrounds/Authenticating-light.png'); + } +} + +@media screen and (min-width: $breakpoint-md) { + + ::deep {} +} \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/CsLearnIcon.razor b/src/Client/CrystaLearn.Client.Core/Components/CsLearnIcon.razor new file mode 100644 index 00000000..9a04b9f0 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/CsLearnIcon.razor @@ -0,0 +1,8 @@ +@inherits AppComponentBase; + +@if (IsVisible) +{ + + + +} \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/CsLearnIcon.razor.cs b/src/Client/CrystaLearn.Client.Core/Components/CsLearnIcon.razor.cs new file mode 100644 index 00000000..3c0a0f31 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/CsLearnIcon.razor.cs @@ -0,0 +1,69 @@ +namespace CrystaLearn.Client.Core.Components; +public partial class CsLearnIcon +{ + private readonly ElementClassBuilder _classBuilder = new(); + private string? _class; + private IconColorStyle? _colorStyle; + private string? _iconName; + + [Parameter] public string? Title { get; set; } + [Parameter] public bool IsVisible { get; set; } = true; + + [Parameter] + public string? IconName + { + get => _iconName; + set + { + if (string.Equals(_iconName, value, StringComparison.Ordinal)) return; + + _iconName = value; + _classBuilder.Reset(); + } + } + + [Parameter] + public IconColorStyle? ColorStyle + { + get => _colorStyle; + set + { + if (_colorStyle == value) return; + + _colorStyle = value; + _classBuilder.Reset(); + } + } + + [Parameter] + public string? Class + { + get => _class; + set + { + if (string.Equals(_class, value, StringComparison.Ordinal)) return; + + _class = value; + _classBuilder.Reset(); + } + } + + protected override Task OnInitAsync() + { + _classBuilder + .Register(() => "cslearn-ico") + .Register(() => IconName) + .Register(() => Class) + .Register(() => ColorStyle?.ToString().ToLowerInvariant()); + + return base.OnInitAsync(); + } + + public enum IconColorStyle + { + Blue, + Gray, + Primary, + Green, + } +} diff --git a/src/Client/CrystaLearn.Client.Core/Components/CsLearnIcon.razor.scss b/src/Client/CrystaLearn.Client.Core/Components/CsLearnIcon.razor.scss new file mode 100644 index 00000000..6c86e29d --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/CsLearnIcon.razor.scss @@ -0,0 +1,21 @@ +@import '../Styles/abstracts/_font-icon.scss'; +@import '../Styles/abstracts/_colors.scss'; + + +.cslearn-ico { + display: inline-block; + font-style: normal; + font-weight: normal; + + &.blue { + color: $Blue2; + } + + &.gray { + color: $Gray200 + } + + &.green { + color: $Green + } +} \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/CsLearnIconName.cs b/src/Client/CrystaLearn.Client.Core/Components/CsLearnIconName.cs new file mode 100644 index 00000000..6b8d76c3 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/CsLearnIconName.cs @@ -0,0 +1,28 @@ +namespace CrystaLearn.Client.Core.Components; +public static class CsLearnIconName +{ + public const string ArrowRight = "icon-arrow-right"; + public const string Bath = "icon-bathroom"; + public const string Bed = "icon-bedroom"; + public const string Brightness = "icon-brightness"; + public const string Check = "icon-check"; + public const string Chinese = "icon-chinese"; + public const string Delete = "icon-delete"; + public const string English = "icon-english"; + public const string Farsi = "icon-farsi"; + public const string French = "icon-french"; + public const string Garage = "icon-garage"; + public const string Info = "icon-info"; + public const string Information = "icon-informative"; + public const string Library = "icon-library"; + public const string LightMode = "icon-light-mode"; + public const string Location = "icon-location"; + public const string MicOn = "icon-mic-on"; + public const string Pin = "icon-pin"; + public const string Pro = "icon-pro"; + public const string Zoning = "icon-zoning"; + public const string CheckMark = "icon-circle-checkmark"; + public const string Message = "icon-message"; + public const string ArrowToRight = "icon-arrow-4"; + public const string WarningCircle = "icon-warning1"; +} diff --git a/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor b/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor index ce880ec4..50d0faff 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor +++ b/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor @@ -3,29 +3,44 @@ @inherits AppComponentBase - -
- -
- - @if(IsDocPage) - { - - } - -
-
- @ChildContent -
-
-
- -
-
+ +
+ +
+ + @if (IsDocPage) + { + + } + +
+
+ @ChildContent + + + @if (panelComponentMetadata is not null) + { + + } + + +
+
+
+ +
+
\ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor.cs b/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor.cs index 1af38a98..cd839ca6 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor.cs +++ b/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor.cs @@ -1,4 +1,5 @@ using CrystaLearn.Client.Core.Models; +using CrystaLearn.Client.Core.Services; using CrystaLearn.Shared.Dtos.Crysta; using Microsoft.AspNetCore.Components.Routing; @@ -17,9 +18,11 @@ public partial class AppShell private BitAppShell? _appShellRef; private bool isNavPanelOpen; private bool isNavPanelToggled; + private bool isOpenButtonShit; private BitNavItem? selectedItem; private List navPanelItems = []; private readonly List unsubscribers = []; + private ComponentMetadata? panelComponentMetadata { get; set; } protected override async Task OnInitAsync() { @@ -41,6 +44,19 @@ protected override async Task OnInitAsync() StateHasChanged(); })); + unsubscribers.Add(PubSubService.Subscribe(ClientPubSubMessages.OPEN_BUTTON_SHIT, async dynamic => + { + panelComponentMetadata = (ComponentMetadata)dynamic!; + isOpenButtonShit = true; + await InvokeAsync(StateHasChanged); + })); + + unsubscribers.Add(PubSubService.Subscribe(ClientPubSubMessages.CLOSE_BUTTON_SHIT, async _ => + { + isOpenButtonShit = false; + await InvokeAsync(StateHasChanged); + })); + unsubscribers.Add(PubSubService.Subscribe(ClientPubSubMessages.SET_PROGRAM_CODE, async (payload) => { navPanelItems = []; diff --git a/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor.scss b/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor.scss index 03533076..d86466ee 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor.scss +++ b/src/Client/CrystaLearn.Client.Core/Components/Layout/AppShell.razor.scss @@ -1,5 +1,6 @@ @import '../../Styles/abstracts/_media-queries.scss'; @import '../../Styles/abstracts/_bit-css-variables.scss'; +@import '../../Styles/abstracts/_vars.scss'; .site-content { width: 100%; @@ -127,3 +128,65 @@ main { inset-inline-end: 0; } } + + +@media screen and (min-width: $breakpoint-md) { + ::deep .cslearn-panel-container { + + & > section { + padding: 2.4rem 2.4rem 4.2rem 2.4rem; + } + } +} + +::deep { + .validation-message { + font-size: 12px; + text-align: start; + line-height: 16px; + color: $bit-color-error; + } + + .nav-panel { + width: 280px; + + @include lt-md { + width: 210px; + } + } + + .cslearn-panel-overlay { + background: rgba(2, 33, 41, 0.30); + backdrop-filter: blur(2.5px); + } + + .cslearn-panel-container { + max-width: 60rem; + margin: 0 auto; + border-radius: 2rem 2rem 0 0; + box-shadow: unset; + background-color: var(--bit-clr-bg-pri); + + & > section { + height: fit-content !important; + width: 100% !important; + padding: 2.4rem 2.4rem 4.2rem 2.4rem; + } + } +} + + +@media screen and (max-width: $breakpoint-md) { + + ::deep { + .conversation-panel { + z-index: 99999999; + + .cslearn-panel-container { + & > section { + padding: 2.4rem 2.4rem 3.2rem 2.4rem !important; + } + } + } + } +} \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor b/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor index c83460db..35e59240 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor +++ b/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor @@ -1,4 +1,5 @@ @inherits AppComponentBase +@using CrystaLearn.Client.Core.Extensions;
@@ -45,5 +46,102 @@ @* *@ + + + + + + + @if (isAuthenticated is false) + { + + + @Localizer[AppStrings.Login] + + + } + else + { + + } + + + @Localizer[AppStrings.Language] + + + + + + + + @if (isAuthenticated is true) + { + + + + @Localizer[AppStrings.LogOut] + + + + + } + + + + + @Localizer[AppStrings.SelectLanguage] + + + @foreach (var culture in cultures) + { + + + @culture.Value.GetLanguageName() + + } + + + + + + +
diff --git a/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor.cs b/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor.cs index 0cccae76..05eadc76 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor.cs +++ b/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor.cs @@ -1,4 +1,8 @@ -using Microsoft.AspNetCore.Components.Routing; +using CrystaLearn.Client.Core.Services; +using CrystaLearn.Shared.Controllers.Identity; +using CrystaLearn.Shared.Dtos.Identity; +using CrystaLearn.Shared.Exceptions; +using Microsoft.AspNetCore.Components.Routing; namespace CrystaLearn.Client.Core.Components.Layout.Header; @@ -9,16 +13,41 @@ public partial class CrystaHeader : AppComponentBase [AutoInject] private History history = default!; [AutoInject] private ThemeService themeService = default!; + [AutoInject] private SignInModalService signInModalService = default!; + [AutoInject] private CultureService cultureService = default!; + [AutoInject] private IUserController userController = default!; + [AutoInject] private ITelemetryContext telemetryContext = default!; + [AutoInject] private PubSubService pubSubService { get; set; } = default!; + private BitDropdownItem[] cultures = default!; + + private bool isDarkMode => CurrentTheme == AppThemeType.Dark; + private string? pageTitle; private string? pageSubtitle; private bool showGoBackButton; + private bool isOpen; + private bool isAuthenticated; + private bool isSignOutConfirmOpen; + private bool isMenuPanelOpen = false; private Action unsubscribePageTitleChanged = default!; + private UserDto user = new(); + + private Uri absoluteServerAddress => new(NavigationManager.BaseUri); + + private bool ShowLanguages { get; set; } protected override async Task OnInitAsync() { - await base.OnInitAsync(); + AuthManager.AuthenticationStateChanged += AuthManager_AuthenticationStateChanged; + await base.OnInitAsync(); + if (CultureInfoManager.InvariantGlobalization is false) + { + cultures = CultureInfoManager.SupportedCultures + .Select(sc => new BitDropdownItem { Value = sc.Culture.Name, Text = sc.DisplayName }) + .ToArray(); + } unsubscribePageTitleChanged = PubSubService.Subscribe(ClientPubSubMessages.PAGE_DATA_CHANGED, async payload => { (pageTitle, pageSubtitle, showGoBackButton) = ((string?, string?, bool))payload!; @@ -27,6 +56,7 @@ protected override async Task OnInitAsync() }); NavigationManager.LocationChanged += NavigationManager_LocationChanged; + await GetCurrentUser(AuthenticationStateTask); } @@ -65,4 +95,71 @@ private void OnLogoClicked() { NavigationManager.NavigateTo("/"); } + private async Task OpenMenuPanel() + { + isMenuPanelOpen = !isMenuPanelOpen; + } + + private async Task OnCultureChanged(string? cultureName) + { + await cultureService.ChangeCulture(cultureName); + } + + private readonly List dirItems = new() + { + new() { Text = "Country", Key = "Country" }, + new() { Text = "State", Key = "State" }, + new() { Text = "Municipality", Key = "Municipality" }, + new() { Text = "Community", Key = "Community" }, + new() { Text = "Street", Key = "Street" }, + new() { Text = "Unit", Key = "Unit" } + }; + + private async Task ModalSignIn() + { + PubSubService.Publish(ClientPubSubMessages.SIGNIN_BUTTON_CLICKED); + isOpen = false; + await signInModalService.SignIn(); + } + + private async Task SignOut() + { + isOpen = false; + await AuthManager.SignOut(CurrentCancellationToken); + } + + private async Task GetCurrentUser(Task task) + { + isAuthenticated = (await task).User.IsAuthenticated(); + try + { + if (isAuthenticated) + { + user = await userController.GetCurrentUser(CurrentCancellationToken); + } + } + catch (UnauthorizedException) + { + //ignore + } + } + + private async void AuthManager_AuthenticationStateChanged(Task task) + { + try + { + await GetCurrentUser(task); + } + catch (KnownException ex) + { + ExceptionHandler.Handle(ex); + } + finally + { + await InvokeAsync(StateHasChanged); + } + } + + private void HandleShowLanguages() => ShowLanguages = true; + private void SlideBack() => ShowLanguages = false; } diff --git a/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor.scss b/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor.scss index 0dfb0104..3e588220 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor.scss +++ b/src/Client/CrystaLearn.Client.Core/Components/Layout/Header/CrystaHeader.razor.scss @@ -65,4 +65,547 @@ header { display: none; } } + + .icon-style-profile { + width: 2.4rem; + min-width: 2.4rem; + height: 2.4rem; + border-radius: 50%; + color: var(--bit-clr-fg-pri-2); + background-color: var(--bit-clr-bg-ter); + display: flex; + align-items: center; + justify-content: center; + font-size: 2rem; + + &:hover { + transition: opacity 0.2s ease-in-out; + opacity: 0.4; + } + } } + +::deep { + + .bit-acb-md:has(.select-lang-title) { + padding: 0rem 0 0.8rem 0.8rem !important; + } + + .select-lang-title { + width: 100%; + text-align: left; + padding: 0.8rem 1.2rem 1rem 0.8rem; + font: var(--font-body-2-strong); + color: var(--bit-clr-fg-pri); + border-bottom: 0.1rem solid var(--bit-clr-ter-light); + } + + .main-menu-content-container { + transition: transform 0.4s ease-in-out; + width: 100%; + } + + .main-menu-content { + width: 26.3rem; + min-width: 26.3rem; + display: flex; + flex-flow: column; + justify-content: flex-start !important; + align-items: start; + width: 100%; + transition: opacity 0.4s ease-in-out; + } + + + .cslearn-items-icon { + display: flex; + align-items: center; + justify-content: center; + font-size: 2.4rem; + border: none; + transition: 0.2s ease-in-out; + color: var(--bit-clr-fg-pri) !important; + } + + .cslearn-text { + font: var(--font-body-2); + color: var(--bit-clr-inf-dark-2); + transition: 0.2s ease-in-out; + align-self: center; + position: relative; + top: 0.1rem + } + + .cslearn-select-text { + color: var(--bit-clr-fg-pri); + } + + .language-item { + .bit-acb-con { + gap: 0.4rem; + } + } + + .language-item:hover { + + .cslearn-items-icon, + .cslearn-text { + opacity: 0.4; + } + } + + .last-slide { + transition: opacity 0.4s ease-in-out; + opacity: 0.2 !important; + } + + .slide-to-languages { + transform: translateX(calc(-100% - 2rem)); + + .main-menu-content.last-slide { + opacity: 1 !important; + } + + .main-menu-content.first-slide { + transition: opacity 0.4s ease-in-out; + opacity: 0.2 !important; + } + } + + .menu-icon-style { + font-size: 2.4rem; + color: var(--bit-clr-fg-pri); + + &:hover { + transition: opacity 0.2s ease-in-out; + opacity: 0.4; + } + } + + .icon-style-profile { + width: 2.4rem; + min-width: 2.4rem; + height: 2.4rem; + border-radius: 50%; + color: var(--bit-clr-fg-pri-2); + background-color: var(--bit-clr-bg-ter); + display: flex; + align-items: center; + justify-content: center; + font-size: 2rem; + + &:hover { + transition: opacity 0.2s ease-in-out; + opacity: 0.4; + } + } + + .bit-drp-cal { + padding: 0.8rem; + flex-direction: column; + align-items: flex-start; + left: unset !important; + right: 4.4rem; + background-color: var(--bit-clr-sec); + top: 7.3rem !important; + border-radius: 1.6rem; + box-shadow: -4px 0px 4px 0px rgba(0, 0, 0, 0.25), 4px 4px 4px 0px rgba(0, 0, 0, 0.25); + padding: 1.6rem 0.8rem; + cursor: pointer; + } + + .bit-drp-itm { + display: flex; + width: 100%; + padding: 1rem; + align-items: center; + height: 100%; + } + + .cslearn-lang-item-button { + &:hover { + transition: opacity 0.2s ease-in-out; + opacity: 0.4; + } + } + + + @media (hover: hover) { + .bit-drp-itm { + &:hover { + background-color: unset; + } + } + } + /////// + .header-contianer { + padding: 2.4rem; + height: 6.4rem; + box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.03); + } + + .icon-container { + align-items: center; + justify-content: center; + } + + .logo-image { + width: 12.5rem; + aspect-ratio: 12.5 / 2.4; + position: absolute; + left: 50%; + transform: translateX(-50%); + } + + .menu-btn { + @include gt-sm { + display: none; + } + } + + .identity-button { + @include lt-sm { + display: none; + } + } + + .bit-drp-icn { + display: none; + } + + .cultures-container { + width: 2.4rem; + height: 2.4rem; + display: flex; + align-items: center; + justify-content: center; + font-size: 2rem; + padding: 1rem; + + .bit-stc { + align-items: center !important; + } + + .cslearn-lang-items-container { + div:has(.cslearn-lang-item-button) { + &:last-child { + .bit-drp-itm { + border: none !important; + } + } + } + } + + .cultures-item { + font: var(--font-body-2); + } + + .bit-drp-sel { + background-color: unset; + } + + .bit-drp-wrp { + display: flex; + flex-flow: column nowrap; + justify-content: center; + align-items: center; + background-color: transparent; + } + + .bit-drp-tcn { + padding-inline-start: 0; + + &:hover { + transition: opacity 0.2s ease-in-out; + opacity: 0.4; + } + } + + .bit-drp-tcn { + font: var(--font-body-1-strong); + line-height: 2.8rem; + color: var(--bit-clr-fg-pri); + } + + .cslearn-menu-btn-content { + font: var(--font-body-2); + } + } + + .icon-style { + width: 2.4rem; + height: 2.4rem; + font-size: 2.4rem; + display: flex; + align-items: center; + justify-content: center; + color: #7e909a; + cursor: pointer; + + &:hover { + transition: opacity 0.2s ease-in-out; + opacity: 0.4; + } + } + + .icon-style-header { + width: 2.4rem; + height: 2.4rem; + font-size: 2.4rem; + display: flex; + align-items: center; + justify-content: center; + color: #7e909a; + cursor: pointer; + + &:hover { + transition: opacity 0.2s ease-in-out; + opacity: 0.4; + } + } + + .theme-icon-container { + padding: 0; + } + + .menu-icon-container { + background-color: transparent; + + .bit-drm-btn { + padding: 0; + background-color: transparent; + } + + .bit-drm { + background-color: transparent; + } + + .cslearn-menu-btn-content { + font: var(--font-body-1-strong); + color: var(--bit-clr-fg-pri) !important; + } + + .cslearn-menu-btn-icon { + font-size: 2.4rem; + color: var(--bit-clr-fg-pri) !important; + + &.icon-exit { + color: var(--bit-clr-err) !important; + } + } + + .cslearn-menu-btn-root:hover { + opacity: 0.4; + } + + .no-user-icon { + width: 4.2rem; + min-width: 4.2rem; + height: 4.2rem; + font-size: 3.2rem; + border-radius: 50%; + color: var(--bit-clr-fg-pri-2); + background-color: var(--bit-clr-bg-ter); + display: flex; + justify-content: center; + align-items: center; + } + + .user-image { + width: 4.2rem; + min-width: 4.2rem; + height: 4.2rem; + object-fit: cover; + } + + .user-info-container { + padding: 0.8rem 0.8rem 1.6rem 2rem; + border-bottom: 0.1rem solid var(--bit-clr-ter-light); + } + + .user-email-name { + overflow: hidden; + } + + .user-name { + font: var(--font-body-1-strong); + color: var(--bit-clr-fg-pri); + overflow: hidden; + text-overflow: ellipsis; + } + + .user-email { + font: var(--font-caption-1); + color: var(--bit-clr-inf-dark-2); + overflow: hidden; + text-overflow: ellipsis; + } + } + + .menu-items-container { + gap: 1rem; + color: var(--bit-clr-fg-pri) !important; + + &:hover { + // opacity: 0.4; + } + } + + .cslearn-header-callout-box { + background-color: var(--bit-clr-bg-pri); + width: 27.9rem; + overflow: hidden; + left: unset !important; + right: 2.4rem; + top: 7.3rem !important; + border-radius: 1.6rem; + box-shadow: -4px 0px 4px 0px rgba(0, 0, 0, 0.25), 4px 4px 4px 0px rgba(0, 0, 0, 0.25); + padding: 1.6rem 0.8rem; + transition: height 0.3s ease-in-out; + height: 17.2rem; + + .bit-acb-md { + width: 100%; + padding: 0.8rem 2rem; + // border-bottom: 0.1rem solid var(--bit-clr-ter-light); + } + + &.stretch-container { + height: 24.2rem; + } + + &:has(.slide-to-languages) { + height: 26rem; + } + } + + .box-height { + height: auto !important; + } + + .cslearn-header-toggle-root { + padding: 0; + } + + .darkmode-toggle-container { + padding: 0.8rem 2rem; + } + + .cslearn-header-toggle-label { + font: var(--font-body-1-strong); + } + + .cslearn-header-toggle-button { + width: 4rem; + height: 2rem; + border-radius: 1rem; + } + + .cslearn-header-toggle-thumb { + width: 1.2rem; + height: 1.2rem; + background-color: var(--bit-clr-fg-pri); + } + + .cslearn-header-toggle-checked { + .cslearn-header-toggle-button { + border-color: var(--bit-clr-ter-light-hover); + background-color: var(--bit-clr-ter-light); + } + } + + .logout-btn { + .cslearn-menu-btn-content { + color: var(--bit-clr-err); + } + + &:hover { + .cslearn-menu-btn-content { + color: var(--bit-clr-err-hover); + } + } + } +} + +::deep { + .bit-pnl-ovl { + backdrop-filter: blur(2.5px); + } + + .bit-pnl-cnt { + box-shadow: none !important; + } + + .cslearn-side-bar-panel { + width: 27.9rem; + padding: 2.4rem 0 1.2rem 0; + background-color: var(--bit-clr-sec); + box-shadow: 2px 0px 12px 0px rgba(0, 0, 0, 0.06); + } + + .logo-image-side-bar-panel { + width: 12.4rem; + height: 2.4rem; + min-height: 2.4rem; + margin: 0 2rem; + cursor: pointer; + } + + .side-bar-panel-list-item-contianer { + padding: 0; + width: 100%; + } + + .side-bar-panel-list { + padding: 0 0 2.4rem 0; + border-bottom: 1px solid var(--bit-clr-ter-light); + height: auto; + } + + .side-bar-panel-list-item { + padding: 0.8rem 2.7rem; + height: auto; + } + + .side-bar-panel-list-item-icon { + font-size: 2.4rem; + color: var(--bit-clr-fg-pri); + + &.disabled { + color: var(--bit-clr-brd-sec); + } + } + + .side-bar-panel-list-item-text { + color: var(--bit-clr-fg-pri); + font: var(--font-body-1-strong); + + &.disabled { + color: var(--bit-clr-brd-sec); + } + } + + .side-bar-panel-list-item-tag { + height: auto; + background-color: var(--bit-clr-bg-ter); + color: var(--bit-clr-inf-dark); + font: var(--font-caption-2); + border-radius: 0.8rem; + padding: 0.4rem; + } + + .ai-side-bar-panel-container { + padding-bottom: 2.4rem; + } + + .version-of-land-logic-container { + padding: 0.8rem 2.7rem; + margin-top: auto; + height: auto; + } + + .version-of-land-logic { + font: var(--font-caption-1); + color: var(--bit-clr-ter-light); + } +} \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor index af7cfe23..ed81b3a7 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor +++ b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor @@ -1,58 +1,24 @@ @inherits AppComponentBase
- - @if (isLoadingProviders) - { - @for (int i = 0; i < 4; i++) - { - - } - } - else - { - @if (supportedProviders.Contains("IdentityServerDemo")) - { - - - - } - @if (supportedProviders.Contains("Google")) - { - - - - } - @if (supportedProviders.Contains("GitHub")) - { - - - - } - @if (supportedProviders.Contains("Twitter")) - { - - - - } - @if (supportedProviders.Contains("Apple")) - { - - - - } - @if (supportedProviders.Contains("AzureAD")) - { - - - - } - @if (supportedProviders.Contains("Facebook")) - { - - - - } - } + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor.cs b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor.cs index e56feee6..2481a7d7 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor.cs +++ b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor.cs @@ -1,37 +1,26 @@ -using CrystaLearn.Shared.Controllers.Identity; - -namespace CrystaLearn.Client.Core.Components.Pages.Identity.Components; +namespace CrystaLearn.Client.Core.Components.Pages.Identity.Components; public partial class SocialRow { - private bool isLoadingProviders = true; - private string[] supportedProviders = []; - - [Parameter] public bool IsWaiting { get; set; } [Parameter] public EventCallback OnClick { get; set; } + [Parameter] public bool IsWaiting { get; set; } - [AutoInject] private IIdentityController IdentityController = default!; + private async Task HandleGoogle() + { + + } + private async Task HandleFacebook() + { + } - protected override async Task OnInitAsync() + private async Task HandleMicrosoft() { - try - { - var providers = await IdentityController.GetSupportedSocialAuthSchemes(CurrentCancellationToken); - supportedProviders = providers; - } - finally - { - isLoadingProviders = false; - } + await OnClick.InvokeAsync("AzureAD"); } - private async Task HandleGoogle() => await OnClick.InvokeAsync("Google"); - private async Task HandleGitHub() => await OnClick.InvokeAsync("GitHub"); - private async Task HandleTwitter() => await OnClick.InvokeAsync("Twitter"); - private async Task HandleApple() => await OnClick.InvokeAsync("Apple"); - private async Task HandleAzureAD() => await OnClick.InvokeAsync("AzureAD"); - private async Task HandleFacebook() => await OnClick.InvokeAsync("Facebook"); - private async Task HandleIdentityServerDemo() => await OnClick.InvokeAsync("IdentityServerDemo"); + private async Task HandleApple() + { + } } diff --git a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor.scss b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor.scss index 67cc43d4..86998db6 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor.scss +++ b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/Components/SocialRow.razor.scss @@ -1,13 +1,32 @@ section { - margin-top: 1rem; + //margin-top: 1rem; } ::deep { .social-button { - width: 60px; - height: 60px; display: flex; - align-items: center; + width: 6.4rem; + height: 6.4rem; + padding: 1.6rem 1.6rem 1.6rem 1.5rem; justify-content: center; + align-items: center; + border-radius: 0.8rem; + border: 0.1rem solid; + border-color: var(--bit-clr-brd-pri-2); + background-color: var(--bit-clr-brd-pri-2); + } + + .cslearn-social-icon-style { + font-size: 4rem; + color: var(--bit-clr-fg-pri); + } + + .icon-apple-style { + font-size: 4.2rem; + padding-bottom: 0.5rem; + } + + .disabled-button { + color: var(--bit-clr-brd-sec); } } diff --git a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInModal.razor b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInModal.razor index a96d5749..2b668091 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInModal.razor +++ b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInModal.razor @@ -1,18 +1,12 @@ @inherits AppComponentBase -
- - - - - - - - - + diff --git a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInModal.razor.cs b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInModal.razor.cs index 3a8c11f5..29e18e6d 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInModal.razor.cs +++ b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInModal.razor.cs @@ -6,6 +6,13 @@ public partial class SignInModal [Parameter] public Action? OnClose { get; set; } [Parameter] public Action? OnSuccess { get; set; } // The SignInModalService will show this page as a modal dialog, and this action will be invoked when the sign-in is successful. + [Parameter] + public string? Title { get; set; } + + [Parameter] + public string? SubTitle { get; set; } + [Parameter] public bool IsFromChat { get; set; } = false; + private void CloseModal() { OnClose?.Invoke(); diff --git a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor index a2ef195b..8e81a869 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor +++ b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor @@ -1,168 +1,65 @@ @inherits AppComponentBase - -@if (isOtpSent || requiresTwoFactor) -{ - - -} -
- - - - - - @if (requiresTwoFactor is false) - { - @if (isOtpSent is false) - { - - - @Localizer[nameof(AppStrings.SignInPanelTitle)] - - - @Localizer[nameof(AppStrings.SignInPanelSubtitle)] - - - - - - @Localizer[AppStrings.Or] - @Localizer[AppStrings.Or] - - - - - - - - - - @if (currentTab is SignInPanelTab.Email) - { - - - } - else - { - - - } - @if (internalSignInPanelType is SignInPanelType.Full or SignInPanelType.Password) - { -
- - - - @Localizer[nameof(AppStrings.Password)] - - @Localizer[nameof(AppStrings.ForgotPasswordLink)] - - - - - } -
-
- - - - - @if (showWebAuthn) - { - - } - - - @if (internalSignInPanelType is SignInPanelType.Full or SignInPanelType.Password) - { - - @if (internalSignInPanelType is SignInPanelType.Password) - { - - @Localizer[nameof(AppStrings.SignInPasswordMessage1)] -
- @Localizer[nameof(AppStrings.SignInPasswordMessage2)] -
- } - - @Localizer[nameof(AppStrings.Continue)] - -
- } + + @if (currentMode == SignInPanelMode.DefaultMode) + { + + @Title + @SubTitle + + } + + + @if (isOtpSent || requiresTwoFactor) + { + + + } - @if (internalSignInPanelType is SignInPanelType.Full or SignInPanelType.Otp) - { - - @(currentTab == SignInPanelTab.Email ? Localizer[nameof(AppStrings.SendMagicLinkButtonText)] : Localizer[nameof(AppStrings.SendOtpButtonText)]) - - } + @if (currentMode == SignInPanelMode.AuthenticatingMode) + { + + } + else if (currentMode == SignInPanelMode.WelcomeMode) + { + + } + else + { - @if (internalSignInPanelType is SignInPanelType.Otp) - { - @Localizer[nameof(AppStrings.SignInByPassword)] - } + + + - @if (internalSignInPanelType is SignInPanelType.Password) - { - @Localizer[nameof(AppStrings.SignInByOtp)] - } + + @if (requiresTwoFactor is false) + { + @if (isOtpSent is false) + { + + @Localizer[nameof(AppStrings.ContinueWithYour)] + - @if (internalSignInPanelType is SignInPanelType.Full) - { - - @Localizer[nameof(AppStrings.DontHaveAccountMessage)] - @Localizer[nameof(AppStrings.SignUp)] - - } - + } + else + { + + } } else { - + OnTokenProvided="DoSignIn" + OnSendTfaToken="WrapHandled(SendTfaToken)" /> } - } - else - { - - } - -
-
-
+ + + + + } +
\ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor.cs b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor.cs index 67715487..7216c709 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor.cs +++ b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor.cs @@ -18,10 +18,11 @@ public partial class SignInPanel private SignInPanelType internalSignInPanelType; private readonly SignInRequestDto model = new(); private AppDataAnnotationsValidator? validatorRef; - private string GetReturnUrl() => ReturnUrl ?? ReturnUrlQueryString ?? PageUrls.Home; + private string ReturnUrl => ReturnUrlQueryString ?? PageUrls.Home; + private SignInPanelMode currentMode = SignInPanelMode.DefaultMode; + + [Parameter] public Action? OnClose { get; set; } - [Parameter] - public string? ReturnUrl { get; set; } [Parameter, SupplyParameterFromQuery(Name = "return-url")] public string? ReturnUrlQueryString { get; set; } @@ -41,6 +42,12 @@ public partial class SignInPanel [Parameter, SupplyParameterFromQuery(Name = "error")] public string? ErrorQueryString { get; set; } + [Parameter] + public string? Title { get; set; } + + [Parameter] + public string? SubTitle { get; set; } + [Parameter] public Action? OnSuccess { get; set; } // The SignInModalService will show this page as a modal dialog, and this action will be invoked when the sign-in is successful. [Parameter] public SignInPanelType SignInPanelType { get; set; } // Check out SignInModalService for more details @@ -121,7 +128,8 @@ private async Task DoSignIn() new VerifyWebAuthnAndSignInRequestDto { ClientResponse = webAuthnAssertion.Value, - TfaCode = model.TwoFactorCode + TfaCode = model.TwoFactorCode, + DeviceInfo = telemetryContext.Platform }, CurrentCancellationToken); @@ -141,7 +149,8 @@ private async Task DoSignIn() if (isNewUser is false) { - model.ReturnUrl = GetReturnUrl(); + model.ReturnUrl = ReturnUrl; + model.DeviceInfo = telemetryContext.Platform; requiresTwoFactor = await AuthManager.SignIn(model, CurrentCancellationToken); @@ -154,7 +163,8 @@ private async Task DoSignIn() var signInResponse = await identityController.ConfirmEmail(new() { Token = model.Otp, - Email = model.Email + Email = model.Email, + DeviceInfo = telemetryContext.Platform }, CurrentCancellationToken); await AuthManager.StoreTokens(signInResponse, true); @@ -164,7 +174,8 @@ private async Task DoSignIn() var signInResponse = await identityController.ConfirmPhone(new() { Token = model.Otp, - PhoneNumber = model.PhoneNumber + PhoneNumber = model.PhoneNumber, + DeviceInfo = telemetryContext.Platform }, CurrentCancellationToken); await AuthManager.StoreTokens(signInResponse, true); @@ -181,11 +192,17 @@ private async Task DoSignIn() { if (OnSuccess is not null) { + + await Task.Delay(1000); + currentMode = SignInPanelMode.WelcomeMode; + await InvokeAsync(StateHasChanged); + await Task.Delay(2000); + OnSuccess.Invoke(); } else { - NavigationManager.NavigateTo(GetReturnUrl(), replace: true); + NavigationManager.NavigateTo(ReturnUrl, replace: true); } } } @@ -208,6 +225,8 @@ private async Task DoSignIn() private async Task SocialSignIn(string provider) { + currentMode = SignInPanelMode.AuthenticatingMode; + StateHasChanged(); try { pubSubUnsubscribe?.Invoke(); @@ -245,7 +264,7 @@ private async Task SocialSignIn(string provider) var port = localHttpServer.EnsureStarted(); - var redirectUrl = await identityController.GetSocialSignInUri(provider, GetReturnUrl(), port is -1 ? null : port, CurrentCancellationToken); + var redirectUrl = await identityController.GetSocialSignInUri(provider, ReturnUrl, port is -1 ? null : port, CurrentCancellationToken); await externalNavigationService.NavigateToAsync(redirectUrl); } @@ -255,48 +274,6 @@ private async Task SocialSignIn(string provider) } } - private async Task PasswordlessSignIn() - { - isWaiting = true; - - try - { - var userIds = await webAuthnService.GetWebAuthnConfiguredUserIds(); - - if (AppPlatform.IsBlazorHybrid) - { - localHttpServer.EnsureStarted(); - } - - var options = await identityController - .WithQueryIf(AppPlatform.IsBlazorHybrid, "origin", localHttpServer.Origin) - .GetWebAuthnAssertionOptions(new() { UserIds = userIds }, CurrentCancellationToken); - - try - { - webAuthnAssertion = await webAuthnService.GetWebAuthnCredential(options); - } - catch (Exception ex) - { - // we can safely handle the exception thrown here since it mostly because of a timeout or user cancelling the native ui. - ExceptionHandler.Handle(ex, AppEnvironment.IsDevelopment() ? ExceptionDisplayKind.NonInterrupting : ExceptionDisplayKind.None); - webAuthnAssertion = null; - return; - } - - await DoSignIn(); - } - catch (KnownException e) - { - webAuthnAssertion = null; - SnackBarService.Error(e.Message); - } - finally - { - isWaiting = false; - } - } - private async Task SendOtp(bool resend) { try @@ -321,7 +298,7 @@ private async Task SendOtp(bool resend) var request = new IdentityRequestDto { UserName = model.UserName, Email = model.Email, PhoneNumber = model.PhoneNumber }; - await identityController.SendOtp(request, GetReturnUrl(), CurrentCancellationToken); + await identityController.SendOtp(request, ReturnUrl, CurrentCancellationToken); isOtpSent = true; } @@ -376,29 +353,28 @@ await identityController private void CleanModel() { - if (internalSignInPanelType is SignInPanelType.Otp) - { - model.Password = null; - validatorRef?.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.Password))); - } - else if (internalSignInPanelType is SignInPanelType.Password && isOtpSent is false) - { - model.Otp = null; - validatorRef?.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.Otp))); - } - if (currentTab is SignInPanelTab.Email) { model.PhoneNumber = null; - validatorRef?.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.PhoneNumber))); + if (validatorRef is null) return; + + validatorRef.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.PhoneNumber))); } else { model.Email = null; - validatorRef?.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.Email))); + if (validatorRef is null) return; + + validatorRef.EditContext.NotifyFieldChanged(validatorRef.EditContext.Field(nameof(SignInRequestDto.Email))); } } + private void CloseModal() + { + currentMode = SignInPanelMode.DefaultMode; + OnClose?.Invoke(); + } + /// /// Check out for more details /// @@ -435,3 +411,13 @@ private async Task ChangeSignInPanelType(SignInPanelType type) internalSignInPanelType = type; } } + +public enum SignInPanelMode +{ + AuthenticatingMode, + WelcomeMode, + DefaultMode +} + + + diff --git a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor.scss b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor.scss index 1baca747..8f88ab2f 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor.scss +++ b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanel.razor.scss @@ -1,4 +1,5 @@ @import '../../../../Styles/abstracts/_media-queries.scss'; +@import '../../../../Styles/abstracts/_vars.scss'; section { width: 100%; @@ -6,6 +7,10 @@ section { } ::deep { + form { + width: 100%; + } + .lg-sep { @include lt-md { display: none; @@ -17,4 +22,29 @@ section { display: none; } } -} \ No newline at end of file +} + + +.brain-bg-style { + margin: 0 auto; + width: 12rem; + height: auto; + object-fit: contain; +} + +::deep { + .header-text { + font: var(--font-subtitle-1); + color: var(--bit-clr-fg-pri); + } + + .desc-text { + font: var(--font-body-2); + color: var(--bit-clr-inf-dark); + } + + .icons-text { + font: var(--font-body-2); + color: var(--bit-clr-brd-ter); + } +} diff --git a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanelType.cs b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanelType.cs index 1e253ea7..9a62287e 100644 --- a/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanelType.cs +++ b/src/Client/CrystaLearn.Client.Core/Components/Pages/Identity/SignIn/SignInPanelType.cs @@ -18,5 +18,7 @@ public enum SignInPanelType /// /// Shows email, phone and send otp button. /// - Otp + Otp, + + Social } diff --git a/src/Client/CrystaLearn.Client.Core/Components/WelcomModal.razor b/src/Client/CrystaLearn.Client.Core/Components/WelcomModal.razor new file mode 100644 index 00000000..fe238c05 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/WelcomModal.razor @@ -0,0 +1,16 @@ +@inherits AppComponentBase; + +
+ + + + + + + + @Localizer[nameof(AppStrings.WelcomeForModal)] + @Localizer[nameof(AppStrings.SuccessfullyLoggedIn)] + + + +
\ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Components/WelcomModal.razor.cs b/src/Client/CrystaLearn.Client.Core/Components/WelcomModal.razor.cs new file mode 100644 index 00000000..fda9375c --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/WelcomModal.razor.cs @@ -0,0 +1,5 @@ +namespace CrystaLearn.Client.Core.Components; + +public partial class WelcomModal +{ +} diff --git a/src/Client/CrystaLearn.Client.Core/Components/WelcomModal.razor.scss b/src/Client/CrystaLearn.Client.Core/Components/WelcomModal.razor.scss new file mode 100644 index 00000000..ff937a37 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Components/WelcomModal.razor.scss @@ -0,0 +1,44 @@ +@import '../Styles/abstracts/_vars.scss'; +@import '../Styles/abstracts/_colors.scss'; + + +::deep { + + .cslearn-modal-container { + width: 100%; + align-items: flex-end; + border-radius: 2rem 2rem 0 0; + background-color: var(--bit-clr-bg-ter-3); + } + + .cslearn-close-icon { + font-size: 2.4rem; + cursor: pointer; + + &::before { + color: var(--bit-clr-fg-pri-3); + } + } + + .cslearn-icon-style { + width: 6.4rem; + height: 6.4rem; + border-radius: 100%; + background-color: var(--bit-clr-bg-ico-2); + display: flex; + align-items: center; + justify-content: center; + font-size: 5.4rem; + color: var( --bit-green-shade-2); + } + + .cslearn-header-text { + font: var(--font-subtitle-1); + color: var(--bit-clr-fg-pre-2); + } + + .cslearn-desc-text { + font: var(--font-body-2); + color: var(--bit-clr-inf-dark-3); + } +} \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/CrystaLearn.Client.Core.csproj b/src/Client/CrystaLearn.Client.Core/CrystaLearn.Client.Core.csproj index 58cb376b..f3a48b4a 100644 --- a/src/Client/CrystaLearn.Client.Core/CrystaLearn.Client.Core.csproj +++ b/src/Client/CrystaLearn.Client.Core/CrystaLearn.Client.Core.csproj @@ -45,10 +45,6 @@ - - - - @@ -75,13 +71,20 @@ + + + + + + + diff --git a/src/Client/CrystaLearn.Client.Core/Extensions/StringExtensions.cs b/src/Client/CrystaLearn.Client.Core/Extensions/StringExtensions.cs new file mode 100644 index 00000000..4b88be9c --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Extensions/StringExtensions.cs @@ -0,0 +1,25 @@ +using CrystaLearn.Client.Core.Components; + +namespace CrystaLearn.Client.Core.Extensions; +public static class StringExtensions +{ + public static string GetLanguageIconName(this string? langCode) + => langCode switch + { + "en-US" => CsLearnIconName.English, + "fr-FR" => CsLearnIconName.French, + "fa-IR" => CsLearnIconName.Farsi, + "zh-CN" => CsLearnIconName.Chinese, + _ => CsLearnIconName.English + }; + + public static string GetLanguageName(this string? langCode) +=> langCode switch +{ + "en-US" => "English", + "fr-FR" => "French", + "fa-IR" => "Farsi", + "zh-CN" => "Chinese", + _ => "English" +}; +} diff --git a/src/Client/CrystaLearn.Client.Core/Services/ClientPubSubMessages.cs b/src/Client/CrystaLearn.Client.Core/Services/ClientPubSubMessages.cs index 91650535..e8272904 100644 --- a/src/Client/CrystaLearn.Client.Core/Services/ClientPubSubMessages.cs +++ b/src/Client/CrystaLearn.Client.Core/Services/ClientPubSubMessages.cs @@ -28,10 +28,14 @@ public partial class ClientPubSubMessages public const string NAVIGATE_TO = nameof(NAVIGATE_TO); public const string SHOW_DIAGNOSTIC_MODAL = nameof(SHOW_DIAGNOSTIC_MODAL); + public const string OPEN_BUTTON_SHIT = nameof(OPEN_BUTTON_SHIT); + public const string CLOSE_BUTTON_SHIT = nameof(CLOSE_BUTTON_SHIT); public const string SOCIAL_SIGN_IN = nameof(SOCIAL_SIGN_IN); public const string FORCE_UPDATE = nameof(FORCE_UPDATE); + + public static string SIGNIN_BUTTON_CLICKED = nameof(SIGNIN_BUTTON_CLICKED); } diff --git a/src/Client/CrystaLearn.Client.Core/Services/SignInModalService.cs b/src/Client/CrystaLearn.Client.Core/Services/SignInModalService.cs index a485dcbe..ef8afa59 100644 --- a/src/Client/CrystaLearn.Client.Core/Services/SignInModalService.cs +++ b/src/Client/CrystaLearn.Client.Core/Services/SignInModalService.cs @@ -12,51 +12,82 @@ namespace CrystaLearn.Client.Core.Services; /// public partial class SignInModalService : IAsyncDisposable { - public SignInModalService(BitModalService modalService, NavigationManager navigationManager) + public SignInModalService(NavigationManager navigationManager, + PubSubService pubSubService, + IStringLocalizer Localizer) { - this.modalService = modalService; this.navigationManager = navigationManager; + this.pubSubService = pubSubService; + this.Localizer = Localizer; this.navigationManager.LocationChanged += NavigationManager_LocationChanged; } - private BitModalService modalService; private NavigationManager navigationManager; - private BitModalReference? modalReference = null; - private TaskCompletionSource? signInModalTcs; + private readonly PubSubService pubSubService; + private TaskCompletionSource? signInPanelTcs; + private IStringLocalizer Localizer; - public async Task SignIn(string? returnUrl = null) + public async Task SignIn(string? returnUrl = null, string? panelTitle = null, string? panelSubTitle = null) { - signInModalTcs?.TrySetCanceled(); - signInModalTcs = new(); + signInPanelTcs?.TrySetCanceled(); + signInPanelTcs = new(); - Dictionary signInParameters = new() - { - { nameof(SignInModal.ReturnUrl), returnUrl ?? navigationManager.GetRelativePath() }, - { nameof(SignInModal.OnClose), () => { signInModalTcs.SetResult(false); modalReference?.Close(); } }, - { nameof(SignInModal.OnSuccess), () => { signInModalTcs.SetResult(true); modalReference?.Close(); } }, - }; - var modalParameters = new BitModalParameters() + panelTitle ??= Localizer[nameof(AppStrings.Login)]; //or AppStrings.MoreDetailsText + panelSubTitle ??= Localizer[nameof(AppStrings.LoginToUnlockFullDetails)]; //or AppStrings.JustLogUnlock + + var panelMetadata = new ComponentMetadata { - Draggable = true, - DragElementSelector = ".header-stack", - OnOverlayClick = EventCallback.Factory.Create(this, () => signInModalTcs.SetResult(false)) + Type = typeof(SignInModal), + Parameters = new() + { + { + nameof(SignInModal.OnClose), + new Action(CloseSignInPanel) + }, + { + nameof(SignInModal.OnSuccess), + new Action(CloseSignInPanel) + }, + { + nameof(SignInModal.ReturnUrl), + returnUrl ?? navigationManager.GetRelativePath() + }, + { + nameof(SignInModal.Title), + panelTitle + }, + { + nameof(SignInModal.SubTitle), + panelSubTitle + } + } }; - modalReference = await modalService.Show(signInParameters, modalParameters); + pubSubService.Publish(ClientPubSubMessages.OPEN_BUTTON_SHIT, panelMetadata); - return await signInModalTcs.Task; + return await signInPanelTcs.Task; } + private void CloseSignInPanel() + { + if (signInPanelTcs is null) + { + return; + } + + pubSubService.Publish(ClientPubSubMessages.CLOSE_BUTTON_SHIT); + signInPanelTcs.TrySetResult(false); + } private void NavigationManager_LocationChanged(object? sender, LocationChangedEventArgs e) { - modalReference?.Close(); - signInModalTcs?.TrySetResult(false); + //modalReference?.Close(); + signInPanelTcs?.TrySetResult(false); } public async ValueTask DisposeAsync() { - modalReference?.Close(); - signInModalTcs?.TrySetResult(false); + //modalReference?.Close(); + signInPanelTcs?.TrySetResult(false); navigationManager.LocationChanged -= NavigationManager_LocationChanged; } } diff --git a/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_colors.scss b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_colors.scss new file mode 100644 index 00000000..36267887 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_colors.scss @@ -0,0 +1,17 @@ +$Blue2: #0077B2; + +$Gray200: #DBDBDB; +$Gray600: #C1C1C1; + +$Green: #00AB6E; +$Green1: #00D68A; +$Green2: #005261; +$Green3: #022129; +$Green4: #021B22; +$Green5: #34A853; + +$Red: #F84345; + +$Yellow: #ffd054; + +$White: #FFFFFF; \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_font-icon-illustrator.scss b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_font-icon-illustrator.scss new file mode 100644 index 00000000..a265fcac --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_font-icon-illustrator.scss @@ -0,0 +1,1033 @@ +.icon-zoning-not-available { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-play--no-border { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pause--no-border { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-language-2 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-language { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-filled--profile { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-avm-pin { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--overlay { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--hazard-land { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--conservation-land { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--appeal { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-directory { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-change-mic { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--general-provision { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--hold { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--other { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--special-provision { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--temporary { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-additional-considerations--exceptions { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-apple--filled { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-microsoft--filled { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-facebook--letter { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-google--letter { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-interrupt { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-microsoft { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-google { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-apple { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-farsi { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chinese { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-french { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-english { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pause { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-play { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-satelite { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-light-mode { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-setting { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pin-point { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Menu { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-landlogic-score { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-landlogic-ranking { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-enhanced-zoning-report { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Location { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-zoning { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-basic-zoning-report { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-demographics-report { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-psa { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sidebar { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-zone { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-school2 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-school1 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-restaurant { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-phone { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-money-up { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-money-down { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lot-frontage { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lot-depth { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-multiple-unit-townhouse-dwelling { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-freehold-townhouse { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-common-element-townhouse { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cluster-townhouse-dwelling { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Back-to-back-townhouse { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-two-side-arrow { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-library { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fitness { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-store { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-park { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-home-add { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-website { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Unemployed { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tools-layer { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-change { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pro { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-f-toolbar { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-policy-text { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-permitted-uses { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-permitted-dwellings { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-councilor { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-shape { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-source { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-watch { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-clock { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-time { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Loading { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-zoom-to-context { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Facebook { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Instagram { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Linkedin { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-spot { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-loading1 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-waiting { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dots-horizontal { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-onboarding { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ai-chat { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-amortization { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mic-on { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-profit { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-zoning-copilot { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lock { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-reload { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-no-photo { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mic-off { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-real-estate-copilot { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-multiplex-assessment { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cma { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-real-estate { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-calculator { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-category-off { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-category-on { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dollar { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-percentage { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-real-estate-module { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-a2z { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-default { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-z2a { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-turnofflayers { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-real-estate-tools { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-replace { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-delete2 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Warning { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-date { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-permit { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plus-add { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-panel-access { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-warning1 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-property-details { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ai { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-estimate { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-scenario { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ic-deselect { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-object-select { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-emails { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-site-selection { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-freehold { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-land-pin { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-school { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-home-style { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-home-Status { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-house-age { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-Tax { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-exit-round { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-realestate { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-warning-triangle { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-notification { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-multiple-unit-townhouse-dwelling1 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-position { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-street-townhouse-building { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bathroom { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-calendar { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-water-supply { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-documents-plus { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cursor-object-select { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-brand { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-parcels { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-accessory-dwelling-unit { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-age { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-air-conditioning { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ancillary-home { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-appartment-measure { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-appartment { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-back-to-back-townhouse { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-basement { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-block-townhouse-dwelling { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-block-townhouse { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cluster-townhouse-dwelling1 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cluster-homes { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-common-element-townhouse1 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-decrease { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-detached-house { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-douplex { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fourplex { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-freehold-townhouse1 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-garage { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ground-heating { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-increase { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-independent-living-facility { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-linked-dwelling { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mixed-use-building { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-non-residential { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-open-platforms { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-parking { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-podium-townhouse { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pool { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-residential-unit { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-retirement-home { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-retirement-residence { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-semi-detached { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sewer { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-stacked-townhouse { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-status { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-street-townhouse { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-supportive-home { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tax { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-townhouse { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-triplex { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-target { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-brightness { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-filter-sort { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-zoom { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-layers { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list-bullets { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-refresh-loading-circle { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-layer { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-shapes-triangle-circle-sqaure { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unarchive { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-privacy { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-attention { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-favourable { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-google-street-view { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-informative { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-warning { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-indigenous { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-users { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-copy { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-load-to-map { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-reports { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-archive { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bookmark { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bookmark-fill { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-servers { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-edit { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-satellite { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-share { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-light { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-draw-square { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-file { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bug { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-2d-view { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-3d-view { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-down { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-up { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-left { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-right { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-4 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-5 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-6 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-boundary { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-message { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-todo { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-checkmark { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-clock-time-timer { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cloud { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-compass { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-creditcard { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-delete { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-delete1 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-disabled-1 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-check { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dots { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-chevron-right { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-chevron-left { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-download-save-upload { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-draw-line { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-exit { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-link { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eye-hidden { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eye-show-visible { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder-plus { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-grid { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-layout { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-info { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-land { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-legend { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-loading { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-map { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-minus { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pen { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pin { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plus { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-question { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ruler { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sale { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bag { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-search { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-send { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-settings { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-trash { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-upload-loading-arrow { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-profile { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow11 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-facebook { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-instagram { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-email { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-linkedin { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-location { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-01 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-04 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-05 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-03 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-02 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-citizen { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-not-citizen { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-uniE954 { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-application-status { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-application-type { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-down-line { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-up-line { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bedroom { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-block { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-children { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-community-centre { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-commuting { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-concession { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-condo { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-councillor-name { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-couple { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cultural-origins { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-distance { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-employed { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-empty { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-family { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-full-time { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-geographic-township { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-greenspace { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-highway-access { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hospital { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-immigrant { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lot { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-man { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-material { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-money { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-name { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-neighborhood { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-non-condo { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-number { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-part-time { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-people { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-police-station { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-public-transit { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rented { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-room { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-shopping { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-smileys { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-train-station { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unemployed { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-visible-minorities { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-woman { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-legal-scale { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-census-area { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-household { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-forward-sortation-Area { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fire-station { + *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} + diff --git a/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_font-icon.scss b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_font-icon.scss new file mode 100644 index 00000000..0013c131 --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_font-icon.scss @@ -0,0 +1,1149 @@ +@font-face { + font-family: 'CsLearn-Icons'; + src: url('/_content/CrystaLearn.Client.Core/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.eot?9bxq4c'); + src: url('/_content/CrystaLearn.Client.Core/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20?9bxq4c#iefix') format('embedded-opentype'), url('/_content/CrystaLearn.Client.Core/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.ttf?9bxq4c') format('truetype'), url('/_content/CrystaLearn.Client.Core/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.woff?9bxq4c') format('woff'), url('/_content/CrystaLearn.Client.Core/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.svg?9bxq4c#CsLearn-Icons') format('svg'); + font-weight: normal; + font-style: normal; + font-display: block; +} + +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'CsLearn-Icons' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-zoning-not-available:before { + content: "\ea5b"; +} +.icon-play--no-border:before { + content: "\ea5c"; +} +.icon-pause--no-border:before { + content: "\ea5d"; +} +.icon-language-2:before { + content: "\ea5e"; +} +.icon-language:before { + content: "\ea5f"; +} +.icon-filled--profile .path1:before { + content: "\ea60"; + color: rgb(0, 50, 63); +} +.icon-filled--profile .path2:before { + content: "\ea61"; + margin-left: -1em; + color: rgb(255, 255, 255); +} +.icon-filled--profile .path3:before { + content: "\ea62"; + margin-left: -1em; + color: rgb(255, 255, 255); +} +.icon-avm-pin:before { + content: "\ea63"; +} +.icon-additional-considerations--overlay:before { + content: "\ea57"; +} +.icon-additional-considerations--hazard-land:before { + content: "\ea58"; +} +.icon-additional-considerations--conservation-land:before { + content: "\ea59"; +} +.icon-additional-considerations--appeal:before { + content: "\ea5a"; +} +.icon-directory:before { + content: "\ea56"; +} +.icon-change-mic:before { + content: "\ea55"; +} +.icon-additional-considerations--general-provision:before { + content: "\ea4f"; +} +.icon-additional-considerations--hold:before { + content: "\ea50"; +} +.icon-additional-considerations--other:before { + content: "\ea51"; +} +.icon-additional-considerations--special-provision:before { + content: "\ea52"; +} +.icon-additional-considerations--temporary:before { + content: "\ea53"; +} +.icon-additional-considerations--exceptions:before { + content: "\ea54"; +} +.icon-apple--filled:before { + content: "\ea4b"; +} +.icon-microsoft--filled:before { + content: "\ea4c"; +} +.icon-facebook--letter:before { + content: "\ea4d"; +} +.icon-google--letter:before { + content: "\ea4e"; +} +.icon-interrupt:before { + content: "\ea4a"; +} +.icon-microsoft:before { + content: "\ea47"; +} +.icon-google:before { + content: "\ea48"; +} +.icon-apple:before { + content: "\ea49"; +} +.icon-farsi:before { + content: "\ea40"; +} +.icon-chinese:before { + content: "\ea41"; +} +.icon-french:before { + content: "\ea42"; +} +.icon-english:before { + content: "\ea43"; +} +.icon-pause:before { + content: "\ea44"; +} +.icon-play:before { + content: "\ea45"; +} +.icon-satelite:before { + content: "\ea46"; +} +.icon-light-mode:before { + content: "\ea3f"; +} +.icon-setting:before { + content: "\ea3c"; +} +.icon-pin-point:before { + content: "\ea3d"; +} +.icon-Menu:before { + content: "\ea3e"; +} +.icon-enhanced-zoning-report:before { + content: "\ea39"; +} +.icon-Location .path1:before { + content: "\ea34"; + color: rgb(0, 50, 63); +} +.icon-Location .path2:before { + content: "\ea35"; + margin-left: -0.9599609375em; + color: rgb(0, 50, 63); +} +.icon-Location .path3:before { + content: "\ea36"; + margin-left: -0.9599609375em; + color: rgb(0, 50, 63); + opacity: 0.1; +} +.icon-Location .path4:before { + content: "\ea37"; + margin-left: -0.9599609375em; + color: rgb(0, 50, 63); +} +.icon-zoning:before { + content: "\ea38"; +} +.icon-basic-zoning-report:before { + content: "\ea30"; +} +.icon-demographics-report:before { + content: "\ea32"; +} +.icon-psa:before { + content: "\ea33"; +} +.icon-sidebar:before { + content: "\ea31"; +} +.icon-zone:before { + content: "\ea27"; +} +.icon-school2:before { + content: "\ea28"; +} +.icon-school1:before { + content: "\ea29"; +} +.icon-restaurant:before { + content: "\ea2a"; +} +.icon-phone:before { + content: "\ea2b"; +} +.icon-money-up:before { + content: "\ea2c"; +} +.icon-money-down:before { + content: "\ea2d"; +} +.icon-lot-frontage:before { + content: "\ea2e"; +} +.icon-lot-depth:before { + content: "\ea2f"; +} +.icon-multiple-unit-townhouse-dwelling:before { + content: "\ea05"; +} +.icon-freehold-townhouse:before { + content: "\ea06"; +} +.icon-common-element-townhouse:before { + content: "\ea07"; +} +.icon-cluster-townhouse-dwelling:before { + content: "\ea08"; +} +.icon-Back-to-back-townhouse:before { + content: "\ea0b"; +} +.icon-two-side-arrow:before { + content: "\ea0c"; +} +.icon-library:before { + content: "\ea0d"; +} +.icon-fitness:before { + content: "\ea0e"; +} +.icon-store:before { + content: "\ea0f"; +} +.icon-park:before { + content: "\ea10"; +} +.icon-home-add:before { + content: "\ea11"; +} +.icon-website:before { + content: "\ea12"; +} +.icon-Unemployed:before { + content: "\ea13"; +} +.icon-tools-layer:before { + content: "\ea14"; + color: #c1c1c1; +} +.icon-change:before { + content: "\ea15"; +} +.icon-pro:before { + content: "\ea16"; +} +.icon-f-toolbar:before { + content: "\ea17"; +} +.icon-policy-text:before { + content: "\ea18"; +} +.icon-permitted-uses:before { + content: "\ea19"; +} +.icon-permitted-dwellings:before { + content: "\ea1a"; +} +.icon-councilor:before { + content: "\ea1b"; +} +.icon-shape:before { + content: "\ea1c"; +} +.icon-source:before { + content: "\ea1d"; +} +.icon-watch:before { + content: "\ea1e"; +} +.icon-clock:before { + content: "\ea1e"; +} +.icon-time:before { + content: "\ea1e"; +} +.icon-Loading:before { + content: "\ea1e"; +} +.icon-zoom-to-context:before { + content: "\ea1f"; +} +.icon-Facebook:before { + content: "\ea20"; +} +.icon-Instagram:before { + content: "\ea21"; +} +.icon-Linkedin:before { + content: "\ea22"; +} +.icon-spot:before { + content: "\ea23"; + color: #d9d9d9; +} +.icon-loading1:before { + content: "\ea24"; +} +.icon-waiting:before { + content: "\ea24"; +} +.icon-dots-horizontal:before { + content: "\ea25"; +} +.icon-onboarding:before { + content: "\ea26"; +} +.icon-ai-chat:before { + content: "\e9f5"; +} +.icon-amortization:before { + content: "\e9ef"; +} +.icon-mic-on:before { + content: "\e9f0"; +} +.icon-profit:before { + content: "\ea04"; +} +.icon-zoning-copilot:before { + content: "\ea0a"; +} +.icon-lock:before { + content: "\e9eb"; +} +.icon-reload:before { + content: "\e9ec"; +} +.icon-no-photo:before { + content: "\e9ed"; +} +.icon-mic-off:before { + content: "\e9ee"; +} +.icon-real-estate-copilot:before { + content: "\e9f1"; +} +.icon-multiplex-assessment:before { + content: "\e9f2"; +} +.icon-cma:before { + content: "\e9f3"; +} +.icon-real-estate:before { + content: "\e9f4"; +} +.icon-calculator:before { + content: "\e9f6"; +} +.icon-category-off .path1:before { + content: "\e9f7"; + color: rgb(50, 50, 50); + opacity: 0.2; +} +.icon-category-off .path2:before { + content: "\e9f8"; + margin-left: -1em; + color: rgb(50, 50, 50); + opacity: 0.2; +} +.icon-category-off .path3:before { + content: "\e9f9"; + margin-left: -1em; + color: rgb(50, 50, 50); +} +.icon-category-off .path4:before { + content: "\e9fa"; + margin-left: -1em; + color: rgb(50, 50, 50); +} +.icon-category-off .path5:before { + content: "\e9fb"; + margin-left: -1em; + color: rgb(50, 50, 50); +} +.icon-category-off .path6:before { + content: "\e9fc"; + margin-left: -1em; + color: rgb(50, 50, 50); +} +.icon-category-on:before { + content: "\e9fd"; +} +.icon-dollar:before { + content: "\e9fe"; +} +.icon-percentage:before { + content: "\e9ff"; +} +.icon-real-estate-module:before { + content: "\ea00"; +} +.icon-sort-a2z:before { + content: "\ea01"; +} +.icon-sort-default:before { + content: "\ea02"; +} +.icon-sort-z2a:before { + content: "\ea03"; +} +.icon-turnofflayers:before { + content: "\ea09"; +} +.icon-real-estate-tools:before { + content: "\e9ea"; +} +.icon-arrow-replace:before { + content: "\e9e8"; +} +.icon-delete2:before { + content: "\e9e9"; +} +.icon-Warning:before { + content: "\e9e7"; +} +.icon-date:before { + content: "\e9e4"; +} +.icon-permit:before { + content: "\e9e5"; +} +.icon-plus-add:before { + content: "\e9e6"; +} +.icon-panel-access:before { + content: "\e9de"; +} +.icon-warning1:before { + content: "\e9df"; +} +.icon-property-details:before { + content: "\e9e0"; +} +.icon-ai:before { + content: "\e9e1"; +} +.icon-estimate:before { + content: "\e9e2"; +} +.icon-scenario:before { + content: "\e9e3"; +} +.icon-ic-deselect:before { + content: "\e9dd"; +} +.icon-object-select:before { + content: "\e9dc"; +} +.icon-emails:before { + content: "\e9da"; +} +.icon-site-selection:before { + content: "\e9db"; +} +.icon-freehold:before { + content: "\e9d8"; +} +.icon-land-pin:before { + content: "\e9d9"; +} +.icon-school .path1:before { + content: "\e9d3"; + color: rgb(0, 0, 0); +} +.icon-school .path2:before { + content: "\e9d4"; + margin-left: -1em; + color: rgb(0, 0, 0); +} +.icon-school .path3:before { + content: "\e9d5"; + margin-left: -1em; + color: rgb(255, 255, 255); +} +.icon-school .path4:before { + content: "\e9d6"; + margin-left: -1em; + color: rgb(255, 255, 255); +} +.icon-home-style:before { + content: "\e9a2"; +} +.icon-home-Status:before { + content: "\e9c8"; +} +.icon-house-age:before { + content: "\e9d2"; +} +.icon-Tax:before { + content: "\e9d7"; +} +.icon-exit-round:before { + content: "\e9a0"; +} +.icon-realestate:before { + content: "\e9a1"; +} +.icon-warning-triangle:before { + content: "\e94c"; +} +.icon-notification:before { + content: "\e99f"; +} +.icon-multiple-unit-townhouse-dwelling1:before { + content: "\e98e"; +} +.icon-position:before { + content: "\e98f"; +} +.icon-street-townhouse-building:before { + content: "\e9a3"; +} +.icon-bathroom:before { + content: "\e9a4"; +} +.icon-calendar:before { + content: "\e9a5"; +} +.icon-water-supply:before { + content: "\e9a6"; +} +.icon-documents-plus:before { + content: "\e9a7"; +} +.icon-cursor-object-select:before { + content: "\e9a8"; +} +.icon-brand:before { + content: "\e9a9"; +} +.icon-parcels:before { + content: "\e9aa"; +} +.icon-accessory-dwelling-unit:before { + content: "\e9ab"; +} +.icon-age:before { + content: "\e9ac"; +} +.icon-air-conditioning:before { + content: "\e9ad"; +} +.icon-ancillary-home:before { + content: "\e990"; +} +.icon-appartment-measure:before { + content: "\e9ae"; +} +.icon-appartment:before { + content: "\e991"; +} +.icon-arrow:before { + content: "\e9af"; +} +.icon-back-to-back-townhouse:before { + content: "\e9b0"; +} +.icon-basement:before { + content: "\e9b1"; +} +.icon-block-townhouse-dwelling:before { + content: "\e9b2"; +} +.icon-block-townhouse:before { + content: "\e9b3"; +} +.icon-cluster-townhouse-dwelling1:before { + content: "\e9b4"; +} +.icon-cluster-homes:before { + content: "\e99b"; +} +.icon-common-element-townhouse1:before { + content: "\e9b5"; +} +.icon-decrease:before { + content: "\e9b6"; +} +.icon-detached-house:before { + content: "\e9b7"; +} +.icon-douplex:before { + content: "\e992"; +} +.icon-fourplex:before { + content: "\e993"; +} +.icon-freehold-townhouse1:before { + content: "\e9b8"; +} +.icon-garage:before { + content: "\e994"; +} +.icon-ground-heating:before { + content: "\e9b9"; +} +.icon-increase:before { + content: "\e9ba"; +} +.icon-independent-living-facility:before { + content: "\e9bb"; +} +.icon-linked-dwelling:before { + content: "\e995"; +} +.icon-list:before { + content: "\e9bc"; +} +.icon-mixed-use-building:before { + content: "\e9bd"; +} +.icon-non-residential:before { + content: "\e9be"; +} +.icon-open-platforms:before { + content: "\e9bf"; +} +.icon-parking:before { + content: "\e9c0"; +} +.icon-podium-townhouse:before { + content: "\e99c"; +} +.icon-pool:before { + content: "\e9c1"; +} +.icon-residential-unit:before { + content: "\e9c2"; +} +.icon-retirement-home:before { + content: "\e996"; +} +.icon-retirement-residence:before { + content: "\e998"; +} +.icon-semi-detached:before { + content: "\e999"; +} +.icon-sewer:before { + content: "\e9c3"; +} +.icon-stacked-townhouse:before { + content: "\e99a"; +} +.icon-status:before { + content: "\e9c4"; +} +.icon-street-townhouse:before { + content: "\e9c5"; +} +.icon-supportive-home:before { + content: "\e9c6"; +} +.icon-tax:before { + content: "\e99e"; +} +.icon-townhouse:before { + content: "\e9c7"; +} +.icon-triplex:before { + content: "\e99d"; +} +.icon-target:before { + content: "\e9c9"; +} +.icon-brightness:before { + content: "\e9ca"; +} +.icon-filter-sort:before { + content: "\e9cb"; +} +.icon-zoom:before { + content: "\e9cc"; +} +.icon-layers:before { + content: "\e9cd"; +} +.icon-list-bullets:before { + content: "\e9ce"; +} +.icon-refresh-loading-circle:before { + content: "\e9cf"; +} +.icon-layer:before { + content: "\e9d0"; +} +.icon-shapes-triangle-circle-sqaure:before { + content: "\e9d1"; +} +.icon-unarchive:before { + content: "\e98c"; +} +.icon-privacy:before { + content: "\e98d"; +} +.icon-attention:before { + content: "\e900"; +} +.icon-favourable:before { + content: "\e901"; +} +.icon-google-street-view .path1:before { + content: "\e902"; + color: rgb(26, 115, 232); +} +.icon-google-street-view .path2:before { + content: "\e903"; + margin-left: -1em; + color: rgb(234, 67, 53); +} +.icon-google-street-view .path3:before { + content: "\e904"; + margin-left: -1em; + color: rgb(66, 133, 244); +} +.icon-google-street-view .path4:before { + content: "\e944"; + margin-left: -1em; + color: rgb(251, 188, 4); +} +.icon-google-street-view .path5:before { + content: "\e946"; + margin-left: -1em; + color: rgb(52, 168, 83); +} +.icon-informative:before { + content: "\e947"; +} +.icon-warning:before { + content: "\e98b"; +} +.icon-indigenous:before { + content: "\e942"; +} +.icon-users:before { + content: "\e997"; +} +.icon-copy:before { + content: "\e987"; +} +.icon-load-to-map:before { + content: "\e988"; +} +.icon-reports:before { + content: "\e989"; +} +.icon-archive:before { + content: "\e98a"; +} +.icon-bookmark:before { + content: "\e986"; +} +.icon-bookmark-fill:before { + content: "\e916"; +} +.icon-folder:before { + content: "\e92c"; +} +.icon-servers:before { + content: "\e905"; +} +.icon-edit:before { + content: "\e906"; +} +.icon-satellite:before { + content: "\e907"; +} +.icon-share:before { + content: "\e908"; +} +.icon-light:before { + content: "\e909"; +} +.icon-draw-square:before { + content: "\e90a"; +} +.icon-file:before { + content: "\e90b"; +} +.icon-bug:before { + content: "\e90c"; +} +.icon-2d-view:before { + content: "\e90d"; +} +.icon-3d-view:before { + content: "\e90e"; +} +.icon-arrow-down:before { + content: "\e90f"; +} +.icon-arrow-up:before { + content: "\e910"; +} +.icon-arrow-left:before { + content: "\e911"; +} +.icon-arrow-right:before { + content: "\e912"; +} +.icon-arrow-4:before { + content: "\e913"; +} +.icon-arrow-5:before { + content: "\e914"; +} +.icon-arrow-6:before { + content: "\e915"; +} +.icon-boundary:before { + content: "\e917"; +} +.icon-message:before { + content: "\e918"; +} +.icon-todo:before { + content: "\e919"; +} +.icon-circle-checkmark:before { + content: "\e91a"; +} +.icon-clock-time-timer:before { + content: "\e91b"; +} +.icon-cloud:before { + content: "\e91c"; +} +.icon-compass:before { + content: "\e91d"; +} +.icon-creditcard:before { + content: "\e91e"; +} +.icon-delete:before { + content: "\e91f"; +} +.icon-delete1:before { + content: "\e920"; +} +.icon-disabled-1:before { + content: "\e920"; +} +.icon-check:before { + content: "\e921"; +} +.icon-dots:before { + content: "\e922"; +} +.icon-double-chevron-right:before { + content: "\e923"; +} +.icon-double-chevron-left:before { + content: "\e924"; +} +.icon-download-save-upload:before { + content: "\e925"; +} +.icon-draw-line:before { + content: "\e926"; +} +.icon-exit:before { + content: "\e927"; +} +.icon-link:before { + content: "\e928"; +} +.icon-eye-hidden:before { + content: "\e929"; +} +.icon-eye-show-visible:before { + content: "\e92a"; +} +.icon-folder-plus:before { + content: "\e92b"; +} +.icon-grid:before { + content: "\e92d"; +} +.icon-layout:before { + content: "\e92e"; +} +.icon-info:before { + content: "\e92f"; +} +.icon-land:before { + content: "\e930"; +} +.icon-legend:before { + content: "\e931"; +} +.icon-loading:before { + content: "\e932"; +} +.icon-map:before { + content: "\e933"; +} +.icon-minus:before { + content: "\e934"; +} +.icon-pen:before { + content: "\e935"; +} +.icon-pin:before { + content: "\e936"; +} +.icon-plus:before { + content: "\e937"; +} +.icon-question:before { + content: "\e938"; +} +.icon-ruler:before { + content: "\e939"; +} +.icon-sale:before { + content: "\e93a"; +} +.icon-bag:before { + content: "\e93b"; +} +.icon-search:before { + content: "\e93c"; +} +.icon-send:before { + content: "\e93d"; +} +.icon-settings:before { + content: "\e93e"; +} +.icon-trash:before { + content: "\e93f"; +} +.icon-upload-loading-arrow:before { + content: "\e940"; +} +.icon-profile:before { + content: "\e941"; +} +.icon-arrow11:before { + content: "\e943"; +} +.icon-facebook:before { + content: "\e945"; +} +.icon-instagram:before { + content: "\e948"; +} +.icon-email:before { + content: "\e949"; +} +.icon-linkedin:before { + content: "\e94a"; +} +.icon-location:before { + content: "\e94b"; +} +.icon-01:before { + content: "\e94d"; + color: #0af; +} +.icon-04:before { + content: "\e94e"; + color: #0af; +} +.icon-05:before { + content: "\e94f"; + color: #0af; +} +.icon-03:before { + content: "\e950"; + color: #0af; +} +.icon-02:before { + content: "\e951"; + color: #0af; +} +.icon-citizen:before { + content: "\e952"; +} +.icon-not-citizen:before { + content: "\e953"; +} +.icon-uniE954:before { + content: "\e954"; +} +.icon-application-status:before { + content: "\e955"; +} +.icon-application-type:before { + content: "\e956"; +} +.icon-arrow-down-line:before { + content: "\e957"; +} +.icon-arrow-up-line:before { + content: "\e958"; +} +.icon-bedroom:before { + content: "\e959"; +} +.icon-block:before { + content: "\e95a"; +} +.icon-children:before { + content: "\e95b"; +} +.icon-community-centre:before { + content: "\e95c"; +} +.icon-commuting:before { + content: "\e95d"; +} +.icon-concession:before { + content: "\e95e"; +} +.icon-condo:before { + content: "\e95f"; +} +.icon-councillor-name:before { + content: "\e960"; +} +.icon-couple:before { + content: "\e961"; +} +.icon-cultural-origins:before { + content: "\e962"; +} +.icon-distance:before { + content: "\e963"; +} +.icon-employed:before { + content: "\e964"; +} +.icon-empty:before { + content: "\e965"; +} +.icon-family:before { + content: "\e966"; +} +.icon-full-time:before { + content: "\e967"; +} +.icon-geographic-township:before { + content: "\e968"; +} +.icon-greenspace:before { + content: "\e969"; +} +.icon-highway-access:before { + content: "\e96a"; +} +.icon-hospital:before { + content: "\e96b"; +} +.icon-immigrant:before { + content: "\e96c"; +} +.icon-lot:before { + content: "\e96d"; +} +.icon-man:before { + content: "\e96e"; +} +.icon-material:before { + content: "\e96f"; +} +.icon-money:before { + content: "\e970"; +} +.icon-name:before { + content: "\e971"; +} +.icon-neighborhood:before { + content: "\e972"; +} +.icon-non-condo:before { + content: "\e973"; +} +.icon-number:before { + content: "\e974"; +} +.icon-part-time:before { + content: "\e975"; +} +.icon-people:before { + content: "\e976"; +} +.icon-police-station:before { + content: "\e977"; +} +.icon-public-transit:before { + content: "\e978"; +} +.icon-rented:before { + content: "\e979"; +} +.icon-room:before { + content: "\e97a"; +} +.icon-shopping:before { + content: "\e97b"; +} +.icon-smileys:before { + content: "\e97c"; +} +.icon-train-station:before { + content: "\e97d"; +} +.icon-unemployed:before { + content: "\e97e"; +} +.icon-visible-minorities:before { + content: "\e97f"; +} +.icon-woman:before { + content: "\e980"; +} +.icon-legal-scale:before { + content: "\e981"; +} +.icon-census-area:before { + content: "\e982"; +} +.icon-household:before { + content: "\e983"; +} +.icon-forward-sortation-Area:before { + content: "\e984"; +} +.icon-fire-station:before { + content: "\e985"; +} diff --git a/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_fonts.scss b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_fonts.scss new file mode 100644 index 00000000..185c7e6e --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_fonts.scss @@ -0,0 +1,145 @@ +// ------------------- Greycliff CF ------------------- + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-BoldOblique.ttf") format("truetype"); + font-weight: 700; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-DemiBold.ttf") format("truetype"); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-Bold.ttf") format("truetype"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-DemiBoldOblique.ttf") format("truetype"); + font-weight: 600; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-ExtraBoldOblique.ttf") format("truetype"); + font-weight: 700; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-ExtraBold.ttf") format("truetype"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-Heavy.ttf") format("truetype"); + font-weight: 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-ExtraLightOblique.ttf") format("truetype"); + font-weight: 200; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-ExtraLight.ttf") format("truetype"); + font-weight: 200; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-LightOblique.ttf") format("truetype"); + font-weight: 300; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-HeavyOblique.ttf") format("truetype"); + font-weight: 900; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-Light.ttf") format("truetype"); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-MediumOblique.ttf") format("truetype"); + font-weight: 500; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-Medium.ttf") format("truetype"); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-Thin.ttf") format("truetype"); + font-weight: 100; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-RegularOblique.ttf") format("truetype"); + font-weight: 400; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: "Greycliff CF"; + src: url("/_content/CrystaLearn.Client.Core/fonts/Greycliff/GreycliffCF-ThinOblique.ttf") format("truetype"); + font-weight: 100; + font-style: italic; + font-display: swap; +} \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_vars.scss b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_vars.scss new file mode 100644 index 00000000..f9e8dcee --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/Styles/abstracts/_vars.scss @@ -0,0 +1,147 @@ +:root { + --font-large-display: 700 100px/100px var(--bit-tpg-font-family); + --font-display: 600 68px/92px var(--bit-tpg-font-family); + --font-large-title: 600 40px/52px var(--bit-tpg-font-family); + --font-title-1-semibold: 600 32px/40px var(--bit-tpg-font-family); + --font-title-1: 600 32px/40px var(--bit-tpg-font-family); + --font-title-2: 600 28px/36px var(--bit-tpg-font-family); + --font-title-3: 600 24px/32px var(--bit-tpg-font-family); + --font-subtitle-1: 600 20px/28px var(--bit-tpg-font-family); + --font-subtitle-2-stronger: 700 16px/22px var(--bit-tpg-font-family); + --font-subtitle-2: 600 16px/22px var(--bit-tpg-font-family); + --font-body-1-strong: 600 16px/22px var(--bit-tpg-font-family); + --font-body-1: 500 16px/22px var(--bit-tpg-font-family); + --font-body-2-stronger: 700 14px/20px var(--bit-tpg-font-family); + --font-body-2-strong: 600 14px/20px var(--bit-tpg-font-family); + --font-body-2: 500 14px/20px var(--bit-tpg-font-family); + --font-caption-1-stronger: 700 12px/16px var(--bit-tpg-font-family); + --font-caption-1-strong: 600 12px/16px var(--bit-tpg-font-family); + --font-caption-1: 500 12px/16px var(--bit-tpg-font-family); + --font-caption-2-strong: 600 10px/14px var(--bit-tpg-font-family); + --font-caption-2: 500 10px/14px var(--bit-tpg-font-family); + + + --space-sm: 0.4rem; + --space-md: 0.8rem; + --space-lg: 1rem; + --space-xl: 1.2rem; + --space-2xl: 1.6rem; + --space-3xl: 2rem; + --space-4xl: 2.4rem; + --space-5xl: 3.2rem; + + --from-top-distance-homepage: 65rem; + --from-bottom-distance-chat-page: -25rem; +} + +//breakpoints + +$breakpoint-xs: 389px; +$breakpoint-md: 768px; +$height-breakpoint: 800px; + +//space + +$space-sm: var(--space-sm); //0.4rem +$space-md: var(--space-md); //0.8rem +$space-lg: var(--space-lg); //1rem +$space-xl: var(--space-xl); //1.2rem +$space-2xl: var(--space-2xl); //1.6rem +$space-3xl: var(--space-3xl); //2rem +$space-4xl: var(--space-4xl); //2.4rem +$space-5xl: var(--space-5xl); //3.2rem + + + +@media screen and (max-width: $breakpoint-xs) { + :root { + // --font-large-display: 700 80px/80px var(--bit-tpg-font-family); + // --font-display: 600 54px/74px var(--bit-tpg-font-family); + // --font-large-title: 600 32px/42px var(--bit-tpg-font-family); + // --font-title-1-semibold: 600 24px/30px var(--bit-tpg-font-family); + // --font-title-1: 600 24px/30px var(--bit-tpg-font-family); + // --font-title-2: 600 24px/30px var(--bit-tpg-font-family); + // --font-title-3: 600 20px/26px var(--bit-tpg-font-family); + // --font-subtitle-1: 600 18px/24px var(--bit-tpg-font-family); + // --font-subtitle-2-stronger: 700 14px/20px var(--bit-tpg-font-family); + // --font-subtitle-2: 600 14px/20px var(--bit-tpg-font-family); + // --font-body-1-strong: 600 14px/20px var(--bit-tpg-font-family); + // --font-body-1: 500 14px/20px var(--bit-tpg-font-family); + // --font-body-2-stronger: 700 12px/18px var(--bit-tpg-font-family); + // --font-body-2-strong: 600 12px/18px var(--bit-tpg-font-family); + // --font-body-2: 500 12px/18px var(--bit-tpg-font-family); + // --font-caption-1-stronger: 700 10px/14px var(--bit-tpg-font-family); + // --font-caption-1-strong: 600 10px/14px var(--bit-tpg-font-family); + // --font-caption-1: 500 10px/14px var(--bit-tpg-font-family); + // --font-caption-2-strong: 600 10px/12px var(--bit-tpg-font-family); + // --font-caption-2: 500 10px/12px var(--bit-tpg-font-family); + + --from-top-distance-homepage: 50rem; + --from-bottom-distance-chat-page: -16.5rem; + } +} + +@media screen and (max-height: $height-breakpoint) { + :root { + --from-top-distance-homepage: 50rem !important; + --from-bottom-distance-chat-page: -16.5rem !important; + } + +} + +@media screen and (min-width: $breakpoint-md) { + :root { + --font-large-display: 700 110px/110px var(--bit-tpg-font-family); + --font-display: 600 80px/104px var(--bit-tpg-font-family); + --font-large-title: 600 48px/60px var(--bit-tpg-font-family); + --font-title-1-semibold: 600 36px/46px var(--bit-tpg-font-family); + --font-title-1: 600 36px/46px var(--bit-tpg-font-family); + --font-title-2: 600 32px/42px var(--bit-tpg-font-family); + --font-title-3: 600 28px/36px var(--bit-tpg-font-family); + --font-subtitle-1: 600 24px/32px var(--bit-tpg-font-family); + --font-subtitle-2-stronger: 700 20px/28px var(--bit-tpg-font-family); + --font-subtitle-2: 600 20px/28px var(--bit-tpg-font-family); + --font-body-1-strong: 600 18px/26px var(--bit-tpg-font-family); + --font-body-1: 500 18px/26px var(--bit-tpg-font-family); + --font-body-2-stronger: 700 16px/24px var(--bit-tpg-font-family); + --font-body-2-strong: 600 16px/24px var(--bit-tpg-font-family); + --font-body-2: 500 16px/24px var(--bit-tpg-font-family); + --font-caption-1-stronger: 700 14px/20px var(--bit-tpg-font-family); + --font-caption-1-strong: 600 14px/20px var(--bit-tpg-font-family); + --font-caption-1: 500 14px/20px var(--bit-tpg-font-family); + --font-caption-2-strong: 600 12px/18px var(--bit-tpg-font-family); + --font-caption-2: 500 12px/18px var(--bit-tpg-font-family); + + --from-top-distance-homepage: 75rem; + --from-bottom-distance-chat-page: -24rem; + } +} + +@media screen and (min-width: $breakpoint-md) { + :root { + // --font-large-display: 700 120px/120px var(--bit-tpg-font-family); + // --font-display: 600 88px/112px var(--bit-tpg-font-family); + // --font-large-title: 600 56px/68px var(--bit-tpg-font-family); + // --font-title-1-semibold: 600 40px/50px var(--bit-tpg-font-family); + // --font-title-1: 600 40px/50px var(--bit-tpg-font-family); + // --font-title-2: 600 36px/46px var(--bit-tpg-font-family); + // --font-title-3: 600 32px/40px var(--bit-tpg-font-family); + // --font-subtitle-1: 600 30px/36px var(--bit-tpg-font-family); + // --font-subtitle-2-stronger: 700 22px/30p var(--bit-tpg-font-family); + // --font-subtitle-2: 600 22px/30px var(--bit-tpg-font-family); + // --font-body-1-strong: 600 20px/28px var(--bit-tpg-font-family); + // --font-body-1: 500 20px/28px var(--bit-tpg-font-family); + // --font-body-2-stronger: 700 18px/26px var(--bit-tpg-font-family); + // --font-body-2-strong: 600 18px/26px var(--bit-tpg-font-family); + // --font-body-2: 500 18px/26px var(--bit-tpg-font-family); + // --font-caption-1-stronger: 700 16px/22px var(--bit-tpg-font-family); + // --font-caption-1-strong: 600 16px/22px var(--bit-tpg-font-family); + // --font-caption-1: 500 16px/22px var(--bit-tpg-font-family); + // --font-caption-2-strong: 600 14px/20px var(--bit-tpg-font-family); + // --font-caption-2: 500 14px/20px var(--bit-tpg-font-family); + + + } + + +} \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/Styles/app.scss b/src/Client/CrystaLearn.Client.Core/Styles/app.scss index eb9827a8..e308f535 100644 --- a/src/Client/CrystaLearn.Client.Core/Styles/app.scss +++ b/src/Client/CrystaLearn.Client.Core/Styles/app.scss @@ -1,11 +1,15 @@ -@import '../Styles/abstracts/_media-queries.scss'; -@import '../Styles/abstracts/_bit-css-variables.scss'; +@import 'abstracts/_media-queries.scss'; +@import 'abstracts/_bit-css-variables.scss'; +@import 'abstracts/_font-icon.scss'; +@import 'abstracts/_font-icon-illustrator.scss'; +@import 'abstracts/_vars.scss'; :root[bit-theme="dark"] { //--bit-clr-bg-pri: #010409; // In case you need to change the background color, make sure to also update ThemeColors.cs's PrimaryDarkBgColor accordingly. } + * { box-sizing: border-box; font-family: "Segoe UI"; diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.eot b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.eot new file mode 100644 index 00000000..08f65b20 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.eot differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.svg b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.svg new file mode 100644 index 00000000..5abd811b --- /dev/null +++ b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.svg @@ -0,0 +1,382 @@ + + + + + + +{ + "fontFamily": "CsLearn-Icons", + "majorVersion": 2, + "minorVersion": 3, + "version": "Version 2.3", + "fontId": "CsLearn-Icons", + "psName": "CsLearn-Icons", + "subFamily": "Regular", + "fullName": "CsLearn-Icons", + "description": "Font generated by IcoMoon." +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.ttf new file mode 100644 index 00000000..c2dcd7f1 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.woff b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.woff new file mode 100644 index 00000000..7f5d7ce6 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/CrystaLearn-FontIcon/CsLearn-Icons-v2.73-2025-07-20.woff differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Bold.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Bold.ttf new file mode 100644 index 00000000..db8d3d02 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Bold.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-BoldOblique.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-BoldOblique.ttf new file mode 100644 index 00000000..cb71aa11 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-BoldOblique.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-DemiBold.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-DemiBold.ttf new file mode 100644 index 00000000..f5c6af63 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-DemiBold.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-DemiBoldOblique.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-DemiBoldOblique.ttf new file mode 100644 index 00000000..9338e53f Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-DemiBoldOblique.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraBold.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraBold.ttf new file mode 100644 index 00000000..f440b7dc Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraBold.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraBoldOblique.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraBoldOblique.ttf new file mode 100644 index 00000000..cfed8912 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraBoldOblique.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraLight.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraLight.ttf new file mode 100644 index 00000000..55c87ca2 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraLight.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraLightOblique.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraLightOblique.ttf new file mode 100644 index 00000000..d040afdf Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ExtraLightOblique.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Heavy.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Heavy.ttf new file mode 100644 index 00000000..0febf5f1 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Heavy.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-HeavyOblique.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-HeavyOblique.ttf new file mode 100644 index 00000000..6db532ab Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-HeavyOblique.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Light.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Light.ttf new file mode 100644 index 00000000..deb7cfc9 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Light.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-LightOblique.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-LightOblique.ttf new file mode 100644 index 00000000..b356c1c1 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-LightOblique.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Medium.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Medium.ttf new file mode 100644 index 00000000..781b691a Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Medium.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-MediumOblique.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-MediumOblique.ttf new file mode 100644 index 00000000..3a5480e2 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-MediumOblique.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Regular.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Regular.ttf new file mode 100644 index 00000000..c32c1747 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Regular.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-RegularOblique.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-RegularOblique.ttf new file mode 100644 index 00000000..c932c6be Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-RegularOblique.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Thin.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Thin.ttf new file mode 100644 index 00000000..90158f8c Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-Thin.ttf differ diff --git a/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ThinOblique.ttf b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ThinOblique.ttf new file mode 100644 index 00000000..54d93d48 Binary files /dev/null and b/src/Client/CrystaLearn.Client.Core/wwwroot/fonts/Greycliff/GreycliffCF-ThinOblique.ttf differ diff --git a/src/Console/CrystaLearn.Console.csproj b/src/Console/CrystaLearn.Console/CrystaLearn.Console.csproj similarity index 91% rename from src/Console/CrystaLearn.Console.csproj rename to src/Console/CrystaLearn.Console/CrystaLearn.Console.csproj index 365b3ade..fd01c949 100644 --- a/src/Console/CrystaLearn.Console.csproj +++ b/src/Console/CrystaLearn.Console/CrystaLearn.Console.csproj @@ -27,7 +27,7 @@ - + diff --git a/src/Console/Extensions/ApplicationBuilderExtensions.cs b/src/Console/CrystaLearn.Console/Extensions/ApplicationBuilderExtensions.cs similarity index 100% rename from src/Console/Extensions/ApplicationBuilderExtensions.cs rename to src/Console/CrystaLearn.Console/Extensions/ApplicationBuilderExtensions.cs diff --git a/src/Console/Program.cs b/src/Console/CrystaLearn.Console/Program.cs similarity index 100% rename from src/Console/Program.cs rename to src/Console/CrystaLearn.Console/Program.cs diff --git a/src/Console/appsettings.json b/src/Console/CrystaLearn.Console/appsettings.json similarity index 99% rename from src/Console/appsettings.json rename to src/Console/CrystaLearn.Console/appsettings.json index ae7fedbe..a7761c27 100644 --- a/src/Console/appsettings.json +++ b/src/Console/CrystaLearn.Console/appsettings.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "PostgresConnectionString": "Host=localhost;Database=CrystaLearn;Username=postgres;Password=postgres", + "PostgresConnectionString": "Host=localhost;Database=CrystaLearn;Username=afshin;Password=securepass123", "AzureBlobStorageSasUrl": "emulator", "AzureBlobStorageSasUrl_Comment": "More info about blob storage sas url at https://learn.microsoft.com/en-us/azure/ai-services/translator/document-translation/how-to-guides/create-sas-tokens?tabs=blobs#create-sas-tokens-in-the-azure-portal" }, diff --git a/src/Core/CrystaLearn.Core.Test/AzureBoardTests/AzureBoardServiceTests.cs b/src/Core/CrystaLearn.Core.Test/AzureBoardTests/AzureBoardServiceTests.cs index f4d94b99..886237a8 100644 --- a/src/Core/CrystaLearn.Core.Test/AzureBoardTests/AzureBoardServiceTests.cs +++ b/src/Core/CrystaLearn.Core.Test/AzureBoardTests/AzureBoardServiceTests.cs @@ -197,11 +197,24 @@ public async Task GetRevisionsAsync_WhenCalled_Returns() // Arrange var services = CreateServiceProvider(); var service = services.GetRequiredService(); + var configuration = services.GetRequiredService(); + var organization = "cs-internship"; + var pat = configuration["AzureDevOps:PersonalAccessToken"] + ?? throw new Exception("No PAT provided."); + + var project = "CS Internship Program"; + + var config = new AzureBoardSyncConfig + { + Organization = organization, + PersonalAccessToken = pat, + Project = project + }; // Act var fields = new string[] { "System.Id", "System.Title", "System.State", "System.Tags", "System.WorkItemType", "System.AssignedTo", "System.CreatedDate", "System.ChangedDate" }; - var list = await service.GetRevisionsAsync(10455); + var list = await service.GetRevisionsAsync(config, 10455); // Assert } @@ -212,11 +225,24 @@ public async Task GetUpdatesAsync_WhenCalled_Returns() // Arrange var services = CreateServiceProvider(); var service = services.GetRequiredService(); + var configuration = services.GetRequiredService(); + var organization = "cs-internship"; + var pat = configuration["AzureDevOps:PersonalAccessToken"] + ?? throw new Exception("No PAT provided."); + + var project = "CS Internship Program"; + + var config = new AzureBoardSyncConfig + { + Organization = organization, + PersonalAccessToken = pat, + Project = project + }; // Act var fields = new string[] { "System.Id", "System.Title", "System.State", "System.Tags", "System.WorkItemType", "System.AssignedTo", "System.CreatedDate", "System.ChangedDate" }; - var list = await service.GetUpdatesAsync(10455); + var list = await service.GetUpdatesAsync(config, 10455); // Assert } diff --git a/src/Core/CrystaLearn.Core.Test/CrystaLearn.Core.Test.csproj b/src/Core/CrystaLearn.Core.Test/CrystaLearn.Core.Test.csproj index eb9ee786..e9beac2b 100644 --- a/src/Core/CrystaLearn.Core.Test/CrystaLearn.Core.Test.csproj +++ b/src/Core/CrystaLearn.Core.Test/CrystaLearn.Core.Test.csproj @@ -5,7 +5,8 @@ enable enable false - + 0f8f5f21-4e94-4185-9731-96793571b980 + diff --git a/src/Core/CrystaLearn.Core.Test/Sync/AzureBoardSyncServiceTests.cs b/src/Core/CrystaLearn.Core.Test/Sync/AzureBoardSyncServiceTests.cs index b939658e..030c22f6 100644 --- a/src/Core/CrystaLearn.Core.Test/Sync/AzureBoardSyncServiceTests.cs +++ b/src/Core/CrystaLearn.Core.Test/Sync/AzureBoardSyncServiceTests.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using CrystaLearn.Core.Extensions; using CrystaLearn.Core.Models.Crysta; using CrystaLearn.Core.Services; using CrystaLearn.Core.Services.AzureBoard; @@ -19,12 +20,14 @@ public async Task SyncAzureBoard_WithFakeData_MustWork() // Arrange var services = CreateServiceProvider(configServices: (sc) => { - sc.AddTransient(); + sc.AddTransient(); }); - var service = services.GetRequiredService(); - - var configuration = services.GetRequiredService(); + using var scope = services.CreateScope(); + var service = scope.ServiceProvider.GetRequiredService(); + var moduleService = scope.ServiceProvider.GetRequiredService(); + + var configuration = scope.ServiceProvider.GetRequiredService(); var organization = "cs-internship"; var pat = configuration["AzureDevOps:PersonalAccessToken"] ?? throw new Exception("No PAT provided."); @@ -45,25 +48,49 @@ public async Task SyncAzureBoard_WithFakeData_MustWork() SyncConfig = System.Text.Json.JsonSerializer.Serialize(config), SyncInfo = new SyncInfo { - LastSyncDateTime = DateTimeOffset.Now.AddDays(-2), + LastSyncDateTime = DateTimeOffset.Now.AddYears(-4), LastSyncOffset = "0" } }; - await service.SyncAsync(module); + await service.SyncAsync(module, new List() { 1332 }); } + + [Fact] + public async Task SyncAzureBoard_MustWork() + { + // Arrange + var services = CreateServiceProvider(configServices: (sc) => + { + sc.AddTransient(); + }); + + using var scope = services.CreateScope(); + var service = scope.ServiceProvider.GetRequiredService(); + var moduleService = scope.ServiceProvider.GetRequiredService(); + var moduleList = await moduleService.GetSyncModulesAsync(CancellationToken.None); + var configuration = scope.ServiceProvider.GetRequiredService(); + + + + await service.SyncAsync(moduleList.First(f => f.ModuleType == SyncModuleType.AzureBoard), new List() { 36233 }); + } + + [Fact] public async Task SyncAzureBoard_WithFakeRepo_MustWork() { // Arrange var services = CreateServiceProvider(configServices: (sc) => { - sc.AddTransient(); + sc.AddTransient(); }); - var moduleService = services.GetRequiredService(); - var syncService = services.GetRequiredService(); + using var scope = services.CreateScope(); + var moduleService = scope.ServiceProvider.GetRequiredService(); + await moduleService.GetSyncModulesAsync(CancellationToken.None); + var syncService = scope.ServiceProvider.GetRequiredService(); var modules = await moduleService.GetSyncModulesAsync(default); @@ -73,3 +100,8 @@ public async Task SyncAzureBoard_WithFakeRepo_MustWork() } } } + +//AzureBoardService Test +//AzureSyncService Test +// CrystaTaskRepository -> CrystaTaskService -> Documented +// diff --git a/src/Core/CrystaLearn.Core/CrystaLearn.Core.csproj b/src/Core/CrystaLearn.Core/CrystaLearn.Core.csproj index 2d84de85..19c7d685 100644 --- a/src/Core/CrystaLearn.Core/CrystaLearn.Core.csproj +++ b/src/Core/CrystaLearn.Core/CrystaLearn.Core.csproj @@ -7,6 +7,7 @@ + @@ -24,6 +25,7 @@ + @@ -33,8 +35,4 @@ - - - - diff --git a/src/Core/CrystaLearn.Core/Data/AppDbContext.cs b/src/Core/CrystaLearn.Core/Data/AppDbContext.cs index c1414bb3..e2a0860c 100644 --- a/src/Core/CrystaLearn.Core/Data/AppDbContext.cs +++ b/src/Core/CrystaLearn.Core/Data/AppDbContext.cs @@ -1,5 +1,6 @@ using CrystaLearn.Core.Models.Attachments; using CrystaLearn.Core.Models.Chatbot; +using CrystaLearn.Core.Models.Crysta; using CrystaLearn.Core.Models.Identity; using CrystaLearn.Core.Models.PushNotification; using CrystaLearn.Server.Api.Data.Configurations; @@ -24,6 +25,18 @@ public partial class AppDbContext(DbContextOptions options) public DbSet DataProtectionKeys { get; set; } = default!; + public DbSet CrystaTasks { get; set; } = default!; + + public DbSet CrystaTaskComments { get; set; } = default!; + + public DbSet CrystaTaskUpdates { get; set; } = default!; + + public DbSet CrystaTaskRevisions { get; set; } = default!; + + public DbSet CrystaPrograms { get; set; } = default!; + + public DbSet CrystaProgramSyncModules { get; set; } = default!; + protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); diff --git a/src/Core/CrystaLearn.Core/Data/AppDbContextFactory.cs b/src/Core/CrystaLearn.Core/Data/AppDbContextFactory.cs new file mode 100644 index 00000000..5b861704 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Data/AppDbContextFactory.cs @@ -0,0 +1,16 @@ +using Microsoft.EntityFrameworkCore.Design; + +namespace CrystaLearn.Core.Data; + +public class AppDbContextFactory : IDesignTimeDbContextFactory +{ + public AppDbContext CreateDbContext(string[] args) + { + var optionsBuilder = new DbContextOptionsBuilder(); + + // Use a default connection string for migrations + optionsBuilder.UseNpgsql("Host=localhost;Database=CrystaLearn;Username=postgres;Password=postgres"); + + return new AppDbContext(optionsBuilder.Options); + } +} diff --git a/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaProgramConfiguration.cs b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaProgramConfiguration.cs new file mode 100644 index 00000000..23283a33 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaProgramConfiguration.cs @@ -0,0 +1,12 @@ +using CrystaLearn.Core.Models.Crysta; + +namespace CrystaLearn.Core.Data.Configurations.Crysta; + +public class CrystaProgramConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasIndex(p => p.Code).IsUnique(); + builder.HasIndex(p => p.IsActive); + } +} diff --git a/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaProgramSyncModuleConfiguration.cs b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaProgramSyncModuleConfiguration.cs new file mode 100644 index 00000000..4142a230 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaProgramSyncModuleConfiguration.cs @@ -0,0 +1,25 @@ +using CrystaLearn.Core.Models.Crysta; + +namespace CrystaLearn.Core.Data.Configurations.Crysta; + +public class CrystaProgramSyncModuleConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasOne(m => m.CrystaProgram) + .WithMany() + .HasForeignKey(m => m.CrystaProgramId) + .OnDelete(DeleteBehavior.Cascade); + + builder.HasIndex(m => m.CrystaProgramId); + builder.HasIndex(m => m.ModuleType); + + builder.OwnsOne(m => m.SyncInfo, syncInfo => + { + syncInfo.Property(s => s.SyncId).HasMaxLength(100); + syncInfo.Property(s => s.ContentHash).HasMaxLength(100); + syncInfo.Property(s => s.SyncGroup).HasMaxLength(100); + syncInfo.Property(s => s.LastSyncOffset).HasMaxLength(40); + }); + } +} diff --git a/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskCommentConfiguration.cs b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskCommentConfiguration.cs new file mode 100644 index 00000000..72b18431 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskCommentConfiguration.cs @@ -0,0 +1,23 @@ +using CrystaLearn.Core.Models.Crysta; + +namespace CrystaLearn.Core.Data.Configurations.Crysta; + +public class CrystaTaskCommentConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasIndex(c => c.ProviderTaskId); + builder.HasIndex(c => c.CrystaTaskId); + builder.HasIndex(c => c.CreatedDateTime); + + builder.HasOne(c => c.CrystaTask) + .WithMany() + .HasForeignKey(c => c.CrystaTaskId) + .OnDelete(DeleteBehavior.Cascade); + + builder.OwnsOne(u => u.SyncInfo, sync => + { + sync.HasIndex(s => s.SyncId).IsUnique(); + }); + } +} diff --git a/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskConfiguration.cs b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskConfiguration.cs new file mode 100644 index 00000000..9af338af --- /dev/null +++ b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskConfiguration.cs @@ -0,0 +1,22 @@ +using CrystaLearn.Core.Models.Crysta; + +namespace CrystaLearn.Core.Data.Configurations.Crysta; + +public class CrystaTaskConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasIndex(t => t.ProviderTaskId); + builder.HasIndex(t => t.ProjectId); + builder.HasIndex(t => t.TaskCreateDateTime); + builder.HasIndex(t => t.Status); + builder.OwnsOne(u => u.WorkItemSyncInfo, sync => + { + sync.HasIndex(s => s.SyncId).IsUnique(); + }); + + builder.OwnsOne(t => t.RevisionsSyncInfo); + builder.OwnsOne(t => t.UpdatesSyncInfo); + builder.OwnsOne(t => t.CommentsSyncInfo); + } +} diff --git a/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskRevisionConfiguration.cs b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskRevisionConfiguration.cs new file mode 100644 index 00000000..20cd8d4b --- /dev/null +++ b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskRevisionConfiguration.cs @@ -0,0 +1,46 @@ +using CrystaLearn.Core.Models.Crysta; + +namespace CrystaLearn.Core.Data.Configurations.Crysta; + +public class CrystaTaskRevisionConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasIndex(r => r.ProviderTaskId); + builder.HasIndex(r => r.CrystaTaskId); + builder.HasIndex(r => r.Revision); + builder.HasIndex(r => r.ChangedDate); + builder.HasIndex(r => r.ProjectId); + builder.HasIndex(r => r.State); + builder.HasIndex(r => r.CreatedDate); + + builder.HasOne(r => r.CrystaTask) + .WithMany() + .HasForeignKey(r => r.CrystaTaskId) + .OnDelete(DeleteBehavior.Cascade); + + builder.HasOne(r => r.AssignedTo) + .WithMany() + .HasForeignKey(r => r.AssignedToId); + + builder.HasOne(r => r.CompletedBy) + .WithMany() + .HasForeignKey(r => r.CompletedById); + + builder.HasOne(r => r.CreatedBy) + .WithMany() + .HasForeignKey(r => r.CreatedById); + + builder.HasOne(r => r.CrystaProgram) + .WithMany() + .HasForeignKey(r => r.CrystaProgramId); + + builder.OwnsOne(u => u.WorkItemSyncInfo, sync => + { + sync.HasIndex(s => s.SyncId).IsUnique(); + }); + builder.OwnsOne(r => r.RevisionsSyncInfo); + builder.OwnsOne(r => r.UpdatesSyncInfo); + builder.OwnsOne(r => r.CommentsSyncInfo); + } +} diff --git a/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskUpdateConfiguration.cs b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskUpdateConfiguration.cs new file mode 100644 index 00000000..42f5f570 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Data/Configurations/Crysta/CrystaTaskUpdateConfiguration.cs @@ -0,0 +1,24 @@ +using CrystaLearn.Core.Models.Crysta; + +namespace CrystaLearn.Core.Data.Configurations.Crysta; + +public class CrystaTaskUpdateConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasIndex(u => u.ProviderTaskId); + builder.HasIndex(u => u.CrystaTaskId); + builder.HasIndex(u => u.Revision); + builder.HasIndex(u => u.ChangedDate); + + builder.HasOne(u => u.CrystaTask) + .WithMany() + .HasForeignKey(u => u.CrystaTaskId) + .OnDelete(DeleteBehavior.Cascade); + + builder.OwnsOne(u => u.SyncInfo, sync => + { + sync.HasIndex(s => s.SyncId).IsUnique(); + }); + } +} diff --git a/src/Core/CrystaLearn.Core/Extensions/ApplicationBuilderExtensions.cs b/src/Core/CrystaLearn.Core/Extensions/ApplicationBuilderExtensions.cs index 3a05cb68..cec395a7 100644 --- a/src/Core/CrystaLearn.Core/Extensions/ApplicationBuilderExtensions.cs +++ b/src/Core/CrystaLearn.Core/Extensions/ApplicationBuilderExtensions.cs @@ -16,19 +16,19 @@ public static void AddCrystaServices(this IHostApplicationBuilder builder) var services = builder.Services; var configuration = builder.Configuration; - builder.AddGitHubClient(); - services.AddPooledDbContextFactory(AddDbContext); services.AddDbContextPool(AddDbContext); void AddDbContext(DbContextOptionsBuilder options) { options.EnableSensitiveDataLogging(env.IsDevelopment()) - .EnableDetailedErrors(env.IsDevelopment()); + .EnableDetailedErrors(env.IsDevelopment()); options.UseNpgsql(configuration.GetConnectionString("PostgresConnectionString")); + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); } - ; + + builder.AddGitHubClient(); services.AddSingleton(); services.AddTransient(); @@ -36,8 +36,8 @@ void AddDbContext(DbContextOptionsBuilder options) services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } private static void AddGitHubClient(this IHostApplicationBuilder builder) diff --git a/src/Core/CrystaLearn.Core/Migrations/20251113120438_SyncAzureDevOpsTasks.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251113120438_SyncAzureDevOpsTasks.Designer.cs new file mode 100644 index 00000000..c17dd3f5 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251113120438_SyncAzureDevOpsTasks.Designer.cs @@ -0,0 +1,1989 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251113120438_SyncAzureDevOpsTasks")] + partial class SyncAzureDevOpsTasks + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.8") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .HasColumnType("integer"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("State"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AzureCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("AzureWorkItemId") + .HasColumnType("integer"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("EditedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .HasColumnType("integer"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AzureWorkItemId"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentsSnapshot") + .HasColumnType("text"); + + b.Property("AzureWorkItemId") + .HasColumnType("integer"); + + b.Property("ChangeDetails") + .HasColumnType("text"); + + b.Property("ChangeSummary") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentsSnapshot") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromUpdateId") + .HasColumnType("integer"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("FieldsSnapshot") + .HasColumnType("text"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationsSnapshot") + .HasColumnType("text"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("RevisionNumber") + .HasColumnType("integer"); + + b.Property("SnapshotJson") + .HasColumnType("text"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Title") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("AzureWorkItemId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("RevisionNumber"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("AzureUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("AzureWorkItemId") + .HasColumnType("integer"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AzureWorkItemId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "BadgeSyncInfo", b1 => + { + b1.Property("CrystaProgramId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaProgramId"); + + b1.ToTable("CrystaPrograms", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaProgramId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "DocumentSyncInfo", b1 => + { + b1.Property("CrystaProgramId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaProgramId"); + + b1.ToTable("CrystaPrograms", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaProgramId"); + }); + + b.Navigation("BadgeSyncInfo") + .IsRequired(); + + b.Navigation("DocumentSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CrystaTask"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251113120438_SyncAzureDevOpsTasks.cs b/src/Core/CrystaLearn.Core/Migrations/20251113120438_SyncAzureDevOpsTasks.cs new file mode 100644 index 00000000..b0dc2a81 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251113120438_SyncAzureDevOpsTasks.cs @@ -0,0 +1,521 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class SyncAzureDevOpsTasks : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CrystaPrograms", + schema: "CrystaLearn", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + Code = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), + Title = table.Column(type: "character varying(200)", maxLength: 200, nullable: false), + BadgeSystemUrl = table.Column(type: "character varying(300)", maxLength: 300, nullable: true), + DocumentUrl = table.Column(type: "character varying(300)", maxLength: 300, nullable: true), + DocumentSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + DocumentSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + DocumentSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + DocumentSyncInfo_SyncHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + DocumentSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + DocumentSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + DocumentSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + BadgeSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + BadgeSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + BadgeSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + BadgeSyncInfo_SyncHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + BadgeSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + BadgeSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + BadgeSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + IsActive = table.Column(type: "boolean", nullable: false), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CrystaPrograms", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "CrystaTasks", + schema: "CrystaLearn", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + ProviderTaskId = table.Column(type: "text", nullable: true), + AssignedToId = table.Column(type: "uuid", nullable: true), + CompletedById = table.Column(type: "uuid", nullable: true), + CreatedById1 = table.Column(type: "uuid", nullable: true), + AssignedToText = table.Column(type: "text", nullable: true), + CompletedByText = table.Column(type: "text", nullable: true), + CreatedByText = table.Column(type: "text", nullable: true), + Title = table.Column(type: "text", nullable: true), + Description = table.Column(type: "text", nullable: true), + DescriptionHtml = table.Column(type: "text", nullable: true), + TaskCreateDateTime = table.Column(type: "timestamp with time zone", nullable: true), + TaskDoneDateTime = table.Column(type: "timestamp with time zone", nullable: true), + TaskAssignDateTime = table.Column(type: "timestamp with time zone", nullable: true), + Status = table.Column(type: "integer", nullable: true), + ProviderTaskUrl = table.Column(type: "text", nullable: true), + WorkItemSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + WorkItemSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + WorkItemSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + WorkItemSyncInfo_SyncHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + WorkItemSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + WorkItemSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + WorkItemSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + RevisionsSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + RevisionsSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + RevisionsSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + RevisionsSyncInfo_SyncHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + RevisionsSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + RevisionsSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + RevisionsSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + UpdatesSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + UpdatesSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + UpdatesSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + UpdatesSyncInfo_SyncHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + UpdatesSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + UpdatesSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + UpdatesSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + CommentsSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + CommentsSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + CommentsSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + CommentsSyncInfo_SyncHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + CommentsSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + CommentsSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + CommentsSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + CrystaProgramId = table.Column(type: "uuid", nullable: true), + ParentId = table.Column(type: "uuid", nullable: true), + WorkItemType = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + State = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + Reason = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + AreaPath = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), + IterationPath = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), + CreatedByDisplayName = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + CreatedById = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + CreatedDate = table.Column(type: "timestamp with time zone", nullable: true), + ChangedBy = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + ChangedById = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + ChangedDate = table.Column(type: "timestamp with time zone", nullable: true), + RevisedBy = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + Revision = table.Column(type: "integer", nullable: false), + ProjectId = table.Column(type: "uuid", nullable: true), + ProjectName = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + AreaId = table.Column(type: "uuid", nullable: true), + IterationId = table.Column(type: "uuid", nullable: true), + Severity = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + Priority = table.Column(type: "integer", nullable: true), + OriginalEstimate = table.Column(type: "double precision", nullable: true), + RemainingWork = table.Column(type: "double precision", nullable: true), + CompletedWork = table.Column(type: "double precision", nullable: true), + StoryPoints = table.Column(type: "double precision", nullable: true), + Tags = table.Column(type: "character varying(2000)", maxLength: 2000, nullable: true), + AttachmentsCount = table.Column(type: "integer", nullable: false), + Relations = table.Column(type: "text", nullable: true), + Links = table.Column(type: "text", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false), + CommentCount = table.Column(type: "integer", nullable: false), + BoardColumn = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + BoardColumnDone = table.Column(type: "boolean", nullable: false), + StateChangeDate = table.Column(type: "timestamp with time zone", nullable: true), + DueDate = table.Column(type: "timestamp with time zone", nullable: true), + StartDate = table.Column(type: "timestamp with time zone", nullable: true), + ClosedDate = table.Column(type: "timestamp with time zone", nullable: true), + ResolvedDate = table.Column(type: "timestamp with time zone", nullable: true), + ExternalId = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + CustomFields = table.Column(type: "text", nullable: true), + RawJson = table.Column(type: "text", nullable: true), + SystemFields = table.Column(type: "text", nullable: true), + CreatedFromRevisionId = table.Column(type: "integer", nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CrystaTasks", x => x.Id); + table.ForeignKey( + name: "FK_CrystaTasks_CrystaPrograms_CrystaProgramId", + column: x => x.CrystaProgramId, + principalSchema: "CrystaLearn", + principalTable: "CrystaPrograms", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_CrystaTasks_Users_AssignedToId", + column: x => x.AssignedToId, + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_CrystaTasks_Users_CompletedById", + column: x => x.CompletedById, + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_CrystaTasks_Users_CreatedById1", + column: x => x.CreatedById1, + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "CrystaTaskComments", + schema: "CrystaLearn", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + AzureWorkItemId = table.Column(type: "integer", nullable: false), + AzureCommentId = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + ThreadId = table.Column(type: "integer", nullable: true), + ParentCommentId = table.Column(type: "integer", nullable: true), + Text = table.Column(type: "text", nullable: true), + FormattedText = table.Column(type: "text", nullable: true), + CreatedBy = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + CreatedById = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + CreatedDate = table.Column(type: "timestamp with time zone", nullable: false), + EditedBy = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + EditedById = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + EditedDate = table.Column(type: "timestamp with time zone", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false), + IsSystem = table.Column(type: "boolean", nullable: false), + CommentType = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + Visibility = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + RawJson = table.Column(type: "text", nullable: true), + ProviderCommentUrl = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true), + Reactions = table.Column(type: "text", nullable: true), + Revision = table.Column(type: "integer", nullable: false), + CrystaTaskId = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: true), + SyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + SyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + SyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + SyncInfo_SyncHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + SyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + SyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + SyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + CrystaProgramId = table.Column(type: "uuid", nullable: true), + Content = table.Column(type: "text", nullable: true), + ContentHtml = table.Column(type: "text", nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CrystaTaskComments", x => x.Id); + table.ForeignKey( + name: "FK_CrystaTaskComments_CrystaPrograms_CrystaProgramId", + column: x => x.CrystaProgramId, + principalSchema: "CrystaLearn", + principalTable: "CrystaPrograms", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_CrystaTaskComments_CrystaTasks_CrystaTaskId", + column: x => x.CrystaTaskId, + principalSchema: "CrystaLearn", + principalTable: "CrystaTasks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CrystaTaskComments_Users_UserId", + column: x => x.UserId, + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "CrystaTaskRevisions", + schema: "CrystaLearn", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + AzureWorkItemId = table.Column(type: "integer", nullable: false), + RevisionNumber = table.Column(type: "integer", nullable: false), + SnapshotJson = table.Column(type: "text", nullable: true), + Title = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), + Description = table.Column(type: "text", nullable: true), + State = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + ChangedBy = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + ChangedDate = table.Column(type: "timestamp with time zone", nullable: false), + CreatedDate = table.Column(type: "timestamp with time zone", nullable: false), + ProjectId = table.Column(type: "uuid", nullable: false), + ProjectName = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + FieldsSnapshot = table.Column(type: "text", nullable: true), + RelationsSnapshot = table.Column(type: "text", nullable: true), + AttachmentsSnapshot = table.Column(type: "text", nullable: true), + CommentsSnapshot = table.Column(type: "text", nullable: true), + ChangeSummary = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true), + ChangeDetails = table.Column(type: "text", nullable: true), + CreatedFromUpdateId = table.Column(type: "integer", nullable: true), + RawJson = table.Column(type: "text", nullable: true), + CrystaTaskId = table.Column(type: "uuid", nullable: false), + RevisionCode = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CrystaTaskRevisions", x => x.Id); + table.ForeignKey( + name: "FK_CrystaTaskRevisions_CrystaTasks_CrystaTaskId", + column: x => x.CrystaTaskId, + principalSchema: "CrystaLearn", + principalTable: "CrystaTasks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "CrystaTaskUpdates", + schema: "CrystaLearn", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + AzureWorkItemId = table.Column(type: "integer", nullable: false), + AzureUpdateId = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + Revision = table.Column(type: "integer", nullable: false), + ChangedBy = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + ChangedById = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + ChangedDate = table.Column(type: "timestamp with time zone", nullable: false), + FieldName = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + FieldDisplayName = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + OldValue = table.Column(type: "text", nullable: true), + NewValue = table.Column(type: "text", nullable: true), + Operation = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + CommentText = table.Column(type: "text", nullable: true), + IsWorkItemFieldChange = table.Column(type: "boolean", nullable: false), + ChangedPropertiesJson = table.Column(type: "text", nullable: true), + RelationChange = table.Column(type: "text", nullable: true), + AttachmentChange = table.Column(type: "text", nullable: true), + ProviderUrl = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true), + RawJson = table.Column(type: "text", nullable: true), + CrystaTaskId = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: true), + SyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + SyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + SyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + SyncInfo_SyncHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + SyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + SyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + SyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + CrystaProgramId = table.Column(type: "uuid", nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CrystaTaskUpdates", x => x.Id); + table.ForeignKey( + name: "FK_CrystaTaskUpdates_CrystaPrograms_CrystaProgramId", + column: x => x.CrystaProgramId, + principalSchema: "CrystaLearn", + principalTable: "CrystaPrograms", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_CrystaTaskUpdates_CrystaTasks_CrystaTaskId", + column: x => x.CrystaTaskId, + principalSchema: "CrystaLearn", + principalTable: "CrystaTasks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CrystaTaskUpdates_Users_UserId", + column: x => x.UserId, + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_CrystaPrograms_Code", + schema: "CrystaLearn", + table: "CrystaPrograms", + column: "Code", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_CrystaPrograms_IsActive", + schema: "CrystaLearn", + table: "CrystaPrograms", + column: "IsActive"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "AzureWorkItemId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_CreatedDate", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "CreatedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_CrystaProgramId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "CrystaProgramId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "CrystaTaskId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_UserId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "AzureWorkItemId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_ChangedDate", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "ChangedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "CrystaTaskId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_RevisionNumber", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "RevisionNumber"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_AssignedToId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "AssignedToId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_ChangedDate", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "ChangedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_CompletedById", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "CompletedById"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_CreatedById1", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "CreatedById1"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_CreatedDate", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "CreatedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_CrystaProgramId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "CrystaProgramId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_ProjectId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "ProjectId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "ProviderTaskId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_State", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "State"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskUpdates_AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + column: "AzureWorkItemId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskUpdates_ChangedDate", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + column: "ChangedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskUpdates_CrystaProgramId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + column: "CrystaProgramId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskUpdates_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + column: "CrystaTaskId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskUpdates_Revision", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + column: "Revision"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskUpdates_UserId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + column: "UserId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CrystaTaskComments", + schema: "CrystaLearn"); + + migrationBuilder.DropTable( + name: "CrystaTaskRevisions", + schema: "CrystaLearn"); + + migrationBuilder.DropTable( + name: "CrystaTaskUpdates", + schema: "CrystaLearn"); + + migrationBuilder.DropTable( + name: "CrystaTasks", + schema: "CrystaLearn"); + + migrationBuilder.DropTable( + name: "CrystaPrograms", + schema: "CrystaLearn"); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251121081101_SyncAzureDevops.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251121081101_SyncAzureDevops.Designer.cs new file mode 100644 index 00000000..30429ad5 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251121081101_SyncAzureDevops.Designer.cs @@ -0,0 +1,1926 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251121081101_SyncAzureDevops")] + partial class SyncAzureDevops + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.8") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .HasColumnType("integer"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("State"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AzureCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("AzureWorkItemId") + .HasColumnType("integer"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("EditedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .HasColumnType("integer"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AzureWorkItemId"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentsSnapshot") + .HasColumnType("text"); + + b.Property("AzureWorkItemId") + .HasColumnType("integer"); + + b.Property("ChangeDetails") + .HasColumnType("text"); + + b.Property("ChangeSummary") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentsSnapshot") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromUpdateId") + .HasColumnType("integer"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("FieldsSnapshot") + .HasColumnType("text"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationsSnapshot") + .HasColumnType("text"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("RevisionNumber") + .HasColumnType("integer"); + + b.Property("SnapshotJson") + .HasColumnType("text"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Title") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("AzureWorkItemId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("RevisionNumber"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("AzureUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("AzureWorkItemId") + .HasColumnType("integer"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AzureWorkItemId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CrystaTask"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251121081101_SyncAzureDevops.cs b/src/Core/CrystaLearn.Core/Migrations/20251121081101_SyncAzureDevops.cs new file mode 100644 index 00000000..1eee1a89 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251121081101_SyncAzureDevops.cs @@ -0,0 +1,343 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class SyncAzureDevops : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "BadgeSyncInfo_LastSyncDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "BadgeSyncInfo_LastSyncOffset", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "BadgeSyncInfo_SyncEndDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "BadgeSyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "BadgeSyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "BadgeSyncInfo_SyncStartDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "BadgeSyncInfo_SyncStatus", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "DocumentSyncInfo_LastSyncDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "DocumentSyncInfo_LastSyncOffset", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "DocumentSyncInfo_SyncEndDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "DocumentSyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "DocumentSyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "DocumentSyncInfo_SyncStartDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.DropColumn( + name: "DocumentSyncInfo_SyncStatus", + schema: "CrystaLearn", + table: "CrystaPrograms"); + + migrationBuilder.RenameColumn( + name: "SyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + newName: "SyncInfo_SyncGroup"); + + migrationBuilder.RenameColumn( + name: "WorkItemSyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "WorkItemSyncInfo_SyncGroup"); + + migrationBuilder.RenameColumn( + name: "UpdatesSyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "WorkItemSyncInfo_ContentHash"); + + migrationBuilder.RenameColumn( + name: "RevisionsSyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "UpdatesSyncInfo_SyncGroup"); + + migrationBuilder.RenameColumn( + name: "CommentsSyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "UpdatesSyncInfo_ContentHash"); + + migrationBuilder.RenameColumn( + name: "SyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "SyncInfo_SyncGroup"); + + migrationBuilder.AddColumn( + name: "SyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AddColumn( + name: "CommentsSyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AddColumn( + name: "CommentsSyncInfo_SyncGroup", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AddColumn( + name: "RevisionsSyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AddColumn( + name: "RevisionsSyncInfo_SyncGroup", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AddColumn( + name: "SyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "character varying(100)", + maxLength: 100, + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "SyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTaskUpdates"); + + migrationBuilder.DropColumn( + name: "CommentsSyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "CommentsSyncInfo_SyncGroup", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "RevisionsSyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "RevisionsSyncInfo_SyncGroup", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "SyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.RenameColumn( + name: "SyncInfo_SyncGroup", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + newName: "SyncInfo_SyncHash"); + + migrationBuilder.RenameColumn( + name: "WorkItemSyncInfo_SyncGroup", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "WorkItemSyncInfo_SyncHash"); + + migrationBuilder.RenameColumn( + name: "WorkItemSyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "UpdatesSyncInfo_SyncHash"); + + migrationBuilder.RenameColumn( + name: "UpdatesSyncInfo_SyncGroup", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "RevisionsSyncInfo_SyncHash"); + + migrationBuilder.RenameColumn( + name: "UpdatesSyncInfo_ContentHash", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "CommentsSyncInfo_SyncHash"); + + migrationBuilder.RenameColumn( + name: "SyncInfo_SyncGroup", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "SyncInfo_SyncHash"); + + migrationBuilder.AddColumn( + name: "BadgeSyncInfo_LastSyncDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "BadgeSyncInfo_LastSyncOffset", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "character varying(40)", + maxLength: 40, + nullable: true); + + migrationBuilder.AddColumn( + name: "BadgeSyncInfo_SyncEndDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "BadgeSyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AddColumn( + name: "BadgeSyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AddColumn( + name: "BadgeSyncInfo_SyncStartDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "BadgeSyncInfo_SyncStatus", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "integer", + nullable: true); + + migrationBuilder.AddColumn( + name: "DocumentSyncInfo_LastSyncDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "DocumentSyncInfo_LastSyncOffset", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "character varying(40)", + maxLength: 40, + nullable: true); + + migrationBuilder.AddColumn( + name: "DocumentSyncInfo_SyncEndDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "DocumentSyncInfo_SyncHash", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AddColumn( + name: "DocumentSyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AddColumn( + name: "DocumentSyncInfo_SyncStartDateTime", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "DocumentSyncInfo_SyncStatus", + schema: "CrystaLearn", + table: "CrystaPrograms", + type: "integer", + nullable: true); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251121101832_UpdatePropertyNameInCrystaTaskUpdate.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251121101832_UpdatePropertyNameInCrystaTaskUpdate.Designer.cs new file mode 100644 index 00000000..18a91937 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251121101832_UpdatePropertyNameInCrystaTaskUpdate.Designer.cs @@ -0,0 +1,1928 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251121101832_UpdatePropertyNameInCrystaTaskUpdate")] + partial class UpdatePropertyNameInCrystaTaskUpdate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.8") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .HasColumnType("integer"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("State"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AzureCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("AzureWorkItemId") + .HasColumnType("integer"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("EditedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .HasColumnType("integer"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AzureWorkItemId"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentsSnapshot") + .HasColumnType("text"); + + b.Property("AzureWorkItemId") + .HasColumnType("integer"); + + b.Property("ChangeDetails") + .HasColumnType("text"); + + b.Property("ChangeSummary") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentsSnapshot") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromUpdateId") + .HasColumnType("integer"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("FieldsSnapshot") + .HasColumnType("text"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationsSnapshot") + .HasColumnType("text"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("RevisionNumber") + .HasColumnType("integer"); + + b.Property("SnapshotJson") + .HasColumnType("text"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Title") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("AzureWorkItemId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("RevisionNumber"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderTaskId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CrystaTask"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251121101832_UpdatePropertyNameInCrystaTaskUpdate.cs b/src/Core/CrystaLearn.Core/Migrations/20251121101832_UpdatePropertyNameInCrystaTaskUpdate.cs new file mode 100644 index 00000000..5dfec2c8 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251121101832_UpdatePropertyNameInCrystaTaskUpdate.cs @@ -0,0 +1,96 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class UpdatePropertyNameInCrystaTaskUpdate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_CrystaTaskUpdates_AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates"); + + migrationBuilder.DropColumn( + name: "AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates"); + + migrationBuilder.RenameColumn( + name: "AzureUpdateId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + newName: "ProviderUpdateId"); + + migrationBuilder.AlterColumn( + name: "Revision", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + type: "text", + nullable: false, + oldClrType: typeof(int), + oldType: "integer"); + + migrationBuilder.AddColumn( + name: "ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + type: "character varying(200)", + maxLength: 200, + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskUpdates_ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + column: "ProviderTaskId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_CrystaTaskUpdates_ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates"); + + migrationBuilder.DropColumn( + name: "ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates"); + + migrationBuilder.RenameColumn( + name: "ProviderUpdateId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + newName: "AzureUpdateId"); + + migrationBuilder.AlterColumn( + name: "Revision", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + type: "integer", + nullable: false, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AddColumn( + name: "AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskUpdates_AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + column: "AzureWorkItemId"); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251126075751_RefactorCrystaTaskProperty.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251126075751_RefactorCrystaTaskProperty.Designer.cs new file mode 100644 index 00000000..2109e80e --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251126075751_RefactorCrystaTaskProperty.Designer.cs @@ -0,0 +1,1864 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251126075751_RefactorCrystaTaskProperty")] + partial class RefactorCrystaTaskProperty + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.8") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("Discriminator") + .IsRequired() + .HasMaxLength(21) + .HasColumnType("character varying(21)"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("State"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + + b.HasDiscriminator().HasValue("CrystaTask"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("EditedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ProviderTaskId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderTaskId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasBaseType("CrystaLearn.Core.Models.Crysta.CrystaTask"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("Revision"); + + b.HasDiscriminator().HasValue("CrystaTaskRevision"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CrystaTask"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251126075751_RefactorCrystaTaskProperty.cs b/src/Core/CrystaLearn.Core/Migrations/20251126075751_RefactorCrystaTaskProperty.cs new file mode 100644 index 00000000..26bd238c --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251126075751_RefactorCrystaTaskProperty.cs @@ -0,0 +1,262 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class RefactorCrystaTaskProperty : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CrystaTaskRevisions", + schema: "CrystaLearn"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTaskComments_AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.DropColumn( + name: "AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.RenameColumn( + name: "AzureCommentId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "ProviderCommentId"); + + migrationBuilder.AlterColumn( + name: "Revision", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "text", + nullable: false, + oldClrType: typeof(int), + oldType: "integer"); + + migrationBuilder.AddColumn( + name: "CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "uuid", + nullable: true); + + migrationBuilder.AddColumn( + name: "Discriminator", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(21)", + maxLength: 21, + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "RevisionCode", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.AlterColumn( + name: "Revision", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "text", + nullable: false, + oldClrType: typeof(int), + oldType: "integer"); + + migrationBuilder.AddColumn( + name: "ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "character varying(200)", + maxLength: 200, + nullable: false, + defaultValue: ""); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "CrystaTaskId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_Revision", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "Revision"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "ProviderTaskId"); + + migrationBuilder.AddForeignKey( + name: "FK_CrystaTasks_CrystaTasks_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "CrystaTaskId", + principalSchema: "CrystaLearn", + principalTable: "CrystaTasks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_CrystaTasks_CrystaTasks_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_Revision", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTaskComments_ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.DropColumn( + name: "CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "Discriminator", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "RevisionCode", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.RenameColumn( + name: "ProviderCommentId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "AzureCommentId"); + + migrationBuilder.AlterColumn( + name: "Revision", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "integer", + nullable: false, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "Revision", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "integer", + nullable: false, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AddColumn( + name: "AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.CreateTable( + name: "CrystaTaskRevisions", + schema: "CrystaLearn", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + CrystaTaskId = table.Column(type: "uuid", nullable: false), + AttachmentsSnapshot = table.Column(type: "text", nullable: true), + AzureWorkItemId = table.Column(type: "integer", nullable: false), + ChangeDetails = table.Column(type: "text", nullable: true), + ChangeSummary = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true), + ChangedBy = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + ChangedDate = table.Column(type: "timestamp with time zone", nullable: false), + CommentsSnapshot = table.Column(type: "text", nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + CreatedDate = table.Column(type: "timestamp with time zone", nullable: false), + CreatedFromUpdateId = table.Column(type: "integer", nullable: true), + Description = table.Column(type: "text", nullable: true), + FieldsSnapshot = table.Column(type: "text", nullable: true), + ProjectId = table.Column(type: "uuid", nullable: false), + ProjectName = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + RawJson = table.Column(type: "text", nullable: true), + RelationsSnapshot = table.Column(type: "text", nullable: true), + RevisionCode = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + RevisionNumber = table.Column(type: "integer", nullable: false), + SnapshotJson = table.Column(type: "text", nullable: true), + State = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + Title = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CrystaTaskRevisions", x => x.Id); + table.ForeignKey( + name: "FK_CrystaTaskRevisions_CrystaTasks_CrystaTaskId", + column: x => x.CrystaTaskId, + principalSchema: "CrystaLearn", + principalTable: "CrystaTasks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "AzureWorkItemId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_AzureWorkItemId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "AzureWorkItemId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_ChangedDate", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "ChangedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "CrystaTaskId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_RevisionNumber", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "RevisionNumber"); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251127142845_AddCrystaTaskRevisionsWithAllColumns.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251127142845_AddCrystaTaskRevisionsWithAllColumns.Designer.cs new file mode 100644 index 00000000..d5c04500 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251127142845_AddCrystaTaskRevisionsWithAllColumns.Designer.cs @@ -0,0 +1,2290 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251127142845_AddCrystaTaskRevisionsWithAllColumns")] + partial class AddCrystaTaskRevisionsWithAllColumns + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ParentId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("State"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("EditedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ProviderTaskId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedByIdString") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("State"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderTaskId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("Parent"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251127142845_AddCrystaTaskRevisionsWithAllColumns.cs b/src/Core/CrystaLearn.Core/Migrations/20251127142845_AddCrystaTaskRevisionsWithAllColumns.cs new file mode 100644 index 00000000..ba5c84d5 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251127142845_AddCrystaTaskRevisionsWithAllColumns.cs @@ -0,0 +1,328 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class AddCrystaTaskRevisionsWithAllColumns : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_CrystaTasks_CrystaTasks_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_Revision", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "Discriminator", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "RevisionCode", + schema: "CrystaLearn", + table: "CrystaTasks"); + + + migrationBuilder.CreateTable( + name: "CrystaTaskRevisions", + schema: "CrystaLearn", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + CrystaTaskId = table.Column(type: "uuid", nullable: false), + RevisionCode = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + ProviderTaskId = table.Column(type: "text", nullable: true), + AssignedToId = table.Column(type: "uuid", nullable: true), + CompletedById = table.Column(type: "uuid", nullable: true), + CreatedById = table.Column(type: "uuid", nullable: true), + AssignedToText = table.Column(type: "text", nullable: true), + CompletedByText = table.Column(type: "text", nullable: true), + CreatedByText = table.Column(type: "text", nullable: true), + Title = table.Column(type: "text", nullable: true), + Description = table.Column(type: "text", nullable: true), + DescriptionHtml = table.Column(type: "text", nullable: true), + TaskCreateDateTime = table.Column(type: "timestamp with time zone", nullable: true), + TaskDoneDateTime = table.Column(type: "timestamp with time zone", nullable: true), + TaskAssignDateTime = table.Column(type: "timestamp with time zone", nullable: true), + Status = table.Column(type: "integer", nullable: true), + ProviderTaskUrl = table.Column(type: "text", nullable: true), + WorkItemSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + WorkItemSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + WorkItemSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + WorkItemSyncInfo_ContentHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + WorkItemSyncInfo_SyncGroup = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + WorkItemSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + WorkItemSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + WorkItemSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + RevisionsSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + RevisionsSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + RevisionsSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + RevisionsSyncInfo_ContentHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + RevisionsSyncInfo_SyncGroup = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + RevisionsSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + RevisionsSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + RevisionsSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + UpdatesSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + UpdatesSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + UpdatesSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + UpdatesSyncInfo_ContentHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + UpdatesSyncInfo_SyncGroup = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + UpdatesSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + UpdatesSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + UpdatesSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + CommentsSyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + CommentsSyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + CommentsSyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + CommentsSyncInfo_ContentHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + CommentsSyncInfo_SyncGroup = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + CommentsSyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + CommentsSyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + CommentsSyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + CrystaProgramId = table.Column(type: "uuid", nullable: true), + ParentId = table.Column(type: "uuid", nullable: true), + WorkItemType = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + State = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + Reason = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + AreaPath = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), + IterationPath = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), + CreatedByDisplayName = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + CreatedByIdString = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + CreatedDate = table.Column(type: "timestamp with time zone", nullable: true), + ChangedBy = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + ChangedById = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + ChangedDate = table.Column(type: "timestamp with time zone", nullable: true), + RevisedBy = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + Revision = table.Column(type: "text", nullable: false), + ProjectId = table.Column(type: "uuid", nullable: true), + ProjectName = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + AreaId = table.Column(type: "uuid", nullable: true), + IterationId = table.Column(type: "uuid", nullable: true), + Severity = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + Priority = table.Column(type: "integer", nullable: true), + OriginalEstimate = table.Column(type: "double precision", nullable: true), + RemainingWork = table.Column(type: "double precision", nullable: true), + CompletedWork = table.Column(type: "double precision", nullable: true), + StoryPoints = table.Column(type: "double precision", nullable: true), + Tags = table.Column(type: "character varying(2000)", maxLength: 2000, nullable: true), + AttachmentsCount = table.Column(type: "integer", nullable: false), + Relations = table.Column(type: "text", nullable: true), + Links = table.Column(type: "text", nullable: true), + IsDeleted = table.Column(type: "boolean", nullable: false), + CommentCount = table.Column(type: "integer", nullable: false), + BoardColumn = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + BoardColumnDone = table.Column(type: "boolean", nullable: false), + StateChangeDate = table.Column(type: "timestamp with time zone", nullable: true), + DueDate = table.Column(type: "timestamp with time zone", nullable: true), + StartDate = table.Column(type: "timestamp with time zone", nullable: true), + ClosedDate = table.Column(type: "timestamp with time zone", nullable: true), + ResolvedDate = table.Column(type: "timestamp with time zone", nullable: true), + ExternalId = table.Column(type: "character varying(200)", maxLength: 200, nullable: true), + CustomFields = table.Column(type: "text", nullable: true), + RawJson = table.Column(type: "text", nullable: true), + SystemFields = table.Column(type: "text", nullable: true), + CreatedFromRevisionId = table.Column(type: "integer", nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CrystaTaskRevisions", x => x.Id); + table.ForeignKey( + name: "FK_CrystaTaskRevisions_CrystaPrograms_CrystaProgramId", + column: x => x.CrystaProgramId, + principalSchema: "CrystaLearn", + principalTable: "CrystaPrograms", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_CrystaTaskRevisions_CrystaTasks_CrystaTaskId", + column: x => x.CrystaTaskId, + principalSchema: "CrystaLearn", + principalTable: "CrystaTasks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CrystaTaskRevisions_Users_AssignedToId", + column: x => x.AssignedToId, + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_CrystaTaskRevisions_Users_CompletedById", + column: x => x.CompletedById, + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_CrystaTaskRevisions_Users_CreatedById", + column: x => x.CreatedById, + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_ParentId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "ParentId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_AssignedToId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "AssignedToId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_ChangedDate", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "ChangedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_CompletedById", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "CompletedById"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_CreatedById", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "CreatedById"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_CreatedDate", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "CreatedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_CrystaProgramId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "CrystaProgramId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "CrystaTaskId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_ProjectId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "ProjectId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_ProviderTaskId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "ProviderTaskId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_Revision", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "Revision"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_State", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "State"); + + migrationBuilder.AddForeignKey( + name: "FK_CrystaTasks_CrystaTasks_ParentId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "ParentId", + principalSchema: "CrystaLearn", + principalTable: "CrystaTasks", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_CrystaTasks_CrystaTasks_ParentId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropTable( + name: "CrystaTaskRevisions", + schema: "CrystaLearn"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_ParentId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.AddColumn( + name: "CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "uuid", + nullable: true); + + migrationBuilder.AddColumn( + name: "Discriminator", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(21)", + maxLength: 21, + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "RevisionCode", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "CrystaTaskId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_Revision", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "Revision"); + + migrationBuilder.AddForeignKey( + name: "FK_CrystaTasks_CrystaTasks_CrystaTaskId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "CrystaTaskId", + principalSchema: "CrystaLearn", + principalTable: "CrystaTasks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251128085546_AddCrystaProgramSyncModule.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251128085546_AddCrystaProgramSyncModule.Designer.cs new file mode 100644 index 00000000..81183991 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251128085546_AddCrystaProgramSyncModule.Designer.cs @@ -0,0 +1,2378 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251128085546_AddCrystaProgramSyncModule")] + partial class AddCrystaProgramSyncModule + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("ModuleType") + .HasColumnType("integer"); + + b.Property("SyncConfig") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ModuleType"); + + b.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ParentId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("State"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("EditedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ProviderTaskId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedByIdString") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("State"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderTaskId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaProgramSyncModuleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaProgramSyncModuleId"); + + b1.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaProgramSyncModuleId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("SyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("Parent"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251128085546_AddCrystaProgramSyncModule.cs b/src/Core/CrystaLearn.Core/Migrations/20251128085546_AddCrystaProgramSyncModule.cs new file mode 100644 index 00000000..0f7f9327 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251128085546_AddCrystaProgramSyncModule.cs @@ -0,0 +1,67 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class AddCrystaProgramSyncModule : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CrystaProgramSyncModules", + schema: "CrystaLearn", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false, defaultValueSql: "gen_random_uuid()"), + CrystaProgramId = table.Column(type: "uuid", nullable: false), + ModuleType = table.Column(type: "integer", nullable: false), + SyncConfig = table.Column(type: "text", nullable: true), + SyncInfo_SyncId = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + SyncInfo_SyncStartDateTime = table.Column(type: "timestamp with time zone", nullable: true), + SyncInfo_SyncEndDateTime = table.Column(type: "timestamp with time zone", nullable: true), + SyncInfo_ContentHash = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + SyncInfo_SyncGroup = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + SyncInfo_SyncStatus = table.Column(type: "integer", nullable: true), + SyncInfo_LastSyncDateTime = table.Column(type: "timestamp with time zone", nullable: true), + SyncInfo_LastSyncOffset = table.Column(type: "character varying(40)", maxLength: 40, nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + UpdatedAt = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CrystaProgramSyncModules", x => x.Id); + table.ForeignKey( + name: "FK_CrystaProgramSyncModules_CrystaPrograms_CrystaProgramId", + column: x => x.CrystaProgramId, + principalSchema: "CrystaLearn", + principalTable: "CrystaPrograms", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_CrystaProgramSyncModules_CrystaProgramId", + schema: "CrystaLearn", + table: "CrystaProgramSyncModules", + column: "CrystaProgramId"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaProgramSyncModules_ModuleType", + schema: "CrystaLearn", + table: "CrystaProgramSyncModules", + column: "ModuleType"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CrystaProgramSyncModules", + schema: "CrystaLearn"); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251202202840_AddProviderStatusProviderParentId.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251202202840_AddProviderStatusProviderParentId.Designer.cs new file mode 100644 index 00000000..4c0c49b3 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251202202840_AddProviderStatusProviderParentId.Designer.cs @@ -0,0 +1,2384 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251202202840_AddProviderStatusProviderParentId")] + partial class AddProviderStatusProviderParentId + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("ModuleType") + .HasColumnType("integer"); + + b.Property("SyncConfig") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ModuleType"); + + b.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderParentId") + .HasColumnType("text"); + + b.Property("ProviderStatus") + .HasColumnType("text"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ParentId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("State"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("EditedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ProviderTaskId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedByIdString") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("State"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderTaskId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaProgramSyncModuleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaProgramSyncModuleId"); + + b1.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaProgramSyncModuleId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("SyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("Parent"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251202202840_AddProviderStatusProviderParentId.cs b/src/Core/CrystaLearn.Core/Migrations/20251202202840_AddProviderStatusProviderParentId.cs new file mode 100644 index 00000000..84ee886d --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251202202840_AddProviderStatusProviderParentId.cs @@ -0,0 +1,42 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class AddProviderStatusProviderParentId : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ProviderParentId", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "text", + nullable: true); + + migrationBuilder.AddColumn( + name: "ProviderStatus", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "text", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ProviderParentId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "ProviderStatus", + schema: "CrystaLearn", + table: "CrystaTasks"); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251202204501_AddUniqueIndexToSyncId.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251202204501_AddUniqueIndexToSyncId.Designer.cs new file mode 100644 index 00000000..85f9934f --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251202204501_AddUniqueIndexToSyncId.Designer.cs @@ -0,0 +1,2396 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251202204501_AddUniqueIndexToSyncId")] + partial class AddUniqueIndexToSyncId + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("ModuleType") + .HasColumnType("integer"); + + b.Property("SyncConfig") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ModuleType"); + + b.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderParentId") + .HasColumnType("text"); + + b.Property("ProviderStatus") + .HasColumnType("text"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ParentId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("State"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("EditedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ProviderTaskId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedByIdString") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("State"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderTaskId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaProgramSyncModuleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaProgramSyncModuleId"); + + b1.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaProgramSyncModuleId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("SyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("Parent"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251202204501_AddUniqueIndexToSyncId.cs b/src/Core/CrystaLearn.Core/Migrations/20251202204501_AddUniqueIndexToSyncId.cs new file mode 100644 index 00000000..c0506faa --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251202204501_AddUniqueIndexToSyncId.cs @@ -0,0 +1,66 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class AddUniqueIndexToSyncId : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskUpdates_SyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates", + column: "SyncInfo_SyncId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_WorkItemSyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "WorkItemSyncInfo_SyncId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskRevisions_WorkItemSyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions", + column: "WorkItemSyncInfo_SyncId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_SyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "SyncInfo_SyncId", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_CrystaTaskUpdates_SyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaTaskUpdates"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_WorkItemSyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTaskRevisions_WorkItemSyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaTaskRevisions"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTaskComments_SyncInfo_SyncId", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251204144555_RefactorCrystaTask.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251204144555_RefactorCrystaTask.Designer.cs new file mode 100644 index 00000000..f0d56401 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251204144555_RefactorCrystaTask.Designer.cs @@ -0,0 +1,2369 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251204144555_RefactorCrystaTask")] + partial class RefactorCrystaTask + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("ModuleType") + .HasColumnType("integer"); + + b.Property("SyncConfig") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ModuleType"); + + b.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderParentId") + .HasColumnType("text"); + + b.Property("ProviderStatus") + .HasColumnType("text"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskChangedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ParentId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Status"); + + b.HasIndex("TaskCreateDateTime"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("EditedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ProviderTaskId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedByIdString") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("State"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderTaskId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaProgramSyncModuleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaProgramSyncModuleId"); + + b1.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaProgramSyncModuleId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("SyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("Parent"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251204144555_RefactorCrystaTask.cs b/src/Core/CrystaLearn.Core/Migrations/20251204144555_RefactorCrystaTask.cs new file mode 100644 index 00000000..175c124a --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251204144555_RefactorCrystaTask.cs @@ -0,0 +1,244 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class RefactorCrystaTask : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_ChangedDate", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_CreatedDate", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_State", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "ChangedDate", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "ClosedDate", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "CreatedByDisplayName", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "CreatedDate", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "DueDate", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "ResolvedDate", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "StartDate", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropColumn( + name: "State", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.RenameColumn( + name: "StateChangeDate", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "TaskChangedDateTime"); + + migrationBuilder.AlterColumn( + name: "Revision", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(50)", + maxLength: 50, + nullable: false, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "CommentCount", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "integer", + nullable: true, + oldClrType: typeof(int), + oldType: "integer"); + + migrationBuilder.AlterColumn( + name: "AttachmentsCount", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "integer", + nullable: true, + oldClrType: typeof(int), + oldType: "integer"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_Status", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "Status"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_TaskCreateDateTime", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "TaskCreateDateTime"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_Status", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTasks_TaskCreateDateTime", + schema: "CrystaLearn", + table: "CrystaTasks"); + + migrationBuilder.RenameColumn( + name: "TaskChangedDateTime", + schema: "CrystaLearn", + table: "CrystaTasks", + newName: "StateChangeDate"); + + migrationBuilder.AlterColumn( + name: "Revision", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "text", + nullable: false, + oldClrType: typeof(string), + oldType: "character varying(50)", + oldMaxLength: 50); + + migrationBuilder.AlterColumn( + name: "CommentCount", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "integer", + nullable: false, + defaultValue: 0, + oldClrType: typeof(int), + oldType: "integer", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "AttachmentsCount", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "integer", + nullable: false, + defaultValue: 0, + oldClrType: typeof(int), + oldType: "integer", + oldNullable: true); + + migrationBuilder.AddColumn( + name: "ChangedDate", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "ClosedDate", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "CreatedByDisplayName", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(255)", + maxLength: 255, + nullable: true); + + migrationBuilder.AddColumn( + name: "CreatedDate", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "DueDate", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "ResolvedDate", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "StartDate", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.AddColumn( + name: "State", + schema: "CrystaLearn", + table: "CrystaTasks", + type: "character varying(100)", + maxLength: 100, + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_ChangedDate", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "ChangedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_CreatedDate", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "CreatedDate"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTasks_State", + schema: "CrystaLearn", + table: "CrystaTasks", + column: "State"); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251205105438_RefactorCrystaCommentTask.Designer.cs b/src/Core/CrystaLearn.Core/Migrations/20251205105438_RefactorCrystaCommentTask.Designer.cs new file mode 100644 index 00000000..e300ee0d --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251205105438_RefactorCrystaCommentTask.Designer.cs @@ -0,0 +1,2383 @@ +// +using System; +using CrystaLearn.Core.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20251205105438_RefactorCrystaCommentTask")] + partial class RefactorCrystaCommentTask + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("CrystaLearn") + .HasAnnotation("ProductVersion", "9.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CrystaLearn.Core.Models.Attachments.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Kind") + .HasColumnType("integer"); + + b.Property("Path") + .HasColumnType("text"); + + b.HasKey("Id", "Kind"); + + b.ToTable("Attachments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Chatbot.SystemPrompt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("bytea"); + + b.Property("Markdown") + .IsRequired() + .HasColumnType("text"); + + b.Property("PromptKind") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PromptKind") + .IsUnique(); + + b.ToTable("SystemPrompts", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code") + .IsUnique(); + + b.HasIndex("IsActive"); + + b.ToTable("CrystaPrograms", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("ModuleType") + .HasColumnType("integer"); + + b.Property("SyncConfig") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ModuleType"); + + b.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedById1") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderParentId") + .HasColumnType("text"); + + b.Property("ProviderStatus") + .HasColumnType("text"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskChangedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ParentId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Status"); + + b.HasIndex("TaskCreateDateTime"); + + b.ToTable("CrystaTasks", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ContentHtml") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedById") + .HasColumnType("uuid"); + + b.Property("EditedByText") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ProviderTaskId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CreatedDateTime"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("EditedById"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") + .HasColumnType("text"); + + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") + .HasColumnType("text"); + + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedByIdString") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedByText") + .HasColumnType("text"); + + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("CustomFields") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IterationId") + .HasColumnType("uuid"); + + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") + .HasColumnType("text"); + + b.Property("OriginalEstimate") + .HasColumnType("double precision"); + + b.Property("ParentId") + .HasColumnType("uuid"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("uuid"); + + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ProviderTaskId") + .HasColumnType("text"); + + b.Property("ProviderTaskUrl") + .HasColumnType("text"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedToId"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("State"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AttachmentChange") + .HasColumnType("text"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") + .HasColumnType("text"); + + b.Property("CommentText") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") + .HasColumnType("text"); + + b.Property("OldValue") + .HasColumnType("text"); + + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderTaskId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("RelationChange") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); + + b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaProgramSyncModuleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaProgramSyncModuleId"); + + b1.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaProgramSyncModuleId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("SyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("Parent"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "EditedBy") + .WithMany() + .HasForeignKey("EditedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskCommentId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTaskComments", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("EditedBy"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskRevisionId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskUpdateId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.Role", "Role") + .WithMany("Users") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Sessions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("WebAuthnCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.UserSession", "UserSession") + .WithOne("PushNotificationSubscription") + .HasForeignKey("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", "UserSessionId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("UserSession"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("Roles"); + + b.Navigation("Sessions"); + + b.Navigation("Tokens"); + + b.Navigation("WebAuthnCredentials"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Navigation("PushNotificationSubscription"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/20251205105438_RefactorCrystaCommentTask.cs b/src/Core/CrystaLearn.Core/Migrations/20251205105438_RefactorCrystaCommentTask.cs new file mode 100644 index 00000000..899357a6 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Migrations/20251205105438_RefactorCrystaCommentTask.cs @@ -0,0 +1,198 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace CrystaLearn.Core.Migrations +{ + /// + public partial class RefactorCrystaCommentTask : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_CrystaTaskComments_CreatedDate", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.DropColumn( + name: "CreatedDate", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.RenameColumn( + name: "EditedDate", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "EditedDateTime"); + + migrationBuilder.RenameColumn( + name: "EditedBy", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "EditedByText"); + + migrationBuilder.RenameColumn( + name: "CreatedBy", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "CreatedByText"); + + migrationBuilder.DropColumn( + name: "EditedById", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.DropColumn( + name: "CreatedById", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.AddColumn( + name: "EditedById", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "uuid", + nullable: true); + + migrationBuilder.AddColumn( + name: "CreatedById", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "uuid", + nullable: true); + + migrationBuilder.AddColumn( + name: "CreatedDateTime", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "timestamp with time zone", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_CreatedById", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "CreatedById"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_CreatedDateTime", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "CreatedDateTime"); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_EditedById", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "EditedById"); + + migrationBuilder.AddForeignKey( + name: "FK_CrystaTaskComments_Users_CreatedById", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "CreatedById", + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_CrystaTaskComments_Users_EditedById", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "EditedById", + principalSchema: "CrystaLearn", + principalTable: "Users", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_CrystaTaskComments_Users_CreatedById", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.DropForeignKey( + name: "FK_CrystaTaskComments_Users_EditedById", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTaskComments_CreatedById", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTaskComments_CreatedDateTime", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.DropIndex( + name: "IX_CrystaTaskComments_EditedById", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.DropColumn( + name: "CreatedDateTime", + schema: "CrystaLearn", + table: "CrystaTaskComments"); + + migrationBuilder.RenameColumn( + name: "EditedDateTime", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "EditedDate"); + + migrationBuilder.RenameColumn( + name: "EditedByText", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "EditedBy"); + + migrationBuilder.RenameColumn( + name: "CreatedByText", + schema: "CrystaLearn", + table: "CrystaTaskComments", + newName: "CreatedBy"); + + migrationBuilder.AlterColumn( + name: "EditedById", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "character varying(200)", + maxLength: 200, + nullable: true, + oldClrType: typeof(Guid), + oldType: "uuid", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "CreatedById", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "character varying(200)", + maxLength: 200, + nullable: true, + oldClrType: typeof(Guid), + oldType: "uuid", + oldNullable: true); + + migrationBuilder.AddColumn( + name: "CreatedDate", + schema: "CrystaLearn", + table: "CrystaTaskComments", + type: "timestamp with time zone", + nullable: false, + defaultValue: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0))); + + migrationBuilder.CreateIndex( + name: "IX_CrystaTaskComments_CreatedDate", + schema: "CrystaLearn", + table: "CrystaTaskComments", + column: "CreatedDate"); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Migrations/AppDbContextModelSnapshot.cs b/src/Core/CrystaLearn.Core/Migrations/AppDbContextModelSnapshot.cs index 97f84b07..941f4073 100644 --- a/src/Core/CrystaLearn.Core/Migrations/AppDbContextModelSnapshot.cs +++ b/src/Core/CrystaLearn.Core/Migrations/AppDbContextModelSnapshot.cs @@ -18,7 +18,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) #pragma warning disable 612, 618 modelBuilder .HasDefaultSchema("CrystaLearn") - .HasAnnotation("ProductVersion", "9.0.8") + .HasAnnotation("ProductVersion", "9.0.9") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); @@ -69,747 +69,2137 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("SystemPrompts", "CrystaLearn"); }); - modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgram", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasDefaultValueSql("gen_random_uuid()"); - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); + b.Property("BadgeSystemUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); - b.Property("Name") + b.Property("Code") + .IsRequired() .HasMaxLength(50) .HasColumnType("character varying(50)"); - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); b.HasKey("Id"); - b.HasIndex("Name") + b.HasIndex("Code") .IsUnique(); - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("Roles", "CrystaLearn"); + b.HasIndex("IsActive"); - b.HasData( - new - { - Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), - ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", - Name = "s-admin", - NormalizedName = "S-ADMIN" - }, - new - { - Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), - ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", - Name = "demo", - NormalizedName = "DEMO" - }); + b.ToTable("CrystaPrograms", "CrystaLearn"); }); - modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => { - b.Property("Id") + b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer"); + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); - b.Property("ClaimType") - .HasColumnType("text"); + b.Property("CrystaProgramId") + .HasColumnType("uuid"); - b.Property("ClaimValue") + b.Property("ModuleType") + .HasColumnType("integer"); + + b.Property("SyncConfig") .HasColumnType("text"); - b.Property("RoleId") - .HasColumnType("uuid"); + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); b.HasKey("Id"); - b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + b.HasIndex("CrystaProgramId"); - b.ToTable("RoleClaims", "CrystaLearn"); + b.HasIndex("ModuleType"); - b.HasData( - new - { - Id = 1, - ClaimType = "mx-p-s", - ClaimValue = "-1", - RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") - }, - new - { - Id = 2, - ClaimType = "feat", - ClaimValue = "3.0", - RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") - }, - new - { - Id = 3, - ClaimType = "feat", - ClaimValue = "3.1", - RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") - }, - new - { - Id = 4, - ClaimType = "feat", - ClaimValue = "4.0", - RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") - }); + b.ToTable("CrystaProgramSyncModules", "CrystaLearn"); }); - modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasDefaultValueSql("gen_random_uuid()"); - b.Property("AccessFailedCount") - .HasColumnType("integer"); + b.Property("AreaId") + .HasColumnType("uuid"); - b.Property("BirthDate") - .HasColumnType("timestamp with time zone"); + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") .HasColumnType("text"); - b.Property("ElevatedAccessTokenRequestedOn") - .HasColumnType("timestamp with time zone"); + b.Property("AttachmentsCount") + .HasColumnType("integer"); - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.Property("EmailConfirmed") + b.Property("BoardColumnDone") .HasColumnType("boolean"); - b.Property("EmailTokenRequestedOn") - .HasColumnType("timestamp with time zone"); + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); - b.Property("FullName") - .HasColumnType("text"); + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); - b.Property("Gender") + b.Property("CommentCount") .HasColumnType("integer"); - b.Property("HasProfilePicture") - .HasColumnType("boolean"); + b.Property("CompletedById") + .HasColumnType("uuid"); - b.Property("LockoutEnabled") - .HasColumnType("boolean"); + b.Property("CompletedByText") + .HasColumnType("text"); - b.Property("LockoutEnd") + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b.Property("CreatedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b.Property("CreatedById1") + .HasColumnType("uuid"); - b.Property("OtpRequestedOn") - .HasColumnType("timestamp with time zone"); + b.Property("CreatedByText") + .HasColumnType("text"); - b.Property("PasswordHash") + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CustomFields") .HasColumnType("text"); - b.Property("PhoneNumber") + b.Property("Description") .HasColumnType("text"); - b.Property("PhoneNumberConfirmed") + b.Property("DescriptionHtml") + .HasColumnType("text"); + + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") .HasColumnType("boolean"); - b.Property("PhoneNumberTokenRequestedOn") - .HasColumnType("timestamp with time zone"); + b.Property("IterationId") + .HasColumnType("uuid"); - b.Property("ResetPasswordTokenRequestedOn") - .HasColumnType("timestamp with time zone"); + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); - b.Property("SecurityStamp") + b.Property("Links") .HasColumnType("text"); - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); + b.Property("OriginalEstimate") + .HasColumnType("double precision"); - b.Property("TwoFactorTokenRequestedOn") - .HasColumnType("timestamp with time zone"); + b.Property("ParentId") + .HasColumnType("uuid"); - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b.Property("Priority") + .HasColumnType("integer"); - b.HasKey("Id"); + b.Property("ProjectId") + .HasColumnType("uuid"); - b.HasIndex("Email") - .IsUnique() - .HasFilter("\"Email\" IS NOT NULL"); + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); + b.Property("ProviderParentId") + .HasColumnType("text"); - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); + b.Property("ProviderStatus") + .HasColumnType("text"); - b.HasIndex("PhoneNumber") - .IsUnique() - .HasFilter("\"PhoneNumber\" IS NOT NULL"); + b.Property("ProviderTaskId") + .HasColumnType("text"); - b.ToTable("Users", "CrystaLearn"); + b.Property("ProviderTaskUrl") + .HasColumnType("text"); - b.HasData( - new - { - Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), - AccessFailedCount = 0, - BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), - ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", - Email = "test@bitplatform.dev", - EmailConfirmed = true, - EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), - FullName = "CrystaLearn test account", - Gender = 0, - HasProfilePicture = false, - LockoutEnabled = true, - NormalizedEmail = "TEST@BITPLATFORM.DEV", - NormalizedUserName = "TEST", - PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", - PhoneNumber = "+31684207362", - PhoneNumberConfirmed = true, - SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", - TwoFactorEnabled = false, - UserName = "test" - }); - }); + b.Property("RawJson") + .HasColumnType("text"); - modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") + .HasColumnType("text"); + + b.Property("RemainingWork") + .HasColumnType("double precision"); + + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("Revision") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Status") .HasColumnType("integer"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.Property("StoryPoints") + .HasColumnType("double precision"); - b.Property("ClaimType") + b.Property("SystemFields") .HasColumnType("text"); - b.Property("ClaimValue") + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskChangedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") .HasColumnType("text"); - b.Property("UserId") - .HasColumnType("uuid"); + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); b.HasKey("Id"); - b.HasIndex("UserId", "ClaimType", "ClaimValue"); + b.HasIndex("AssignedToId"); - b.ToTable("UserClaims", "CrystaLearn"); + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById1"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("ParentId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Status"); + + b.HasIndex("TaskCreateDateTime"); + + b.ToTable("CrystaTasks", "CrystaLearn"); }); - modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => { - b.Property("UserId") + b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasDefaultValueSql("gen_random_uuid()"); - b.Property("RoleId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasDefaultValueSql("gen_random_uuid()"); + b.Property("CommentType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.HasKey("UserId", "RoleId"); + b.Property("Content") + .HasColumnType("text"); - b.HasIndex("RoleId", "UserId") - .IsUnique(); + b.Property("ContentHtml") + .HasColumnType("text"); - b.ToTable("UserRoles", "CrystaLearn"); + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); - b.HasData( - new - { - UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), - RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") - }); + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedByText") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("EditedById") + .HasColumnType("uuid"); + + b.Property("EditedByText") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("EditedDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("FormattedText") + .HasColumnType("text"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsSystem") + .HasColumnType("boolean"); + + b.Property("ParentCommentId") + .HasColumnType("integer"); + + b.Property("ProviderCommentId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderCommentUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("ProviderTaskId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RawJson") + .HasColumnType("text"); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .HasColumnType("text"); + + b.Property("ThreadId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Visibility") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CreatedDateTime"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("EditedById"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskComments", "CrystaLearn"); }); - modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid") .HasDefaultValueSql("gen_random_uuid()"); - b.Property("Address") + b.Property("AreaId") + .HasColumnType("uuid"); + + b.Property("AreaPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("AssignedToId") + .HasColumnType("uuid"); + + b.Property("AssignedToText") .HasColumnType("text"); - b.Property("AppVersion") + b.Property("AttachmentsCount") + .HasColumnType("integer"); + + b.Property("BoardColumn") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("BoardColumnDone") + .HasColumnType("boolean"); + + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ClosedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CommentCount") + .HasColumnType("integer"); + + b.Property("CompletedById") + .HasColumnType("uuid"); + + b.Property("CompletedByText") .HasColumnType("text"); - b.Property("CultureName") + b.Property("CompletedWork") + .HasColumnType("double precision"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedByDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("CreatedById") + .HasColumnType("uuid"); + + b.Property("CreatedByIdString") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("CreatedByText") .HasColumnType("text"); - b.Property("DeviceInfo") + b.Property("CreatedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedFromRevisionId") + .HasColumnType("integer"); + + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("CustomFields") .HasColumnType("text"); - b.Property("IP") + b.Property("Description") .HasColumnType("text"); - b.Property("NotificationStatus") - .HasColumnType("integer"); + b.Property("DescriptionHtml") + .HasColumnType("text"); - b.Property("PlatformType") - .HasColumnType("integer"); + b.Property("DueDate") + .HasColumnType("timestamp with time zone"); - b.Property("Privileged") + b.Property("ExternalId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsDeleted") .HasColumnType("boolean"); - b.Property("RenewedOn") - .HasColumnType("bigint"); + b.Property("IterationId") + .HasColumnType("uuid"); - b.Property("SignalRConnectionId") + b.Property("IterationPath") + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("Links") .HasColumnType("text"); - b.Property("StartedOn") - .HasColumnType("bigint"); + b.Property("OriginalEstimate") + .HasColumnType("double precision"); - b.Property("UserId") + b.Property("ParentId") .HasColumnType("uuid"); - b.HasKey("Id"); + b.Property("Priority") + .HasColumnType("integer"); - b.HasIndex("UserId"); + b.Property("ProjectId") + .HasColumnType("uuid"); - b.ToTable("UserSessions", "CrystaLearn"); - }); + b.Property("ProjectName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); - modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => - { - b.Property("Id") - .HasColumnType("bytea"); + b.Property("ProviderTaskId") + .HasColumnType("text"); - b.Property("AaGuid") - .HasColumnType("uuid"); + b.Property("ProviderTaskUrl") + .HasColumnType("text"); - b.Property("AttestationClientDataJson") - .HasColumnType("bytea"); + b.Property("RawJson") + .HasColumnType("text"); - b.Property("AttestationFormat") + b.Property("Reason") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Relations") .HasColumnType("text"); - b.Property("AttestationObject") - .HasColumnType("bytea"); + b.Property("RemainingWork") + .HasColumnType("double precision"); - b.Property("IsBackedUp") - .HasColumnType("boolean"); + b.Property("ResolvedDate") + .HasColumnType("timestamp with time zone"); - b.Property("IsBackupEligible") - .HasColumnType("boolean"); + b.Property("RevisedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); - b.Property("PublicKey") - .HasColumnType("bytea"); + b.Property("Revision") + .IsRequired() + .HasColumnType("text"); - b.Property("RegDate") + b.Property("RevisionCode") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Severity") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("StartDate") .HasColumnType("timestamp with time zone"); - b.Property("SignCount") - .HasColumnType("bigint"); + b.Property("State") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.PrimitiveCollection("Transports") - .HasColumnType("integer[]"); + b.Property("StateChangeDate") + .HasColumnType("timestamp with time zone"); - b.Property("UserHandle") - .HasColumnType("bytea"); + b.Property("Status") + .HasColumnType("integer"); - b.Property("UserId") - .HasColumnType("uuid"); + b.Property("StoryPoints") + .HasColumnType("double precision"); + + b.Property("SystemFields") + .HasColumnType("text"); + + b.Property("Tags") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("TaskAssignDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskCreateDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("TaskDoneDateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkItemType") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); b.HasKey("Id"); - b.HasIndex("UserId"); + b.HasIndex("AssignedToId"); - b.ToTable("WebAuthnCredential", "CrystaLearn"); + b.HasIndex("ChangedDate"); + + b.HasIndex("CompletedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CreatedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("State"); + + b.ToTable("CrystaTaskRevisions", "CrystaLearn"); }); - modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => { - b.Property("Id") + b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); - b.Property("Auth") + b.Property("AttachmentChange") .HasColumnType("text"); - b.Property("DeviceId") - .IsRequired() + b.Property("ChangedBy") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("ChangedById") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ChangedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ChangedPropertiesJson") .HasColumnType("text"); - b.Property("Endpoint") + b.Property("CommentText") .HasColumnType("text"); - b.Property("ExpirationTime") - .HasColumnType("bigint"); + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); - b.Property("P256dh") + b.Property("CrystaProgramId") + .HasColumnType("uuid"); + + b.Property("CrystaTaskId") + .HasColumnType("uuid"); + + b.Property("FieldDisplayName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("FieldName") + .HasMaxLength(255) + .HasColumnType("character varying(255)"); + + b.Property("IsWorkItemFieldChange") + .HasColumnType("boolean"); + + b.Property("NewValue") .HasColumnType("text"); - b.Property("Platform") - .IsRequired() + b.Property("OldValue") .HasColumnType("text"); - b.Property("PushChannel") - .IsRequired() + b.Property("Operation") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ProviderTaskId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUpdateId") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProviderUrl") + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("RawJson") .HasColumnType("text"); - b.Property("RenewedOn") - .HasColumnType("bigint"); + b.Property("RelationChange") + .HasColumnType("text"); - b.PrimitiveCollection("Tags") + b.Property("Revision") .IsRequired() - .HasColumnType("text[]"); + .HasColumnType("text"); - b.Property("UserSessionId") + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") .HasColumnType("uuid"); b.HasKey("Id"); - b.HasIndex("UserSessionId") - .IsUnique() - .HasFilter("\"UserSessionId\" IS NOT NULL"); + b.HasIndex("ChangedDate"); + + b.HasIndex("CrystaProgramId"); + + b.HasIndex("CrystaTaskId"); + + b.HasIndex("ProviderTaskId"); + + b.HasIndex("Revision"); + + b.HasIndex("UserId"); + + b.ToTable("CrystaTaskUpdates", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("Roles", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7"), + ConcurrencyStamp = "8ff71671-a1d6-5f97-abb9-d87d7b47d6e7", + Name = "s-admin", + NormalizedName = "S-ADMIN" + }, + new + { + Id = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8"), + ConcurrencyStamp = "9ff71672-a1d5-4f97-abb7-d87d6b47d5e8", + Name = "demo", + NormalizedName = "DEMO" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("RoleId", "ClaimType", "ClaimValue"); + + b.ToTable("RoleClaims", "CrystaLearn"); + + b.HasData( + new + { + Id = 1, + ClaimType = "mx-p-s", + ClaimValue = "-1", + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }, + new + { + Id = 2, + ClaimType = "feat", + ClaimValue = "3.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 3, + ClaimType = "feat", + ClaimValue = "3.1", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }, + new + { + Id = 4, + ClaimType = "feat", + ClaimValue = "4.0", + RoleId = new Guid("9ff71672-a1d5-4f97-abb7-d87d6b47d5e8") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("ElevatedAccessTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("EmailTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("FullName") + .HasColumnType("text"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HasProfilePicture") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("OtpRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("PhoneNumberTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("ResetPasswordTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("TwoFactorTokenRequestedOn") + .HasColumnType("timestamp with time zone"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique() + .HasFilter("\"Email\" IS NOT NULL"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.HasIndex("PhoneNumber") + .IsUnique() + .HasFilter("\"PhoneNumber\" IS NOT NULL"); + + b.ToTable("Users", "CrystaLearn"); + + b.HasData( + new + { + Id = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + AccessFailedCount = 0, + BirthDate = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + ConcurrencyStamp = "315e1a26-5b3a-4544-8e91-2760cd28e231", + Email = "test@bitplatform.dev", + EmailConfirmed = true, + EmailTokenRequestedOn = new DateTimeOffset(new DateTime(2023, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + FullName = "CrystaLearn test account", + Gender = 0, + HasProfilePicture = false, + LockoutEnabled = true, + NormalizedEmail = "TEST@BITPLATFORM.DEV", + NormalizedUserName = "TEST", + PasswordHash = "AQAAAAIAAYagAAAAEP0v3wxkdWtMkHA3Pp5/JfS+42/Qto9G05p2mta6dncSK37hPxEHa3PGE4aqN30Aag==", + PhoneNumber = "+31684207362", + PhoneNumberConfirmed = true, + SecurityStamp = "959ff4a9-4b07-4cc1-8141-c5fc033daf83", + TwoFactorEnabled = false, + UserName = "test" + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "ClaimType", "ClaimValue"); + + b.ToTable("UserClaims", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserRole", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("RoleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId") + .IsUnique(); + + b.ToTable("UserRoles", "CrystaLearn"); + + b.HasData( + new + { + UserId = new Guid("8ff71671-a1d6-4f97-abb9-d87d7b47d6e7"), + RoleId = new Guid("8ff71671-a1d6-5f97-abb9-d87d7b47d6e7") + }); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.UserSession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("AppVersion") + .HasColumnType("text"); + + b.Property("CultureName") + .HasColumnType("text"); + + b.Property("DeviceInfo") + .HasColumnType("text"); + + b.Property("IP") + .HasColumnType("text"); + + b.Property("NotificationStatus") + .HasColumnType("integer"); + + b.Property("PlatformType") + .HasColumnType("integer"); + + b.Property("Privileged") + .HasColumnType("boolean"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.Property("SignalRConnectionId") + .HasColumnType("text"); + + b.Property("StartedOn") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserSessions", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Identity.WebAuthnCredential", b => + { + b.Property("Id") + .HasColumnType("bytea"); + + b.Property("AaGuid") + .HasColumnType("uuid"); + + b.Property("AttestationClientDataJson") + .HasColumnType("bytea"); + + b.Property("AttestationFormat") + .HasColumnType("text"); + + b.Property("AttestationObject") + .HasColumnType("bytea"); + + b.Property("IsBackedUp") + .HasColumnType("boolean"); + + b.Property("IsBackupEligible") + .HasColumnType("boolean"); + + b.Property("PublicKey") + .HasColumnType("bytea"); + + b.Property("RegDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SignCount") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Transports") + .HasColumnType("integer[]"); + + b.Property("UserHandle") + .HasColumnType("bytea"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("WebAuthnCredential", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.PushNotification.PushNotificationSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Auth") + .HasColumnType("text"); + + b.Property("DeviceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Endpoint") + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("bigint"); + + b.Property("P256dh") + .HasColumnType("text"); + + b.Property("Platform") + .IsRequired() + .HasColumnType("text"); + + b.Property("PushChannel") + .IsRequired() + .HasColumnType("text"); + + b.Property("RenewedOn") + .HasColumnType("bigint"); + + b.PrimitiveCollection("Tags") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("UserSessionId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserSessionId") + .IsUnique() + .HasFilter("\"UserSessionId\" IS NOT NULL"); b.ToTable("PushNotificationSubscriptions", "CrystaLearn"); }); - modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("UserLogins", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("UserTokens", "CrystaLearn"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet", "jobs"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState", "jobs"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", "CrystaLearn"); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaProgramSyncModule", b => + { + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaProgramSyncModuleId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaProgramSyncModuleId"); + + b1.ToTable("CrystaProgramSyncModules", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaProgramSyncModuleId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("SyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTask", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); + + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById1"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); + + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); + + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); + + b1.Property("SyncStatus") + .HasColumnType("integer"); + + b1.HasKey("CrystaTaskId"); + + b1.HasIndex("SyncId") + .IsUnique(); + + b1.ToTable("CrystaTasks", "CrystaLearn"); + + b1.WithOwner() + .HasForeignKey("CrystaTaskId"); + }); + + b.Navigation("AssignedTo"); + + b.Navigation("CommentsSyncInfo") + .IsRequired(); + + b.Navigation("CompletedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("CrystaProgram"); + + b.Navigation("Parent"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); + }); + + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskComment", b => + { + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); + + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Property("ProviderKey") - .HasColumnType("text"); + b.HasOne("CrystaLearn.Core.Models.Identity.User", "EditedBy") + .WithMany() + .HasForeignKey("EditedById"); - b.Property("ProviderDisplayName") - .HasColumnType("text"); + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); - b.Property("UserId") - .HasColumnType("uuid"); + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskCommentId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); - b.HasKey("LoginProvider", "ProviderKey"); + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.HasIndex("UserId"); + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); - b.ToTable("UserLogins", "CrystaLearn"); - }); + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); - modelBuilder.Entity("CrystaLearn.Server.Api.Models.Identity.UserToken", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasDefaultValueSql("gen_random_uuid()"); + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); - b.Property("LoginProvider") - .HasColumnType("text"); + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.Property("Name") - .HasColumnType("text"); + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.Property("Value") - .HasColumnType("text"); + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); - b.HasKey("UserId", "LoginProvider", "Name"); + b1.Property("SyncStatus") + .HasColumnType("integer"); - b.ToTable("UserTokens", "CrystaLearn"); - }); + b1.HasKey("CrystaTaskCommentId"); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint"); + b1.HasIndex("SyncId") + .IsUnique(); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b1.ToTable("CrystaTaskComments", "CrystaLearn"); - b.Property("ExpireAt") - .HasColumnType("timestamp with time zone"); + b1.WithOwner() + .HasForeignKey("CrystaTaskCommentId"); + }); - b.Property("Key") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b.Navigation("CreatedBy"); - b.Property("Value") - .HasColumnType("bigint"); + b.Navigation("CrystaProgram"); - b.HasKey("Id"); + b.Navigation("CrystaTask"); - b.HasIndex("ExpireAt"); + b.Navigation("EditedBy"); - b.HasIndex("Key", "Value"); + b.Navigation("SyncInfo"); - b.ToTable("HangfireCounter", "jobs"); + b.Navigation("User"); }); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskRevision", b => { - b.Property("Key") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b.HasOne("CrystaLearn.Core.Models.Identity.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId"); - b.Property("Field") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CompletedBy") + .WithMany() + .HasForeignKey("CompletedById"); - b.Property("ExpireAt") - .HasColumnType("timestamp with time zone"); + b.HasOne("CrystaLearn.Core.Models.Identity.User", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); - b.Property("Value") - .HasColumnType("text"); + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); - b.HasKey("Key", "Field"); + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasIndex("ExpireAt"); + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "CommentsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); - b.ToTable("HangfireHash", "jobs"); - }); + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint"); + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); - b.Property("ExpireAt") - .HasColumnType("timestamp with time zone"); + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.Property("InvocationData") - .IsRequired() - .HasColumnType("text"); + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.Property("StateId") - .HasColumnType("bigint"); + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); - b.Property("StateName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b1.Property("SyncStatus") + .HasColumnType("integer"); - b.HasKey("Id"); + b1.HasKey("CrystaTaskRevisionId"); - b.HasIndex("ExpireAt"); + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); - b.HasIndex("StateId"); + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); - b.HasIndex("StateName"); + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "RevisionsSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); - b.ToTable("HangfireJob", "jobs"); - }); + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => - { - b.Property("JobId") - .HasColumnType("bigint"); + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); - b.Property("Value") - .HasColumnType("text"); + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); - b.HasKey("JobId", "Name"); + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.ToTable("HangfireJobParameter", "jobs"); - }); + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => - { - b.Property("Key") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); - b.Property("Position") - .HasColumnType("integer"); + b1.Property("SyncStatus") + .HasColumnType("integer"); - b.Property("ExpireAt") - .HasColumnType("timestamp with time zone"); + b1.HasKey("CrystaTaskRevisionId"); - b.Property("Value") - .HasColumnType("text"); + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); - b.HasKey("Key", "Position"); + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); - b.HasIndex("ExpireAt"); + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "UpdatesSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); - b.ToTable("HangfireList", "jobs"); - }); + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => - { - b.Property("Id") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); - b.Property("AcquiredAt") - .HasColumnType("timestamp with time zone"); + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); - b.HasKey("Id"); + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); - b.ToTable("HangfireLock", "jobs"); - }); + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint"); + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); - b.Property("FetchedAt") - .IsConcurrencyToken() - .HasColumnType("timestamp with time zone"); + b1.Property("SyncStatus") + .HasColumnType("integer"); - b.Property("JobId") - .HasColumnType("bigint"); + b1.HasKey("CrystaTaskRevisionId"); - b.Property("Queue") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); - b.HasKey("Id"); + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); - b.HasIndex("JobId"); + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "WorkItemSyncInfo", b1 => + { + b1.Property("CrystaTaskRevisionId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); - b.HasIndex("Queue", "FetchedAt"); + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.ToTable("HangfireQueuedJob", "jobs"); - }); + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => - { - b.Property("Id") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); - b.Property("Heartbeat") - .HasColumnType("timestamp with time zone"); + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); - b.Property("Queues") - .IsRequired() - .HasColumnType("text"); + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.Property("StartedAt") - .HasColumnType("timestamp with time zone"); + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.Property("WorkerCount") - .HasColumnType("integer"); + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); - b.HasKey("Id"); + b1.Property("SyncStatus") + .HasColumnType("integer"); - b.HasIndex("Heartbeat"); + b1.HasKey("CrystaTaskRevisionId"); - b.ToTable("HangfireServer", "jobs"); - }); + b1.HasIndex("SyncId") + .IsUnique(); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => - { - b.Property("Key") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); + b1.ToTable("CrystaTaskRevisions", "CrystaLearn"); - b.Property("Value") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b1.WithOwner() + .HasForeignKey("CrystaTaskRevisionId"); + }); - b.Property("ExpireAt") - .HasColumnType("timestamp with time zone"); + b.Navigation("AssignedTo"); - b.Property("Score") - .HasColumnType("double precision"); + b.Navigation("CommentsSyncInfo") + .IsRequired(); - b.HasKey("Key", "Value"); + b.Navigation("CompletedBy"); - b.HasIndex("ExpireAt"); + b.Navigation("CreatedBy"); - b.HasIndex("Key", "Score"); + b.Navigation("CrystaProgram"); - b.ToTable("HangfireSet", "jobs"); + b.Navigation("CrystaTask"); + + b.Navigation("RevisionsSyncInfo") + .IsRequired(); + + b.Navigation("UpdatesSyncInfo") + .IsRequired(); + + b.Navigation("WorkItemSyncInfo") + .IsRequired(); }); - modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + modelBuilder.Entity("CrystaLearn.Core.Models.Crysta.CrystaTaskUpdate", b => { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint"); + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaProgram", "CrystaProgram") + .WithMany() + .HasForeignKey("CrystaProgramId"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.HasOne("CrystaLearn.Core.Models.Crysta.CrystaTask", "CrystaTask") + .WithMany() + .HasForeignKey("CrystaTaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); + b.HasOne("CrystaLearn.Core.Models.Identity.User", "User") + .WithMany() + .HasForeignKey("UserId"); - b.Property("Data") - .IsRequired() - .HasColumnType("text"); + b.OwnsOne("CrystaLearn.Core.Models.Crysta.SyncInfo", "SyncInfo", b1 => + { + b1.Property("CrystaTaskUpdateId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasDefaultValueSql("gen_random_uuid()"); - b.Property("JobId") - .HasColumnType("bigint"); + b1.Property("ContentHash") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); + b1.Property("LastSyncDateTime") + .HasColumnType("timestamp with time zone"); - b.Property("Reason") - .HasColumnType("text"); + b1.Property("LastSyncOffset") + .HasMaxLength(40) + .HasColumnType("character varying(40)"); - b.HasKey("Id"); + b1.Property("SyncEndDateTime") + .HasColumnType("timestamp with time zone"); - b.HasIndex("JobId"); + b1.Property("SyncGroup") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - b.ToTable("HangfireState", "jobs"); - }); + b1.Property("SyncId") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); - modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + b1.Property("SyncStartDateTime") + .HasColumnType("timestamp with time zone"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b1.Property("SyncStatus") + .HasColumnType("integer"); - b.Property("FriendlyName") - .HasColumnType("text"); + b1.HasKey("CrystaTaskUpdateId"); - b.Property("Xml") - .HasColumnType("text"); + b1.HasIndex("SyncId") + .IsUnique(); - b.HasKey("Id"); + b1.ToTable("CrystaTaskUpdates", "CrystaLearn"); - b.ToTable("DataProtectionKeys", "CrystaLearn"); + b1.WithOwner() + .HasForeignKey("CrystaTaskUpdateId"); + }); + + b.Navigation("CrystaProgram"); + + b.Navigation("CrystaTask"); + + b.Navigation("SyncInfo"); + + b.Navigation("User"); }); modelBuilder.Entity("CrystaLearn.Core.Models.Identity.RoleClaim", b => diff --git a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaProgram.cs b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaProgram.cs index 7c3b7096..526b9d90 100644 --- a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaProgram.cs +++ b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaProgram.cs @@ -13,7 +13,6 @@ public class CrystaProgram : Entity public virtual string? BadgeSystemUrl { get; set; } [MaxLength(300)] public virtual string? DocumentUrl { get; set; } - public virtual SyncInfo DocumentSyncInfo { get; set; } = new(); - public virtual SyncInfo BadgeSyncInfo { get; set; } = new(); + public virtual bool IsActive { get; set; } } diff --git a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTask.cs b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTask.cs index 402b25cb..6fbf8e6c 100644 --- a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTask.cs +++ b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTask.cs @@ -1,12 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using CrystaLearn.Core.Models.Identity; +using CrystaLearn.Core.Models.Identity; using CrystaLearn.Core.Models.Infra; namespace CrystaLearn.Core.Models.Crysta; + public class CrystaTask : Entity { public string? ProviderTaskId { get; set; } = default; @@ -22,7 +18,9 @@ public class CrystaTask : Entity public DateTimeOffset? TaskCreateDateTime { get; set; } public DateTimeOffset? TaskDoneDateTime { get; set; } public DateTimeOffset? TaskAssignDateTime { get; set; } + public DateTimeOffset? TaskChangedDateTime { get; set; } public CrystaTaskStatus? Status { get; set; } + public string? ProviderStatus { get; set; } public string? ProviderTaskUrl { get; set; } public SyncInfo WorkItemSyncInfo { get; set; } = new(); public SyncInfo RevisionsSyncInfo { get; set; } = new(); @@ -30,6 +28,81 @@ public class CrystaTask : Entity public SyncInfo CommentsSyncInfo { get; set; } public CrystaProgram? CrystaProgram { get; set; } + public Guid? ParentId { get; set; } + + public CrystaTask Parent { get; set; } + + [MaxLength(100)] + public string? WorkItemType { get; set; } + + [MaxLength(200)] + public string? Reason { get; set; } + + [MaxLength(500)] + public string? AreaPath { get; set; } + + [MaxLength(500)] + public string? IterationPath { get; set; } + + [MaxLength(200)] + public string? CreatedById { get; set; } + + [MaxLength(255)] + public string? ChangedBy { get; set; } + + [MaxLength(200)] + public string? ChangedById { get; set; } + + [MaxLength(255)] + public string? RevisedBy { get; set; } + + [MaxLength(50)] + public string Revision { get; set; } + + public Guid? ProjectId { get; set; } + + [MaxLength(255)] + public string? ProjectName { get; set; } + + public Guid? AreaId { get; set; } + public Guid? IterationId { get; set; } + + [MaxLength(100)] + public string? Severity { get; set; } + + public int? Priority { get; set; } + public double? OriginalEstimate { get; set; } + public double? RemainingWork { get; set; } + public double? CompletedWork { get; set; } + public double? StoryPoints { get; set; } + + [MaxLength(2000)] + public string? Tags { get; set; } + + public int? AttachmentsCount { get; set; } + + public string? Relations { get; set; } + public string? Links { get; set; } + + public bool IsDeleted { get; set; } + + public int? CommentCount { get; set; } + + [MaxLength(100)] + public string? BoardColumn { get; set; } + + public bool BoardColumnDone { get; set; } + + [MaxLength(200)] + public string? ExternalId { get; set; } + + public string? CustomFields { get; set; } + public string? RawJson { get; set; } + public string? SystemFields { get; set; } + + public int? CreatedFromRevisionId { get; set; } + + public string? ProviderParentId { get; set; } public override string ToString() { return $"{Title} / {Description}"; diff --git a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskComment.cs b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskComment.cs index e9cc480b..66500e54 100644 --- a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskComment.cs +++ b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskComment.cs @@ -5,11 +5,65 @@ namespace CrystaLearn.Core.Models.Crysta; public class CrystaTaskComment : Entity { + [MaxLength(200)] + public string ProviderTaskId { get; set; } + + [MaxLength(200)] + public string? ProviderCommentId { get; set; } + + // Thread identifiers for threaded discussions + public int? ThreadId { get; set; } + public int? ParentCommentId { get; set; } + + // Comment content + public string? Text { get; set; } + public string? FormattedText { get; set; } + + // Author information + [MaxLength(255)] + public string? CreatedByText { get; set; } + + public User? CreatedBy { get; set; } + + public DateTimeOffset? CreatedDateTime { get; set; } + + public DateTimeOffset? EditedDateTime { get; set; } + + [MaxLength(255)] + public string? EditedByText { get; set; } + + public User? EditedBy { get; set; } + + // Status flags + public bool IsDeleted { get; set; } + public bool IsSystem { get; set; } + + // Comment metadata + [MaxLength(100)] + public string? CommentType { get; set; } + + [MaxLength(100)] + public string? Visibility { get; set; } + + // Raw data + public string? RawJson { get; set; } + + [MaxLength(1000)] + public string? ProviderCommentUrl { get; set; } + + public string? Reactions { get; set; } + + public string Revision { get; set; } + + // Relationships public Guid CrystaTaskId { get; set; } public CrystaTask CrystaTask { get; set; } = default!; + + // Legacy fields for backward compatibility public User? User { get; set; } public SyncInfo? SyncInfo { get; set; } public CrystaProgram? CrystaProgram { get; set; } + public string? Content { get; set; } public string? ContentHtml { get; set; } } diff --git a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskRevision.cs b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskRevision.cs index 8e2c49a2..a0a07907 100644 --- a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskRevision.cs +++ b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskRevision.cs @@ -1,9 +1,133 @@ -namespace CrystaLearn.Core.Models.Crysta; +using CrystaLearn.Core.Models.Identity; +using CrystaLearn.Core.Models.Infra; -public class CrystaTaskRevision : CrystaTask +namespace CrystaLearn.Core.Models.Crysta; + +[Table("CrystaTaskRevisions", Schema = "CrystaLearn")] +public class CrystaTaskRevision : Entity { + // Reference to the original task public Guid CrystaTaskId { get; set; } public CrystaTask CrystaTask { get; set; } = default!; + + [MaxLength(100)] public string? RevisionCode { get; set; } + // Snapshot of all task fields at this revision + public string? ProviderTaskId { get; set; } + public Guid? AssignedToId { get; set; } + public User? AssignedTo { get; set; } + public Guid? CompletedById { get; set; } + public User? CompletedBy { get; set; } + public Guid? CreatedById { get; set; } + public User? CreatedBy { get; set; } + public string? AssignedToText { get; set; } + public string? CompletedByText { get; set; } + public string? CreatedByText { get; set; } + public string? Title { get; set; } + public string? Description { get; set; } + public string? DescriptionHtml { get; set; } + public DateTimeOffset? TaskCreateDateTime { get; set; } + public DateTimeOffset? TaskDoneDateTime { get; set; } + public DateTimeOffset? TaskAssignDateTime { get; set; } + public CrystaTaskStatus? Status { get; set; } + public string? ProviderTaskUrl { get; set; } + public SyncInfo WorkItemSyncInfo { get; set; } = new(); + public SyncInfo RevisionsSyncInfo { get; set; } = new(); + public SyncInfo UpdatesSyncInfo { get; set; } = new(); + public SyncInfo CommentsSyncInfo { get; set; } = new(); + public Guid? CrystaProgramId { get; set; } + public CrystaProgram? CrystaProgram { get; set; } + + public Guid? ParentId { get; set; } + + [MaxLength(100)] + public string? WorkItemType { get; set; } + + [MaxLength(100)] + public string? State { get; set; } + + [MaxLength(200)] + public string? Reason { get; set; } + + [MaxLength(500)] + public string? AreaPath { get; set; } + + [MaxLength(500)] + public string? IterationPath { get; set; } + + [MaxLength(255)] + public string? CreatedByDisplayName { get; set; } + + [MaxLength(200)] + public string? CreatedByIdString { get; set; } + + public DateTimeOffset? CreatedDate { get; set; } + + [MaxLength(255)] + public string? ChangedBy { get; set; } + + [MaxLength(200)] + public string? ChangedById { get; set; } + + public DateTimeOffset? ChangedDate { get; set; } + + [MaxLength(255)] + public string? RevisedBy { get; set; } + + public string Revision { get; set; } = default!; + + public Guid? ProjectId { get; set; } + + [MaxLength(255)] + public string? ProjectName { get; set; } + + public Guid? AreaId { get; set; } + public Guid? IterationId { get; set; } + + [MaxLength(100)] + public string? Severity { get; set; } + + public int? Priority { get; set; } + public double? OriginalEstimate { get; set; } + public double? RemainingWork { get; set; } + public double? CompletedWork { get; set; } + public double? StoryPoints { get; set; } + + [MaxLength(2000)] + public string? Tags { get; set; } + + public int AttachmentsCount { get; set; } + + public string? Relations { get; set; } + public string? Links { get; set; } + + public bool IsDeleted { get; set; } + + public int CommentCount { get; set; } + + [MaxLength(100)] + public string? BoardColumn { get; set; } + + public bool BoardColumnDone { get; set; } + + public DateTimeOffset? StateChangeDate { get; set; } + public DateTimeOffset? DueDate { get; set; } + public DateTimeOffset? StartDate { get; set; } + public DateTimeOffset? ClosedDate { get; set; } + public DateTimeOffset? ResolvedDate { get; set; } + + [MaxLength(200)] + public string? ExternalId { get; set; } + + public string? CustomFields { get; set; } + public string? RawJson { get; set; } + public string? SystemFields { get; set; } + + public int? CreatedFromRevisionId { get; set; } + + public override string ToString() + { + return $"{Title} / {Description} (Revision: {Revision})"; + } } diff --git a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskUpdate.cs b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskUpdate.cs index 407533a7..648cc734 100644 --- a/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskUpdate.cs +++ b/src/Core/CrystaLearn.Core/Models/Crysta/CrystaTaskUpdate.cs @@ -5,8 +5,59 @@ namespace CrystaLearn.Core.Models.Crysta; public class CrystaTaskUpdate : Entity { + [MaxLength(200)] + public string? ProviderUpdateId { get; set; } + + [MaxLength(200)] + public string? ProviderTaskId { get; set; } + + public string Revision { get; set; } + + // Actor information + [MaxLength(255)] + public string? ChangedBy { get; set; } + + [MaxLength(200)] + public string? ChangedById { get; set; } + + public DateTimeOffset ChangedDate { get; set; } + + // Field change details + [MaxLength(255)] + public string? FieldName { get; set; } + + [MaxLength(255)] + public string? FieldDisplayName { get; set; } + + public string? OldValue { get; set; } + public string? NewValue { get; set; } + + [MaxLength(100)] + public string? Operation { get; set; } + + // Comment attached to update + public string? CommentText { get; set; } + + // Flags + public bool IsWorkItemFieldChange { get; set; } + + // Additional change data + public string? ChangedPropertiesJson { get; set; } + public string? RelationChange { get; set; } + public string? AttachmentChange { get; set; } + + // Provider URL + [MaxLength(1000)] + public string? ProviderUrl { get; set; } + + // Raw data + public string? RawJson { get; set; } + + // Relationships public Guid CrystaTaskId { get; set; } public CrystaTask CrystaTask { get; set; } = default!; + + // Legacy fields for backward compatibility public User? User { get; set; } public SyncInfo? SyncInfo { get; set; } public CrystaProgram? CrystaProgram { get; set; } diff --git a/src/Core/CrystaLearn.Core/Models/Crysta/SyncInfo.cs b/src/Core/CrystaLearn.Core/Models/Crysta/SyncInfo.cs index 52304140..11fa6322 100644 --- a/src/Core/CrystaLearn.Core/Models/Crysta/SyncInfo.cs +++ b/src/Core/CrystaLearn.Core/Models/Crysta/SyncInfo.cs @@ -3,14 +3,26 @@ [ComplexType] public class SyncInfo { + /// + /// For relation between our system and 3rd party system + /// [MaxLength(100)] public string? SyncId { get; set; } public DateTimeOffset? SyncStartDateTime { get; set; } public DateTimeOffset? SyncEndDateTime { get; set; } + + [MaxLength(100)] + public string? ContentHash { get; set; } = string.Empty; + + /// + /// Azure board or Manual + /// [MaxLength(100)] - public string? SyncHash { get; set; } = string.Empty; + public string? SyncGroup { get; set; } = string.Empty; + public SyncStatus? SyncStatus { get; set; } public DateTimeOffset? LastSyncDateTime { get; set; } + [MaxLength(40)] public string? LastSyncOffset { get; set; } diff --git a/src/Core/CrystaLearn.Core/Services/AzureBoard/AzureBoardService.cs b/src/Core/CrystaLearn.Core/Services/AzureBoard/AzureBoardService.cs index b4d55181..dc790fa8 100644 --- a/src/Core/CrystaLearn.Core/Services/AzureBoard/AzureBoardService.cs +++ b/src/Core/CrystaLearn.Core/Services/AzureBoard/AzureBoardService.cs @@ -41,7 +41,9 @@ public async Task> GetWorkItemsRawQueryAsync( "System.WorkItemType", "System.AssignedTo", "System.CreatedDate", - "System.ChangedDate" + "System.ChangedDate", + "System.AttachedFileCount", + "System.CreatedBy" ]; var wiql = new Wiql { Query = query }; @@ -84,16 +86,19 @@ public async IAsyncEnumerable> EnumerateWorkItemsQueryAsync(Azure "System.ChangedDate", "System.AreaPath", "System.IterationPath", + "System.Parent", + "System.ChangedBy", + "System.ChangedDate", + "System.CreatedBy", + "System.AttachedFileCount" ]; var wiql = new Wiql { Query = query }; var result = await witClient.QueryByWiqlAsync(wiql, top: top).ConfigureAwait(false); var ids = result.WorkItems.Select(item => item.Id).ToArray(); - - var workItemChunks = ids.Chunk(200); - - foreach (var chunk in workItemChunks) + + foreach (var chunk in ids.Chunk(200)) { List workItems = await witClient.GetWorkItemsAsync(chunk, fields, result.AsOf).ConfigureAwait(false); yield return workItems; @@ -116,7 +121,8 @@ public async Task> GetWorkItemsBatchAsync(AzureBoardSyncConfig co "System.WorkItemType", "System.AssignedTo", "System.CreatedDate", - "System.ChangedDate" + "System.ChangedDate", + "System.CreatedBy" ]; var wiql = new Wiql { Query = query }; @@ -134,24 +140,54 @@ public async Task> GetWorkItemsBatchAsync(AzureBoardSyncConfig co return workItems; } - public async Task> GetRevisionsAsync(int workItemId) + public async Task> GetRevisionsAsync(AzureBoardSyncConfig config, int workItemId, int top = 200) { - var pat = Configuration["AzureDevOps:PersonalAccessToken"]; - VssConnection connection = new VssConnection(new Uri("https://dev.azure.com/cs-internship"), new VssBasicCredential(string.Empty, pat)); - using WorkItemTrackingHttpClient witClient = await connection.GetClientAsync(); + if (top > 200) + { + throw new InvalidOperationException("Top cannot be greater than 200"); + } - var result = await witClient.GetRevisionsAsync(workItemId, top: 100).ConfigureAwait(false); + VssConnection connection = new VssConnection( + new Uri($"https://dev.azure.com/{config.Organization}"), + new VssBasicCredential(string.Empty, config.PersonalAccessToken)); + + using WorkItemTrackingHttpClient witClient = await connection.GetClientAsync(); + + var result = await witClient.GetRevisionsAsync(workItemId, top: top).ConfigureAwait(false); return result; } - public async Task> GetUpdatesAsync(int workItemId) + public async Task> GetUpdatesAsync(AzureBoardSyncConfig config, int workItemId, int top = 200) { - var pat = Configuration["AzureDevOps:PersonalAccessToken"]; - VssConnection connection = new VssConnection(new Uri("https://dev.azure.com/cs-internship"), new VssBasicCredential(string.Empty, pat)); - using WorkItemTrackingHttpClient witClient = await connection.GetClientAsync(); + if (top > 200) + { + throw new InvalidOperationException("Top cannot be greater than 200"); + } + VssConnection connection = new VssConnection( + new Uri($"https://dev.azure.com/{config.Organization}"), + new VssBasicCredential(string.Empty, config.PersonalAccessToken)); + + using WorkItemTrackingHttpClient witClient = await connection.GetClientAsync(); - var result = await witClient.GetUpdatesAsync(workItemId, top: 100).ConfigureAwait(false); + var result = await witClient.GetUpdatesAsync(workItemId, top: top).ConfigureAwait(false); return result; } + + public async Task> GetCommentsAsync(AzureBoardSyncConfig config, int workItemId, int top = 200) + { + if (top > 200) + { + throw new InvalidOperationException("Top cannot be greater than 200"); + } + + VssConnection connection = new VssConnection( + new Uri($"https://dev.azure.com/{config.Organization}"), + new VssBasicCredential(string.Empty, config.PersonalAccessToken)); + + using WorkItemTrackingHttpClient witClient = await connection.GetClientAsync(); + + var result = await witClient.GetCommentsAsync(workItemId, top: top).ConfigureAwait(false); + return result.Comments.ToList(); + } } diff --git a/src/Core/CrystaLearn.Core/Services/Contracts/IAzureBoardService.cs b/src/Core/CrystaLearn.Core/Services/Contracts/IAzureBoardService.cs index 839097f0..688912ba 100644 --- a/src/Core/CrystaLearn.Core/Services/Contracts/IAzureBoardService.cs +++ b/src/Core/CrystaLearn.Core/Services/Contracts/IAzureBoardService.cs @@ -11,8 +11,9 @@ public interface IAzureBoardService { Task> GetWorkItemsRawQueryAsync(AzureBoardSyncConfig config, string query, string[]? fields = null, int? top = 200); Task> GetWorkItemsBatchAsync(AzureBoardSyncConfig config, string query, string[]? fields = null); - Task> GetRevisionsAsync(int workItemId); - Task> GetUpdatesAsync(int workItemId); + Task> GetRevisionsAsync(AzureBoardSyncConfig config, int workItemId, int top = 200); + Task> GetUpdatesAsync(AzureBoardSyncConfig config, int workItemId, int top = 200); + Task> GetCommentsAsync(AzureBoardSyncConfig config, int workItemId, int top = 200); IAsyncEnumerable> EnumerateWorkItemsQueryAsync( AzureBoardSyncConfig config, diff --git a/src/Core/CrystaLearn.Core/Services/Contracts/IAzureBoardSyncService.cs b/src/Core/CrystaLearn.Core/Services/Contracts/IAzureBoardSyncService.cs index d9152bd5..f7b66c1b 100644 --- a/src/Core/CrystaLearn.Core/Services/Contracts/IAzureBoardSyncService.cs +++ b/src/Core/CrystaLearn.Core/Services/Contracts/IAzureBoardSyncService.cs @@ -5,6 +5,6 @@ namespace CrystaLearn.Core.Services.Contracts; public interface IAzureBoardSyncService { - Task SyncAsync(CrystaProgramSyncModule module); + Task SyncAsync(CrystaProgramSyncModule module, List? workItemIds = null); } diff --git a/src/Core/CrystaLearn.Core/Services/Contracts/ICrystaProgramSyncModuleRepository.cs b/src/Core/CrystaLearn.Core/Services/Contracts/ICrystaProgramSyncModuleService.cs similarity index 52% rename from src/Core/CrystaLearn.Core/Services/Contracts/ICrystaProgramSyncModuleRepository.cs rename to src/Core/CrystaLearn.Core/Services/Contracts/ICrystaProgramSyncModuleService.cs index 2c4783e8..56b5d57a 100644 --- a/src/Core/CrystaLearn.Core/Services/Contracts/ICrystaProgramSyncModuleRepository.cs +++ b/src/Core/CrystaLearn.Core/Services/Contracts/ICrystaProgramSyncModuleService.cs @@ -2,7 +2,10 @@ namespace CrystaLearn.Core.Services.Contracts; -public interface ICrystaProgramSyncModuleRepository +public interface ICrystaProgramSyncModuleService { Task> GetSyncModulesAsync(CancellationToken cancellationToken); + + // Save or update a sync module (persist SyncInfo changes) + Task UpdateSyncModuleAsync(CrystaProgramSyncModule module); } diff --git a/src/Core/CrystaLearn.Core/Services/Contracts/ICrystaTaskRepository.cs b/src/Core/CrystaLearn.Core/Services/Contracts/ICrystaTaskRepository.cs index d01b136d..0d132579 100644 --- a/src/Core/CrystaLearn.Core/Services/Contracts/ICrystaTaskRepository.cs +++ b/src/Core/CrystaLearn.Core/Services/Contracts/ICrystaTaskRepository.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using CrystaLearn.Core.Models.Crysta; using CrystaLearn.Core.Services.Sync; namespace CrystaLearn.Core.Services.Contracts; @@ -10,4 +11,26 @@ namespace CrystaLearn.Core.Services.Contracts; public interface ICrystaTaskRepository { Task> GetWorkItemSyncItemsAsync(List ids); + Task> GetCommentsSyncItemsAsync(List ids); + Task> GetUpdatesSyncItemsAsync(List ids); + Task> GetRevisionsSyncItemsAsync(List ids); + + // Split add/update operations into separate methods to allow batching and transactions + Task AddCrystaTasksAsync(List tasks); + Task UpdateCrystaTasksAsync(List tasks); + + Task AddCrystaTaskCommentsAsync(List comments); + Task UpdateCrystaTaskCommentsAsync(List comments); + + Task AddCrystaTaskUpdatesAsync(List updates); + Task UpdateCrystaTaskUpdatesAsync(List updates); + + Task AddCrystaTaskRevisionsAsync(List revisions); + Task UpdateCrystaTaskRevisionsAsync(List revisions); + + Task MarkCrystaTasksAsDeletedAsync(List syncIds); + Task DeleteCrystaTaskCommentsAsync(List syncIds); + Task DeleteCrystaTaskUpdatesAsync(List syncIds); + Task DeleteCrystaTaskRevisionsAsync(List syncIds); + Task> GetAllWorkItemSyncIdsAsync(string project); } diff --git a/src/Core/CrystaLearn.Core/Services/CrystaProgramSyncModuleRepositoryFake.cs b/src/Core/CrystaLearn.Core/Services/CrystaProgramSyncModuleRepositoryFake.cs deleted file mode 100644 index a914b049..00000000 --- a/src/Core/CrystaLearn.Core/Services/CrystaProgramSyncModuleRepositoryFake.cs +++ /dev/null @@ -1,40 +0,0 @@ -using CrystaLearn.Core.Models.Crysta; -using CrystaLearn.Core.Services.Contracts; - -namespace CrystaLearn.Core.Services; - -public partial class CrystaProgramSyncModuleRepositoryFake : ICrystaProgramSyncModuleRepository -{ - [AutoInject] private IConfiguration Configuration { get; set; } = default!; - - public async Task> GetSyncModulesAsync(CancellationToken cancellationToken) - { - var pat = Configuration["AzureDevOps:PersonalAccessToken"]; - - List modules = - [ - new() - { - Id = Guid.NewGuid(), - CrystaProgramId = CrystaProgramRepositoryFake.FakeProgramCSI.Id, - CrystaProgram = CrystaProgramRepositoryFake.FakeProgramCSI, - ModuleType = SyncModuleType.AzureBoard, - SyncConfig = - $$""" - { - "Organization": "cs-internship", - "PersonalAccessToken": "{{pat}}", - "Project": "CS Internship Program" - } - """, - SyncInfo = new() - { - LastSyncDateTime = DateTimeOffset.Now.AddDays(-2), - LastSyncOffset = "0" - } - } - ]; - - return modules; - } -} diff --git a/src/Core/CrystaLearn.Core/Services/CrystaProgramSyncModuleService.cs b/src/Core/CrystaLearn.Core/Services/CrystaProgramSyncModuleService.cs new file mode 100644 index 00000000..6f3e8a16 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Services/CrystaProgramSyncModuleService.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using CrystaLearn.Core.Data; +using CrystaLearn.Core.Models.Crysta; +using CrystaLearn.Core.Services.Contracts; + +namespace CrystaLearn.Core.Services; + +public partial class CrystaProgramSyncModuleService : ICrystaProgramSyncModuleService +{ + + private static List _modules = new(); + private AppDbContext DbContext { get; set; } = default!; + + public CrystaProgramSyncModuleService(AppDbContext dbContext) + { + this.DbContext = dbContext; + if (_modules.Count == 0) + { + _modules = DbContext.Set().ToListAsync().GetAwaiter().GetResult(); + } + } + + public async Task> GetSyncModulesAsync(CancellationToken cancellationToken) + { + return _modules; + } + + public async Task UpdateSyncModuleAsync(CrystaProgramSyncModule module) + { + // Try to persist to database if DbContext is available and configured + try + { + if (DbContext != null) + { + var set = DbContext.Set(); + + var existing = await set.FindAsync(new object[] { module.Id }, cancellationToken: CancellationToken.None); + if (existing != null) + { + // Update all scalar properties from incoming module + DbContext.Entry(existing).CurrentValues.SetValues(module); + + // If SyncInfo is an owned/complex type, ensure its properties are updated as well + if (module.SyncInfo != null) + { + existing.SyncInfo ??= new SyncInfo(); + DbContext.Entry(existing).CurrentValues.SetValues(existing); // ensure entry is tracked + DbContext.Entry(existing).Reference(e => e.SyncInfo).TargetEntry?.CurrentValues.SetValues(module.SyncInfo); + } + + DbContext.Update(existing); + } + else + { + await set.AddAsync(module); + } + + await DbContext.SaveChangesAsync(); + + // keep in-memory copy in sync as well - replace whole object to reflect all fields + var idx = _modules.FindIndex(m => m.Id == module.Id); + if (idx >= 0) + { + _modules[idx] = module; + } + else + { + _modules.Add(module); + } + + return; + } + } + catch + { + // If persistence fails (for example entity not mapped), fall back to in-memory update below. + } + + // Fallback: update in-memory collection (replace whole object) + var existingInMemoryIndex = _modules.FindIndex(m => m.Id == module.Id); + if (existingInMemoryIndex >= 0) + { + _modules[existingInMemoryIndex] = module; + } + else + { + _modules.Add(module); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Services/CrystaProgramSyncModuleServiceFake.cs b/src/Core/CrystaLearn.Core/Services/CrystaProgramSyncModuleServiceFake.cs new file mode 100644 index 00000000..563b306d --- /dev/null +++ b/src/Core/CrystaLearn.Core/Services/CrystaProgramSyncModuleServiceFake.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using CrystaLearn.Core.Models.Crysta; +using CrystaLearn.Core.Services.Contracts; + +namespace CrystaLearn.Core.Services; + +public partial class CrystaProgramSyncModuleServiceFake : ICrystaProgramSyncModuleService +{ + private static List _modules = new(); + + [AutoInject] private IConfiguration Configuration { get; set; } = default!; + + public CrystaProgramSyncModuleServiceFake() + { + if (_modules.Count == 0) + { + var pat = Configuration["AzureDevOps:PersonalAccessToken"]; + + _modules = new List + { + new CrystaProgramSyncModule + { + Id = Guid.NewGuid(), + CrystaProgramId = CrystaProgramRepositoryFake.FakeProgramCSI.Id, + CrystaProgram = CrystaProgramRepositoryFake.FakeProgramCSI, + ModuleType = SyncModuleType.AzureBoard, + SyncConfig = + $$""" + { + "Organization": "cs-internship", + "PersonalAccessToken": "{pat}", + "Project": "CS Internship Program" + } + """, + SyncInfo = new SyncInfo + { + LastSyncDateTime = DateTimeOffset.Now.AddDays(-2), + LastSyncOffset = "0" + } + } + }; + } + } + + public async Task> GetSyncModulesAsync(CancellationToken cancellationToken) + { + return _modules; + } + + public async Task UpdateSyncModuleAsync(CrystaProgramSyncModule module) + { + var existing = _modules.FirstOrDefault(m => m.Id == module.Id); + if (existing != null) + { + existing.SyncInfo = module.SyncInfo; + existing.SyncConfig = module.SyncConfig; + } + else + { + _modules.Add(module); + } + } +} diff --git a/src/Core/CrystaLearn.Core/Services/CrystaTaskRepository.cs b/src/Core/CrystaLearn.Core/Services/CrystaTaskRepository.cs new file mode 100644 index 00000000..04199418 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Services/CrystaTaskRepository.cs @@ -0,0 +1,486 @@ +using CrystaLearn.Core.Data; +using CrystaLearn.Core.Models.Crysta; +using CrystaLearn.Core.Services.Contracts; +using CrystaLearn.Core.Services.Sync; +using Microsoft.EntityFrameworkCore; +using EFCore.BulkExtensions; + +namespace CrystaLearn.Core.Services; + +public partial class CrystaTaskRepository : ICrystaTaskRepository +{ + [AutoInject] private AppDbContext DbContext { get; set; } = default!; + + public async Task> GetWorkItemSyncItemsAsync(List ids) + { + if (ids == null || ids.Count == 0) + { + return new List(); + } + + var syncItems = await DbContext.CrystaTasks + .Where(t => ids.Contains(t.WorkItemSyncInfo.SyncId ?? "")) + .Select(t => new SyncItem + { + Id = t.Id, + SyncInfo = t.WorkItemSyncInfo + }).AsNoTracking() + .ToListAsync(); + + return syncItems; + } + + public async Task> GetCommentsSyncItemsAsync(List ids) + { + if (ids == null || ids.Count == 0) + { + return new List(); + } + + var syncItems = await DbContext.CrystaTaskComments + .Where(c => c.SyncInfo != null && ids.Contains(c.SyncInfo.SyncId ?? "")) + .AsNoTracking() + .Select(c => new SyncItem + { + Id = c.Id, + SyncInfo = c.SyncInfo ?? new SyncInfo() + }) + .ToListAsync(); + + return syncItems; + } + + public async Task> GetUpdatesSyncItemsAsync(List ids) + { + if (ids == null || ids.Count == 0) + { + return new List(); + } + + var syncItems = await DbContext.CrystaTaskUpdates + .Where(u => u.SyncInfo != null && ids.Contains(u.SyncInfo.SyncId ?? "")) + .AsNoTracking() + .Select(u => new SyncItem + { + Id = u.Id, + SyncInfo = u.SyncInfo ?? new SyncInfo() + }) + .ToListAsync(); + + return syncItems; + } + + public async Task> GetRevisionsSyncItemsAsync(List ids) + { + if (ids == null || ids.Count == 0) + { + return new List(); + } + + var syncItems = await DbContext.CrystaTaskRevisions + .Where(t => ids.Contains(t.WorkItemSyncInfo.SyncId ?? "")) + .Select(t => new SyncItem + { + Id = t.Id, + SyncInfo = t.WorkItemSyncInfo + }).AsNoTracking() + .ToListAsync(); + + return syncItems; + } + + private const int BatchSize = 1000; + + public async Task AddCrystaTasksAsync(List tasks) + { + if (tasks == null || tasks.Count == 0) + return; + + await using var tx = await DbContext.Database.BeginTransactionAsync(); + try + { + foreach (var chunk in tasks.Chunk(BatchSize)) + { +#pragma warning disable NonAsyncEFCoreMethodsUsageAnalyzer + DbContext.CrystaTasks.AddRange(chunk); +#pragma warning restore NonAsyncEFCoreMethodsUsageAnalyzer + await DbContext.SaveChangesAsync(); + } + + await tx.CommitAsync(); + } + catch + { + await tx.RollbackAsync(); + throw; + } + } + + public async Task UpdateCrystaTasksAsync(List tasks) + { + if (tasks == null || tasks.Count == 0) + return; + + // Gather sync ids from incoming items + var syncIds = tasks.Select(t => t.WorkItemSyncInfo?.SyncId ?? "").Where(s => !string.IsNullOrEmpty(s)).ToList(); + if (syncIds.Count == 0) + return; + + await using var tx = await DbContext.Database.BeginTransactionAsync(); + try + { + // Fetch only Id and SyncId mapping (lightweight) + var existingMap = await DbContext.CrystaTasks + .Where(t => syncIds.Contains(t.WorkItemSyncInfo.SyncId ?? "")) + .Select(t => new { t.Id, SyncId = t.WorkItemSyncInfo.SyncId }) + .ToDictionaryAsync(x => x.SyncId ?? string.Empty, x => x.Id); + + // Set primary keys on incoming entities so BulkUpdate uses PK matching + var toUpdate = new List(); + foreach (var task in tasks) + { + var key = task.WorkItemSyncInfo?.SyncId ?? string.Empty; + if (existingMap.TryGetValue(key, out var id)) + { + task.Id = id; // ensure PK present for BulkUpdate + toUpdate.Add(task); + } + } + + if (toUpdate.Count == 0) + { + await tx.CommitAsync(); + return; + } + + // Bulk update in chunks + foreach (var chunk in toUpdate.Chunk(BatchSize)) + { + await DbContext.BulkUpdateAsync(chunk); + } + + await tx.CommitAsync(); + } + catch + { + await tx.RollbackAsync(); + throw; + } + } + + public async Task AddCrystaTaskCommentsAsync(List comments) + { + if (comments == null || comments.Count == 0) + return; + + await using var tx = await DbContext.Database.BeginTransactionAsync(); + try + { + foreach (var chunk in comments.Chunk(BatchSize)) + { +#pragma warning disable NonAsyncEFCoreMethodsUsageAnalyzer + DbContext.CrystaTaskComments.AddRange(chunk); +#pragma warning restore NonAsyncEFCoreMethodsUsageAnalyzer + await DbContext.SaveChangesAsync(); + } + + await tx.CommitAsync(); + } + catch + { + await tx.RollbackAsync(); + throw; + } + } + + public async Task UpdateCrystaTaskCommentsAsync(List comments) + { + if (comments == null || comments.Count == 0) + return; + + var syncIds = comments.Select(c => c.SyncInfo?.SyncId ?? "").Where(s => !string.IsNullOrEmpty(s)).ToList(); + if (syncIds.Count == 0) + return; + + await using var tx = await DbContext.Database.BeginTransactionAsync(); + try + { + var existingMap = await DbContext.CrystaTaskComments + .Where(c => c.SyncInfo != null && syncIds.Contains(c.SyncInfo.SyncId ?? "")) + .Select(c => new { c.Id, SyncId = c.SyncInfo!.SyncId }) + .ToDictionaryAsync(x => x.SyncId ?? string.Empty, x => x.Id); + + var toUpdate = new List(); + foreach (var comment in comments) + { + var key = comment.SyncInfo?.SyncId ?? string.Empty; + if (existingMap.TryGetValue(key, out var id)) + { + comment.Id = id; + toUpdate.Add(comment); + } + } + + if (toUpdate.Count > 0) + { + foreach (var chunk in toUpdate.Chunk(BatchSize)) + { + await DbContext.BulkUpdateAsync(chunk); + } + } + + await tx.CommitAsync(); + } + catch + { + await tx.RollbackAsync(); + throw; + } + } + + public async Task AddCrystaTaskUpdatesAsync(List updates) + { + if (updates == null || updates.Count == 0) + return; + + await using var tx = await DbContext.Database.BeginTransactionAsync(); + try + { + foreach (var chunk in updates.Chunk(BatchSize)) + { +#pragma warning disable NonAsyncEFCoreMethodsUsageAnalyzer + DbContext.CrystaTaskUpdates.AddRange(chunk); +#pragma warning restore NonAsyncEFCoreMethodsUsageAnalyzer + await DbContext.SaveChangesAsync(); + } + + await tx.CommitAsync(); + } + catch + { + await tx.RollbackAsync(); + throw; + } + } + + public async Task UpdateCrystaTaskUpdatesAsync(List updates) + { + if (updates == null || updates.Count == 0) + return; + + var syncIds = updates.Select(u => u.SyncInfo?.SyncId ?? "").Where(s => !string.IsNullOrEmpty(s)).ToList(); + if (syncIds.Count == 0) + return; + + await using var tx = await DbContext.Database.BeginTransactionAsync(); + try + { + var existingMap = await DbContext.CrystaTaskUpdates + .Where(u => u.SyncInfo != null && syncIds.Contains(u.SyncInfo.SyncId ?? "")) + .Select(u => new { u.Id, SyncId = u.SyncInfo!.SyncId }) + .ToDictionaryAsync(x => x.SyncId ?? string.Empty, x => x.Id); + + var toUpdate = new List(); + foreach (var update in updates) + { + var key = update.SyncInfo?.SyncId ?? string.Empty; + if (existingMap.TryGetValue(key, out var id)) + { + update.Id = id; + toUpdate.Add(update); + } + } + + if (toUpdate.Count > 0) + { + foreach (var chunk in toUpdate.Chunk(BatchSize)) + { + await DbContext.BulkUpdateAsync(chunk); + } + } + + await tx.CommitAsync(); + } + catch + { + await tx.RollbackAsync(); + throw; + } + } + + public async Task AddCrystaTaskRevisionsAsync(List revisions) + { + if (revisions == null || revisions.Count == 0) + return; + + await using var tx = await DbContext.Database.BeginTransactionAsync(); + try + { + foreach (var chunk in revisions.Chunk(BatchSize)) + { +#pragma warning disable NonAsyncEFCoreMethodsUsageAnalyzer + DbContext.CrystaTaskRevisions.AddRange(chunk); +#pragma warning restore NonAsyncEFCoreMethodsUsageAnalyzer + await DbContext.SaveChangesAsync(); + } + + await tx.CommitAsync(); + } + catch + { + await tx.RollbackAsync(); + throw; + } + } + + public async Task UpdateCrystaTaskRevisionsAsync(List revisions) + { + if (revisions == null || revisions.Count == 0) + return; + + // Identify revisions by ProviderTaskId + Revision + var keys = revisions.Select(r => (ProviderId: r.ProviderTaskId ?? string.Empty, Revision: r.Revision ?? string.Empty)) + .Where(k => !string.IsNullOrEmpty(k.ProviderId) && !string.IsNullOrEmpty(k.Revision)) + .ToList(); + + if (keys.Count == 0) + return; + + await using var tx = await DbContext.Database.BeginTransactionAsync(); + try + { + var providerIds = keys.Select(k => k.ProviderId).Distinct().ToList(); + + var existing = await DbContext.CrystaTaskRevisions + .Where(r => providerIds.Contains(r.ProviderTaskId ?? string.Empty)) + .Select(r => new { r.Id, ProviderTaskId = r.ProviderTaskId ?? string.Empty, Revision = r.Revision ?? string.Empty }) + .ToListAsync(); + + var map = existing.ToDictionary(e => $"{e.ProviderTaskId}-{e.Revision}", e => e.Id); + + var toUpdate = new List(); + + foreach (var revision in revisions) + { + var key = $"{revision.ProviderTaskId}-{revision.Revision}"; + if (map.TryGetValue(key, out var id)) + { + revision.Id = id; + toUpdate.Add(revision); + } + } + + if (toUpdate.Count > 0) + { + foreach (var chunk in toUpdate.Chunk(BatchSize)) + { + await DbContext.BulkUpdateAsync(chunk); + } + } + + await tx.CommitAsync(); + } + catch + { + await tx.RollbackAsync(); + throw; + } + } + + public async Task MarkCrystaTasksAsDeletedAsync(List syncIds) + { + if (syncIds == null || syncIds.Count == 0) + { + return 0; + } + + var tasksToDelete = await DbContext.CrystaTasks + .Where(t => syncIds.Contains(t.WorkItemSyncInfo.SyncId ?? "")) + .ToListAsync(); + + foreach (var task in tasksToDelete) + { + task.IsDeleted = true; + task.WorkItemSyncInfo.SyncStatus = SyncStatus.Deleted; + task.WorkItemSyncInfo.LastSyncDateTime = DateTimeOffset.Now; + } + + await DbContext.SaveChangesAsync(); + return tasksToDelete.Count; + } + + public async Task DeleteCrystaTaskCommentsAsync(List syncIds) + { + if (syncIds == null || syncIds.Count == 0) + { + return 0; + } + + var commentsToDelete = await DbContext.CrystaTaskComments + .Where(c => c.SyncInfo != null && syncIds.Contains(c.SyncInfo.SyncId ?? "")) + .ToListAsync(); + + foreach (var comment in commentsToDelete) + { + comment.IsDeleted = true; + if (comment.SyncInfo != null) + { + comment.SyncInfo.SyncStatus = SyncStatus.Deleted; + comment.SyncInfo.LastSyncDateTime = DateTimeOffset.Now; + } + } + + await DbContext.SaveChangesAsync(); + return commentsToDelete.Count; + } + + public async Task DeleteCrystaTaskUpdatesAsync(List syncIds) + { + if (syncIds == null || syncIds.Count == 0) + { + return 0; + } + + var updatesToDelete = await DbContext.CrystaTaskUpdates + .Where(u => u.SyncInfo != null && syncIds.Contains(u.SyncInfo.SyncId ?? "")) + .ToListAsync(); + +#pragma warning disable NonAsyncEFCoreMethodsUsageAnalyzer + DbContext.CrystaTaskUpdates.RemoveRange(updatesToDelete); +#pragma warning restore NonAsyncEFCoreMethodsUsageAnalyzer + + await DbContext.SaveChangesAsync(); + return updatesToDelete.Count; + } + + public async Task DeleteCrystaTaskRevisionsAsync(List syncIds) + { + if (syncIds == null || syncIds.Count == 0) + { + return 0; + } + + var revisionsToDelete = await DbContext.CrystaTaskRevisions + .Where(r => syncIds.Contains($"{r.ProviderTaskId}-{r.Revision}")) + .ToListAsync(); + +#pragma warning disable NonAsyncEFCoreMethodsUsageAnalyzer + DbContext.CrystaTaskRevisions.RemoveRange(revisionsToDelete); +#pragma warning restore NonAsyncEFCoreMethodsUsageAnalyzer + + await DbContext.SaveChangesAsync(); + return revisionsToDelete.Count; + } + + public async Task> GetAllWorkItemSyncIdsAsync(string project) + { + // Get all non-deleted tasks sync IDs + var syncIds = await DbContext.CrystaTasks + .Where(t => !t.IsDeleted && t.ProjectName == project) + .Select(t => t.WorkItemSyncInfo.SyncId ?? "") + .Where(id => !string.IsNullOrEmpty(id)) + .ToListAsync(); + + return syncIds; + } +} diff --git a/src/Core/CrystaLearn.Core/Services/CrystaTaskRepositoryFake.cs b/src/Core/CrystaLearn.Core/Services/CrystaTaskRepositoryFake.cs deleted file mode 100644 index c1b620f0..00000000 --- a/src/Core/CrystaLearn.Core/Services/CrystaTaskRepositoryFake.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using CrystaLearn.Core.Models.Crysta; -using CrystaLearn.Core.Services.Contracts; -using CrystaLearn.Core.Services.Sync; - -namespace CrystaLearn.Core.Services; - -public class CrystaTaskRepositoryFake : ICrystaTaskRepository -{ - public async Task> GetWorkItemSyncItemsAsync(List ids) - { - return []; - } -} diff --git a/src/Core/CrystaLearn.Core/Services/GitHub/GitHubExtensions.cs b/src/Core/CrystaLearn.Core/Services/GitHub/GitHubExtensions.cs index b3cebb2b..b9e90c89 100644 --- a/src/Core/CrystaLearn.Core/Services/GitHub/GitHubExtensions.cs +++ b/src/Core/CrystaLearn.Core/Services/GitHub/GitHubExtensions.cs @@ -71,7 +71,7 @@ public static Models.Crysta.Document CreateDocument(this GitHubItem item, Crysta SyncInfo = new SyncInfo() { SyncStatus = SyncStatus.Success, - SyncHash = item.Sha, + ContentHash = item.Sha, SyncStartDateTime = DateTimeOffset.Now, } }; diff --git a/src/Core/CrystaLearn.Core/Services/Jobs/CrystaProgramSyncJobRunner.cs b/src/Core/CrystaLearn.Core/Services/Jobs/CrystaProgramSyncJobRunner.cs new file mode 100644 index 00000000..2c740a68 --- /dev/null +++ b/src/Core/CrystaLearn.Core/Services/Jobs/CrystaProgramSyncJobRunner.cs @@ -0,0 +1,43 @@ +using System.Threading; +using CrystaLearn.Core.Services.Contracts; + +namespace CrystaLearn.Core.Services.Jobs; + +public partial class CrystaProgramSyncJobRunner +{ + [AutoInject] private ICrystaProgramSyncModuleService syncModuleService = default!; + [AutoInject] private ICrystaProgramSyncService syncService = default!; + + private static bool isRunning = false; + + public async Task RunSyncForAllModules(CancellationToken cancellationToken) + { + + try + { + if (isRunning) + { + return; + } + + Console.Write($"Sync Start at {DateTime.UtcNow}"); + + isRunning = true; + var modules = await syncModuleService.GetSyncModulesAsync(cancellationToken); + + foreach (var module in modules) + { + await syncService.SyncAsync(module); + } + } + catch (Exception ex) + { + Console.WriteLine($"Error during sync: {ex.Message} {ex}"); + isRunning = false; + throw; + } + + isRunning = false; + + } +} diff --git a/src/Core/CrystaLearn.Core/Services/Sync/AzureBoardSyncService.cs b/src/Core/CrystaLearn.Core/Services/Sync/AzureBoardSyncService.cs index 5524e8f5..a702d9fd 100644 --- a/src/Core/CrystaLearn.Core/Services/Sync/AzureBoardSyncService.cs +++ b/src/Core/CrystaLearn.Core/Services/Sync/AzureBoardSyncService.cs @@ -13,8 +13,9 @@ public partial class AzureBoardSyncService : IAzureBoardSyncService [AutoInject] private IAzureBoardService AzureBoardService { get; set; } = default!; [AutoInject] private IConfiguration Configuration { get; set; } = default!; [AutoInject] private ICrystaTaskRepository CrystaTaskRepository { get; set; } = default!; + [AutoInject] private ICrystaProgramSyncModuleService CrystaProgramSyncModuleRepository { get; set; } = default!; - public async Task SyncAsync(CrystaProgramSyncModule module) + public async Task SyncAsync(CrystaProgramSyncModule module, List? workItemIds = null) { if (module.ModuleType != SyncModuleType.AzureBoard) { @@ -23,7 +24,7 @@ public async Task SyncAsync(CrystaProgramSyncModule module) if (string.IsNullOrWhiteSpace(module.SyncConfig)) { - throw new ArgumentNullException(nameof(module.CrystaProgram)); + throw new ArgumentNullException(nameof(module.SyncConfig)); } var config = JsonSerializer.Deserialize(module.SyncConfig) @@ -40,8 +41,16 @@ public async Task SyncAsync(CrystaProgramSyncModule module) lastWorkItemId = 0; } - var query = - $""" + string query; + + if (workItemIds != null && workItemIds.Count > 0) + { + query = $"Select [Id] From WorkItems Where [System.Id] In ({string.Join(",", workItemIds)})"; + } + else + { + query = + $""" Select [Id] From @@ -53,67 +62,502 @@ And [System.State] <> 'Closed' Order By [Changed Date] Asc """; + } + var totalResult = new SyncResult { AddCount = 0, UpdateCount = 0, SameCount = 0, DeleteCount = 0 }; + + // Collect all active work item IDs from Azure Board + var activeWorkItemIds = new HashSet(); + - await foreach (var workItems in AzureBoardService.EnumerateWorkItemsQueryAsync(config, query, top: 200)) + await foreach (var workItems in AzureBoardService.EnumerateWorkItemsQueryAsync(config, query)) { + Console.WriteLine($"Processing batch of {workItems.Count} work items..."); + + module.SyncInfo.SyncStartDateTime = DateTimeOffset.Now; + var tasks = workItems - .Select(ToCrystaTask) + .Select(w => ToCrystaTask(w, config)) .ToList(); - - await SyncWorkItemsAsync(tasks); - await SyncUpdatesAsync(tasks); - await SyncCommentsAsync(tasks); - await SyncRevisionsAsync(tasks); + + // Collect active work item IDs + foreach (var task in tasks) + { + if (!string.IsNullOrEmpty(task.WorkItemSyncInfo.SyncId)) + { + activeWorkItemIds.Add(task.WorkItemSyncInfo.SyncId); + } + } + + var workItemResult = await SyncWorkItemsAsync(config, tasks); + Console.WriteLine($" WorkItems - Added: {workItemResult.AddCount}, Updated: {workItemResult.UpdateCount}, Unchanged: {workItemResult.SameCount}"); + //var updatesResult = await SyncUpdatesAsync(config, tasks); + //Console.WriteLine($" Updates - Added: {updatesResult.AddCount}, Updated: {updatesResult.UpdateCount}, Unchanged: {updatesResult.SameCount}"); + var commentsResult = await SyncCommentsAsync(config, tasks); + Console.WriteLine($" Comments - Added: {commentsResult.AddCount}, Updated: {commentsResult.UpdateCount}, Unchanged: {commentsResult.SameCount}"); + // var revisionsResult = await SyncRevisionsAsync(config, tasks); + // Console.WriteLine($" Revisions - Added: {revisionsResult.AddCount}, Updated: {revisionsResult.UpdateCount}, Unchanged: {revisionsResult.SameCount}"); + + // Persist only tasks that got new SyncInfo values + + var tasksToUpdate = tasks + .Where(t => t.UpdatesSyncInfo != null || t.CommentsSyncInfo != null || t.RevisionsSyncInfo != null) + .ToList(); + + if (tasksToUpdate.Count > 0) + await CrystaTaskRepository.UpdateCrystaTasksAsync(tasksToUpdate); + + + // Aggregate results + totalResult.AddCount += workItemResult.AddCount + commentsResult.AddCount; + totalResult.UpdateCount += workItemResult.UpdateCount + commentsResult.UpdateCount; + totalResult.SameCount += workItemResult.SameCount + commentsResult.SameCount; + + // Update module sync info for this batch using the largest 'Changed Date' among loaded work items + DateTimeOffset? batchMaxChanged = null; + foreach (var wi in workItems) + { + if (wi.Fields != null && wi.Fields.TryGetValue("System.ChangedDate", out var changedObj)) + { + var changedStr = changedObj?.ToString(); + if (!string.IsNullOrEmpty(changedStr) && DateTimeOffset.TryParse(changedStr, out var changedDt)) + { + if (!batchMaxChanged.HasValue || changedDt > batchMaxChanged.Value) + batchMaxChanged = changedDt; + } + } + } + + if (batchMaxChanged.HasValue) + { + module.SyncInfo.LastSyncDateTime = batchMaxChanged.Value; + module.UpdatedAt = DateTimeOffset.Now; + // Also update LastSyncOffset to the max work item id in this batch so subsequent queries can continue from there + var maxId = workItems.Max(w => w.Id ?? 0); + module.SyncInfo.LastSyncOffset = maxId.ToString(); + + module.SyncInfo.SyncEndDateTime = DateTimeOffset.Now; + config.WorkItemChangedFromDateTime = batchMaxChanged.Value; + + module.SyncConfig = JsonSerializer.Serialize(config); + + // Persist module after updating sync info for this batch + try + { + await CrystaProgramSyncModuleRepository.UpdateSyncModuleAsync(module); + } + catch + { + throw; + } + } } - return new SyncResult - { - AddCount = 0, - UpdateCount = 0, - SameCount = 0 - }; + //TODO: Handle deletions - find tasks in our DB that are no longer in Azure Board + + + // Update module sync info + + module.SyncInfo.SyncStatus = SyncStatus.Success; + + // Persist final module sync info + + await CrystaProgramSyncModuleRepository.UpdateSyncModuleAsync(module); + + return totalResult; } - private async Task SyncUpdatesAsync(List tasks) + /// + /// Sync CrystaTaskUpdate + /// + /// + /// + /// + private async Task SyncUpdatesAsync(AzureBoardSyncConfig config, List tasks) { + var allUpdates = new List(); + + // Preload mapping of WorkItem SyncId -> CrystaTask.Id for existing tasks (used when task.Id == Guid.Empty) + var taskSyncIds = tasks.Select(t => t.WorkItemSyncInfo.SyncId ?? "").Where(s => !string.IsNullOrEmpty(s)).Distinct().ToList(); + var workItemSyncItems = taskSyncIds.Count > 0 ? await CrystaTaskRepository.GetWorkItemSyncItemsAsync(taskSyncIds) : new List(); + var syncIdToGuidMap = workItemSyncItems.Where(s => s.SyncInfo != null && s.Id.HasValue) + .ToDictionary(s => s.SyncInfo.SyncId ?? string.Empty, s => s.Id.Value, StringComparer.OrdinalIgnoreCase); + + foreach (var task in tasks) + { + if (string.IsNullOrEmpty(task.ProviderTaskId) || !int.TryParse(task.ProviderTaskId, out var workItemId)) + { + continue; + } + + var azureUpdates = await AzureBoardService.GetUpdatesAsync(config, workItemId); + + // collect per-task updates + var taskUpdates = new List(); + + foreach (var update in azureUpdates) + { + // Resolve CrystaTaskId: prefer task.Id, otherwise try to lookup by SyncId + var crystaTaskId = task.Id != Guid.Empty + ? task.Id + : (syncIdToGuidMap.TryGetValue(task.WorkItemSyncInfo?.SyncId ?? string.Empty, out var gid) ? gid : Guid.Empty); + + var crystaUpdates = ToCrystaTaskUpdate(update, crystaTaskId, workItemId, config); + if (crystaUpdates != null && crystaUpdates.Count > 0) + { + taskUpdates.AddRange(crystaUpdates); + allUpdates.AddRange(crystaUpdates); + } + } + + // compute and assign UpdatesSyncInfo for this task using only its own updates + if (taskUpdates.Count > 0) + { + try + { + var combined = string.Join("", taskUpdates.Select(u => u.RawJson ?? string.Empty)); + var contentHash = combined.Sha(); + + int maxUpdateId = 0; + foreach (var u in taskUpdates) + { + if (int.TryParse(u.ProviderUpdateId, out var uid)) + { + if (uid > maxUpdateId) maxUpdateId = uid; + } + } + + task.UpdatesSyncInfo = new SyncInfo + { + SyncId = $"{config.Organization}/{config.Project}/{task.ProviderTaskId}/updates", + ContentHash = contentHash, + LastSyncDateTime = DateTimeOffset.Now, + LastSyncOffset = maxUpdateId > 0 ? maxUpdateId.ToString() : null, + SyncStatus = SyncStatus.Success, + SyncGroup = "SyncService" + }; + } + catch + { + // swallow per-task sync info errors + } + } + } + + if (allUpdates.Count == 0) + { + return new SyncResult { AddCount = 0, UpdateCount = 0, SameCount = 0 }; + } + + var updateSyncItems = allUpdates + .Select(u => new SyncItem + { + Id = u.Id, + SyncInfo = u.SyncInfo ?? new SyncInfo() + }) + .ToList(); + + var ids = updateSyncItems.Select(u => u.SyncInfo.SyncId ?? "").Where(id => !string.IsNullOrEmpty(id)).ToList(); + var existingUpdateSyncItems = await CrystaTaskRepository.GetUpdatesSyncItemsAsync(ids); + + var toAddList = updateSyncItems + .Where(board => existingUpdateSyncItems.All(existing => board.SyncInfo.SyncId != existing.SyncInfo.SyncId)) + .ToList(); + + var remainedList = updateSyncItems.Except(toAddList).ToList(); + + var toUpdateList = remainedList + .Where(board => + existingUpdateSyncItems.Any(existing => board.SyncInfo.SyncId == existing.SyncInfo.SyncId && board.SyncInfo.ContentHash != existing.SyncInfo.ContentHash)) + .ToList(); + + var sameList = remainedList.Except(toUpdateList).ToList(); + + var toAddOrUpdate = allUpdates + .Where(u => toAddList.Any(s => s.SyncInfo.SyncId == u.SyncInfo.SyncId) || toUpdateList.Any(s => s.SyncInfo.SyncId == u.SyncInfo.SyncId)) + .ToList(); + + // split to add and update + var toAdd = toAddOrUpdate.Where(u => toAddList.Any(s => s.SyncInfo.SyncId == u.SyncInfo.SyncId)).ToList(); + var toUpdate = toAddOrUpdate.Where(u => toUpdateList.Any(s => s.SyncInfo.SyncId == u.SyncInfo.SyncId)).ToList(); + + if (toAdd.Count > 0) + await CrystaTaskRepository.AddCrystaTaskUpdatesAsync(toAdd); + + if (toUpdate.Count > 0) + await CrystaTaskRepository.UpdateCrystaTaskUpdatesAsync(toUpdate); + return new SyncResult { - AddCount = 0, - UpdateCount = 0, - SameCount = 0 + AddCount = toAddList.Count, + UpdateCount = toUpdateList.Count, + SameCount = sameList.Count }; } - private async Task SyncCommentsAsync(List tasks) + /// + /// Sync CrystaTaskComment + /// + /// + /// + /// + private async Task SyncCommentsAsync(AzureBoardSyncConfig config, List tasks) { + var allComments = new List(); + + // Preload mapping of WorkItem SyncId -> CrystaTask.Id for existing tasks + var taskSyncIds = tasks.Select(t => t.WorkItemSyncInfo.SyncId ?? "").Where(s => !string.IsNullOrEmpty(s)).Distinct().ToList(); + var workItemSyncItems = taskSyncIds.Count > 0 ? await CrystaTaskRepository.GetWorkItemSyncItemsAsync(taskSyncIds) : new List(); + var syncIdToGuidMap = workItemSyncItems.Where(s => s.SyncInfo != null && s.Id.HasValue) + .ToDictionary(s => s.SyncInfo.SyncId ?? string.Empty, s => s.Id.Value, StringComparer.OrdinalIgnoreCase); + + foreach (var task in tasks) + { + if (string.IsNullOrEmpty(task.ProviderTaskId) || !int.TryParse(task.ProviderTaskId, out var workItemId)) + { + continue; + } + + var azureComments = await AzureBoardService.GetCommentsAsync(config, workItemId); + + var taskComments = new List(); + + foreach (var comment in azureComments) + { + // Resolve CrystaTaskId: prefer task.Id, otherwise try to lookup by SyncId + var crystaTaskId = task.Id != Guid.Empty + ? task.Id + : (syncIdToGuidMap.TryGetValue(task.WorkItemSyncInfo?.SyncId ?? string.Empty, out var gid) ? gid : Guid.Empty); + + var crystaComment = ToCrystaTaskComment(comment, crystaTaskId, workItemId, config); + if (crystaComment != null) + { + taskComments.Add(crystaComment); + allComments.Add(crystaComment); + } + } + + if (taskComments.Count > 0) + { + try + { + var combined = string.Join("", taskComments.Select(c => c.RawJson ?? string.Empty)); + var contentHash = combined.Sha(); + + SyncInfo syncInfo = taskComments.OrderByDescending(f => f.EditedDateTime).First().SyncInfo; + + task.CommentsSyncInfo = new SyncInfo + { + SyncId = syncInfo.SyncId, + ContentHash = syncInfo.ContentHash, + LastSyncDateTime = syncInfo.LastSyncDateTime, + LastSyncOffset = syncInfo.LastSyncOffset, + SyncStatus = SyncStatus.Success, + SyncGroup = "SyncService" + }; + } + catch + { + // swallow per-task + } + } + } + + if (allComments.Count == 0) + { + return new SyncResult { AddCount = 0, UpdateCount = 0, SameCount = 0 }; + } + + var commentSyncItems = allComments + .Select(c => new SyncItem + { + Id = c.Id, + SyncInfo = c.SyncInfo ?? new SyncInfo() + }) + .ToList(); + + var ids = commentSyncItems.Select(c => c.SyncInfo.SyncId ?? "").Where(id => !string.IsNullOrEmpty(id)).ToList(); + var existingCommentSyncItems = await CrystaTaskRepository.GetCommentsSyncItemsAsync(ids); + + var toAddList = commentSyncItems + .Where(board => existingCommentSyncItems.All(existing => board.SyncInfo.SyncId != existing.SyncInfo.SyncId)) + .ToList(); + + var remainedList = commentSyncItems.Except(toAddList).ToList(); + + var toUpdateList = remainedList + .Where(board => + existingCommentSyncItems.Any(existing => board.SyncInfo.SyncId == existing.SyncInfo.SyncId && board.SyncInfo.ContentHash != existing.SyncInfo.ContentHash)) + .ToList(); + + var sameList = remainedList.Except(toUpdateList).ToList(); + + var toAddOrUpdate = allComments + .Where(c => toAddList.Any(s => s.SyncInfo.SyncId == c.SyncInfo.SyncId) || toUpdateList.Any(s => s.SyncInfo.SyncId == c.SyncInfo.SyncId)) + .ToList(); + + var toAdd = toAddOrUpdate.Where(c => toAddList.Any(s => s.SyncInfo.SyncId == c.SyncInfo.SyncId)).ToList(); + var toUpdate = toAddOrUpdate.Where(c => toUpdateList.Any(s => s.SyncInfo.SyncId == c.SyncInfo.SyncId)).ToList(); + + if (toAdd.Count > 0) + await CrystaTaskRepository.AddCrystaTaskCommentsAsync(toAdd); + + if (toUpdate.Count > 0) + await CrystaTaskRepository.UpdateCrystaTaskCommentsAsync(toUpdate); + return new SyncResult { - AddCount = 0, - UpdateCount = 0, - SameCount = 0 + AddCount = toAddList.Count, + UpdateCount = toUpdateList.Count, + SameCount = sameList.Count }; } - private async Task SyncRevisionsAsync(List tasks) + + /// + /// Sync CrystaTaskRevision + /// + /// + /// + /// + private async Task SyncRevisionsAsync(AzureBoardSyncConfig config, List tasks) { + var allRevisions = new List(); + + // Preload mapping of WorkItem SyncId -> CrystaTask.Id for existing tasks + var taskSyncIds = tasks.Select(t => t.WorkItemSyncInfo.SyncId ?? "").Where(s => !string.IsNullOrEmpty(s)).Distinct().ToList(); + var workItemSyncItems = taskSyncIds.Count > 0 ? await CrystaTaskRepository.GetWorkItemSyncItemsAsync(taskSyncIds) : new List(); + var syncIdToGuidMap = workItemSyncItems.Where(s => s.SyncInfo != null && s.Id.HasValue) + .ToDictionary(s => s.SyncInfo.SyncId ?? string.Empty, s => s.Id.Value, StringComparer.OrdinalIgnoreCase); + + foreach (var task in tasks) + { + if (string.IsNullOrEmpty(task.ProviderTaskId) || !int.TryParse(task.ProviderTaskId, out var workItemId)) + { + continue; + } + + var azureRevisions = await AzureBoardService.GetRevisionsAsync(config, workItemId); + + var taskRevisions = new List(); + + foreach (var revision in azureRevisions) + { + // Resolve CrystaTaskId: prefer task.Id, otherwise try to lookup by SyncId + var crystaTaskId = task.Id != Guid.Empty + ? task.Id + : (syncIdToGuidMap.TryGetValue(task.WorkItemSyncInfo?.SyncId ?? string.Empty, out var gid) ? gid : Guid.Empty); + + var crystaRevision = ToCrystaTaskRevision(revision, crystaTaskId, workItemId, config); + if (crystaRevision != null) + { + taskRevisions.Add(crystaRevision); + allRevisions.Add(crystaRevision); + } + } + + if (taskRevisions.Count > 0) + { + try + { + var combined = string.Join("", taskRevisions.Select(r => r.RawJson ?? string.Empty)); + var contentHash = combined.Sha(); + + int maxRevision = 0; + foreach (var r in taskRevisions) + { + if (int.TryParse(r.Revision, out var rv)) + { + if (rv > maxRevision) maxRevision = rv; + } + } + + task.RevisionsSyncInfo = new SyncInfo + { + SyncId = $"{config.Organization}/{config.Project}/{task.ProviderTaskId}/revisions", + ContentHash = contentHash, + LastSyncDateTime = DateTimeOffset.Now, + LastSyncOffset = maxRevision > 0 ? maxRevision.ToString() : null, + SyncStatus = SyncStatus.Success, + SyncGroup = "SyncService" + }; + } + catch + { + // swallow per-task + } + } + } + + if (allRevisions.Count == 0) + { + return new SyncResult { AddCount = 0, UpdateCount = 0, SameCount = 0 }; + } + + var revisionSyncItems = allRevisions + .Select(r => new SyncItem + { + Id = r.Id, + SyncInfo = new SyncInfo + { + SyncId = r.WorkItemSyncInfo.SyncId, + ContentHash = r.WorkItemSyncInfo.ContentHash + } + }) + .ToList(); + + var ids = revisionSyncItems.Select(r => r.SyncInfo.SyncId ?? "").Where(id => !string.IsNullOrEmpty(id)).ToList(); + var existingRevisionSyncItems = await CrystaTaskRepository.GetRevisionsSyncItemsAsync(ids); + + var toAddList = revisionSyncItems + .Where(board => existingRevisionSyncItems.All(existing => board.SyncInfo.SyncId != existing.SyncInfo.SyncId)) + .ToList(); + + var remainedList = revisionSyncItems.Except(toAddList).ToList(); + + var toUpdateList = remainedList + .Where(board => + existingRevisionSyncItems.Any(existing => board.SyncInfo.SyncId == existing.SyncInfo.SyncId && board.SyncInfo.ContentHash != existing.SyncInfo.ContentHash)) + .ToList(); + + var sameList = remainedList.Except(toUpdateList).ToList(); + + var toAddOrUpdate = allRevisions + .Where(r => toAddList.Any(s => s.SyncInfo.SyncId == r.WorkItemSyncInfo.SyncId) || toUpdateList.Any(s => s.SyncInfo.SyncId == r.WorkItemSyncInfo.SyncId)) + .ToList(); + + var toAdd = toAddOrUpdate.Where(r => toAddList.Any(s => s.SyncInfo.SyncId == r.WorkItemSyncInfo.SyncId)).ToList(); + var toUpdate = toAddOrUpdate.Where(r => toUpdateList.Any(s => s.SyncInfo.SyncId == r.WorkItemSyncInfo.SyncId)).ToList(); + + if (toAdd.Count > 0) + await CrystaTaskRepository.AddCrystaTaskRevisionsAsync(toAdd); + + if (toUpdate.Count > 0) + await CrystaTaskRepository.UpdateCrystaTaskRevisionsAsync(toUpdate); + return new SyncResult { - AddCount = 0, - UpdateCount = 0, - SameCount = 0 + AddCount = toAddList.Count, + UpdateCount = toUpdateList.Count, + SameCount = sameList.Count }; } - private async Task SyncWorkItemsAsync(List tasks) + /// + /// Sync CrystaTask + /// + /// + /// + private async Task SyncWorkItemsAsync(AzureBoardSyncConfig config, List tasks) { var boardSyncItems = tasks - .Select(task => new SyncItem - { - SyncInfo = task.WorkItemSyncInfo + .Select(task => new SyncItem + { + Id = task.Id, + SyncInfo = task.WorkItemSyncInfo }) .ToList(); - var ids = boardSyncItems.Select(wi => wi.SyncInfo.SyncId).ToList(); + var ids = boardSyncItems.Select(wi => wi.SyncInfo.SyncId ?? "").Where(id => !string.IsNullOrEmpty(id)).ToList(); var existingWorkItemSyncItems = await CrystaTaskRepository.GetWorkItemSyncItemsAsync(ids); @@ -125,46 +569,128 @@ private async Task SyncWorkItemsAsync(List tasks) var toUpdateList = remainedList .Where(board => - existingWorkItemSyncItems.Any(existing => board.SyncInfo.SyncId == existing.SyncInfo.SyncId && board.SyncInfo.SyncHash != existing.SyncInfo.SyncHash)) + existingWorkItemSyncItems.Any(existing => board.SyncInfo.SyncId == existing.SyncInfo.SyncId && board.SyncInfo.ContentHash != existing.SyncInfo.ContentHash)) .ToList(); var sameList = remainedList.Except(toUpdateList).ToList(); - // ToDo: do the real sync + var toAddOrUpdate = tasks + .Where(t => toAddList.Any(s => s.SyncInfo.SyncId == t.WorkItemSyncInfo.SyncId) || toUpdateList.Any(s => s.SyncInfo.SyncId == t.WorkItemSyncInfo.SyncId)) + .ToList(); - return new SyncResult + var toAdd = toAddOrUpdate.Where(t => toAddList.Any(s => s.SyncInfo.SyncId == t.WorkItemSyncInfo.SyncId)).ToList(); + var toUpdate = toAddOrUpdate.Where(t => toUpdateList.Any(s => s.SyncInfo.SyncId == t.WorkItemSyncInfo.SyncId)).ToList(); + + // Ensure new tasks have an Id so parent references can be assigned before persisting + foreach (var t in toAdd) + { + if (t.Id == Guid.Empty) + t.Id = Guid.NewGuid(); + } + + // Build a map of SyncId -> CrystaTask.Id that includes existing DB items and the current batch (toAdd) + var syncIdToGuid = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var existing in existingWorkItemSyncItems) + { + var sid = existing.SyncInfo?.SyncId; + if (!string.IsNullOrEmpty(sid) && existing.Id.HasValue) + { + syncIdToGuid[sid] = existing.Id.Value; + } + } + + foreach (var item in toAdd) + { + var sid = item.WorkItemSyncInfo?.SyncId; + if (!string.IsNullOrEmpty(sid)) + { + // Prefer existing DB id if present; otherwise use the in-memory id (for toAdd) + if (!syncIdToGuid.ContainsKey(sid)) + syncIdToGuid[sid] = item.Id; + } + } + + // Assign ParentId for tasks that have a ProviderParentId + // First, collect missing parent sync ids that are not present in the current map + var missingParentSyncIds = new HashSet(StringComparer.OrdinalIgnoreCase); + + foreach (var t in toAddOrUpdate) + { + if (string.IsNullOrEmpty(t.ProviderParentId)) + continue; + + var parentSyncId = $"{config.Organization}/{config.Project}/{t.ProviderParentId}"; + if (!syncIdToGuid.ContainsKey(parentSyncId)) + { + missingParentSyncIds.Add(parentSyncId); + } + } + + if (missingParentSyncIds.Count > 0) + { + // Try to load missing parents from DB in one call + var parentSyncItems = await CrystaTaskRepository.GetWorkItemSyncItemsAsync(missingParentSyncIds.ToList()); + foreach (var p in parentSyncItems) + { + var sid = p.SyncInfo?.SyncId; + if (!string.IsNullOrEmpty(sid) && p.Id.HasValue && !syncIdToGuid.ContainsKey(sid)) + { + syncIdToGuid[sid] = p.Id.Value; + } + } + } + + // Now assign ParentId using the updated map + foreach (var t in toAddOrUpdate) + { + if (string.IsNullOrEmpty(t.ProviderParentId)) + continue; + + var parentSyncId = $"{config.Organization}/{config.Project}/{t.ProviderParentId}"; + if (syncIdToGuid.TryGetValue(parentSyncId, out var parentGuid)) + { + t.ParentId = parentGuid; + } + } + + if (toAdd.Count > 0) + await CrystaTaskRepository.AddCrystaTasksAsync(toAdd); + + if (toUpdate.Count > 0) + await CrystaTaskRepository.UpdateCrystaTasksAsync(toUpdate); + + // Build combined list: existing + newly added (toAddList) + //var combined = new List(existingWorkItemSyncItems.Count + toAddList.Count); + //combined.AddRange(existingWorkItemSyncItems); + //combined.AddRange(toAdd.Select(a => new SyncItem() { Id = a.Id, SyncInfo = a.WorkItemSyncInfo })); + + var result = new SyncResult { AddCount = toAddList.Count, UpdateCount = toUpdateList.Count, SameCount = sameList.Count }; + + return result; } - private CrystaTask ToCrystaTask(WorkItem workItem) + private CrystaTask ToCrystaTask(WorkItem workItem, AzureBoardSyncConfig config) { - var json = JsonSerializer.Serialize(workItem.Fields); + var json = JsonSerializer.Serialize(workItem); var hash = json.Sha(); var syncInfo = new SyncInfo { - SyncId = workItem.Id.ToString() ?? throw new Exception("Work Item with no ID from board is not valid."), - SyncHash = hash, + SyncId = $"{config.Organization}/{config.Project}/{workItem.Id.ToString()}", + ContentHash = hash, LastSyncDateTime = DateTimeOffset.Now, - LastSyncOffset = workItem.Id.ToString() + LastSyncOffset = workItem.Id.ToString(), + SyncGroup = "SyncService" }; - var status = workItem.Fields["System.State"]?.ToString() switch - { - "New" or "To Do" => CrystaTaskStatus.New, - "Approved" or "In Progress" or "Committed" - => CrystaTaskStatus.InProgress, - "Done" or "Closed" - => CrystaTaskStatus.Done, - "Canceled" or "Removed" - => CrystaTaskStatus.Canceled, - _ - => throw new Exception($"Invalid status for mapping: {workItem.Fields["System.State"]?.ToString()}") - }; + var providerStatus = workItem.Fields["System.State"]?.ToString(); + var status = GetStatus(workItem, providerStatus); var title = workItem.Fields["System.Title"]?.ToString(); @@ -176,6 +702,15 @@ private CrystaTask ToCrystaTask(WorkItem workItem) _ => throw new Exception("Invalid date") }; + var taskChangeDateTime = workItem.Fields["System.ChangedDate"]?.ToString() switch + { + string s => DateTimeOffset.Parse(s), + _ => throw new Exception("Invalid date") + }; + + var areaPath = workItem.Fields["System.AreaPath"]?.ToString(); + var iterationPath = workItem.Fields["System.IterationPath"]?.ToString(); + //var taskDoneDateTime = workItem.Fields["System.FinishedDate"]?.ToString() switch //{ // string s => DateTimeOffset.Parse(s), @@ -188,25 +723,289 @@ private CrystaTask ToCrystaTask(WorkItem workItem) // _ => throw new Exception("Invalid date") //}; - var assignedToText = workItem.Fields.GetValueOrDefault("System.AssignedTo") switch { + var assignedToText = workItem.Fields.GetValueOrDefault("System.AssignedTo") switch + { + IdentityRef identityRef => $"{identityRef.DisplayName} ({identityRef.UniqueName})", + _ => "" + }; + + var createdBy = workItem.Fields.GetValueOrDefault("System.CreatedBy") switch + { + IdentityRef identityRef => $"{identityRef.DisplayName} ({identityRef.UniqueName})", + _ => "" + }; + + object? remainingWorkObj = workItem.Fields.GetValueOrDefault("Microsoft.VSTS.Scheduling.RemainingWork"); + double? remainingWork = null; + if (remainingWorkObj is double d) + { + remainingWork = d; + } + else if (remainingWorkObj is int i) + { + remainingWork = Convert.ToDouble(i); + } + else if (remainingWorkObj is string s && double.TryParse(s, out var result)) + { + remainingWork = result; + } + + var changedBy = workItem.Fields.GetValueOrDefault("System.ChangedBy") switch + { IdentityRef identityRef => $"{identityRef.DisplayName} ({identityRef.UniqueName})", _ => "" }; - + var task = new CrystaTask { ProviderTaskId = workItem.Id?.ToString(), Title = title, - //Description = description, - //DescriptionHtml = description, + Description = description, + DescriptionHtml = description, Status = status, + ProviderStatus = providerStatus, TaskCreateDateTime = taskCreateDateTime, - ProviderTaskUrl = workItem.Url, + TaskChangedDateTime = taskChangeDateTime, + ProviderTaskUrl = $"https://dev.azure.com/{config.Organization}/{config.Project}/_workitems/edit/{workItem.Id}", WorkItemSyncInfo = syncInfo, AssignedToText = assignedToText, + Revision = workItem.Rev?.ToString() ?? string.Empty, + RawJson = json, + WorkItemType = workItem.Fields["System.WorkItemType"]?.ToString(), + AreaPath = areaPath, + IterationPath = iterationPath, + CreatedByText = createdBy, + Tags = workItem.Fields.GetValueOrDefault("System.Tags")?.ToString(), + ProjectName = workItem.Fields.GetValueOrDefault("System.TeamProject")?.ToString(), + RemainingWork = remainingWork, + ProviderParentId = workItem.Fields.GetValueOrDefault("System.Parent")?.ToString(), + ChangedBy = changedBy, + BoardColumn = workItem.Fields.GetValueOrDefault("System.BoardColumn")?.ToString(), + BoardColumnDone = workItem.Fields.GetValueOrDefault("System.BoardColumnDone") as bool? ?? false, + Reason = workItem.Fields.GetValueOrDefault("System.Reason")?.ToString(), + Priority = workItem.Fields.GetValueOrDefault("Microsoft.VSTS.Common.Priority") switch + { + int p => p, + string ps when int.TryParse(ps, out var pi) => pi, + _ => null + }, + CommentCount = workItem.Fields.GetValueOrDefault("System.CommentCount") switch + { + int c => c, + string cs when int.TryParse(cs, out var ci) => ci, + _ => null + }, + AttachmentsCount = workItem.Fields.GetValueOrDefault("System.AttachedFileCount") switch + { + int c => c, + string cs when int.TryParse(cs, out var ci) => ci, + _ => null + }, + IsDeleted = false }; - return task; } + + private static CrystaTaskStatus? GetStatus(WorkItem work, string? providerStatus) + { + return providerStatus switch + { + "New" or "To Do" or "Design" => CrystaTaskStatus.New, + "Approved" or "In Progress" or "Committed" or "Ready" or "Active" or "Open" => CrystaTaskStatus.InProgress, + "Done" or "Closed" => CrystaTaskStatus.Done, + "Canceled" or "Removed" or "Inactive" => CrystaTaskStatus.Canceled, + _ => throw new Exception($"Invalid status for mapping: {providerStatus}, WorkItemId: {work.Id}") + }; + } + + private CrystaTaskComment? ToCrystaTaskComment(WorkItemComment comment, Guid crystaTaskId, int workItemId, AzureBoardSyncConfig config) + { + if (comment == null) + { + return null; + } + + var json = JsonSerializer.Serialize(comment); + var hash = json.Sha(); + + // WorkItemComment properties: Text, RenderedText + return new CrystaTaskComment + { + CrystaTaskId = crystaTaskId, + ProviderTaskId = workItemId.ToString(), + Text = comment.Text, + FormattedText = comment.RenderedText, + Revision = comment.Revision.ToString(), // Will be populated from context if available + CreatedDateTime = comment.RevisedDate, + EditedDateTime = comment.RevisedDate, + CreatedByText = $"{comment.RevisedBy.DisplayName} ({comment.RevisedBy.UniqueName})", + RawJson = json, + SyncInfo = new SyncInfo + { + SyncId = $"{config.Organization}/{config.Project}/{workItemId.ToString()}/{comment.Revision.ToString()}", + ContentHash = hash, + LastSyncDateTime = DateTimeOffset.Now, + SyncStatus = SyncStatus.Success, + LastSyncOffset = comment.Revision.ToString(), + SyncGroup = "SyncService", + SyncStartDateTime = DateTimeOffset.Now, + SyncEndDateTime = DateTimeOffset.Now + }, + ContentHtml = comment.RenderedText + }; + } + + private List ToCrystaTaskUpdate(WorkItemUpdate update, Guid crystaTaskId, int workItemId, AzureBoardSyncConfig config) + { + var result = new List(); + + if (update == null || update.Fields == null || update.Fields.Count == 0) + { + return result; + } + + var json = JsonSerializer.Serialize(update); + var baseHash = json.Sha(); + + string FormatValue(object? v) + { + if (v == null) return null!; + if (v is IdentityRef idRef) + { + return $"{idRef.DisplayName} ({idRef.UniqueName})"; + } + if (v is string s) return s; + if (v is JsonElement je) + { + try + { + if (je.ValueKind == JsonValueKind.String) return je.GetString() ?? string.Empty; + return je.ToString() ?? string.Empty; + } + catch + { + return je.ToString() ?? string.Empty; + } + } + return v.ToString() ?? string.Empty; + } + + foreach (var fieldChange in update.Fields) + { + var fieldName = fieldChange.Key; + var oldVal = fieldChange.Value?.OldValue is object ov ? FormatValue(ov) : null; + var newVal = fieldChange.Value?.NewValue is object nv ? FormatValue(nv) : null; + + var updateObj = new CrystaTaskUpdate + { + CrystaTaskId = crystaTaskId, + ProviderTaskId = workItemId.ToString(), + ProviderUpdateId = update.Id.ToString(), + Revision = update.Rev.ToString(), + ChangedBy = update.RevisedBy?.DisplayName, + ChangedById = update.RevisedBy?.Id.ToString(), + ChangedDate = update.RevisedDate, + FieldName = fieldName, + OldValue = oldVal, + NewValue = newVal, + RawJson = json, + SyncInfo = new SyncInfo + { + SyncId = $"{config.Organization}/{config.Project}/{workItemId}/{update.Id}", + ContentHash = baseHash, + LastSyncDateTime = DateTimeOffset.Now, + SyncStatus = SyncStatus.Success, + SyncGroup = "SyncService" + } + }; + + result.Add(updateObj); + } + + return result; + } + + private CrystaTaskRevision? ToCrystaTaskRevision(WorkItem revision, Guid crystaTaskId, int workItemId, AzureBoardSyncConfig config) + { + if (revision == null) + { + return null; + } + + var json = JsonSerializer.Serialize(revision); + var hash = json.Sha(); + + string revisionNumber = revision.Rev?.ToString() ?? "0"; + var title = revision.Fields?.GetValueOrDefault("System.Title")?.ToString(); + var description = revision.Fields?.GetValueOrDefault("System.Description")?.ToString(); + var state = revision.Fields?.GetValueOrDefault("System.State")?.ToString(); + var changedBy = revision.Fields?.GetValueOrDefault("System.ChangedBy") as IdentityRef; + + DateTimeOffset changedDate = DateTimeOffset.Now; + if (revision.Fields?.GetValueOrDefault("System.ChangedDate") is string changedDateStr) + { + DateTimeOffset.TryParse(changedDateStr, out changedDate); + } + + DateTimeOffset createdDate = DateTimeOffset.Now; + if (revision.Fields?.GetValueOrDefault("System.CreatedDate") is string createdDateStr) + { + DateTimeOffset.TryParse(createdDateStr, out createdDate); + } + + var areaPath = revision.Fields?.GetValueOrDefault("System.AreaPath")?.ToString(); + var iterationPath = revision.Fields?.GetValueOrDefault("System.IterationPath")?.ToString(); + + var createdBy = revision.Fields?.GetValueOrDefault("System.CreatedBy") switch + { + IdentityRef identityRef => $"{identityRef.DisplayName} ({identityRef.UniqueName})", + _ => "" + }; + + CrystaTaskStatus? status = GetStatus(revision, state); + + var syncInfo = new SyncInfo + { + SyncId = $"{config.Organization}/{config.Project}/{revision.Id.ToString()}/{revisionNumber}", + ContentHash = hash, + LastSyncDateTime = DateTimeOffset.Now, + LastSyncOffset = revision.Id.ToString(), + SyncGroup = "SyncService" + }; + + return new CrystaTaskRevision + { + CrystaTaskId = crystaTaskId, + ProviderTaskId = workItemId.ToString(), + Revision = revisionNumber, + + // CrystaTask properties (mapped similar to ToCrystaTask) + Title = title, + Description = description, + DescriptionHtml = description, + Status = status, + TaskCreateDateTime = createdDate, + ProviderTaskUrl = revision.Url, + AssignedToText = revision.Fields?.GetValueOrDefault("System.AssignedTo") switch + { + IdentityRef identityRef => $"{identityRef.DisplayName} ({identityRef.UniqueName})", + _ => "" + }, + RawJson = json, + WorkItemType = revision.Fields?.GetValueOrDefault("System.WorkItemType")?.ToString(), + AreaPath = areaPath, + IterationPath = iterationPath, + CreatedDate = createdDate, + CreatedByText = createdBy, + Tags = revision.Fields?.GetValueOrDefault("System.Tags")?.ToString(), + ProjectName = revision.Fields?.GetValueOrDefault("System.TeamProject")?.ToString(), + + // Revision-specific + ChangedBy = changedBy?.DisplayName, + ChangedDate = changedDate, + WorkItemSyncInfo = syncInfo + + }; + } } diff --git a/src/Core/CrystaLearn.Core/Services/Sync/CrystaProgramSyncService.cs b/src/Core/CrystaLearn.Core/Services/Sync/CrystaProgramSyncService.cs index 49fe71c1..2639ecc5 100644 --- a/src/Core/CrystaLearn.Core/Services/Sync/CrystaProgramSyncService.cs +++ b/src/Core/CrystaLearn.Core/Services/Sync/CrystaProgramSyncService.cs @@ -10,7 +10,7 @@ namespace CrystaLearn.Core.Services.Sync; public partial class CrystaProgramSyncService : ICrystaProgramSyncService { - private IAzureBoardSyncService AzureBoardSyncService { get; set; } = default!; + [AutoInject] private IAzureBoardSyncService AzureBoardSyncService { get; set; } = default!; public async Task SyncAsync(CrystaProgramSyncModule module) { diff --git a/src/Core/CrystaLearn.Core/Services/Sync/SyncResult.cs b/src/Core/CrystaLearn.Core/Services/Sync/SyncResult.cs index 422f7697..e10e7220 100644 --- a/src/Core/CrystaLearn.Core/Services/Sync/SyncResult.cs +++ b/src/Core/CrystaLearn.Core/Services/Sync/SyncResult.cs @@ -5,4 +5,5 @@ public class SyncResult public int AddCount { get; set; } public int UpdateCount { get; set; } public int SameCount { get; set; } + public int DeleteCount { get; set; } } diff --git a/src/CrystallineSociety/.editorconfig b/src/CrystallineSociety/.editorconfig deleted file mode 100644 index 09b151e9..00000000 --- a/src/CrystallineSociety/.editorconfig +++ /dev/null @@ -1,124 +0,0 @@ -# To learn more about .editorconfig see https://aka.ms/editorconfigdocs -############################### -# Core EditorConfig Options # -############################### -# All files -[*] -indent_style = space -indent_size = 4 -# Code files -[*.{cs,csx,vb,vbx}] -insert_final_newline = true -charset = utf-8-bom -############################### -# .NET Coding Conventions # -############################### -[*.{cs,vb}] -# Organize usings -dotnet_sort_system_directives_first = true -# this. preferences -dotnet_style_qualification_for_field = false:silent -dotnet_style_qualification_for_property = false:silent -dotnet_style_qualification_for_method = false:silent -dotnet_style_qualification_for_event = false:silent -# Language keywords vs BCL types preferences -dotnet_style_predefined_type_for_locals_parameters_members = true:silent -dotnet_style_predefined_type_for_member_access = true:silent -# Parentheses preferences -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent -# Modifier preferences -dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent -dotnet_style_readonly_field = true:suggestion -# Expression-level preferences -dotnet_style_object_initializer = true:suggestion -dotnet_style_collection_initializer = true:suggestion -dotnet_style_explicit_tuple_names = true:suggestion -dotnet_style_null_propagation = true:suggestion -dotnet_style_coalesce_expression = true:suggestion -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent -dotnet_style_prefer_inferred_tuple_names = true:suggestion -dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion -dotnet_style_prefer_auto_properties = true:silent -dotnet_style_prefer_conditional_expression_over_assignment = true:silent -dotnet_style_prefer_conditional_expression_over_return = true:silent -############################### -# Naming Conventions # -############################### -# Style Definitions -dotnet_naming_style.pascal_case_style.capitalization = pascal_case -# Use PascalCase for constant fields -dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields -dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style -dotnet_naming_symbols.constant_fields.applicable_kinds = field -dotnet_naming_symbols.constant_fields.applicable_accessibilities = * -dotnet_naming_symbols.constant_fields.required_modifiers = const -############################### -# C# Coding Conventions # -############################### -[*.cs] -# var preferences -csharp_style_namespace_declarations = file_scoped:warning -csharp_style_var_for_built_in_types = true:silent -csharp_style_var_when_type_is_apparent = true:silent -csharp_style_var_elsewhere = true:silent -# Expression-bodied members -csharp_style_expression_bodied_methods = false:silent -csharp_style_expression_bodied_constructors = false:silent -csharp_style_expression_bodied_operators = false:silent -csharp_style_expression_bodied_properties = true:silent -csharp_style_expression_bodied_indexers = true:silent -csharp_style_expression_bodied_accessors = true:silent -# Pattern matching preferences -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -# Null-checking preferences -csharp_style_throw_expression = true:suggestion -csharp_style_conditional_delegate_call = true:suggestion -# Modifier preferences -csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion -# Expression-level preferences -csharp_prefer_braces = true:silent -csharp_style_deconstructed_variable_declaration = true:suggestion -csharp_prefer_simple_default_expression = true:suggestion -csharp_style_pattern_local_over_anonymous_function = true:suggestion -csharp_style_inlined_variable_declaration = true:suggestion -############################### -# C# Formatting Rules # -############################### -# New line preferences -csharp_new_line_before_open_brace = all -csharp_new_line_before_else = true -csharp_new_line_before_catch = true -csharp_new_line_before_finally = true -csharp_new_line_before_members_in_object_initializers = true -csharp_new_line_before_members_in_anonymous_types = true -csharp_new_line_between_query_expression_clauses = true -# Indentation preferences -csharp_indent_case_contents = true -csharp_indent_switch_labels = true -csharp_indent_labels = flush_left -# Space preferences -csharp_space_after_cast = false -csharp_space_after_keywords_in_control_flow_statements = true -csharp_space_between_method_call_parameter_list_parentheses = false -csharp_space_between_method_declaration_parameter_list_parentheses = false -csharp_space_between_parentheses = false -csharp_space_before_colon_in_inheritance_clause = true -csharp_space_after_colon_in_inheritance_clause = true -csharp_space_around_binary_operators = before_and_after -csharp_space_between_method_declaration_empty_parameter_list_parentheses = false -csharp_space_between_method_call_name_and_opening_parenthesis = false -csharp_space_between_method_call_empty_parameter_list_parentheses = false -# Wrapping preferences -csharp_preserve_single_line_statements = true -csharp_preserve_single_line_blocks = true -############################### -# VB Coding Conventions # -############################### -[*.vb] -# Modifier preferences -visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion diff --git a/src/CrystallineSociety/.gitignore b/src/CrystallineSociety/.gitignore deleted file mode 100644 index 78ed0404..00000000 --- a/src/CrystallineSociety/.gitignore +++ /dev/null @@ -1,238 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -build/ -bld/ -[Bb]in/ -[Oo]bj/ - -# Visual Studio 2015 cache/options directory -.vs/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# DNX -project.lock.json -artifacts/ - -*_i.c -*_p.c -*_i.h -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -_NCrunch_* -.*crunch*.local.xml - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -## TODO: Comment the next line if you want to checkin your -## web deploy settings but do note that will include unencrypted -## passwords -*.pubxml - -*.publishproj - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config - -# Windows Azure Build Output -csx/ -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ - -# Others -ClientBin/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.publishsettings -node_modules/ -orleans.codegen.cs - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -*.mdf -*.ldf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings - -# Microsoft Fakes -FakesAssemblies/ - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# LightSwitch generated files -GeneratedArtifacts/ -_Pvt_Extensions/ -ModelManifest.xml - -# VS Code -.vscode - -# .NET Meteor -.meteor - -# Rider -.idea - -profile.arm.json - -# CrystallineSociety -*.map -*Resource.designer.cs -/**/*.css -custom.aprof - -/src/CrystallineSociety.Server/Attachments/**/*.* - -/src/Client/CrystallineSociety.Client.Core/wwwroot/scripts/app*.js - -/src/CrystallineSociety.Server/*.db* - -# Ignore bootstrap folder in web Project -!/src/Client/CrystallineSociety.Client.Web/wwwroot/lib/js/*.js -!/src/Client/CrystallineSociety.Client.Web/wwwroot/lib/js/*.css \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/.gitignore b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/.gitignore deleted file mode 100644 index caa3a7ef..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/projectSettingsUpdater.xml -/.idea.CrystallineSociety.iml -/modules.xml -/contentModel.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/discord.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/discord.xml deleted file mode 100644 index 30bab2ab..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/discord.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/encodings.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/encodings.xml deleted file mode 100644 index df87cf95..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/indexLayout.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/indexLayout.xml deleted file mode 100644 index 7b08163c..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_annotation_annotation.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_annotation_annotation.xml deleted file mode 100644 index db7e9c80..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_annotation_annotation.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_annotation_annotation_jvm.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_annotation_annotation_jvm.xml deleted file mode 100644 index 25266cff..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_annotation_annotation_jvm.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_arch_core_core_common.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_arch_core_core_common.xml deleted file mode 100644 index 689d696b..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_arch_core_core_common.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_collection_collection.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_collection_collection.xml deleted file mode 100644 index c2454d1d..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_collection_collection.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_collection_collection_ktx.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_collection_collection_ktx.xml deleted file mode 100644 index 6730a92f..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_collection_collection_ktx.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_concurrent_concurrent_futures.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_concurrent_concurrent_futures.xml deleted file mode 100644 index a4160645..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_concurrent_concurrent_futures.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_constraintlayout_constraintlayout_core.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_constraintlayout_constraintlayout_core.xml deleted file mode 100644 index f5912261..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_constraintlayout_constraintlayout_core.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_customview_customview_poolingcontainer.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_customview_customview_poolingcontainer.xml deleted file mode 100644 index 5f8a0e02..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_customview_customview_poolingcontainer.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_lifecycle_lifecycle_common.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_lifecycle_lifecycle_common.xml deleted file mode 100644 index 5049899e..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_lifecycle_lifecycle_common.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_profileinstaller_profileinstaller.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_profileinstaller_profileinstaller.xml deleted file mode 100644 index c0f7dfe9..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_profileinstaller_profileinstaller.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_resourceinspection_resourceinspection_annotation.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_resourceinspection_resourceinspection_annotation.xml deleted file mode 100644 index 019b9c41..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_resourceinspection_resourceinspection_annotation.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_window_extensions_core_core.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_window_extensions_core_core.xml deleted file mode 100644 index dbf0b6bd..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/androidx_window_extensions_core_core.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/annotations.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/annotations.xml deleted file mode 100644 index 076294ab..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/annotations.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/disklrucache.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/disklrucache.xml deleted file mode 100644 index 1df118ee..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/disklrucache.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/guava_listenablefuture.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/guava_listenablefuture.xml deleted file mode 100644 index 99ada19d..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/guava_listenablefuture.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_annotations_24_0_1.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_annotations_24_0_1.xml deleted file mode 100644 index 2102466d..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_annotations_24_0_1.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_1_9_0.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_1_9_0.xml deleted file mode 100644 index 54cf6633..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_1_9_0.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_common_1_9_0.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_common_1_9_0.xml deleted file mode 100644 index 504d1da0..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_common_1_9_0.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_9_0.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_9_0.xml deleted file mode 100644 index 1d6f65a7..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_9_0.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_9_0.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_9_0.xml deleted file mode 100644 index 8dea5c6c..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_9_0.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlinx_kotlinx_coroutines_android_1_7_2.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlinx_kotlinx_coroutines_android_1_7_2.xml deleted file mode 100644 index 57ede73f..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlinx_kotlinx_coroutines_android_1_7_2.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_7_2.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_7_2.xml deleted file mode 100644 index 01359084..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/libraries/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_7_2.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/vcs.xml b/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/vcs.xml deleted file mode 100644 index b2bdec2d..00000000 --- a/src/CrystallineSociety/.idea/.idea.CrystallineSociety/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Clean.bat b/src/CrystallineSociety/Clean.bat deleted file mode 100644 index 47b6fc10..00000000 --- a/src/CrystallineSociety/Clean.bat +++ /dev/null @@ -1,17 +0,0 @@ -FOR /F "tokens=*" %%G IN ('DIR /B /AD /S bin') DO RMDIR /S /Q "%%G" -FOR /F "tokens=*" %%G IN ('DIR /B /AD /S debug') DO RMDIR /S /Q "%%G" -FOR /F "tokens=*" %%G IN ('DIR /B /AD /S release') DO RMDIR /S /Q "%%G" -FOR /F "tokens=*" %%G IN ('DIR /B /AD /S obj') DO RMDIR /S /Q "%%G" -FOR /F "tokens=*" %%G IN ('DIR /B /AD /S node_modules') DO RMDIR /S /Q "%%G" -FOR /F "tokens=*" %%G IN ('DIR /B /AD /S Packages') DO RMDIR /S /Q "%%G" -FOR /F "tokens=*" %%G IN ('DIR /B /AD /S .vs') DO RMDIR /S /Q "%%G" -FOR /F "tokens=*" %%G IN ('DIR /B /AD /S .angular') DO RMDIR /S /Q "%%G" -FOR /F "tokens=*" %%G IN ('DIR /B /AD /S TestResults') DO RMDIR /S /Q "%%G" -DEL /Q /F /S "Resource.designer.cs" -DEL /Q /F /S "*.csproj.user" -DEL /Q /F /S "*.csproj.user" -DEL /Q /F /S "*.Model.Context.d.ts" -DEL /Q /F /S "*.Model.Context.js" -DEL /Q /F /S "Client\CrystallineSociety.Client.Core\Components\*.css" -DEL /Q /F /S "Client\CrystallineSociety.Client.Core\Components\*.css.map" -DEL /Q /F /S "Client\CrystallineSociety.Client.Core\Components\*.min.css" \ No newline at end of file diff --git a/src/CrystallineSociety/Clean.sh b/src/CrystallineSociety/Clean.sh deleted file mode 100644 index 04061b11..00000000 --- a/src/CrystallineSociety/Clean.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -# This batch script cleans your project by deleting unnecessary files. -# It is important to close any IDEs, such as vs for mac, before running this script to prevent conflicts or data loss. -# The commands in this script are specifically designed for macOS/Linux. - -# Runs the dotnet clean command for each .csproj file. -for csproj in $(find . -name '*.csproj'); do - dotnet clean $csproj -done - -# Deletes specified directories -for dir in $(find . -type d \( -name "bin" -o -name "obj" -o -name "node_modules" -o -name "Packages" -o -name ".vs" -o -name "TestResults" -o -name "AppPackages" -o -name ".meteor" \)); do - rm -rf $dir -done - -# Deletes specified files -for file in $(find . -type f \( -name "*.csproj.user" -o -name "Resources.designer.cs" -o -name "*.css" -o -name "*.min.css" -o -name "*.js" -o -name "*.min.js" -o -name "*.map" \)); do - rm -f $file -done - -# Deletes empty directories. -find . -type d -empty -delete \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/AppComponentBase.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/AppComponentBase.cs deleted file mode 100644 index 7299cf06..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/AppComponentBase.cs +++ /dev/null @@ -1,191 +0,0 @@ -using System.Text.Json; - -namespace CrystallineSociety.Client.Core.Components; - -public partial class AppComponentBase : ComponentBase, IDisposable -{ - [AutoInject] protected IJSRuntime JSRuntime = default!; - - [AutoInject] protected IStorageService StorageService = default!; - - [AutoInject] protected HttpClient HttpClient = default!; - - [AutoInject] protected JsonSerializerOptions JsonSerializerOptions = default!; - - /// - /// - /// - [AutoInject] protected IPrerenderStateService PrerenderStateService = default!; - - /// - /// - /// - [AutoInject] protected IPubSubService PubSubService = default!; - - [AutoInject] protected IConfiguration Configuration = default!; - - [AutoInject] protected NavigationManager NavigationManager = default!; - - [AutoInject] protected IAuthTokenProvider AuthTokenProvider = default!; - - [AutoInject] protected IStringLocalizer Localizer = default!; - - [AutoInject] protected IExceptionHandler ExceptionHandler = default!; - - [AutoInject] protected AuthenticationManager AuthenticationManager = default!; - - [CascadingParameter] public Task AuthenticationStateTask { get; set; } = default!; - - private readonly CancellationTokenSource cts = new(); - protected CancellationToken CurrentCancellationToken => cts.Token; - - protected sealed override async Task OnInitializedAsync() - { - try - { - await OnInitAsync(); - await base.OnInitializedAsync(); - } - catch (Exception exp) - { - ExceptionHandler.Handle(exp); - } - } - - protected sealed override async Task OnParametersSetAsync() - { - try - { - await OnParamsSetAsync(); - await base.OnParametersSetAsync(); - } - catch (Exception exp) - { - ExceptionHandler.Handle(exp); - } - } - - /// - /// Replacement for which catches all possible exceptions in order to prevent app crash. - /// - protected virtual Task OnInitAsync() - { - return Task.CompletedTask; - } - - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender) - { - try - { - await OnAfterFirstRenderAsync(); - } - catch (Exception exp) - { - ExceptionHandler.Handle(exp); - } - } - - await base.OnAfterRenderAsync(firstRender); - } - - protected sealed override void OnInitialized() - { - base.OnInitialized(); - } - - /// - /// Replacement for which catches all possible exceptions in order to prevent app crash. - /// - protected virtual Task OnParamsSetAsync() - { - return Task.CompletedTask; - } - - /// - /// Method invoked after first time the component has been rendered. - /// - protected virtual Task OnAfterFirstRenderAsync() - { - return Task.CompletedTask; - } - - /// - /// Executes passed action while catching all possible exceptions to prevent app crash. - /// - public virtual Action WrapHandled(Action action) - { - return () => - { - try - { - action(); - } - catch (Exception exp) - { - ExceptionHandler.Handle(exp); - } - }; - } - - /// - /// Executes passed action while catching all possible exceptions to prevent app crash. - /// - public virtual Action WrapHandled(Action func) - { - return (e) => - { - try - { - func(e); - } - catch (Exception exp) - { - ExceptionHandler.Handle(exp); - } - }; - } - - /// - /// Executes passed function while catching all possible exceptions to prevent app crash. - /// - public virtual Func WrapHandled(Func func) - { - return async () => - { - try - { - await func(); - } - catch (Exception exp) - { - ExceptionHandler.Handle(exp); - } - }; - } - - /// - /// Executes passed function while catching all possible exceptions to prevent app crash. - /// - public virtual Func WrapHandled(Func func) - { - return async (e) => - { - try - { - await func(e); - } - catch (Exception exp) - { - ExceptionHandler.Handle(exp); - } - }; - } - - public virtual void Dispose() - { - cts.Cancel(); - cts.Dispose(); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/AppDataAnnotationsValidator.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/AppDataAnnotationsValidator.cs deleted file mode 100644 index 95150d36..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/AppDataAnnotationsValidator.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; -using CrystallineSociety.Shared.Attributes; -using CrystallineSociety.Shared.Dtos.Identity; -using Microsoft.AspNetCore.Components.Forms; - -namespace CrystallineSociety.Client.Core.Components; - -/// -/// To implement forms where each error is displayed according to the language chosen by the user, you can use the -/// on the corresponding class instead of using `ErrorResourceType` on each property. Check out for an example. -/// However, you need to use instead of in Blazor EditForms for this method to work. -/// -public partial class AppDataAnnotationsValidator : AppComponentBase, IDisposable -{ - private static readonly PropertyInfo otherPropertyNamePropertyInfo = typeof(CompareAttribute).GetProperty(nameof(CompareAttribute.OtherPropertyDisplayName))!; - - private bool disposed; - private ValidationMessageStore validationMessageStore = default!; - - [AutoInject] private IServiceProvider serviceProvider = default!; - [AutoInject] private IStringLocalizerFactory stringLocalizerFactory = default!; - - [CascadingParameter] public EditContext EditContext { get; set; } = default!; - - protected override Task OnInitAsync() - { - if (EditContext is null) - throw new InvalidOperationException("EditContext is required"); - - EditContext.OnFieldChanged += OnFieldChanged; - EditContext.OnValidationRequested += OnValidationRequested; - - validationMessageStore = new ValidationMessageStore(EditContext); - - return base.OnInitAsync(); - } - - private void OnFieldChanged(object? sender, FieldChangedEventArgs eventArgs) - { - var fieldIdentifier = eventArgs.FieldIdentifier; - var propertyInfo = fieldIdentifier.Model.GetType().GetProperty(fieldIdentifier.FieldName); - if (propertyInfo is null) return; - - var propertyValue = propertyInfo.GetValue(fieldIdentifier.Model); - var validationContext = new ValidationContext(fieldIdentifier.Model, serviceProvider, items: null) - { - MemberName = propertyInfo.Name - }; - var results = new List(); - - var parent = propertyInfo.DeclaringType!; - var dtoResourceTypeAttr = parent.GetCustomAttribute(); - if (dtoResourceTypeAttr is not null) - { - var resourceType = dtoResourceTypeAttr.ResourceType; - var stringLocalizer = stringLocalizerFactory.Create(resourceType); - var validationAttributes = propertyInfo.GetCustomAttributes(); - - foreach (var attribute in validationAttributes) - { - if (string.IsNullOrEmpty(attribute.ErrorMessage) is false) - { - attribute.ErrorMessageResourceName = attribute.ErrorMessage; - attribute.ErrorMessage = null; - } - - if (string.IsNullOrWhiteSpace(attribute.ErrorMessageResourceName) is false && attribute.ErrorMessageResourceType is null) - { - attribute.ErrorMessageResourceType = resourceType; - var displayAttribute = propertyInfo.GetCustomAttribute(); - validationContext.DisplayName = stringLocalizer.GetString(displayAttribute?.Name ?? propertyInfo.Name); - - if (attribute is CompareAttribute compareAttribute) - { - var otherPropertyInfoDisplayAttribute = (parent.GetProperty(compareAttribute.OtherProperty) ?? throw new InvalidOperationException($"Invalid OtherProperty {compareAttribute.OtherProperty}")).GetCustomAttribute(); - otherPropertyNamePropertyInfo.SetValue(attribute, stringLocalizer.GetString(otherPropertyInfoDisplayAttribute?.Name ?? compareAttribute.OtherProperty).ToString()); - } - } - - var result = attribute.GetValidationResult(propertyValue, validationContext); - - if (result is not null) - { - results.Add(result); - } - } - - } - else - { - Validator.TryValidateProperty(propertyValue, validationContext, results); - } - - validationMessageStore.Clear(fieldIdentifier); - foreach (var result in CollectionsMarshal.AsSpan(results)) - { - validationMessageStore.Add(fieldIdentifier, result.ErrorMessage!); - } - - EditContext.NotifyValidationStateChanged(); - } - - private void OnValidationRequested(object? sender, ValidationRequestedEventArgs e) - { - var validationContext = new ValidationContext(EditContext.Model, serviceProvider, items: null); - var results = new List(); - - var objectType = validationContext.ObjectType; - var objectInstance = validationContext.ObjectInstance; - var dtoResourceTypeAttr = objectType.GetCustomAttribute(); - - validationMessageStore.Clear(); - if (dtoResourceTypeAttr is not null) - { - var resourceType = dtoResourceTypeAttr.ResourceType; - - var stringLocalizer = stringLocalizerFactory.Create(resourceType); - - var properties = objectType.GetProperties(BindingFlags.Instance | BindingFlags.Public); - - foreach (var propertyInfo in properties) - { - var context = new ValidationContext(objectInstance, validationContext, validationContext.Items); - context.MemberName = propertyInfo.Name; - var propertyValue = propertyInfo.GetValue(objectInstance); - var validationAttributes = propertyInfo.GetCustomAttributes(); - foreach (var attribute in validationAttributes) - { - if (string.IsNullOrEmpty(attribute.ErrorMessage) is false) - { - attribute.ErrorMessageResourceName = attribute.ErrorMessage; - attribute.ErrorMessage = null; - } - - if (string.IsNullOrWhiteSpace(attribute.ErrorMessageResourceName) is false && attribute.ErrorMessageResourceType is null) - { - attribute.ErrorMessageResourceType = resourceType; - var displayAttribute = propertyInfo.GetCustomAttribute(); - validationContext.DisplayName = stringLocalizer.GetString(displayAttribute?.Name ?? propertyInfo.Name); - if (attribute is CompareAttribute compareAttribute) - { - var otherPropertyInfoDisplayAttribute = (properties.FirstOrDefault(p => p.Name == compareAttribute.OtherProperty) ?? throw new InvalidOperationException($"Invalid OtherProperty {compareAttribute.OtherProperty}")).GetCustomAttribute(); - otherPropertyNamePropertyInfo.SetValue(attribute, stringLocalizer.GetString(otherPropertyInfoDisplayAttribute?.Name ?? compareAttribute.OtherProperty).ToString()); - } - } - - var result = attribute.GetValidationResult(propertyValue, context); - - if (result is not null) - { - results.Add(result); - } - } - } - } - else - { - Validator.TryValidateObject(EditContext.Model, validationContext, results, true); - } - - validationMessageStore.Clear(); - foreach (var validationResult in results) - { - if (validationResult == null) continue; - - var hasMemberNames = false; - foreach (var memberName in validationResult.MemberNames) - { - hasMemberNames = true; - validationMessageStore.Add(EditContext.Field(memberName), validationResult.ErrorMessage!); - } - - if (hasMemberNames) continue; - - validationMessageStore.Add(new FieldIdentifier(EditContext.Model, fieldName: string.Empty), validationResult.ErrorMessage!); - } - - EditContext.NotifyValidationStateChanged(); - } - - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposed || disposing is false) return; - - if (EditContext is not null) - { - EditContext.OnFieldChanged -= OnFieldChanged; - EditContext.OnValidationRequested -= OnValidationRequested; - } - - disposed = true; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeContent.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeContent.razor deleted file mode 100644 index dc71a0ae..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeContent.razor +++ /dev/null @@ -1,161 +0,0 @@ -@page "/badgecontent" -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@using CrystallineSociety.Client.Core.Components - -@if (Badge != null) -{ -
-
- -
-
@Badge.Title
-
@Badge.Description
-
-
-
- - - -
-

Different methods to obtain this badge.

- -
- @if (selectedAppraisalMethod != null) - { -
-
-
-
Badge Requirements
-
-
-
    - @{ - var badgeRequirements = selectedAppraisalMethod.BadgeRequirements; - } - - @if (badgeRequirements == null || !badgeRequirements.Any()) - { -
    No badge requirements.
    - } - else - { - @foreach (var badgeRequirement in badgeRequirements) - { - - } - } -
-
-
- -
-
-
Activity Requirements
-
-
-
    - @{ - var activityRequirements = selectedAppraisalMethod?.ActivityRequirements; - } - - @if (activityRequirements == null || !activityRequirements.Any()) - { -
    No activity requirements.
    - } - else - { - @foreach (var activityRequirement in activityRequirements) - { - - } - } -
-
-
- -
-
-
Approving Steps
-
-
- @{ - var approvingSteps = selectedAppraisalMethod?.ApprovingSteps; - } - - @if (approvingSteps == null || !approvingSteps.Any()) - { -
No Approving Steps.
- } - else - { - @foreach (var approvingStep in approvingSteps) - { -
-
-
-
Step @approvingStep.Step: @approvingStep.Title
-
-
-
-
Approver Required Badges:
-
    - @{ - var approverBadges = approvingStep?.ApproverRequiredBadges; - } - - @if (approverBadges == null || !approverBadges.Any()) - { -
    No Approver Required Badges.
    - } - else - { - @foreach (var approverBadge in approverBadges) - { - - } - } -
-
Required Approval Count: @approvingStep.RequiredApprovalCount
-
-
-
-
- } - } -
-
-
- } -
-
-
-} -else -{ -
-

No Badge Selected

-
-} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeContent.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeContent.razor.cs deleted file mode 100644 index e406b5a4..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeContent.razor.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using Microsoft.AspNetCore.Components; -using CrystallineSociety.Shared.Dtos.BadgeSystem; - -namespace CrystallineSociety.Client.Core.Components -{ - public partial class BadgeContent : ComponentBase - { - [Parameter] public BadgeDto? Badge { get; set; } - private AppraisalMethod? selectedAppraisalMethod; - - protected override void OnParametersSet() - { - if (Badge?.AppraisalMethods?.Any() == true) - { - selectedAppraisalMethod = Badge.AppraisalMethods.First(); - } - else - { - selectedAppraisalMethod = null; - } - } - - private void SelectAppraisalMethod(AppraisalMethod appraisalMethod) - { - selectedAppraisalMethod = appraisalMethod; - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeContent.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeContent.razor.scss deleted file mode 100644 index 35c9cc4d..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeContent.razor.scss +++ /dev/null @@ -1,28 +0,0 @@ -.badge-container { - height: 70vh; - overflow-y: auto; -} - -.badge-image { - width: 35px; - height: 35px; -} - -.Gold{ - background: url("images/icons/gold.png") center/cover no-repeat; -} -.Silver { - background: url("images/icons/silver.png") center/cover no-repeat; -} -.Bronze { - background: url("images/icons/bronze.png") center/cover no-repeat; -} - -.content-container { - overflow-y: auto; - overflow-x: hidden; -} - -.color-style { - color: black; -} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeRequirement.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeRequirement.razor deleted file mode 100644 index c7aa2665..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeRequirement.razor +++ /dev/null @@ -1,23 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - - @{string[] parts = @Requirement?.RequirementStr.Split('*');} - - @if (parts.Length > 1) - { - string textBeforeAsterisk = parts[0]; - string textAfterAsterisk = parts[1]; -
@textBeforeAsterisk - @textAfterAsterisk -
- } - else - { - string textBeforeAsterisk = parts[0]; - string textAfterAsterisk = "1"; -
@textBeforeAsterisk - @textAfterAsterisk -
- } - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeRequirement.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeRequirement.razor.cs deleted file mode 100644 index 4c0a7fef..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeRequirement.razor.cs +++ /dev/null @@ -1,9 +0,0 @@ -using CrystallineSociety.Shared.Dtos.BadgeSystem; -using Microsoft.AspNetCore.Components; - -namespace CrystallineSociety.Client.Core.Components; - - public partial class BadgeRequirement - { - [Parameter] public IRequirement? Requirement { get; set; } - } diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeRequirement.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeRequirement.razor.scss deleted file mode 100644 index 5f282702..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeRequirement.razor.scss +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeSystem.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeSystem.razor deleted file mode 100644 index 7eb55d6f..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeSystem.razor +++ /dev/null @@ -1,12 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - -
-
- - -
-
- -
-
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeSystem.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeSystem.razor.cs deleted file mode 100644 index e2f25d7f..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeSystem.razor.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Text; -using CrystallineSociety.Shared.Dtos.BadgeSystem; - -namespace CrystallineSociety.Client.Core.Components -{ - public partial class BadgeSystem - { - [AutoInject] private IBadgeSystemService BadgeSystemService { get; set; } = default!; - [AutoInject] private IBadgeUtilService BadgeUtilService { get; set; } = default!; - [Parameter] public BadgeBundleDto? Bundle { get; set; } - private BadgeDto? BadgeDto {get; set;} - - - private string? GetBundleText(BadgeBundleDto bundle) - { - var builder = new StringBuilder(); - if (Bundle != null) - { - foreach (var badge in Bundle.Badges) - { - builder.AppendLine(BadgeUtilService.SerializeBadge(badge)); - } - } - - return builder.ToString(); - } - - private void GetBadge(BadgeDto badgeDto) - { - BadgeDto = badgeDto; - } - } - - -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeSystem.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeSystem.razor.scss deleted file mode 100644 index 5f282702..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeSystem.razor.scss +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeTree.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeTree.razor deleted file mode 100644 index 085244b3..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeTree.razor +++ /dev/null @@ -1,85 +0,0 @@ -@page "/badge-tree" -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@using Microsoft.AspNetCore.Components.Web -@using CrystallineSociety.Client.Core.Components - -
-
-
- -
- @if (Badges == null) - { -
-
-
- -
-
-
- } - else - { -
- @for (int i = 0; i < 5; i++) - { -
    -
  • - -
    - @if (Badges != null) - { -
      - @for (int badgeIndex = 0; badgeIndex < Badges.Count; badgeIndex++) - { - var badge = Badges[badgeIndex]; -
    • - -
    • - // Temp code for SubFolder name - @for (int j = 0; j < 3; j++) - { -
        -
      • - -
        - @if (Badges != null) - { -
          - @for (int k = 0; k < 2; k++) - { -
        • - -
        • - } -
        - } -
        -
      • -
      - } - } -
    - } -
    -
  • -
- } -
- } -
-
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeTree.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeTree.razor.cs deleted file mode 100644 index b5b0fa81..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeTree.razor.cs +++ /dev/null @@ -1,57 +0,0 @@ -using CrystallineSociety.Shared.Dtos.BadgeSystem; - -namespace CrystallineSociety.Client.Core.Components -{ - public partial class BadgeTree : ComponentBase - { - [Parameter] public BadgeBundleDto? BadgeBundleDto { get; set; } - [Parameter] public EventCallback BadgeDtoCallBack { get; set; } - - private Dictionary homeCollapseState = new(); - private Dictionary<(int, int, int), bool> subFolderCollapseState = new(); - private List? Badges { get; set; } - private string? ActiveBadgeUrl { get; set; } - - - protected override void OnParametersSet() - { - if (BadgeBundleDto != null) - { - Badges = BadgeBundleDto.Badges.ToList(); - } - } - - private void ToggleHomeCollapse(int index) - { - if (homeCollapseState.ContainsKey(index)) - { - homeCollapseState[index] = !homeCollapseState[index]; - } - else - { - homeCollapseState[index] = true; - } - } - - private void ToggleSubFolder(int folderIndex, int badgeIndex, int subFolderIndex) - { - var key = (folderIndex, badgeIndex, subFolderIndex); - if (subFolderCollapseState.ContainsKey(key)) - { - subFolderCollapseState[key] = !subFolderCollapseState[key]; - } - else - { - subFolderCollapseState[key] = true; - } - } - - private async Task OnBadgeClick(BadgeDto badgeDto) - { - ActiveBadgeUrl = badgeDto.Url; - await BadgeDtoCallBack.InvokeAsync(badgeDto); - } - - private string GetArrowClass(bool isExpanded) => isExpanded ? "down-arrow" : "right-arrow"; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeTree.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeTree.razor.scss deleted file mode 100644 index 32ca3071..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeTree.razor.scss +++ /dev/null @@ -1,27 +0,0 @@ -.badge-image { - width: 8px; - height: 8px; -} - -.right-arrow{ - background: url("images/icons/right-arrow.png") center/cover no-repeat; -} - -.down-arrow{ - background: url("images/icons/down-arrow.png") center/cover no-repeat; -} - -.badge-container { - height: 70vh; - overflow-y: hidden; -} - -.customize-spacing { - padding: 3px 6px !important; - line-height: 18px; - margin-bottom: 1px; - - div { - line-height: 10px; - } -} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeValidation.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeValidation.razor deleted file mode 100644 index c473cea7..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeValidation.razor +++ /dev/null @@ -1,18 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - -@if (BadgeBundle?.Validations != null) -{ - - -
-
Level: @badgeValidation.Level
-
Title: @badgeValidation.Title
-
Description: @badgeValidation.Description
-
-
-
-} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeValidation.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeValidation.razor.cs deleted file mode 100644 index 92a89e0d..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeValidation.razor.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CrystallineSociety.Shared.Dtos.BadgeSystem; - -namespace CrystallineSociety.Client.Core.Components; - -public partial class BadgeValidation -{ - [Parameter] public BadgeBundleDto? BadgeBundle { get; set; } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeValidation.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeValidation.razor.scss deleted file mode 100644 index 458e4476..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/BadgeValidation.razor.scss +++ /dev/null @@ -1,11 +0,0 @@ -.Error { - color: red; -} - -.Warning { - color: orange; -} - -.Information { - color: skyblue; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/AppErrorBoundary.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/AppErrorBoundary.razor deleted file mode 100644 index 79129e9a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/AppErrorBoundary.razor +++ /dev/null @@ -1,31 +0,0 @@ -@namespace CrystallineSociety.Client.Shared -@inherits ErrorBoundaryBase - -@if (CurrentException is null) -{ - @ChildContent -} -else if (ErrorContent is null) -{ -
-
- -
-
- -
-

Oops, something went wrong...

- @if (ShowException) - { -
@CurrentException?.ToString()
- } -
- Refresh - Home -
-
-} -else -{ - @ErrorContent(CurrentException) -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/AppErrorBoundary.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/AppErrorBoundary.razor.cs deleted file mode 100644 index 82384794..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/AppErrorBoundary.razor.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace CrystallineSociety.Client.Shared; - -public partial class AppErrorBoundary -{ - [AutoInject] private IExceptionHandler _exceptionHandler = default!; - - [AutoInject] private NavigationManager _navigationManager = default!; - - private bool ShowException { get; set; } - -#if DEBUG - protected override void OnInitialized() - { - ShowException = true; - } -#endif - - protected override Task OnErrorAsync(Exception exception) - { - _exceptionHandler.Handle(exception); - - return Task.CompletedTask; - } - - private void Refresh() - { - _navigationManager.NavigateTo(_navigationManager.Uri, true); - } - - private void GoHome() - { - _navigationManager.NavigateTo("/", true); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/AppErrorBoundary.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/AppErrorBoundary.razor.scss deleted file mode 100644 index 734d0d87..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/AppErrorBoundary.razor.scss +++ /dev/null @@ -1,34 +0,0 @@ -@import '../../Styles/abstracts/_colors.scss'; -@import '../../Styles/abstracts/_functions.scss'; - -.main { - display: flex; - flex-direction: column; - text-align: center; - width: 100%; - max-width: rem(800px); - max-height: rem(600px); - background-color: $White; - border-radius: rem(4px); - padding: rem(8px); -} - -.header { - text-align: right; -} - -.title { - color: $Red; -} - -.exception { - color: $Black; - white-space: pre; - overflow: auto; - text-align: left; - margin: rem(24px); -} - -.buttons { - margin-bottom: rem(24px); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/ConfirmMessageBox.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/ConfirmMessageBox.razor deleted file mode 100644 index 578813bd..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/ConfirmMessageBox.razor +++ /dev/null @@ -1,25 +0,0 @@ -@inherits AppComponentBase; - - -
-
- @title - -
-
- @message -
-
- - @Localizer[nameof(AppStrings.Yes)] - - - - @Localizer[nameof(AppStrings.No)] - -
-
-
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/ConfirmMessageBox.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/ConfirmMessageBox.razor.cs deleted file mode 100644 index 21a914f4..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/ConfirmMessageBox.razor.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace CrystallineSociety.Client.Core.Components.Layout; - -public partial class ConfirmMessageBox -{ - private bool isOpen; - private string? title; - private string? message; - - public async Task Show(string message, string title) - { - if (tcs is not null) - await tcs.Task; - - tcs = new TaskCompletionSource(); - - await InvokeAsync(() => - { - isOpen = true; - this.title = title; - this.message = message; - - StateHasChanged(); - }); - - return await tcs.Task; - } - - private TaskCompletionSource? tcs; - - public async Task Confirm(bool value) - { - isOpen = false; - tcs?.SetResult(value); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/ConfirmMessageBox.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/ConfirmMessageBox.razor.scss deleted file mode 100644 index c2d93ada..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/ConfirmMessageBox.razor.scss +++ /dev/null @@ -1,44 +0,0 @@ -@import '../../Styles/abstracts/_functions.scss'; -@import '../../Styles/abstracts/_media-queries.scss'; -@import '../../Styles/abstracts/_bit-css-variables.scss'; - -.main-container { - flex-grow: 1; - display: flex; - align-items: center; - flex-flow: column nowrap; - justify-content: flex-start; - padding: rem2(16px) rem2(24px); - background-color: $bit-color-background-primary; -} - -.header { - width: 100%; - display: flex; - align-items: center; - flex-flow: row nowrap; - margin-bottom: rem2(20px); - justify-content: space-between; -} - -.title { - font-weight: 600; - font-size: rem2(20px); - line-height: rem2(28px); -} - -.body { - width: 100%; - font-weight: 400; - font-size: rem2(14px); - line-height: rem2(20px); - margin-bottom: rem2(16px); -} - -.btn-group { - width: 100%; - display: flex; - align-items: center; - flex-flow: row nowrap; - justify-content: flex-end; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Footer.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Footer.razor deleted file mode 100644 index 308fdad8..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Footer.razor +++ /dev/null @@ -1,6 +0,0 @@ -@namespace CrystallineSociety.Client.Shared -@inherits AppComponentBase - -
- -
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Footer.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Footer.razor.cs deleted file mode 100644 index 9b0596fd..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Footer.razor.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace CrystallineSociety.Client.Core.Components.Layout; - -public partial class Footer -{ -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Footer.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Footer.razor.scss deleted file mode 100644 index b45d8372..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Footer.razor.scss +++ /dev/null @@ -1,98 +0,0 @@ -@import '../../Styles/abstracts/_media-queries.scss'; -@import '../../Styles/abstracts/_colors.scss'; -@import '../../Styles/abstracts/_functions.scss'; - -.footer { - display: flex; - flex-flow: column nowrap; - justify-content: center; - align-items: center; - width: 100%; -} - -.footer-content { - display: flex; - flex-flow: column nowrap; - justify-content: center; - align-items: center; - width: 100%; - min-height: rem(54px); - border-top: rem(1px) solid $S1Color; - padding: rem(4px) 0; - box-sizing: border-box; - - @include lt-xl { - min-height: rem(50px); - } -} - -.footer-contact { - margin-bottom: rem(4px); - font-size: rem(14px); - line-height: rem(20px); - color: $S4Color; - - @include lg { - font-size: rem(13px); - line-height: rem(19px); - } - - @include lt-lg { - font-size: rem(12px); - } -} - -.footer-copyright { - font-size: rem(12px); - line-height: rem(20px); - color: $S4Color; - - @include lt-xl { - font-size: rem(10px); - line-height: rem(16px); - } -} - -.footer-social-lnk-grp { - display: flex; - flex-flow: row nowrap; - justify-content: center; - align-items: center; -} - -.social-lnk { - width: rem(32px); - height: rem(32px); - background-position: center; - background-repeat: no-repeat; - background-size: cover; -} - -.twitter-lnk { - background-image: url('images/icons/twitter-icon.svg'); -} - -.youtube-lnk { - background-image: url('images/icons/youtube-icon.svg'); -} - -.linkedin-lnk { - background-image: url('images/icons/linkedin-icon.svg'); -} - -.github-lnk { - background-image: url('images/icons/github-icon.svg'); -} - -.text--red { - color: $Red; -} - -::deep { - .culture-drp { - position: absolute; - left: rem(5px); - width: rem(105px); - background-color: white; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Header.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Header.razor deleted file mode 100644 index 2e02dc7e..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Header.razor +++ /dev/null @@ -1,37 +0,0 @@ -@namespace CrystallineSociety.Client.Core.Components.Layout -@inherits AppComponentBase - -
- -
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Header.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Header.razor.cs deleted file mode 100644 index 6f75588b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Header.razor.cs +++ /dev/null @@ -1,54 +0,0 @@ -using CrystallineSociety.Shared.Dtos.Organization; -using CrystallineSociety.Shared.Dtos.Identity; -using CrystallineSociety.Client.Core.Controllers; - -namespace CrystallineSociety.Client.Core.Components.Layout; - -public partial class Header : IDisposable -{ - private bool _disposed; - private bool _isUserAuthenticated; - - [Parameter] - public EventCallback OnToggleMenu { get; set; } - - [AutoInject] - public required IOrganizationController OrganizationController { get; set; } - - [CascadingParameter(Name = "AppState")] - public AppStateDto AppState { get; set; } = default!; - - private List Organizations { get; set; } = new(); - - private OrganizationDto? ActiveOrganization { get; set; } - - protected override async Task OnInitAsync() - { - Organizations = await PrerenderStateService.GetValue(async () => await HttpClient.GetFromJsonAsync>("api/Organization/GetOrganizations")) ?? new(); - } - - private async Task ToggleMenu() - { - await OnToggleMenu.InvokeAsync(); - } - - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (_disposed) return; - - _disposed = true; - } - - private void HandleOrganizationClick(OrganizationDto organization) - { - ActiveOrganization = organization; - AppState.Organization = ActiveOrganization; - NavigationManager.NavigateTo($"/o/{organization.Code}",false); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Header.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Header.razor.scss deleted file mode 100644 index d9623afc..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/Header.razor.scss +++ /dev/null @@ -1,4 +0,0 @@ -@import '../../Styles/abstracts/_media-queries.scss'; -@import '../../Styles/abstracts/_colors.scss'; -@import '../../Styles/abstracts/_functions.scss'; - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/LoadingComponent.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/LoadingComponent.razor deleted file mode 100644 index 01a374d7..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/LoadingComponent.razor +++ /dev/null @@ -1,13 +0,0 @@ -@namespace CrystallineSociety.Client.Shared - - - -
-
-
-
-
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/LoadingComponent.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/LoadingComponent.razor.cs deleted file mode 100644 index 60e41dc6..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/LoadingComponent.razor.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace CrystallineSociety.Client.Shared; - -public partial class LoadingComponent -{ - [Parameter] public string Color { get; set; } = "#123456"; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/LoadingComponent.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/LoadingComponent.razor.scss deleted file mode 100644 index 8dcbb1f0..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/LoadingComponent.razor.scss +++ /dev/null @@ -1,91 +0,0 @@ -@import '../../Styles/abstracts/_functions.scss'; - -.lds-wrapper { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - -.lds-grid { - display: inline-block; - position: relative; - width: rem(80px); - height: rem(80px); - div - -{ - position: absolute; - width: rem(16px); - height: rem(16px); - border-radius: 50%; - animation: lds-grid 1.2s linear infinite; - &:nth-child(1) - -{ - top: 8px; - left: 8px; - animation-delay: 0s; -} - -&:nth-child(2) { - top: 8px; - left: 32px; - animation-delay: -0.4s; -} - -&:nth-child(3) { - top: 8px; - left: 56px; - animation-delay: -0.8s; -} - -&:nth-child(4) { - top: 32px; - left: 8px; - animation-delay: -0.4s; -} - -&:nth-child(5) { - top: 32px; - left: 32px; - animation-delay: -0.8s; -} - -&:nth-child(6) { - top: 32px; - left: 56px; - animation-delay: -1.2s; -} - -&:nth-child(7) { - top: 56px; - left: 8px; - animation-delay: -0.8s; -} - -&:nth-child(8) { - top: 56px; - left: 32px; - animation-delay: -1.2s; -} - -&:nth-child(9) { - top: 56px; - left: 56px; - animation-delay: -1.6s; -} - -} -} - - -@keyframes lds-grid { - 0%, 100% { - opacity: 1; - } - - 50% { - opacity: 0.5; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MainLayout.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MainLayout.razor deleted file mode 100644 index 34d4c8bf..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MainLayout.razor +++ /dev/null @@ -1,36 +0,0 @@ -@namespace CrystallineSociety.Client.Core.Components.Layout -@inherits LayoutComponentBase - - -
-
-
- - @Body - -
-
-
- - -
- -@* -
- - @if (_isUserAuthenticated) - { - - } - -
-
- - @Body - -
-
-
- - - *@ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MainLayout.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MainLayout.razor.cs deleted file mode 100644 index 5266063a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MainLayout.razor.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Microsoft.AspNetCore.Components.Web; - -namespace CrystallineSociety.Client.Core.Components.Layout; - -public partial class MainLayout : IDisposable -{ - private bool _disposed; - private bool _isMenuOpen; - private bool _isUserAuthenticated; - private ErrorBoundary ErrorBoundaryRef = default!; - - [AutoInject] private IExceptionHandler _exceptionHandler = default!; - - [AutoInject] private AuthenticationManager _authStateProvider = default!; - - [AutoInject] private AppStateDto _appStateDto = default!; - - private void ToggleMenuHandler() - { - _isMenuOpen = !_isMenuOpen; - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (_disposed) return; - - _disposed = true; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MainLayout.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MainLayout.razor.scss deleted file mode 100644 index c549ab98..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MainLayout.razor.scss +++ /dev/null @@ -1,20 +0,0 @@ -@import '../../Styles/abstracts/_media-queries.scss'; -@import '../../Styles/abstracts/_colors.scss'; -@import '../../Styles/abstracts/_functions.scss'; - -.main { - position: relative; - width: 100%; - min-height: 100vh; - box-sizing: border-box; - font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif; - display: flex; - flex-flow: column nowrap; - justify-content: flex-start; - align-items: stretch; -} - -.page-wrapper { - flex-grow: 1; -} - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MessageBox.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MessageBox.razor deleted file mode 100644 index 211ad9e3..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MessageBox.razor +++ /dev/null @@ -1,16 +0,0 @@ -@namespace CrystallineSociety.Client.Shared - - -
-
- @_title - -
-
- @_body -
- -
-
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MessageBox.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MessageBox.razor.cs deleted file mode 100644 index 21a762f5..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MessageBox.razor.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace CrystallineSociety.Client.Shared; - -public partial class MessageBox : IDisposable -{ - private static event Func OnShow = default!; - - private bool _isOpen; - private string _title = string.Empty; - private string _body = string.Empty; - - public static async Task Show(string message, string title = "") - { - if (OnShow is not null) - { - await OnShow.Invoke(message, title); - } - } - - protected override void OnInitialized() - { - OnShow += ShowMessageBox; - - base.OnInitialized(); - } - - private async Task ShowMessageBox(string message, string title) - { - await InvokeAsync(() => - { - _isOpen = true; - - _title = title; - _body = message; - - StateHasChanged(); - }); - } - - private void OnCloseClick() => _isOpen = false; - - private void OnOkClick() => _isOpen = false; - - public void Dispose() => OnShow -= ShowMessageBox; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MessageBox.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MessageBox.razor.scss deleted file mode 100644 index 5db33ef2..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/MessageBox.razor.scss +++ /dev/null @@ -1,29 +0,0 @@ -@import '../../Styles/abstracts/_functions.scss'; - -.main { - flex-grow: 1; - display: flex; - flex-direction: column; - padding: rem(10px); -} - -.header { - display: flex; -} - -.title { - flex-grow: 1; -} - -.body { - display: flex; - flex-grow: 1; - margin: rem(10px) 0; - white-space: pre; - overflow: auto; -} - -.footer { - display: flex; - justify-content: center; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/NavMenu.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/NavMenu.razor deleted file mode 100644 index 22fbb02c..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/NavMenu.razor +++ /dev/null @@ -1,3 +0,0 @@ -@namespace CrystallineSociety.Client.Core.Components.Layout -@inherits AppComponentBase; - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/NavMenu.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/NavMenu.razor.cs deleted file mode 100644 index 91159e87..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/NavMenu.razor.cs +++ /dev/null @@ -1,32 +0,0 @@ -using CrystallineSociety.Shared.Dtos.Identity; -using CrystallineSociety.Client.Core.Controllers.Identity; - -namespace CrystallineSociety.Client.Core.Components.Layout; - -public partial class NavMenu : IDisposable -{ - private bool _disposed; - private UserDto _user = new(); - private List _navItems = new(); - - private Action _unsubscribe = default!; - - [Parameter] public bool IsMenuOpen { get; set; } - - [Parameter] public EventCallback IsMenuOpenChanged { get; set; } - - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (_disposed || disposing is false) return; - - _unsubscribe?.Invoke(); - - _disposed = true; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/NavMenu.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/NavMenu.razor.scss deleted file mode 100644 index 2f733143..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/NavMenu.razor.scss +++ /dev/null @@ -1,119 +0,0 @@ -@import '../../Styles/abstracts/_media-queries.scss'; -@import '../../Styles/abstracts/_colors.scss'; -@import '../../Styles/abstracts/_functions.scss'; - -.main-container { - position: fixed; - left: 0; - top: rem(48px); - z-index: 16; - display: flex; - flex-flow: column nowrap; - justify-content: flex-start; - width: rem(240px); - height: calc(100vh - #{rem(48px)}); - background-color: $Gray3; - - @include lg { - width: rem(206px); - } -} - -.main-container--closed { - display: none; - - @include gt-md { - display: flex; - } -} - -.top-container { - display: flex; - flex-flow: column nowrap; - justify-content: flex-start; - align-items: center; - width: 100%; - padding: rem(24px) 0 rem(12px); - margin-bottom: rem(20px); - border-bottom: rem(1px) solid $Gray4; - - @include lg { - padding: rem(24px) 0 rem(8px); - } - - @include lt-lg { - padding: rem(24px) 0 rem(16px); - margin-bottom: rem(24px); - } -} - -.user-img-container { - display: flex; - justify-content: center; - align-items: center; - width: rem(56px); - height: rem(56px); - margin-bottom: rem(4px); - border-radius: 50%; - background-color: $S2Color; - font-size: rem(18px); - line-height: rem(24px); - color: $White; - - @include lg { - width: rem(48px); - height: rem(48px); - margin-bottom: rem(2px); - } - - @include lt-lg { - font-size: rem(20px); - } -} - -.user-img { - width: rem(56px); - height: rem(56px); - border-radius: 50%; - - @include lg { - width: rem(48px); - height: rem(48px); - } -} - -.user-name { - margin-bottom: rem(8px); - font-size: rem(13px); - line-height: rem(21px); - color: $S3Color; - - @include lg { - margin-bottom: rem(6px); - font-size: rem(12px); - line-height: rem(20px); - } - - @include lt-lg { - margin-bottom: rem(6px); - } -} - -.menu-shadow { - position: fixed; - left: 0; - top: rem(48px); - z-index: 15; - display: none; - width: 100%; - height: calc(100vh - #{rem(48px)}); - background-color: rgba(0, 0, 0, 0.5); - - @include lt-lg { - display: block; - } -} - -::deep a { - text-decoration: none; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/SignOutConfirmModal.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/SignOutConfirmModal.razor deleted file mode 100644 index 716a333b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/SignOutConfirmModal.razor +++ /dev/null @@ -1,16 +0,0 @@ -@namespace CrystallineSociety.Client.Core.Components.Layout -@inherits AppComponentBase - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/SignOutConfirmModal.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/SignOutConfirmModal.razor.cs deleted file mode 100644 index 3a18444d..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/SignOutConfirmModal.razor.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace CrystallineSociety.Client.Core.Components.Layout; - -public partial class SignOutConfirmModal -{ - [Parameter] - public bool IsOpen { get; set; } - - [Parameter] public EventCallback IsOpenChanged { get; set; } - - private async Task CloseModal() - { - IsOpen = false; - - await IsOpenChanged.InvokeAsync(false); - } - - private async Task SignOut() - { - await AuthenticationManager.SignOut(); - - await CloseModal(); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/SignOutConfirmModal.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/SignOutConfirmModal.razor.scss deleted file mode 100644 index baf8a654..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Layout/SignOutConfirmModal.razor.scss +++ /dev/null @@ -1,58 +0,0 @@ -@import '../../Styles/abstracts/_functions.scss'; -@import '../../Styles/abstracts/_media-queries.scss'; -@import '../../Styles/abstracts/_colors.scss'; - -.modal-body { - position: relative; - display: flex; - flex-flow: column nowrap; - align-items: center; - justify-content: center; - padding: rem(28px) rem(110px); - box-sizing: border-box; - - @include lt-xl { - padding: rem(28px) rem(101px); - } - - @media screen and (max-width:em(480px)) { - padding: rem(28px) rem(47px); - } -} - -.modal-close-btn-container { - position: absolute; - right: 0; - top: 0; -} - -.modal-title { - margin-bottom: rem(12px); - font-size: rem(24px); - line-height: rem(40px); - font-weight: 600; - color: $Black; - - @include lt-xl { - margin-bottom: rem(8px); - font-size: rem(20px); - line-height: rem(32px); - } - - @include sm { - margin-bottom: rem(4px); - } -} - -.modal-desc { - margin-bottom: rem(36px); - font-size: rem(18px); - line-height: rem(24px); - color: $Black; - - @include lt-xl { - margin-bottom: rem(28px); - font-size: rem(14px); - line-height: rem(20px); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationBadges.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationBadges.razor deleted file mode 100644 index e86277ea..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationBadges.razor +++ /dev/null @@ -1,13 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - -
-
-
- -
-
- -
-
-
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationBadges.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationBadges.razor.cs deleted file mode 100644 index 4314e127..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationBadges.razor.cs +++ /dev/null @@ -1,23 +0,0 @@ -using CrystallineSociety.Shared.Dtos.BadgeSystem; -using CrystallineSociety.Shared.Dtos.Organization; -using Microsoft.AspNetCore.Components; - -namespace CrystallineSociety.Client.Core.Components -{ - public partial class OrganizationBadges - { - [Parameter] - public OrganizationDto Organization { get; set; } = default!; - - [Parameter] - public BadgeBundleDto? Bundle { get; set; } - - private BadgeDto? BadgeDto { get; set; } - - private void GetBadge(BadgeDto badgeDto) - { - BadgeDto = badgeDto; - StateHasChanged(); - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationBadges.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationBadges.razor.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationDocs.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationDocs.razor deleted file mode 100644 index 6209b756..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationDocs.razor +++ /dev/null @@ -1,30 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - -
- -
-
-
-
- - -
-
-
-
- -
-
- -
-
- -
-
-
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationDocs.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationDocs.razor.cs deleted file mode 100644 index f10960ec..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationDocs.razor.cs +++ /dev/null @@ -1,25 +0,0 @@ -using CrystallineSociety.Shared.Dtos.Organization; - -namespace CrystallineSociety.Client.Core.Components -{ - public partial class OrganizationDocs - { - [Parameter] - public OrganizationDto Organization { get; set; } = default!; - - private List _programDocuments { get; set; } = new(); - - private ProgramDocumentDto? _programDocument { get; set; } - - protected override async Task OnInitAsync() - { - _programDocuments = await PrerenderStateService.GetValue(async () => await HttpClient.GetFromJsonAsync($"api/ProgramDocument/GetProgramDocuments?organizationCode={Organization.Code}", AppJsonContext.Default.ListProgramDocumentDto)) ?? _programDocuments; - await base.OnInitAsync(); - } - - private void GetProgramDocument(ProgramDocumentDto programDocument) - { - _programDocument = programDocument; - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationDocs.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationDocs.razor.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationFeeds.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationFeeds.razor deleted file mode 100644 index cd87ab34..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationFeeds.razor +++ /dev/null @@ -1,7 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - - - - -Feed \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationFeeds.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationFeeds.razor.cs deleted file mode 100644 index ace5680f..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationFeeds.razor.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CrystallineSociety.Client.Shared.Components -{ - public partial class OrganizationFeeds - { - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationFeeds.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationFeeds.razor.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationHome.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationHome.razor deleted file mode 100644 index 69035d7d..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationHome.razor +++ /dev/null @@ -1,5 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - - -Home diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationHome.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationHome.razor.cs deleted file mode 100644 index 63749bf1..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationHome.razor.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CrystallineSociety.Client.Shared.Components -{ - public partial class OrganizationHome - { - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationHome.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationHome.razor.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationLearners.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationLearners.razor deleted file mode 100644 index c189fac6..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationLearners.razor +++ /dev/null @@ -1,7 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - - - - -Learners \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationLearners.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationLearners.razor.cs deleted file mode 100644 index 8ba4c6c3..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationLearners.razor.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CrystallineSociety.Client.Shared.Components -{ - public partial class OrganizationLearners - { - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationLearners.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/OrganizationLearners.razor.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/DefaultBadgeSystemPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/DefaultBadgeSystemPage.razor deleted file mode 100644 index 04f92d6e..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/DefaultBadgeSystemPage.razor +++ /dev/null @@ -1,7 +0,0 @@ -@page "/badge-system/default" -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/DefaultBadgeSystemPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/DefaultBadgeSystemPage.razor.cs deleted file mode 100644 index 91e4b3a3..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/DefaultBadgeSystemPage.razor.cs +++ /dev/null @@ -1,23 +0,0 @@ -using CrystallineSociety.Shared.Dtos.BadgeSystem; -using CrystallineSociety.Shared.Services.Implementations.BadgeSystem; - -namespace CrystallineSociety.Client.Core.Components.Pages; - -public partial class DefaultBadgeSystemPage -{ - [AutoInject] - public required BadgeSystemFactory BadgeSystemFactory { get; set; } - - private BadgeBundleDto? DefaultBundle { get; set; } = new(); - - protected override async Task OnInitAsync() - { - await PrerenderStateService.GetValue(async() => LoadDefaultBundleAsync()); - } - - private async Task LoadDefaultBundleAsync() - { - DefaultBundle = await HttpClient.GetFromJsonAsync("api/BadgeSystem/GetDefaultBadgeBundle", AppJsonContext.Default.BadgeBundleDto); - StateHasChanged(); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/DefaultBadgeSystemPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/DefaultBadgeSystemPage.razor.scss deleted file mode 100644 index d0106be9..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/DefaultBadgeSystemPage.razor.scss +++ /dev/null @@ -1,338 +0,0 @@ -@import '../../Styles/abstracts/_functions.scss'; -@import '../../Styles/abstracts/_colors.scss'; -@import '../../Styles/abstracts/_media-queries.scss'; - -.page-container { - display: flex; - flex-flow: column nowrap; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; - padding: rem(56px) rem(16px); - box-sizing: border-box; - - @include lg { - padding: rem(48px) rem(16px); - } - - @include md { - padding: rem(72px) rem(16px); - } - - @include sm { - padding: rem(24px) rem(16px); - } -} - -.page-content--white { - position: relative; - display: flex; - flex-flow: column nowrap; - align-items: center; - width: 100%; - max-width: rem(860px); - border-radius: rem(4px); - background-color: $Gray6; - - @include lg { - max-width: rem(816px); - } - - @include md { - max-width: rem(738px); - } - - @media all and (max-width: #{em(390px)}) { - max-width: 100%; - } -} - -.search-box-container { - display: flex; - justify-content: center; - align-items: center; - width: 100%; - padding: rem(32px) rem(14px); - border-bottom: rem(1px) solid $Gray4; - - @include lg { - padding: rem(24px) rem(14px); - } - - @include md { - padding: rem(32px) rem(14px); - } - - @media all and (max-width: #{em(390px)}) { - padding: rem(20px) rem(14px); - } -} - -.todo-content { - position: relative; - display: flex; - flex-flow: column nowrap; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - max-width: rem(608px); - padding: rem(24px) rem(14px) rem(64px); - box-sizing: border-box; - - - @include lg { - max-width: rem(570px); - padding: rem(20px) rem(14px) rem(56px); - } - - @include md { - max-width: rem(570px); - padding: rem(24px) rem(14px) rem(60px); - } - - @media all and (max-width: #{em(390px)}) { - max-width: rem(570px); - padding: rem(16px) rem(14px) rem(36px); - } -} - -.main-title { - margin: 0; - margin-bottom: rem(20px); - font-weight: 600; - font-size: rem(22px); - color: $SecondaryColor; - line-height: rem(36px); - - @include lg { - font-size: rem(20px); - line-height: rem(28px); - } - - @include md { - margin-bottom: rem(24px); - font-size: rem(18px); - line-height: rem(28px); - } - - - @media all and (max-width: #{em(390px)}) { - margin-bottom: rem(24px); - font-size: rem(16px); - line-height: rem(24px); - } -} - -.add-todo-container { - display: flex; - flex-flow: row nowrap; - justify-content: flex-start; - align-items: center; - width: 100%; - margin-bottom: rem(24px); - - @include md { - margin-bottom: rem(44px); - } - - @media all and (max-width: #{em(390px)}) { - margin-bottom: rem(36px); - } -} - -.todo-list-container { - width: 100%; -} - -.filter-container { - display: flex; - flex-flow: row nowrap; - justify-content: space-between; - align-items: center; - width: 100%; -} - -.sort-drp-container { - @media all and (max-width: #{em(550px)}) { - position: absolute; - top: rem(18px); - right: rem(5px); - } - - @media all and (max-width: #{em(390px)}) { - top: rem(10px); - } -} - -.todo-list--empty-state { - display: flex; - flex-flow: column nowrap; - justify-content: center; - align-items: center; - height: 100%; -} - -.todo-list { - display: flex; - flex-flow: column nowrap; - justify-content: flex-start; - align-items: center; - width: 100%; - height: rem(240px); - border: rem(1px) solid $Gray4; - - @media all and (max-width: #{em(390px)}) { - height: rem(198px); - } -} - -::deep .todo-item { - display: flex; - flex-flow: row wrap; - justify-content: space-between; - align-items: center; - width: 100%; - min-width: fit-content; - min-height: rem(80px); - padding: rem(16px); - border-bottom: rem(1px) solid $Gray4; - box-sizing: border-box; - - &:last-child { - border-bottom: none; - } - - @include md { - padding: rem(20px) rem(16px); - } - - @media all and (max-width: #{em(390px)}) { - min-height: rem(66px); - padding: rem(14px) rem(18px); - } - - .todo-input { - @media all and (max-width: #{em(451px)}) { - width: 100% - } - } -} - -.todo-info { - display: flex; - flex-flow: column nowrap; - justify-content: center; - align-items: flex-start; -} - -.todo-item-date { - margin-top: rem(4px); - margin-left: rem(28px); - font-size: rem(12px); - line-height: rem(20px); - color: $Gray1; - white-space: nowrap; - - @include lt-xl { - font-size: rem(10px); - } -} - -.todo-item-btn-group--edit-mode { - @media all and (max-width: #{em(451)}) { - margin-top: rem(5px); - } -} - -.todo-btn-group { - display: flex; - flex-flow: row nowrap; - justify-content: center; -} - -.todo-list-spinner { - display: flex; - justify-content: center; - align-items: center; - width: 100%; - height: 100%; -} - -::deep .add-todo-input { - width: rem(300px); - - @include md { - width: 100%; - max-width: rem(300px); - } - - @media all and (max-width: #{em(390px)}) { - width: 100%; - max-width: rem(228px); - } -} - -::deep .add-todo-button { - width: rem(67px); - margin-left: rem(8px); - - @media all and (max-width: #{em(390px)}) { - margin-left: rem(5px); - } -} - -::deep .filter-pivot { - &.bit-pvt-fluent > div { - display: flex; - justify-content: flex-start; - - @media all and (max-width: #{em(390px)}) { - justify-content: space-between; - } - } - - @media all and (max-width: #{em(390px)}) { - width: 100%; - } -} - -::deep .todo-pivot-tab { - margin-right: rem(64px); - - @media all and (max-width: #{em(390px)}) { - margin-right: 0; - } - - &:last-child { - margin-right: 0; - } -} - -::deep .sort-todo-drp { - width: rem(150px); - height: rem(32px); - - .bit-act-btn-fluent > span:first-child i { - color: black; - font-size: rem(11px); - } - - .bit-drp-items-wrapper { - @media all and (max-width: #{em(639px)}) { - min-height: 100vh; - } - } - - .bit-drp-items-wrapper button { - font-size: rem(12px); - } - - .bit-act-btn-fluent > span:last-child { - font-size: rem(12px); - } - - .bit-drp-wrapper .bit-drp-wrapper-txt { - display: none; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/GitHubBadgeSystemExplorerPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/GitHubBadgeSystemExplorerPage.razor deleted file mode 100644 index c5498897..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/GitHubBadgeSystemExplorerPage.razor +++ /dev/null @@ -1,15 +0,0 @@ -@page "/badge-system/github" -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - -
-
- GitHub URL: -
- - -
-
- @GitHubUrl - -
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/GitHubBadgeSystemExplorerPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/GitHubBadgeSystemExplorerPage.razor.cs deleted file mode 100644 index ca5b5f16..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/GitHubBadgeSystemExplorerPage.razor.cs +++ /dev/null @@ -1,20 +0,0 @@ -using CrystallineSociety.Shared.Dtos.BadgeSystem; - -namespace CrystallineSociety.Client.Core.Components.Pages -{ - public partial class GitHubBadgeSystemExplorerPage - { - private string? GitHubUrl { get; set; } - private BadgeBundleDto? Bundle { get; set; } - - public GitHubBadgeSystemExplorerPage() - { - - } - - private async Task LoadBadgeSystem() - { - Bundle = await HttpClient.GetFromJsonAsync($"api/BadgeSystem/GetBadgeBundleFromGitHub?url={GitHubUrl}", AppJsonContext.Default.BadgeBundleDto); - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/GitHubBadgeSystemExplorerPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/GitHubBadgeSystemExplorerPage.razor.scss deleted file mode 100644 index 5f282702..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/GitHubBadgeSystemExplorerPage.razor.scss +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/HomePage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/HomePage.razor deleted file mode 100644 index e5163340..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/HomePage.razor +++ /dev/null @@ -1,17 +0,0 @@ -@page "/" -@inherits AppComponentBase - -@Localizer[nameof(AppStrings.HomeTitle)] - -
-

CS System

-

- CS System is a versatile software designed to run the CS Internship program. However, its flexibility allows it to be used for any education program. Companies and organizations can easily integrate their own documentation and policies into CS System, making it a comprehensive solution for managing educational programs. -

-
- Default Badge System - GitHub Badge System - Education Program -
-
- diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/HomePage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/HomePage.razor.cs deleted file mode 100644 index 6799fc90..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/HomePage.razor.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace CrystallineSociety.Client.Shared.Pages; - -public partial class HomePage -{ -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/HomePage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/HomePage.razor.scss deleted file mode 100644 index 582e1703..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/HomePage.razor.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import '../../Styles/abstracts/_media-queries.scss'; -@import '../../Styles/abstracts/_colors.scss'; -@import '../../Styles/abstracts/_functions.scss'; diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/DeleteAccountConfirmModal.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/DeleteAccountConfirmModal.razor deleted file mode 100644 index 1328ef16..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/DeleteAccountConfirmModal.razor +++ /dev/null @@ -1,15 +0,0 @@ -@inherits AppComponentBase - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/DeleteAccountConfirmModal.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/DeleteAccountConfirmModal.razor.cs deleted file mode 100644 index 36e973f3..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/DeleteAccountConfirmModal.razor.cs +++ /dev/null @@ -1,28 +0,0 @@ -using CrystallineSociety.Client.Core.Controllers.Identity; - -namespace CrystallineSociety.Client.Core.Components.Pages.Identity; - -public partial class DeleteAccountConfirmModal -{ - [AutoInject] IUserController userController = default!; - - [Parameter] public bool IsOpen { get; set; } - - [Parameter] public EventCallback IsOpenChanged { get; set; } - - private async Task CloseModal() - { - IsOpen = false; - - await IsOpenChanged.InvokeAsync(false); - } - - private async Task DeleteAccount() - { - await userController.Delete(CurrentCancellationToken); - - await AuthenticationManager.SignOut(); - - await CloseModal(); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/DeleteAccountConfirmModal.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/DeleteAccountConfirmModal.razor.scss deleted file mode 100644 index f7bab1ee..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/DeleteAccountConfirmModal.razor.scss +++ /dev/null @@ -1,35 +0,0 @@ -@import '../../../Styles/abstracts/_functions.scss'; -@import '../../../Styles/abstracts/_media-queries.scss'; - -.modal-body { - display: flex; - position: relative; - align-items: center; - justify-content: center; - flex-flow: column nowrap; - padding: rem2(28px) rem2(110px); - - @include lt-lg { - padding: rem2(28px) rem2(47px); - } -} - -.modal-close-btn-container { - top: 0; - right: 0; - position: absolute; -} - -.modal-title { - color: #dc0000; - font-weight: 600; - font-size: rem2(24px); - line-height: rem2(40px); - margin-bottom: rem2(12px); -} - -.modal-desc { - font-size: rem2(18px); - line-height: rem2(24px); - margin-bottom: rem2(36px); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EditProfilePage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EditProfilePage.razor deleted file mode 100644 index 2561ea80..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EditProfilePage.razor +++ /dev/null @@ -1,128 +0,0 @@ -@page "/edit-profile" -@inherits AppComponentBase - -@Localizer[nameof(AppStrings.EditProfileTitle)] - -
-
- @if (string.IsNullOrEmpty(editProfileMessage) is false) - { - - @editProfileMessage - - } - -

- @Localizer[nameof(AppStrings.EditProfileTitle)] -

- - @if (isLoading) - { -
- -
- } - else - { -
- -
- -
- @if (user.ProfileImageName is not null) - { - - @Localizer[nameof(AppStrings.Remove)] - - } - - @Localizer[nameof(AppStrings.ProfileImage)] - -
@profileImageError
-
- - - - -
- - -
- -
- - -
- -
- - - - - -
- - - @Localizer[nameof(AppStrings.Save)] - -
- - } -
-
-
- - @Localizer[nameof(AppStrings.DeleteAccount)] - -
-
- - @Localizer[nameof(AppStrings.DeleteAccountPrompt)] - -
-
- - @Localizer[nameof(AppStrings.DeleteAccount)] - -
-
- - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EditProfilePage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EditProfilePage.razor.cs deleted file mode 100644 index a31bcf92..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EditProfilePage.razor.cs +++ /dev/null @@ -1,114 +0,0 @@ -using CrystallineSociety.Client.Core.Controllers.Identity; -using CrystallineSociety.Shared.Dtos.Identity; - -namespace CrystallineSociety.Client.Core.Components.Pages.Identity; - -[Authorize] -public partial class EditProfilePage -{ - [AutoInject] IUserController userController = default!; - - private bool isSaving; - private bool isRemoving; - private bool isLoading; - private string? profileImageUrl; - private string? profileImageError; - private string? editProfileMessage; - private string? profileImageUploadUrl; - private string? profileImageRemoveUrl; - private BitMessageBarType editProfileMessageType; - private UserDto user = new(); - private readonly EditUserDto userToEdit = new(); - private bool isDeleteAccountConfirmModalOpen; - - protected override async Task OnInitAsync() - { - isLoading = true; - - try - { - await LoadEditProfileData(); - - var access_token = await PrerenderStateService.GetValue(AuthTokenProvider.GetAccessTokenAsync); - - profileImageUploadUrl = $"{Configuration.GetApiServerAddress()}api/Attachment/UploadProfileImage?access_token={access_token}"; - profileImageUrl = $"{Configuration.GetApiServerAddress()}api/Attachment/GetProfileImage?access_token={access_token}"; - profileImageRemoveUrl = $"api/Attachment/RemoveProfileImage?access_token={access_token}"; - } - finally - { - isLoading = false; - } - - await base.OnInitAsync(); - } - - private async Task LoadEditProfileData() - { - user = await GetCurrentUser() ?? new(); - - user.Patch(userToEdit); - } - - private async Task RefreshProfileData() - { - await LoadEditProfileData(); - - PubSubService.Publish(PubSubMessages.PROFILE_UPDATED, user); - } - - private Task GetCurrentUser() => userController.GetCurrentUser(CurrentCancellationToken); - - private async Task DoSave() - { - if (isSaving) return; - - isSaving = true; - editProfileMessage = null; - - try - { - userToEdit.Patch(user); - - (await userController.Update(userToEdit, CurrentCancellationToken)).Patch(user); - - PubSubService.Publish(PubSubMessages.PROFILE_UPDATED, user); - - editProfileMessageType = BitMessageBarType.Success; - editProfileMessage = Localizer[nameof(AppStrings.ProfileUpdatedSuccessfullyMessage)]; - } - catch (KnownException e) - { - editProfileMessageType = BitMessageBarType.Error; - - editProfileMessage = e.Message; - } - finally - { - isSaving = false; - } - } - - private async Task RemoveProfileImage() - { - if (isRemoving) return; - - isRemoving = true; - - try - { - await HttpClient.DeleteAsync(profileImageRemoveUrl, CurrentCancellationToken); - - await RefreshProfileData(); - } - catch (KnownException e) - { - editProfileMessage = e.Message; - editProfileMessageType = BitMessageBarType.Error; - } - finally - { - isRemoving = false; - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EditProfilePage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EditProfilePage.razor.scss deleted file mode 100644 index b682076b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EditProfilePage.razor.scss +++ /dev/null @@ -1,107 +0,0 @@ -@import '../../../Styles/abstracts/_functions.scss'; -@import '../../../Styles/abstracts/_media-queries.scss'; -@import '../../../Styles/abstracts/_bit-css-variables.scss'; - -.page-container { - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - flex-flow: column nowrap; -} - -.content-container { - width: 100%; - display: flex; - position: relative; - align-items: center; - max-width: rem2(608px); - border-radius: rem2(4px); - flex-flow: column nowrap; - padding: rem2(32px) rem2(16px); - background-color: $bit-color-background-primary; - - &.profile-panel { - box-shadow: $bit-box-shadow-callout; - } - - &.danger-panel { - border: 2px solid darkred; - } -} - -.loading-container { - width: 100%; - height: 100%; - display: flex; - position: absolute; - align-items: center; - justify-content: center; -} - -.form-message-bar { - top: 0; - left: 0; - position: absolute; - border-radius: rem2(4px) rem2(4px) 0 0; -} - -.page-title { - font-weight: 600; - font-size: rem2(28px); - line-height: rem2(44px); - margin-bottom: rem2(16px); -} - -.form-profile-container { - width: 100%; - display: flex; - align-items: center; - flex-flow: row nowrap; - max-width: rem2(340px); - margin-bottom: rem2(16px); - justify-content: flex-start; -} - -.form-input-container { - width: 100%; - display: flex; - max-width: rem2(340px); - flex-flow: column nowrap; - margin-bottom: rem2(17px); -} - -.form-input-error { - font-size: rem2(12px); - line-height: rem2(16px); - color: $bit-color-state-error; -} - -.form-choice-container { - width: 100%; - max-width: rem2(340px); - margin-bottom: rem2(16px); -} - -::deep .edit-profile-dtp { - .bit-dtp-wrapper { - z-index: 5; - } - - .bit-dtp-overlay { - z-index: 4; - } - - .bit-dtp-callout { - z-index: 6; - } -} - -::deep .edit-profile-form { - width: 100%; - display: flex; - align-items: center; - flex-flow: column nowrap; - justify-content: flex-start; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EmailConfirmationPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EmailConfirmationPage.razor deleted file mode 100644 index 74213076..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EmailConfirmationPage.razor +++ /dev/null @@ -1,56 +0,0 @@ -@page "/email-confirmation" -@inherits AppComponentBase - -@Localizer[nameof(AppStrings.EmailConfirmationTitle)] - -
-
- @if (isLoading) - { - - } - else - { - @if (string.IsNullOrEmpty(error) is false) - { - - @(error) - - } - - @if (emailConfirmed) - { -

- @Localizer[nameof(AppStrings.EmailConfirmedSuccessfullyMessage)] -

- - @Localizer[nameof(AppStrings.SignIn)] - - } - else - { -

- @Localizer[nameof(AppStrings.EmailConfirmationFailedMessage)] -

- -
- @Localizer[nameof(AppStrings.InvalidConfirmationLinkMessage)] -
- - - @Localizer[nameof(AppStrings.ResendEmail)] - - } - } -
-
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EmailConfirmationPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EmailConfirmationPage.razor.cs deleted file mode 100644 index 42408ac3..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EmailConfirmationPage.razor.cs +++ /dev/null @@ -1,68 +0,0 @@ -using CrystallineSociety.Client.Core.Controllers.Identity; - -namespace CrystallineSociety.Client.Core.Components.Pages.Identity; - -public partial class EmailConfirmationPage -{ - [AutoInject] IIdentityController identityController = default!; - - private bool isLoading = true; - private string? error; - private bool emailConfirmed = false; - private BitMessageBarType emailConfirmationMessageType = BitMessageBarType.Error; - - [SupplyParameterFromQuery, Parameter] public string? Email { get; set; } - [SupplyParameterFromQuery, Parameter] public string? Token { get; set; } - - protected override async Task OnAfterFirstRenderAsync() - { - try - { - await identityController.ConfirmEmail(new() { Email = Email!, Token = Token! }); - emailConfirmed = true; - } - catch (ResourceValidationException exp) - { - error = string.Join(", ", exp.Payload.Details.SelectMany(d => d.Errors)); - } - finally - { - isLoading = false; - StateHasChanged(); - } - - await base.OnAfterFirstRenderAsync(); - } - - private void RedirectToSignIn() - { - NavigationManager.NavigateTo($"/sign-in?email={Email}"); - } - - private async Task DoResendLink() - { - if (isLoading) return; - - isLoading = true; - error = null; - - try - { - await identityController.SendConfirmationEmail(new() { Email = Email }, CurrentCancellationToken); - - emailConfirmationMessageType = BitMessageBarType.Success; - - error = Localizer[nameof(AppStrings.ResendConfirmationLinkMessage)]; - } - catch (KnownException e) - { - emailConfirmationMessageType = BitMessageBarType.Error; - - error = e.Message; - } - finally - { - isLoading = false; - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EmailConfirmationPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EmailConfirmationPage.razor.scss deleted file mode 100644 index 9cb5cd92..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/EmailConfirmationPage.razor.scss +++ /dev/null @@ -1,39 +0,0 @@ -@import '../../../Styles/abstracts/_functions.scss'; -@import '../../../Styles/abstracts/_media-queries.scss'; - -.page-container { - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - flex-flow: column nowrap; -} - -.form-description { - font-weight: 600; - width: rem2(454px); - height: rem2(24px); - font-size: rem2(16px); - line-height: rem2(24px); - - @include lg { - width: rem2(398px); - height: rem2(20px); - } - - @include md { - width: rem2(398px); - height: rem2(20px); - } - - @include sm { - width: rem2(280px); - height: rem2(40px); - } - - @include lt-xl { - font-size: rem2(14px); - line-height: rem2(20px); - } -} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ForgotPasswordPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ForgotPasswordPage.razor deleted file mode 100644 index 2655a85a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ForgotPasswordPage.razor +++ /dev/null @@ -1,42 +0,0 @@ -@page "/forgot-password" -@inherits AppComponentBase - -@Localizer[nameof(AppStrings.ForgetPasswordTitle)] - -
- - - - @if (string.IsNullOrEmpty(forgotPasswordMessage) is false) - { - - @forgotPasswordMessage - - } - -

@Localizer[nameof(AppStrings.ForgetPasswordTitle)]

- -
- @Localizer[nameof(AppStrings.ForgetPasswordMessage)] -
- -
- - -
- - - @Localizer[nameof(AppStrings.Submit)] - -
-
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ForgotPasswordPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ForgotPasswordPage.razor.cs deleted file mode 100644 index eb6244d9..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ForgotPasswordPage.razor.cs +++ /dev/null @@ -1,41 +0,0 @@ -using CrystallineSociety.Client.Core.Controllers.Identity; -using CrystallineSociety.Shared.Dtos.Identity; - -namespace CrystallineSociety.Client.Core.Components.Pages.Identity; - -public partial class ForgotPasswordPage -{ - [AutoInject] IIdentityController identityController = default!; - - private bool isLoading; - private string? forgotPasswordMessage; - private BitMessageBarType forgotPasswordMessageType; - private SendResetPasswordEmailRequestDto forgotPasswordModel = new(); - - private async Task DoSubmit() - { - if (isLoading) return; - - isLoading = true; - forgotPasswordMessage = null; - - try - { - await identityController.SendResetPasswordEmail(forgotPasswordModel, CurrentCancellationToken); - - forgotPasswordMessageType = BitMessageBarType.Success; - - forgotPasswordMessage = Localizer[nameof(AppStrings.ResetPasswordLinkSentMessage)]; - } - catch (KnownException e) - { - forgotPasswordMessageType = BitMessageBarType.Error; - - forgotPasswordMessage = e.Message; - } - finally - { - isLoading = false; - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ForgotPasswordPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ForgotPasswordPage.razor.scss deleted file mode 100644 index 595886a0..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ForgotPasswordPage.razor.scss +++ /dev/null @@ -1,16 +0,0 @@ -@import '../../../Styles/abstracts/_functions.scss'; -@import '../../../Styles/abstracts/_media-queries.scss'; - -.page-container { - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - flex-flow: column nowrap; -} - -.form-description { - display: flex; - padding: rem2(20px); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ResetPasswordPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ResetPasswordPage.razor deleted file mode 100644 index f7d7dd90..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ResetPasswordPage.razor +++ /dev/null @@ -1,60 +0,0 @@ -@page "/reset-password" -@inherits AppComponentBase - -@Localizer[nameof(AppStrings.ResetPasswordTitle)] - -
- - - - @if (string.IsNullOrEmpty(resetPasswordMessage) is false) - { - - @resetPasswordMessage - - } - - @if (passwordChanged) - { - - @Localizer[nameof(AppStrings.SignIn)] - - } - else - { -

@Localizer[nameof(AppStrings.ResetPasswordTitle)]

-
- - -
- -
- - -
- - - @Localizer[nameof(AppStrings.ResetPassword)] - - } -
-
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ResetPasswordPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ResetPasswordPage.razor.cs deleted file mode 100644 index 78c6101c..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ResetPasswordPage.razor.cs +++ /dev/null @@ -1,61 +0,0 @@ -using CrystallineSociety.Client.Core.Controllers.Identity; -using CrystallineSociety.Shared.Dtos.Identity; - -namespace CrystallineSociety.Client.Core.Components.Pages.Identity; - -public partial class ResetPasswordPage -{ - [AutoInject] IIdentityController identityController = default!; - - private bool isLoading; - private bool passwordChanged; - private string? resetPasswordMessage; - private BitMessageBarType resetPasswordMessageType; - private ResetPasswordRequestDto resetPasswordModel = new(); - - [Parameter, SupplyParameterFromQuery] public string? Email { get; set; } - - [Parameter, SupplyParameterFromQuery] public string? Token { get; set; } - - protected override async Task OnInitAsync() - { - resetPasswordModel.Email = Email; - resetPasswordModel.Token = Token; - - await base.OnInitAsync(); - } - - private void RedirectToSignIn() - { - NavigationManager.NavigateTo($"/sign-in?email={Email}"); - } - - private async Task DoSubmit() - { - if (isLoading) return; - - isLoading = true; - resetPasswordMessage = null; - - try - { - await identityController.ResetPassword(resetPasswordModel, CurrentCancellationToken); - - resetPasswordMessageType = BitMessageBarType.Success; - - resetPasswordMessage = Localizer[nameof(AppStrings.PasswordChangedSuccessfullyMessage)]; - - passwordChanged = true; - } - catch (KnownException e) - { - resetPasswordMessageType = BitMessageBarType.Error; - - resetPasswordMessage = e.Message; - } - finally - { - isLoading = false; - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ResetPasswordPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ResetPasswordPage.razor.scss deleted file mode 100644 index f68317de..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/ResetPasswordPage.razor.scss +++ /dev/null @@ -1,11 +0,0 @@ -@import '../../../Styles/abstracts/_functions.scss'; -@import '../../../Styles/abstracts/_media-queries.scss'; - -.page-container { - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - flex-flow: column nowrap; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignInPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignInPage.razor deleted file mode 100644 index 66f50dbf..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignInPage.razor +++ /dev/null @@ -1,60 +0,0 @@ -@page "/sign-in" -@inherits AppComponentBase - -@Localizer[nameof(AppStrings.SignInTitle)] - -
- - - - @if (string.IsNullOrEmpty(signInMessage) is false) - { - - @signInMessage - - } - -

@Localizer[nameof(AppStrings.SignInTitle)]

- -
- - -
- -
- - -
- -
- -
- - - @Localizer[nameof(AppStrings.SignIn)] - - -
- @Localizer[nameof(AppStrings.ForgotPasswordLink)] -
- -
- @Localizer[nameof(AppStrings.DontHaveAccountMessage)] @Localizer[nameof(AppStrings.SignUp)] -
-
-
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignInPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignInPage.razor.cs deleted file mode 100644 index 63c14e22..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignInPage.razor.cs +++ /dev/null @@ -1,50 +0,0 @@ -using CrystallineSociety.Shared.Dtos.Identity; - -namespace CrystallineSociety.Client.Core.Components.Pages.Identity; - -public partial class SignInPage -{ - private bool isLoading; - private string? signInMessage; - private BitMessageBarType signInMessageType; - private SignInRequestDto signInModel = new(); - - [SupplyParameterFromQuery(Name = "redirect-url"), Parameter] public string? RedirectUrl { get; set; } - [SupplyParameterFromQuery(Name = "email"), Parameter] public string? Email { get; set; } - - protected override async Task OnParamsSetAsync() - { - await base.OnParamsSetAsync(); - - if (string.IsNullOrEmpty(signInModel.UserName)) - { - signInModel.UserName = Email; - } - } - - private async Task DoSignIn() - { - if (isLoading) return; - - isLoading = true; - signInMessage = null; - - try - { - await AuthenticationManager.SignIn(signInModel, CurrentCancellationToken); - - NavigationManager.NavigateTo(RedirectUrl ?? "/"); - } - catch (KnownException e) - { - signInMessageType = BitMessageBarType.Error; - - signInMessage = e.Message; - } - finally - { - isLoading = false; - } - } -} - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignInPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignInPage.razor.scss deleted file mode 100644 index ce50e7c3..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignInPage.razor.scss +++ /dev/null @@ -1,17 +0,0 @@ -@import '../../../Styles/abstracts/_functions.scss'; -@import '../../../Styles/abstracts/_media-queries.scss'; - -.page-container { - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - flex-flow: column nowrap; -} - -.form-forgot-password { - font-size: rem2(14px); - line-height: rem2(24px); - margin-bottom: rem2(20px); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignUpPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignUpPage.razor deleted file mode 100644 index 39a6fb59..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignUpPage.razor +++ /dev/null @@ -1,99 +0,0 @@ -@page "/sign-up" -@inherits AppComponentBase - -@Localizer[nameof(AppStrings.SingUpTitle)] - -
- - - - @if (string.IsNullOrEmpty(signUpMessage) is false) - { - - @signUpMessage - - } - - @if (isSignedUp) - { -

- @Localizer[nameof(AppStrings.ConfirmEmailTitle)] -

- -
- @Localizer[nameof(AppStrings.ConfirmEmailMessage)] -
-
-
- @Localizer[nameof(AppStrings.NotReceivedConfirmationEmailMessage)] -
-
- @Localizer[nameof(AppStrings.CheckSpamMailMessage)] -
-
- - @Localizer[nameof(AppStrings.Or)] - -
- - @Localizer[nameof(AppStrings.ResendEmail)] - -
-
- @Localizer[nameof(AppStrings.SignIn)] -
- } - else - { -

- @Localizer[nameof(AppStrings.SignUp)] -

- -
- - -
- -
- - -
- -
- - - @Localizer[nameof(AppStrings.TermsMessage)] @Localizer[nameof(AppStrings.TermsTitle)] - - - -
- - - @Localizer[nameof(AppStrings.SignUp)] - - -
- @Localizer[nameof(AppStrings.AlreadyHaveAccountMessage)] @Localizer[nameof(AppStrings.SignIn)] -
- } - -
-
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignUpPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignUpPage.razor.cs deleted file mode 100644 index 330a862f..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignUpPage.razor.cs +++ /dev/null @@ -1,69 +0,0 @@ -using CrystallineSociety.Client.Core.Controllers.Identity; -using CrystallineSociety.Shared.Dtos.Identity; - -namespace CrystallineSociety.Client.Core.Components.Pages.Identity; - -public partial class SignUpPage -{ - [AutoInject] IIdentityController identityController = default!; - - private bool isLoading; - private bool isSignedUp; - private string? signUpMessage; - private BitMessageBarType signUpMessageType; - private SignUpRequestDto signUpModel = new(); - - private async Task DoSignUp() - { - if (isLoading) return; - - isLoading = true; - signUpMessage = null; - - try - { - await identityController.SignUp(signUpModel, CurrentCancellationToken); - - isSignedUp = true; - } - catch (ResourceValidationException e) - { - signUpMessageType = BitMessageBarType.Error; - signUpMessage = string.Join(Environment.NewLine, e.Payload.Details.SelectMany(d => d.Errors).Select(e => e.Message)); - } - catch (KnownException e) - { - signUpMessage = e.Message; - signUpMessageType = BitMessageBarType.Error; - } - finally - { - isLoading = false; - } - } - - private async Task DoResendLink() - { - if (isLoading) return; - - isLoading = true; - signUpMessage = null; - - try - { - await identityController.SendConfirmationEmail(new() { Email = signUpModel.Email }, CurrentCancellationToken); - - signUpMessageType = BitMessageBarType.Success; - signUpMessage = Localizer[nameof(AppStrings.ResendConfirmationLinkMessage)]; - } - catch (KnownException e) - { - signUpMessage = e.Message; - signUpMessageType = BitMessageBarType.Error; - } - finally - { - isLoading = false; - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignUpPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignUpPage.razor.scss deleted file mode 100644 index d1fd11d9..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/Identity/SignUpPage.razor.scss +++ /dev/null @@ -1,18 +0,0 @@ -@import '../../../Styles/abstracts/_functions.scss'; -@import '../../../Styles/abstracts/_media-queries.scss'; - -.page-container { - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - flex-flow: column nowrap; -} - -.form-description { - font-weight: 600; - line-height: 1.5; - font-size: rem2(14px); - max-width: rem2(432px); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotAuthorizedPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotAuthorizedPage.razor deleted file mode 100644 index 7e888fc9..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotAuthorizedPage.razor +++ /dev/null @@ -1,14 +0,0 @@ -@page "/not-authorized" - -@inherits AppComponentBase - - -
-
-

@Localizer[nameof(AppStrings.ForbiddenException)]

-

@Localizer[nameof(AppStrings.YouAreSignInAs)] @user.GetUserName()

-
- @Localizer[nameof(AppStrings.SignInAsDifferentUser)] -
-
-
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotAuthorizedPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotAuthorizedPage.razor.cs deleted file mode 100644 index 26c353ce..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotAuthorizedPage.razor.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace CrystallineSociety.Client.Core.Components.Pages; - -public partial class NotAuthorizedPage -{ - private ClaimsPrincipal user = default!; - - [SupplyParameterFromQuery(Name = "redirect-url"), Parameter] public string? RedirectUrl { get; set; } - - protected override async Task OnParamsSetAsync() - { - user = (await AuthenticationStateTask).User; - - await base.OnParamsSetAsync(); - } - - protected override async Task OnAfterFirstRenderAsync() - { - string? refresh_token = await StorageService.GetItem("refresh_token"); - - // Let's update the access token by refreshing it when a refresh token is available. - // Following this procedure, the newly acquired access token may now include the necessary roles or claims. - // To prevent infinitie redirect loop, let's append refresh_token=false to the url, so we only redirect in case no refresh_token=false is present - - if (string.IsNullOrEmpty(refresh_token) is false && RedirectUrl?.Contains("try_refreshing_token=false", StringComparison.InvariantCulture) is null or false) - { - await AuthenticationManager.RefreshToken(); - - if ((await AuthenticationStateTask).User.IsAuthenticated()) - { - if (RedirectUrl is not null) - { - var @char = RedirectUrl.Contains('?') ? '&' : '?'; // The RedirectUrl may already include a query string. - NavigationManager.NavigateTo($"{RedirectUrl}{@char}try_refreshing_token=false"); - } - } - } - - if ((await AuthenticationStateTask).User.IsAuthenticated() is false) - { - // If neither the refresh_token nor the access_token is present, proceed to the sign-in page. - await SignIn(); - } - - await base.OnAfterFirstRenderAsync(); - } - - private async Task SignIn() - { - await AuthenticationManager.SignOut(); - - RedirectToSignInPage(); - } - - private void RedirectToSignInPage() - { - var redirectUrl = RedirectUrl ?? NavigationManager.ToBaseRelativePath(NavigationManager.Uri); - NavigationManager.NavigateTo($"/sign-in{(string.IsNullOrEmpty(redirectUrl) ? "" : $"?redirect-url={redirectUrl}")}"); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotAuthorizedPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotAuthorizedPage.razor.scss deleted file mode 100644 index c0f2c128..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotAuthorizedPage.razor.scss +++ /dev/null @@ -1,28 +0,0 @@ -@import '../../Styles/abstracts/_functions.scss'; -@import '../../Styles/abstracts/_bit-css-variables.scss'; - -.main { - width: 100%; - display: flex; - padding: rem2(8px); - text-align: center; - max-width: rem2(800px); - flex-direction: column; - max-height: rem2(600px); - border-radius: rem2(4px); - background-color: $bit-color-background-primary; -} - -.title { - color: $bit-color-state-error; -} - -.description { - overflow: auto; - white-space: pre; - margin: rem2(24px); -} - -.buttons { - margin-bottom: rem2(24px); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotFoundPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotFoundPage.razor deleted file mode 100644 index ff2a8b07..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotFoundPage.razor +++ /dev/null @@ -1,8 +0,0 @@ -@page "/not-found" - -@inherits AppComponentBase - -
-

404

-
There is nothing here.
-
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotFoundPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotFoundPage.razor.scss deleted file mode 100644 index 52bf68d2..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/NotFoundPage.razor.scss +++ /dev/null @@ -1,30 +0,0 @@ -@import '../../Styles/abstracts/_functions.scss'; -@import '../../Styles/abstracts/_media-queries.scss'; - -.main { - display: flex; - align-items: center; - justify-content: center; - flex-flow: column nowrap; -} - -.title { - font-weight: 600; - font-size: rem2(120px); - line-height: rem2(168px); - - @include lt-xl { - font-size: rem2(100px); - } -} - -.description { - font-weight: 400; - font-size: rem2(18px); - line-height: rem2(28px); - - @include lt-xl { - font-size: rem2(16px); - line-height: rem2(24px); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationPage.razor deleted file mode 100644 index 5b69bb70..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationPage.razor +++ /dev/null @@ -1,55 +0,0 @@ -@page "/o/{OrganizationCode}/{NavTitle?}" -@inherits AppComponentBase - - - - -@if (Organization is not null) -{ - @switch (ActiveOrganizationNavLink) - { - case OrganizationNavLink.Home: - - break; - case OrganizationNavLink.Badges: - - break; - case OrganizationNavLink.Docs: - - break; - case OrganizationNavLink.Learners: - - break; - case OrganizationNavLink.Feed: - - break; - default: - break; - } -} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationPage.razor.cs deleted file mode 100644 index 0d8b92b9..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationPage.razor.cs +++ /dev/null @@ -1,73 +0,0 @@ -using CrystallineSociety.Shared.Dtos.BadgeSystem; -using CrystallineSociety.Shared.Dtos.Organization; - -namespace CrystallineSociety.Client.Core.Components.Pages -{ - public partial class OrganizationPage - { - [Parameter] - public string? OrganizationCode { get; set; } - - [Parameter] - public string? NavTitle { get; set; } - - private OrganizationDto Organization { get; set; } = default!; - - private BadgeBundleDto? Bundle { get; set; } - - private OrganizationNavLink ActiveOrganizationNavLink { get; set; } = OrganizationNavLink.Home; - - protected override async Task OnInitAsync() - { - if (NavTitle != null) - { - await HandleNavMenuClickAsync(NavTitle); - } - - else - { - await HandleNavMenuClickAsync("Home"); - } - - await PrerenderStateService.GetValue(async () => LoadOrganizationAsync()); - - await base.OnInitAsync(); - } - - private async Task LoadOrganizationAsync() - { - Organization = await HttpClient.GetFromJsonAsync($"api/Organization/GetOrganizationByCode?code={OrganizationCode}", AppJsonContext.Default.OrganizationDto); - } - - private async Task LoadBadgeSystem() - { - Bundle = await HttpClient.GetFromJsonAsync($"api/BadgeSystem/GetBadgeBundleFromGitHub?repositoryUrl={Organization.BadgeSystemUrl}", AppJsonContext.Default.BadgeBundleDto); - } - - private async Task HandleNavMenuClickAsync(string navTitle) - { - ActiveOrganizationNavLink = navTitle.ToLower().Trim() switch - { - "home" => OrganizationNavLink.Home, - "docs" => OrganizationNavLink.Docs, - "learners" => OrganizationNavLink.Learners, - "badges" => OrganizationNavLink.Badges, - "feed" => OrganizationNavLink.Feed, - _ => throw new NotImplementedException() - }; - - var url = $"/o/{OrganizationCode}/{navTitle.ToLower().Trim()}"; - - await JSRuntime.InvokeVoidAsync("App.removeParametersOfUrl", url); - - if (ActiveOrganizationNavLink == OrganizationNavLink.Badges) - { - await LoadBadgeSystem(); - } - else if (ActiveOrganizationNavLink == OrganizationNavLink.Docs) - { - await LoadOrganizationAsync(); - } - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationPage.razor.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationsSettingsPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationsSettingsPage.razor deleted file mode 100644 index 20056e5f..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationsSettingsPage.razor +++ /dev/null @@ -1,66 +0,0 @@ -@page "/OrganizationsSettings" -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@using CrystallineSociety.Shared.Dtos.Organization -@inherits AppComponentBase - -
-
-

Manage organizations

-
- -
- - - - - - - - - @foreach (var organization in Organizations) - { - - - - - } - -
Organization nameOrganization actions
@organization.Title - - - -
-
-
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationsSettingsPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationsSettingsPage.razor.cs deleted file mode 100644 index 77def6cb..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationsSettingsPage.razor.cs +++ /dev/null @@ -1,33 +0,0 @@ -using CrystallineSociety.Shared.Dtos.Organization; - -namespace CrystallineSociety.Client.Core.Components.Pages; -public partial class OrganizationsSettingsPage -{ - private List Organizations = new(); - private bool IsSyncing = false; - private bool IsDeleting = false; - - - protected override async Task OnInitAsync() - { - // Todo : complete this code to return dto not entity. - Organizations = await PrerenderStateService.GetValue(async () => await HttpClient.GetFromJsonAsync>("api/Organization/GetOrganizations")) ?? new(); - await base.OnInitAsync(); - } - - private async Task HandelSyncAsync(OrganizationDto organization) - { - IsSyncing = true; - await HttpClient.PostAsJsonAsync("api/Organization/SyncOrganizationBadges", organization); - await HttpClient.PostAsJsonAsync("api/ProgramDocument/SyncOrganizationProgramDocuments", organization); - IsSyncing = false; - } - - private async Task HandelDeleteAsync(OrganizationDto organization) - { - IsDeleting = true; - await HttpClient.PostAsJsonAsync("api/Organization/SyncOrganizationBadges", organization); - await HttpClient.PostAsJsonAsync("api/ProgramDocument/SyncOrganizationProgramDocuments", organization); - IsDeleting = false; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationsSettingsPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationsSettingsPage.razor.scss deleted file mode 100644 index 0be47eff..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/OrganizationsSettingsPage.razor.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import '../../Styles/abstracts/_functions.scss'; -@import '../../Styles/abstracts/_colors.scss'; -@import '../../Styles/abstracts/_media-queries.scss'; diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/TermsPage.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/TermsPage.razor deleted file mode 100644 index e8d9410a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/TermsPage.razor +++ /dev/null @@ -1,106 +0,0 @@ -@page "/terms" -@inherits AppComponentBase - -@Localizer[nameof(AppStrings.TermsTitle)] - -
-
- -
-

CrystallineSociety license

-
- This EULA and Privacy Policy are written for individuals who use the CrystallineSociety Demo Version through the todo.bitplatform.dev website, or the published version of this app on the bit platform's Google Play, Apple Store, and Microsoft Store accounts. -
- If you want to build your own project based on this Project Template, please refer to the License and create your own project, publish it with the relevant EULA and Privacy Policy for your business.s -
-
- -
-

End-User License Agreement (EULA) for CrystallineSociety Demo Version

-
- This End-User License Agreement (EULA) is a legal agreement between you (the "user") and bit platform, located at Sixmastraat 15, 8932 PA Leeuwarden, Netherlands, with phone number +31684207362, for the use of CrystallineSociety Demo Version (the "Software"). -
- By using the Software, you agree to be bound by the terms and conditions of this agreement. -
-
- -
-

License Grant

-
- bit platform hereby grants the user a non-exclusive, non-transferable license to use the Software, solely for the purpose of evaluating and testing the features of the CrystallineSociety Demo Version during the term of this EULA. -
-
- -
-

Ownership

-
- bit platform retains all rights, title, and interest in and to the Software, including any and all intellectual property rights. -
-
- -
-

User Data

-
- bit platform may collect user data, including name, surname, photo, date of birth, and gender. Providing this information is optional, and bit platform will only use it for the purposes of the CrystallineSociety Demo Version. If the user requests, bit platform will delete this data within one day, using one of the contact methods provided at the end of this EULA. In addition, the user is required to provide an email address for account verification purposes, but bit platform will not use this email for any other purposes. -
-
- -
-

Analytics and Cookies

-
- bit platform does not use any Analytics tools for measuring website traffic and only uses strictly necessary cookies. -
-
- -
-

Restrictions

-
- User may not: (a) copy the Software, except as necessary for testing purposes; (b) distribute, rent, loan, lease, sell, sublicense, or otherwise transfer the Software or any portion thereof; (c) reverse engineer, decompile, disassemble, modify, translate, make any attempt to discover the source code of the Software, or create derivative works based on the Software; or (d) remove any proprietary notices or labels on the Software. -
-
- -
-

No Warranty

-
- The Software is provided "AS IS" and without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. bit platform does not warrant that the Software will be error-free or that its use will be uninterrupted. -
-
- -
-

Limitation of Liability

-
- bit platform shall not be liable for any damages whatsoever arising out of the use of or inability to use the Software, including but not limited to direct, indirect, incidental, special, or consequential damages, even if bit platform has been advised of the possibility of such damages. -
-
- -
-

Termination

-
- This EULA shall remain in effect until 2025-12-31. bit platform reserves the right to terminate this EULA at any time without notice. Upon termination, the user shall immediately cease all use of the Software and destroy all copies of the Software in its possession. -
-
- -
-

Contact Information

-
- If you have any questions or concerns regarding this EULA or the Privacy Policy, or if you would like to contact bit platform for any reason, please email info@bitplatform.dev or call +31684207362, or visit our website at our website or visit us at Sixmastraat 15, 8932 PA Leeuwarden, Netherlands. -
-
- - -
-

Privacy Policy

-
-
    -
  • bit platform is committed to protecting the privacy of the user data.
  • -
  • We will only use the data collected from the user for the purposes of the CrystallineSociety Demo Version and will delete this data upon user request, using one of the contact methods provided above.
  • -
  • We do not share the user data with any third parties and do not allow users to share data with anyone in any way.
  • -
  • We do not collect any information on user's usage in the CrystallineSociety Demo Version.
  • -
  • We do not display any Third-Party content, advertisements, or any purchases in the CrystallineSociety Demo Version.
  • -
  • This Privacy Policy is effective until 2025-12-31 and is subject to change without notice.
  • -
-
-
- -
-
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/TermsPage.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/TermsPage.razor.cs deleted file mode 100644 index f0d85800..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/TermsPage.razor.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace CrystallineSociety.Client.Core.Components.Pages; - -public partial class TermsPage -{ -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/TermsPage.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/TermsPage.razor.scss deleted file mode 100644 index c5eb2717..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/Pages/TermsPage.razor.scss +++ /dev/null @@ -1,111 +0,0 @@ -@import '../../Styles/abstracts/_functions.scss'; -@import '../../Styles/abstracts/_media-queries.scss'; - -.page-container { - width: 100%; - display: flex; - align-items: center; - align-self: flex-start; - flex-flow: column nowrap; - justify-content: flex-start; -} - -.page-content { - width: 100%; - display: flex; - align-items: center; - max-width: rem2(1128px); - flex-flow: column nowrap; - justify-content: flex-start; - - @include lg { - max-width: rem2(1040px); - } - - @include md { - max-width: rem2(770px); - } -} - -.main-section { - width: 100%; - margin-bottom: rem2(24px); -} - -.main-section-title { - width: 100%; - text-align: left; - font-weight: bold; - font-size: rem2(34px); - line-height: rem2(56px); - margin-bottom: rem2(24px); - - @include lg { - font-size: rem2(30px); - line-height: rem2(48px); - margin-bottom: rem2(16px); - } - - @include md { - font-size: rem2(24px); - line-height: rem2(40px); - margin-bottom: rem2(16px); - } - - @include sm { - font-size: rem2(20px); - line-height: rem2(32px); - margin-bottom: rem2(12px); - } -} - -.section-desc { - width: 100%; - font-size: rem2(18px); - line-height: rem2(28px); - - @include lt-xl { - font-size: rem2(16px); - line-height: rem2(24px); - } - - @include sm { - font-size: rem2(14px); - } -} - -.sub-section { - width: 100%; - margin-bottom: rem2(24px); - - &:last-child { - margin-bottom: 0; - } -} - -.sub-section-title { - width: 100%; - text-align: left; - font-weight: 600; - font-size: rem2(24px); - line-height: rem2(36px); - margin-bottom: rem2(16px); - - @include lg { - font-size: rem2(20px); - line-height: rem2(32px); - margin-bottom: rem2(8px); - } - - @include md { - font-size: rem2(18px); - line-height: rem2(28px); - margin-bottom: rem2(8px); - } - - @include sm { - font-size: rem2(16px); - line-height: rem2(24px); - margin-bottom: rem2(8px); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentContent.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentContent.razor deleted file mode 100644 index 571c93d1..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentContent.razor +++ /dev/null @@ -1,18 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - -@if (ProgramDocument != null) -{ -
-

@ProgramDocument.Title

- -
-
- ProgramDocument Code : @ProgramDocument.Code - ProgramDocument Content -
- @(new MarkupString(ProgramDocument.HtmlContent ?? string.Empty)) -
-
-} - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentContent.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentContent.razor.cs deleted file mode 100644 index 0655c815..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentContent.razor.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace CrystallineSociety.Client.Core.Components; -public partial class ProgramDocumentContent -{ - [Parameter] public ProgramDocumentDto? ProgramDocument { get; set; } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentContent.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentContent.razor.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentTree.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentTree.razor deleted file mode 100644 index 3eb2695d..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentTree.razor +++ /dev/null @@ -1,9 +0,0 @@ -@using CrystallineSociety.Shared.Dtos.BadgeSystem -@inherits AppComponentBase - -
    - @foreach (var programDocument in ProgramDocuments) - { -
  • @programDocument.Title
  • - } -
diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentTree.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentTree.razor.cs deleted file mode 100644 index f154ffc6..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentTree.razor.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace CrystallineSociety.Client.Core.Components; -public partial class ProgramDocumentTree -{ - [Parameter] public List ProgramDocuments { get; set; } = new(); - [Parameter] public EventCallback ProgramDocumentCallBack { get; set; } - - private string? ActiveProgramDocumentUrl { get; set; } - - private async Task OnProgramDocumentClick(ProgramDocumentDto programDocument) - { - ActiveProgramDocumentUrl = programDocument.Url; - await ProgramDocumentCallBack.InvokeAsync(programDocument); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentTree.razor.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Components/ProgramDocumentTree.razor.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Attributes.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Attributes.cs deleted file mode 100644 index 6b33916b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Attributes.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace CrystallineSociety.Client.Core.Controllers; - -[AttributeUsage(AttributeTargets.Interface)] -internal class RouteAttribute(string template) : Attribute -{ - public string Template { get; } = template; -} - -[AttributeUsage(AttributeTargets.Method)] -internal class HttpGetAttribute(string? template = null) : Attribute -{ - public string? Template { get; } = template; -} - -[AttributeUsage(AttributeTargets.Method)] -internal class HttpPostAttribute(string? template = null) : Attribute -{ - public string? Template { get; } = template; -} - -[AttributeUsage(AttributeTargets.Method)] -internal class HttpPutAttribute(string? template = null) : Attribute -{ - public string? Template { get; } = template; -} - -[AttributeUsage(AttributeTargets.Method)] -internal class HttpDeleteAttribute(string? template = null) : Attribute -{ - public string? Template { get; } = template; -} - -[AttributeUsage(AttributeTargets.Method)] -internal class HttpPatchAttribute(string? template = null) : Attribute -{ - public string? Template { get; } = template; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IAppController.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IAppController.cs deleted file mode 100644 index 48cb1fc8..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IAppController.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace CrystallineSociety.Client.Core.Controllers; - -public interface IAppController -{ - void AddQueryString(string key, object? value) { } - void AddQueryStrings(Dictionary queryString) { } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IBadgeController.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IBadgeController.cs deleted file mode 100644 index 01f9334f..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IBadgeController.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CrystallineSociety.Client.Core.Controllers; - -[Route("api/[controller]/[action]")] -public interface IBadgeController : IAppController -{ -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IBadgeSystemController.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IBadgeSystemController.cs deleted file mode 100644 index ffd49661..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IBadgeSystemController.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using CrystallineSociety.Shared.Dtos.BadgeSystem; -using CrystallineSociety.Shared.Services.Contracts; -using CrystallineSociety.Shared.Services.Implementations.BadgeSystem; - -namespace CrystallineSociety.Client.Core.Controllers; - -[Route("api/[controller]/[action]")] -public interface IBadgeSystemController : IAppController -{ - /// - /// Retrieves the default badge bundle. - /// - /// Cancellation token. - /// The default badge bundle. - [HttpGet] - Task GetDefaultBadgeBundle(CancellationToken cancellationToken = default); - - /// - /// Retrieves a badge bundle from a GitHub repository. - /// - /// The URL of the GitHub repository. - /// Cancellation token. - /// The badge bundle from the GitHub repository. - [HttpGet] - Task GetBadgeBundleFromGitHub(string repositoryUrl, CancellationToken cancellationToken = default); - - /// - /// Retrieves all badges. - /// - /// Cancellation token. - /// All badges. - [HttpGet] - Task> GetBadges(CancellationToken cancellationToken = default); - - /// - /// Retrieves all badge system validations. - /// - /// Cancellation token. - /// All badge system validations. - [HttpGet] - Task> GetBadgeValidations(CancellationToken cancellationToken = default); - - /// - /// Retrieves all earned badges for a given user. - /// - /// The username of the user. - /// All earned badges for the user. - [HttpGet] - Task> GetEarnedBadgesAsync(string username); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IMinimalApiController.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IMinimalApiController.cs deleted file mode 100644 index e93ec8ee..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IMinimalApiController.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Text.Json; - -namespace CrystallineSociety.Client.Core.Controllers; - -public interface IMinimalApiController : IAppController -{ - [HttpGet("api/minimal-api-sample/{routeParameter}{?queryStringParameter}")] - Task MinimalApiSample(string routeParameter, string queryStringParameter, CancellationToken cancellationToken = default); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IOrganizationController.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IOrganizationController.cs deleted file mode 100644 index fd56405f..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IOrganizationController.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using CrystallineSociety.Shared.Dtos.Organization; - -namespace CrystallineSociety.Client.Core.Controllers; - -[Route("api/[controller]/[action]")] -public interface IOrganizationController : IAppController -{ - [HttpPost] - Task SyncOrganizationBadgesAsync(OrganizationDto organization, CancellationToken cancellationToken = default); - - /// - /// Retrieves all education programs. - /// - /// Cancellation token. - /// All education programs. - [HttpGet] - Task> GetOrganizationsAsync(CancellationToken cancellationToken = default); - - /// - /// Retrieves an organization by its code. - /// - /// The code of the organization to retrieve. - /// Cancellation token. - /// The organization with the specified code. - [HttpGet] - Task GetOrganizationByCodeAsync(string code, CancellationToken cancellationToken = default); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IProgramDocumentController.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IProgramDocumentController.cs deleted file mode 100644 index d97d2f32..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/IProgramDocumentController.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using CrystallineSociety.Shared.Dtos.Organization; - -namespace CrystallineSociety.Client.Core.Controllers; - -[Route("api/[controller]/[action]")] -public interface IProgramDocumentController : IAppController -{ - [HttpGet] - Task> GetProgramDocumentsAsync(string organizationCode, CancellationToken cancellationToken = default); - - //[HttpPost] - //Task CreateProgramDocumentAsync(ProgramDocument document, CancellationToken cancellationToken); - - [HttpPost] - Task SyncOrganizationProgramDocumentsAsync(OrganizationDto organization, CancellationToken cancellationToken = default); - - //[HttpPut("{id}")] - // Task UpdateProgramDocumentAsync(ProgramDocument document, CancellationToken cancellationToken); - - [HttpDelete("{id}")] - Task DeleteProgramDocumentAsync(Guid id, CancellationToken cancellationToken = default); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Identity/IIdentityController.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Identity/IIdentityController.cs deleted file mode 100644 index fd82edfa..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Identity/IIdentityController.cs +++ /dev/null @@ -1,28 +0,0 @@ -using CrystallineSociety.Shared.Dtos.Identity; - -namespace CrystallineSociety.Client.Core.Controllers.Identity; - -[Route("api/[controller]/[action]/")] -public interface IIdentityController : IAppController -{ - [HttpPost] - Task SignUp(SignUpRequestDto body, CancellationToken cancellationToken = default); - - [HttpPost] - Task SendConfirmationEmail(SendConfirmationEmailRequestDto body, CancellationToken cancellationToken = default); - - [HttpPost] - Task SendResetPasswordEmail(SendResetPasswordEmailRequestDto body, CancellationToken cancellationToken = default); - - [HttpPost] - Task ConfirmEmail(ConfirmEmailRequestDto body); - - [HttpPost] - Task ResetPassword(ResetPasswordRequestDto body, CancellationToken cancellationToken = default); - - [HttpPost] - Task Refresh(RefreshRequestDto body, CancellationToken cancellationToken = default) => default!; - - [HttpPost] - Task SignIn(SignInRequestDto body, CancellationToken cancellationToken = default) => default!; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Identity/IUserController.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Identity/IUserController.cs deleted file mode 100644 index f3bc6908..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Identity/IUserController.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CrystallineSociety.Shared.Dtos.Identity; - -namespace CrystallineSociety.Client.Core.Controllers.Identity; - -[Route("api/[controller]/[action]/")] -public interface IUserController : IAppController -{ - [HttpGet] - Task GetCurrentUser(CancellationToken cancellationToken = default); - - [HttpPut] - Task Update(EditUserDto body, CancellationToken cancellationToken = default); - - [HttpDelete] - Task Delete(CancellationToken cancellationToken = default); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Readme.md b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Readme.md deleted file mode 100644 index cb5eda9f..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Controllers/Readme.md +++ /dev/null @@ -1,56 +0,0 @@ -**Bit.SourceGenerator interface based HttpClient proxy generator** - -**Introduction:** -When defining server-side APIs, there are no restrictions. You can leverage features such as Api versioning, OData, ASP.NET Core Minimal API, -Middleware, and more. On the client side, use HttpClient and optionally employ Bit.SourceGenerator. - -Getting started: - -1- Creating a Custom Interface: -Define an interface, for instance, `ICategoryController`, extending `IAppController`. - -```csharp -public interface ICategoryController : IAppController -``` - -2- Simply inject these interfaces into your classes, and you're all set! - -3- (Optional) implement that interface in server project. -```csharp -public class CategoryController : AppControllerBase, ICategoryController -``` -Interface implementation on the server-side is not mandatory nor possible in some situations (For example ASP.NET Core Minimal API) - -**Note:** If you implement the interface on the server-side, C# compiler ensure -that methods seen by the client in `ICategoryController` are present in `CategoryController` during build. - -**Note:** Server-side methods may have conditions that make direct definition in the client-side interface challenging. -For example, an `Upload` method in `AttachmentController` has `IFormFile`, -and `Refresh` method of `IdentityController` returns `ActionResult` and these types are not present in client side. -In this case you can still use `Bit.SourceGenerator`, but in order to prevent C# compiler's build error, write the followings: -```csharp -[HttpPost] -Task Refresh(RefreshRequestDto body) => default!; -``` -instead of -```csharp -[HttpPost] -Task Refresh(RefreshRequestDto body); -``` - -**Convention Over Configuration:** - -While following the Convention over Configuration principle, methods like `Create` in `ICategoryController` send requests to `api/Category/Create`, -you are not bound by this convention. Use any `RoutePrefix` you prefer, as long as your API is accepting/returning json you're all set! - -**Advanced sample**: -Explore `IMinimalApiController` for example of ASP.NET Core Minimal API that has the following characteristics: - -1- No server-side web api controllers because of ASP.NET Core Minimal API. - -2- Receiving output as `JsonElement`. - -3- Example of Query String. - -**Note:** We supprt [RFC6570](https://datatracker.ietf.org/doc/html/rfc6570) for request url templates thanks to [DoLess.UriTemplates](https://github.com/letsar/DoLess.UriTemplates?tab=readme-ov-file#examples)! - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/CrystallineSociety.Client.Core.csproj b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/CrystallineSociety.Client.Core.csproj deleted file mode 100644 index 50144326..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/CrystallineSociety.Client.Core.csproj +++ /dev/null @@ -1,74 +0,0 @@ - - - - net8.0 - - BeforeBuildTasks; - $(ResolveStaticWebAssetsInputsDependsOn) - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - $([System.String]::Copy('%(Filename)').Replace('.Designer','')).resx - - - PublicResXFileCodeGenerator - %(Filename).Designer.cs - - - - - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/ICollectionExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/ICollectionExtensions.cs deleted file mode 100644 index 399d6b29..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/ICollectionExtensions.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace System.Collections.Generic; - -public static class ICollectionExtensions -{ - // Basically a Polyfill since we now expose IList instead of List - // which is better but IList doesn't have AddRange - public static void AddRange(this IList list, IEnumerable items) - { - ArgumentNullException.ThrowIfNull(list); - ArgumentNullException.ThrowIfNull(items); - - if (list is List asList) - { - asList.AddRange(items); - return; - } - - foreach (T item in items) - { - list.Add(item); - } - } - - public static async Task> ToListAsync(this IAsyncEnumerable items, CancellationToken cancellationToken = default) - { - var results = new List(); - await foreach (var item in items.WithCancellation(cancellationToken)) - { - results.Add(item); - } - return results; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/IConfigurationBuilderExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/IConfigurationBuilderExtensions.cs deleted file mode 100644 index ecee2b71..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/IConfigurationBuilderExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Reflection; - -namespace Microsoft.Extensions.Configuration; - -public static class IConfigurationBuilderExtensions -{ - public static void AddClientConfigurations(this IConfigurationBuilder builder) - { - var assembly = Assembly.Load("CrystallineSociety.Client.Core"); - builder.AddJsonStream(assembly.GetManifestResourceStream("CrystallineSociety.Client.Core.appsettings.json")!); - - if (BuildConfiguration.IsDebug()) - { - builder.AddJsonStream(assembly.GetManifestResourceStream("CrystallineSociety.Client.Core.appsettings.Development.json")!); - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/IJSRuntimeExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/IJSRuntimeExtensions.cs deleted file mode 100644 index 49c6aa44..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/IJSRuntimeExtensions.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Microsoft.JSInterop; - -public static class IJSRuntimeExtensions -{ - public static async Task ApplyBodyElementClasses(this IJSRuntime jsRuntime, List cssClasses, Dictionary cssVariables) - { - await jsRuntime.InvokeVoidAsync("App.applyBodyElementClasses", cssClasses, cssVariables); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/IServiceCollectionExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/IServiceCollectionExtensions.cs deleted file mode 100644 index 73ad644e..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Extensions/IServiceCollectionExtensions.cs +++ /dev/null @@ -1,78 +0,0 @@ -using CrystallineSociety.Client.Core.Services.HttpMessageHandlers; -using Microsoft.AspNetCore.Components.WebAssembly.Services; - -namespace Microsoft.Extensions.DependencyInjection; - -public static class IServiceCollectionExtensions -{ - public static IServiceCollection AddClientSharedServices(this IServiceCollection services) - { - // Services registered in this class can be injected in client side (Web, Android, iOS, Windows, macOS) - - services.TryAddTransient(); - - services.TryAddSessioned(); - services.TryAddTransient(); - services.TryAddTransient(); - - services.TryAddKeyedTransient("DefaultMessageHandler"); - services.TryAddTransient(); - services.TryAddTransient(); - services.TryAddTransient(); - services.TryAddTransient(); - - services.TryAddTransient(); - - services.AddScoped(); - services.AddScoped(sp => (AuthenticationManager)sp.GetRequiredService()); - - services.TryAddTransient(); - services.TryAddTransient(); - - services.TryAddTransient(sp => AppJsonContext.Default.Options); - services.AddTypedHttpClients(); - - services.AddBitButilServices(); - services.AddBitBlazorUIServices(); - services.AddSharedServices(); - - return services; - } - - /// - /// Utilizing the AddSessioned method seamlessly configures the service to function as a singleton in BlazorHybrid, and BlazorWebAssembly - /// environments. Simultaneously, it employs per-scope registration for pre-rendering and BlazorServer scenarios - /// - public static IServiceCollection AddSessioned(this IServiceCollection services) - where TImplementation : class, TService - where TService : class - { - if (AppRenderMode.IsBlazorHybrid || OperatingSystem.IsBrowser()) - { - return services.AddSingleton(); - } - else - { - return services.AddScoped(); - } - } - - /// - /// - /// - public static IServiceCollection TryAddSessioned(this IServiceCollection services) - where TImplementation : class, TService - where TService : class - { - if (AppRenderMode.IsBlazorHybrid || OperatingSystem.IsBrowser()) - { - services.TryAddSingleton(); - } - else - { - services.TryAddScoped(); - } - - return services; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Routes.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Routes.razor deleted file mode 100644 index e406f48b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Routes.razor +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Routes.razor.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Routes.razor.cs deleted file mode 100644 index 91497af4..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Routes.razor.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace CrystallineSociety.Client.Core; - -public partial class Routes -{ - [AutoInject] IJSRuntime jsRuntime = default!; - [AutoInject] IBitDeviceCoordinator bitDeviceCoordinator = default!; - [AutoInject] IStorageService storageService = default!; - - protected override async Task OnInitializedAsync() - { - if (AppRenderMode.IsBlazorHybrid) - { - if (AppRenderMode.MultilingualEnabled) - { - CultureInfoManager.SetCurrentCulture(await storageService.GetItem("Culture")); - } - - await SetupBodyClasses(); - } - - await base.OnInitializedAsync(); - } - - private async Task SetupBodyClasses() - { - var cssClasses = new List { }; - - if (OperatingSystem.IsWindows()) - { - cssClasses.Add("bit-windows"); - } - else if (OperatingSystem.IsMacOS() || OperatingSystem.IsMacCatalyst()) - { - cssClasses.Add("bit-macos"); - } - else if (OperatingSystem.IsIOS() && OperatingSystem.IsMacCatalyst() is false) - { - cssClasses.Add("bit-ios"); - } - else if (OperatingSystem.IsAndroid()) - { - cssClasses.Add("bit-android"); - } - - var cssVariables = new Dictionary(); - var statusBarHeight = bitDeviceCoordinator.GetStatusBarHeight(); - - if (OperatingSystem.IsMacCatalyst() is false) - { - //For iOS this is handled in css using safe-area env() variables - //For Android there's an issue with keyboard in fullscreen mode. more info: https://github.com/bitfoundation/bitplatform/issues/5626 - //For Windows there's an issue with TitleBar. more info: https://github.com/bitfoundation/bitplatform/issues/5695 - statusBarHeight = 0; - } - - cssVariables.Add("--bit-status-bar-height", $"{statusBarHeight.ToString("F3", CultureInfo.InvariantCulture)}px"); - await jsRuntime.ApplyBodyElementClasses(cssClasses, cssVariables); - } - - [AutoInject] NavigationManager? navigationManager { set => universalLinksNavigationManager = value; get => universalLinksNavigationManager; } - public static NavigationManager? universalLinksNavigationManager; - - public static async Task OpenUniversalLink(string url) - { - await Task.Run(async () => - { - while (universalLinksNavigationManager is null) - { - await Task.Yield(); - } - - universalLinksNavigationManager.NavigateTo(url); - }); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Scripts/app.ts b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Scripts/app.ts deleted file mode 100644 index 6fda326c..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Scripts/app.ts +++ /dev/null @@ -1,31 +0,0 @@ -class App { - public static applyBodyElementClasses(cssClasses: string[], cssVariables: any): void { - cssClasses?.forEach(c => document.body.classList.add(c)); - Object.keys(cssVariables).forEach(key => document.body.style.setProperty(key, cssVariables[key])); - } - - public static goBack(): void { - window.history.back(); - } - - public static removeParametersOfUrl(url: any) { - window.history.pushState(null, '', url); - } -} - -declare class BitTheme { static init(options: any): void; }; - -BitTheme.init({ - system: true, - onChange: (newTheme: string, oldThem: string) => { - if (newTheme === 'dark') { - document.body.classList.add('theme-dark'); - document.body.classList.remove('theme-light'); - document.querySelector("meta[name=theme-color]")!.setAttribute('content', '#0d1117'); - } else { - document.body.classList.add('theme-light'); - document.body.classList.remove('theme-dark'); - document.querySelector("meta[name=theme-color]")!.setAttribute('content', '#ffffff'); - } - } -}); diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/AppRenderMode.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/AppRenderMode.cs deleted file mode 100644 index 67c67aa1..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/AppRenderMode.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Microsoft.AspNetCore.Components.Web; - -namespace CrystallineSociety.Client.Core.Services; - -public static class AppRenderMode -{ - public static readonly bool PrerenderEnabled = false; - - private static IComponentRenderMode Auto { get; } = new InteractiveAutoRenderMode(PrerenderEnabled); - private static IComponentRenderMode BlazorWebAssembly { get; } = new InteractiveWebAssemblyRenderMode(PrerenderEnabled); - private static IComponentRenderMode BlazorServer { get; } = new InteractiveServerRenderMode(PrerenderEnabled); - public static IComponentRenderMode NoPrerenderBlazorWebAssembly => new InteractiveWebAssemblyRenderMode(prerender: false); - - public static IComponentRenderMode Current => - BuildConfiguration.IsDebug() ? BlazorServer /*For better development experience*/ : Auto; - - /// - /// To enable/disable pwa support, navigate to Directory.Build.props and modify the PwaEnabled flag. - /// - public static bool PwaEnabled { get; } = -#if PwaEnabled - true; -#else - false; -#endif - - /// - /// To enable/disable multilingual support, navigate to Directory.Build.props and modify the MultilingualEnabled flag. - /// - public static bool MultilingualEnabled { get; } = -#if MultilingualEnabled - true; -#else - false; -#endif - - /// - /// Is running under .NET MAUI? - /// - public static bool IsBlazorHybrid { get; set; } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/AuthenticationManager.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/AuthenticationManager.cs deleted file mode 100644 index 4e09e891..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/AuthenticationManager.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System.Text; -using System.Text.Json; -using CrystallineSociety.Shared.Dtos.Identity; -using CrystallineSociety.Client.Core.Controllers.Identity; - -namespace CrystallineSociety.Client.Core.Services; - -public partial class AuthenticationManager : AuthenticationStateProvider -{ - [AutoInject] private Cookie cookie = default!; - [AutoInject] private IAuthTokenProvider tokenProvider = default!; - [AutoInject] private IStorageService storageService = default!; - [AutoInject] private IIdentityController identityController = default; - [AutoInject] private IStringLocalizer localizer = default!; - [AutoInject] private JsonSerializerOptions jsonSerializerOptions = default!; - - public async Task SignIn(SignInRequestDto signInModel, CancellationToken cancellationToken) - { - var result = await identityController.SignIn(signInModel, cancellationToken); - - await StoreToken(result!, signInModel.RememberMe); - - NotifyAuthenticationStateChanged(Task.FromResult(await GetAuthenticationStateAsync())); - } - - public async Task SignOut() - { - await storageService.RemoveItem("access_token"); - await storageService.RemoveItem("refresh_token"); - if (AppRenderMode.PrerenderEnabled && AppRenderMode.IsBlazorHybrid is false) - { - await cookie.Remove("access_token"); - } - NotifyAuthenticationStateChanged(Task.FromResult(await GetAuthenticationStateAsync())); - } - - public async Task RefreshToken() - { - if (AppRenderMode.PrerenderEnabled && AppRenderMode.IsBlazorHybrid is false) - { - await cookie.Remove("access_token"); - } - await storageService.RemoveItem("access_token"); - NotifyAuthenticationStateChanged(Task.FromResult(await GetAuthenticationStateAsync())); - } - - public override async Task GetAuthenticationStateAsync() - { - var access_token = await tokenProvider.GetAccessTokenAsync(); - - if (string.IsNullOrEmpty(access_token) && tokenProvider.IsInitialized) - { - string? refresh_token = await storageService.GetItem("refresh_token"); - - if (string.IsNullOrEmpty(refresh_token) is false) - { - // We refresh the access_token to ensure a seamless user experience, preventing unnecessary 'NotAuthorized' page redirects and improving overall UX. - // This method is triggered after 401 and 403 server responses in AuthDelegationHandler, - // as well as when accessing pages without the required permissions in NotAuthorizedPage, ensuring that any recent claims granted to the user are promptly reflected. - - try - { - var refreshTokenResponse = await identityController.Refresh(new() { RefreshToken = refresh_token }); - await StoreToken(refreshTokenResponse!); - access_token = refreshTokenResponse!.AccessToken; - } - catch (ResourceValidationException exp) // refresh_token in invalid or expired - { - await storageService.RemoveItem("refresh_token"); - throw new UnauthorizedException(localizer[nameof(AppStrings.YouNeedToSignIn)], exp); - } - } - } - - if (string.IsNullOrEmpty(access_token)) - { - return NotSignedIn(); - } - - var identity = new ClaimsIdentity(claims: ParseTokenClaims(access_token), authenticationType: "Bearer", nameType: "name", roleType: "role"); - - return new AuthenticationState(new ClaimsPrincipal(identity)); - } - - private async Task StoreToken(TokenResponseDto tokenResponseDto, bool? rememberMe = null) - { - if (rememberMe is null) - { - rememberMe = await storageService.IsPersistent("refresh_token"); - } - await storageService.SetItem("access_token", tokenResponseDto!.AccessToken, rememberMe is true); - await storageService.SetItem("refresh_token", tokenResponseDto!.RefreshToken, rememberMe is true); - if (AppRenderMode.PrerenderEnabled && AppRenderMode.IsBlazorHybrid is false) - { - await cookie.Set(new ButilCookie - { - Name = "access_token", - Value = tokenResponseDto.AccessToken, - MaxAge = tokenResponseDto.ExpiresIn - }); - } - } - - private static AuthenticationState NotSignedIn() - { - return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); - } - - private IEnumerable ParseTokenClaims(string access_token) - { - return ParseJwt(access_token) - .Select(keyValue => new Claim(keyValue.Key, keyValue.Value.ToString() ?? string.Empty)) - .ToArray(); - } - - private Dictionary ParseJwt(string access_token) - { - // Split the token to get the payload - string base64UrlPayload = access_token.Split('.')[1]; - - // Convert the payload from Base64Url format to Base64 - string base64Payload = ConvertBase64UrlToBase64(base64UrlPayload); - - // Decode the Base64 string to get a JSON string - string jsonPayload = Encoding.UTF8.GetString(Convert.FromBase64String(base64Payload)); - - // Deserialize the JSON string to a dictionary - var claims = JsonSerializer.Deserialize(jsonPayload, jsonSerializerOptions.GetTypeInfo>())!; - - return claims; - } - - private static string ConvertBase64UrlToBase64(string base64Url) - { - base64Url = base64Url.Replace('-', '+').Replace('_', '/'); - - // Adjust base64Url string length for padding - switch (base64Url.Length % 4) - { - case 2: - base64Url += "=="; - break; - case 3: - base64Url += "="; - break; - } - - return base64Url; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/BrowserStorageService.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/BrowserStorageService.cs deleted file mode 100644 index a9f61b24..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/BrowserStorageService.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace CrystallineSociety.Client.Core.Services; - -public partial class BrowserStorageService : IStorageService -{ - [AutoInject] private SessionStorage sessionStorage; - [AutoInject] private LocalStorage localStorage; - - public async ValueTask GetItem(string key) - { - return await localStorage.GetItem(key) ?? - await sessionStorage.GetItem(key); - } - - public async ValueTask RemoveItem(string key) - { - await localStorage.RemoveItem(key); - await sessionStorage.RemoveItem(key); - } - - public async ValueTask SetItem(string key, string? value, bool persistent = true) - { - if (persistent) - { - await localStorage.SetItem(key, value); - } - else - { - await sessionStorage.SetItem(key, value); - } - } - - public async ValueTask IsPersistent(string key) - { - return (await localStorage.GetItem(key)) is not null; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/ClientLearnerService.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/ClientLearnerService.cs deleted file mode 100644 index 779161b8..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/ClientLearnerService.cs +++ /dev/null @@ -1,37 +0,0 @@ -using CrystallineSociety.Shared.Dtos.BadgeSystem; - -namespace CrystallineSociety.Client.Core.Services -{ - public class ClientLearnerService : ILearnerService - { - public Task> GetLearnerBadgesAsync(LearnerDto learner) - { - throw new NotImplementedException(); - } - - public Task GetLearnerByIdAsync(Guid id) - { - throw new NotImplementedException(); - } - - public Task GetLearnerByUsernameAsync(string username) - { - throw new NotImplementedException(); - } - - public IQueryable GetLearners() - { - throw new NotImplementedException(); - } - - public Task> GetLearnersHavingBadgeAsync(params BadgeCountDto[] requiredEarnedBadges) - { - throw new NotImplementedException(); - } - - public IQueryable GetLearnerBadges(LearnerDto learner) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/ClientSideAuthTokenProvider.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/ClientSideAuthTokenProvider.cs deleted file mode 100644 index 0016f726..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/ClientSideAuthTokenProvider.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace CrystallineSociety.Client.Core.Services; - -public partial class ClientSideAuthTokenProvider : IAuthTokenProvider -{ - [AutoInject] private IStorageService storageService = default!; - - public bool IsInitialized => true; - - public async Task GetAccessTokenAsync() - { - return await storageService.GetItem("access_token"); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IBitDeviceCoordinator.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IBitDeviceCoordinator.cs deleted file mode 100644 index bdba72bb..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IBitDeviceCoordinator.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace CrystallineSociety.Client.Core.Services.Contracts; - -/// -/// This service performs device-specific tasks, such as setting the theme. -/// -public interface IBitDeviceCoordinator -{ - public double GetStatusBarHeight() { return 0; } - - public async Task ApplyTheme(bool isDark) { } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IExceptionHandler.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IExceptionHandler.cs deleted file mode 100644 index c0d008ae..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IExceptionHandler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace CrystallineSociety.Client.Core.Services.Contracts; - -public interface IExceptionHandler -{ - void Handle(Exception exception, IDictionary? parameters = null); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IPrerenderStateService.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IPrerenderStateService.cs deleted file mode 100644 index 917f56ba..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IPrerenderStateService.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Runtime.CompilerServices; - -namespace CrystallineSociety.Client.Core.Services.Contracts; - -/// -/// This service simplifies the process of persisting application state in Pre-Rendering mode -/// (explained in this documentation: https://docs.microsoft.com/en-us/aspnet/core/blazor/components/prerendering-and-integration#persist-prerendered-state). -/// If your project does not require prerendering to be enabled, you can completely remove this service and its usages from your project. -/// -public interface IPrerenderStateService -{ - /// - /// Instead of using ApplicationState.TryTakeFromJson, ApplicationState.RegisterOnPersisting, - /// and ApplicationState.PersistAsJson (explained here: https://docs.microsoft.com/en-us/aspnet/core/blazor/components/prerendering-and-integration#persist-prerendered-state), - /// one can easily use the following method () in the OnInit lifecycle method of the Blazor components or pages - /// to retrieve everything that requires an async-await (like current user's info). - /// - Task GetValue(Func> factory, - [CallerLineNumber] int lineNumber = 0, - [CallerMemberName] string memberName = "", - [CallerFilePath] string filePath = ""); - - Task GetValue(string key, Func> factory); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IPubSubService.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IPubSubService.cs deleted file mode 100644 index aebb6be6..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/Contracts/IPubSubService.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace CrystallineSociety.Client.Core.Services.Contracts; - -/// -/// Contract for Publish/Subscribe pattern. -/// -public interface IPubSubService -{ - void Publish(string message, object? payload); - Action Subscribe(string message, Func handler); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/ExceptionHandlerBase.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/ExceptionHandlerBase.cs deleted file mode 100644 index 286dbc8e..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/ExceptionHandlerBase.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Diagnostics; - -namespace CrystallineSociety.Client.Core.Services; - -public abstract partial class ExceptionHandlerBase : IExceptionHandler -{ - [AutoInject] protected readonly IStringLocalizer Localizer = default!; - [AutoInject] protected readonly MessageBoxService MessageBoxService = default!; - [AutoInject] protected Bit.Butil.Console Console = default!; - - public virtual void Handle(Exception exception, IDictionary? parameters = null) - { - var isDebug = BuildConfiguration.IsDebug(); - - string exceptionMessage = (exception as KnownException)?.Message ?? - (isDebug ? exception.ToString() : Localizer[nameof(AppStrings.UnknownException)]); - - if (isDebug) - { - if (OperatingSystem.IsBrowser() || AppRenderMode.IsBlazorHybrid) - { - _ = Console.Error(exceptionMessage); - } - else - { - _ = System.Console.Out.WriteLineAsync(exceptionMessage); - } - Debugger.Break(); - } - - _ = MessageBoxService.Show(exceptionMessage, Localizer[nameof(AppStrings.Error)]); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/AuthDelegatingHandler.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/AuthDelegatingHandler.cs deleted file mode 100644 index 420d0949..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/AuthDelegatingHandler.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Net.Http.Headers; - -namespace CrystallineSociety.Client.Core.Services.HttpMessageHandlers; - -public class AuthDelegatingHandler(IAuthTokenProvider tokenProvider, IServiceProvider serviceProvider, IStorageService storageService, RetryDelegatingHandler handler) - : DelegatingHandler(handler) -{ - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - if (request.Headers.Authorization is null) - { - var access_token = await tokenProvider.GetAccessTokenAsync(); - if (access_token is not null) - { - request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", access_token); - } - } - - try - { - return await base.SendAsync(request, cancellationToken); - } - catch (Exception _) when ((_ is ForbiddenException or UnauthorizedException) && tokenProvider.IsInitialized) - { - // Let's update the access token by refreshing it when a refresh token is available. - // Following this procedure, the newly acquired access token may now include the necessary roles or claims. - - var authManager = serviceProvider.GetRequiredService(); - var refresh_token = await storageService.GetItem("refresh_token"); - - if (refresh_token is not null) - { - // In the AuthenticationStateProvider, the access_token is refreshed using the refresh_token (if available). - await authManager.RefreshToken(); - - request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await tokenProvider.GetAccessTokenAsync()); - - return await base.SendAsync(request, cancellationToken); - } - else - { - await authManager.SignOut(); - } - - throw; - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/ExceptionDelegatingHandler.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/ExceptionDelegatingHandler.cs deleted file mode 100644 index b153bbcb..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/ExceptionDelegatingHandler.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Net; -using System.Text.Json; - -namespace CrystallineSociety.Client.Core.Services.HttpMessageHandlers; - -public class ExceptionDelegatingHandler(IStringLocalizer localizer, JsonSerializerOptions jsonSerializerOptions, HttpClientHandler httpClientHandler) - : DelegatingHandler(httpClientHandler) -{ - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - bool serverCommunicationSuccess = false; - - try - { - var response = await base.SendAsync(request, cancellationToken); - - serverCommunicationSuccess = true; - - if (response.IsSuccessStatusCode is false && response.Content.Headers.ContentType?.MediaType?.Contains("application/json", StringComparison.InvariantCultureIgnoreCase) is true) - { - if (response.Headers.TryGetValues("Request-ID", out IEnumerable? values) && values is not null && values.Any()) - { - RestErrorInfo restError = (await response!.Content.ReadFromJsonAsync(jsonSerializerOptions.GetTypeInfo(), cancellationToken))!; - - Type exceptionType = typeof(RestErrorInfo).Assembly.GetType(restError.ExceptionType!) ?? typeof(UnknownException); - - var args = new List { typeof(KnownException).IsAssignableFrom(exceptionType) ? new LocalizedString(restError.Key!, restError.Message!) : restError.Message! }; - - if (exceptionType == typeof(ResourceValidationException)) - { - args.Add(restError.Payload); - } - - Exception exp = (Exception)Activator.CreateInstance(exceptionType, args.ToArray())!; - - throw exp; - } - } - - if (response.StatusCode is HttpStatusCode.Unauthorized) - { - throw new UnauthorizedException(localizer[nameof(AppStrings.YouNeedToSignIn)]); - } - if (response.StatusCode is HttpStatusCode.Forbidden) - { - throw new ForbiddenException(localizer[nameof(AppStrings.ForbiddenException)]); - } - - response.EnsureSuccessStatusCode(); - - return response; - } - catch (Exception exp) when ((exp is HttpRequestException && serverCommunicationSuccess is false) - || exp is TaskCanceledException tcExp && tcExp.InnerException is TimeoutException - || exp is HttpRequestException { StatusCode: HttpStatusCode.BadGateway or HttpStatusCode.GatewayTimeout or HttpStatusCode.ServiceUnavailable }) - { - throw new ServerConnectionException(localizer[nameof(AppStrings.ServerConnectionException)], exp); - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/RequestHeadersDelegationHandler.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/RequestHeadersDelegationHandler.cs deleted file mode 100644 index e1031cf8..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/RequestHeadersDelegationHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Net.Http.Headers; -using Microsoft.AspNetCore.Components.WebAssembly.Http; - -namespace CrystallineSociety.Client.Core.Services.HttpMessageHandlers; - -public class RequestHeadersDelegationHandler(AuthDelegatingHandler handler) - : DelegatingHandler(handler) -{ - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - request.SetBrowserRequestCredentials(BrowserRequestCredentials.Omit); - request.SetBrowserResponseStreamingEnabled(true); - - if (AppRenderMode.MultilingualEnabled) - { - request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(CultureInfo.CurrentCulture.Name)); - } - - return await base.SendAsync(request, cancellationToken); - } -} - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/RetryDelegatingHandler.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/RetryDelegatingHandler.cs deleted file mode 100644 index cc32a5a7..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/HttpMessageHandlers/RetryDelegatingHandler.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace CrystallineSociety.Client.Core.Services.HttpMessageHandlers; - -public class RetryDelegatingHandler(ExceptionDelegatingHandler handler) - : DelegatingHandler(handler) -{ - - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - var delays = GetDelays(scaleFirstTry: TimeSpan.FromSeconds(3), maxRetries: 3).ToArray(); - - Exception? lastExp = null; - - foreach (var delay in delays) - { - try - { - return await base.SendAsync(request, cancellationToken); - } - catch (Exception exp) when (exp is not KnownException || exp is ServerConnectionException) - { - lastExp = exp; - await Task.Delay(delay, cancellationToken); - } - } - - throw lastExp!; - } - - private static IEnumerable GetDelays(TimeSpan scaleFirstTry, int maxRetries) - { - TimeSpan maxValue = TimeSpan.MaxValue; - var maxTimeSpanDouble = maxValue.Ticks - 1_000.0; - var i = 0; - var targetTicksFirstDelay = scaleFirstTry.Ticks; - var num = 0.0; - for (; i < maxRetries; i++) - { - var num2 = i + Random.Shared.NextDouble(); - var next = Math.Pow(2.0, num2) * Math.Tanh(Math.Sqrt(4.0 * num2)); - var num3 = next - num; - yield return TimeSpan.FromTicks((long)Math.Min(num3 * 0.7_142_857_142_857_143 * targetTicksFirstDelay, maxTimeSpanDouble)); - num = next; - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/MessageBoxService.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/MessageBoxService.cs deleted file mode 100644 index e0118d88..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/MessageBoxService.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace CrystallineSociety.Client.Core.Services; -public partial class MessageBoxService -{ - [AutoInject] private IPubSubService pubSubService = default!; - - public async Task Show(string message, string title = "") - { - TaskCompletionSource tcs = new(); - pubSubService.Publish(PubSubMessages.SHOW_MESSAGE, (message, title, tcs)); - await tcs.Task; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/PrerenderStateService.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/PrerenderStateService.cs deleted file mode 100644 index 21a1ffec..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/PrerenderStateService.cs +++ /dev/null @@ -1,70 +0,0 @@ - -using System.Runtime.CompilerServices; - -namespace CrystallineSociety.Client.Core.Services; - -/// -/// For more information docs. -/// -public class PrerenderStateService : IPrerenderStateService, IAsyncDisposable -{ - private PersistingComponentStateSubscription? subscription; - private readonly PersistentComponentState? persistentComponentState; - private readonly ConcurrentDictionary values = new(); - - public PrerenderStateService(PersistentComponentState? persistentComponentState = null) - { - subscription = persistentComponentState?.RegisterOnPersisting(PersistAsJson, AppRenderMode.Current); - this.persistentComponentState = persistentComponentState; - } - - public async Task GetValue(Func> factory, - [CallerLineNumber] int lineNumber = 0, - [CallerMemberName] string memberName = "", - [CallerFilePath] string filePath = "") - { - if (AppRenderMode.PrerenderEnabled is false || AppRenderMode.IsBlazorHybrid) - return await factory(); - - string key = $"{filePath.Split('\\').LastOrDefault()} {memberName} {lineNumber}"; - - return await GetValue(key, factory); - } - - public async Task GetValue(string key, Func> factory) - { - if (AppRenderMode.PrerenderEnabled is false || AppRenderMode.IsBlazorHybrid) - return await factory(); - - if (persistentComponentState!.TryTakeFromJson(key, out T? value)) return value; - - var result = await factory(); - Persist(key, result); - return result; - } - - void Persist(string key, T value) - { - if (AppRenderMode.PrerenderEnabled is false || AppRenderMode.IsBlazorHybrid) - return; - - values.TryRemove(key, out object? _); - values.TryAdd(key, value); - } - - async Task PersistAsJson() - { - foreach (var item in values) - { - persistentComponentState!.PersistAsJson(item.Key, item.Value); - } - } - - public async ValueTask DisposeAsync() - { - if (AppRenderMode.PrerenderEnabled is false || AppRenderMode.IsBlazorHybrid) - return; - - subscription?.Dispose(); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/PubSubMessages.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/PubSubMessages.cs deleted file mode 100644 index 9bd39ab2..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/PubSubMessages.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace CrystallineSociety.Client.Core.Services; - -public static class PubSubMessages -{ - public const string PROFILE_UPDATED = nameof(PROFILE_UPDATED); - public const string SHOW_MESSAGE = nameof(SHOW_MESSAGE); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/PubSubService.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/PubSubService.cs deleted file mode 100644 index 9f898ba9..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Services/PubSubService.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace CrystallineSociety.Client.Core.Services; - -/// -/// For more information docs. -/// -public partial class PubSubService : IPubSubService -{ - [AutoInject] private IServiceProvider serviceProvider = default!; - - private readonly ConcurrentDictionary>> handlers = new(); - - public void Publish(string message, object? payload) - { - if (handlers.TryGetValue(message, out var messageHandlers)) - { - foreach (var handler in messageHandlers) - { - handler(payload) - .ContinueWith(t => serviceProvider.GetRequiredService().Handle(t.Exception!), TaskContinuationOptions.OnlyOnFaulted); - } - } - } - - public Action Subscribe(string message, Func handler) - { - var messageHandlers = handlers.ContainsKey(message) - ? handlers[message] - : handlers[message] = []; - - messageHandlers.Add(handler); - - return () => messageHandlers.Remove(handler); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_bit-css-variables.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_bit-css-variables.scss deleted file mode 100644 index b715b9c5..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_bit-css-variables.scss +++ /dev/null @@ -1,123 +0,0 @@ -/*-------- Colors --------*/ -$bit-color-primary-main: var(--bit-clr-primary-main); -$bit-color-primary-dark: var(--bit-clr-primary-dark); -$bit-color-primary-light: var(--bit-clr-primary-light); -$bit-color-primary-text: var(--bit-clr-primary-text); - -$bit-color-secondary-main: var(--bit-clr-secondary-main); -$bit-color-secondary-dark: var(--bit-clr-secondary-dark); -$bit-color-secondary-light: var(--bit-clr-secondary-light); -$bit-color-secondary-text: var(--bit-clr-secondary-text); - -//foreground -$bit-color-foreground-primary: var(--bit-clr-fg-primary); -$bit-color-foreground-secondary: var(--bit-clr-fg-secondary); -$bit-color-foreground-disabled: var(--bit-clr-fg-disabled); - -//backgrounds -$bit-color-background-primary: var(--bit-clr-bg-primary); -$bit-color-background-secondary: var(--bit-clr-bg-secondary); -$bit-color-background-disabled: var(--bit-clr-bg-disabled); -$bit-color-background-overlay: var(--bit-clr-bg-overlay); - -//borders -$bit-color-border-primary: var(--bit-clr-brd-primary); -$bit-color-border-secondary: var(--bit-clr-brd-secondary); -$bit-color-border-disabled: var(--bit-clr-brd-disabled); - -//actions -$bit-color-action-hover-primary: var(--bit-clr-act-hover-pri); -$bit-color-action-active-primary: var(--bit-clr-act-active-pri); -$bit-color-action-hover-primary-dark: var(--bit-clr-act-hover-pri-dark); -$bit-color-action-active-primary-dark: var(--bit-clr-act-active-pri-dark); -$bit-color-action-hover-primary-light: var(--bit-clr-act-hover-pri-light); -$bit-color-action-active-primary-light: var(--bit-clr-act-active-pri-light); -$bit-color-action-hover-secondary: var(--bit-clr-act-hover-sec); -$bit-color-action-active-secondary: var(--bit-clr-act-active-sec); -$bit-color-action-hover-secondary-dark: var(--bit-clr-act-hover-sec-dark); -$bit-color-action-active-secondary-dark: var(--bit-clr-act-active-sec-dark); -$bit-color-action-hover-secondary-light: var(--bit-clr-act-hover-sec-light); -$bit-color-action-active-secondary-light: var(--bit-clr-act-active-sec-light); -//actions-foreground -$bit-color-action-hover-foreground-primary: var(--bit-clr-act-hover-fg-pri); -$bit-color-action-active-foreground-primary: var(--bit-clr-act-active-fg-pri); -$bit-color-action-hover-foreground-secondary: var(--bit-clr-act-hover-fg-sec); -$bit-color-action-active-foreground-secondary: var(--bit-clr-act-hover-fg-sec); -//actions-backgrounds -$bit-color-action-hover-background-primary: var(--bit-clr-act-hover-bg-pri); -$bit-color-action-active-background-primary: var(--bit-clr-act-active-bg-pri); -$bit-color-action-hover-background-secondary: var(--bit-clr-act-hover-bg-sec); -$bit-color-action-active-background-secondary: var(--bit-clr-act-active-bg-sec); -//actions-borders -$bit-color-action-hover-border-primary: var(--bit-clr-act-hover-brd-pri); -$bit-color-action-active-border-primary: var(--bit-clr-act-active-brd-pri); -$bit-color-action-hover-border-secondary: var(--bit-clr-act-hover-brd-sec); -$bit-color-action-active-border-secondary: var(--bit-clr-act-active-brd-sec); - -//states -$bit-color-state-info: var(--bit-clr-sta-info); -$bit-color-state-info-bg: var(--bit-clr-sta-info-bg); -$bit-color-state-success: var(--bit-clr-sta-success); -$bit-color-state-success-bg: var(--bit-clr-sta-success-bg); -$bit-color-state-warning: var(--bit-clr-sta-warning); -$bit-color-state-warning-bg: var(--bit-clr-sta-warning-bg); -$bit-color-state-severe-warning: var(--bit-clr-sta-severe-warning); -$bit-color-state-severe-warning-bg: var(--bit-clr-sta-severe-warning-bg); -$bit-color-state-error: var(--bit-clr-sta-error); -$bit-color-state-error-bg: var(--bit-clr-sta-error-bg); -$bit-color-state-required: var(--bit-clr-sta-req); - -//neutrals -$bit-color-neutrals-white: var(--bit-clr-ntr-white); -$bit-color-neutrals-black: var(--bit-clr-ntr-black); -$bit-color-neutrals-gray10: var(--bit-clr-ntr-gray10); -$bit-color-neutrals-gray20: var(--bit-clr-ntr-gray20); -$bit-color-neutrals-gray30: var(--bit-clr-ntr-gray30); -$bit-color-neutrals-gray40: var(--bit-clr-ntr-gray40); -$bit-color-neutrals-gray50: var(--bit-clr-ntr-gray50); -$bit-color-neutrals-gray60: var(--bit-clr-ntr-gray60); -$bit-color-neutrals-gray70: var(--bit-clr-ntr-gray70); -$bit-color-neutrals-gray80: var(--bit-clr-ntr-gray80); -$bit-color-neutrals-gray90: var(--bit-clr-ntr-gray90); -$bit-color-neutrals-gray100: var(--bit-clr-ntr-gray100); -$bit-color-neutrals-gray110: var(--bit-clr-ntr-gray110); -$bit-color-neutrals-gray120: var(--bit-clr-ntr-gray120); -$bit-color-neutrals-gray130: var(--bit-clr-ntr-gray130); -$bit-color-neutrals-gray140: var(--bit-clr-ntr-gray140); -$bit-color-neutrals-gray150: var(--bit-clr-ntr-gray150); -$bit-color-neutrals-gray160: var(--bit-clr-ntr-gray160); -$bit-color-neutrals-gray170: var(--bit-clr-ntr-gray170); -$bit-color-neutrals-gray180: var(--bit-clr-ntr-gray180); -$bit-color-neutrals-gray190: var(--bit-clr-ntr-gray190); -$bit-color-neutrals-gray200: var(--bit-clr-ntr-gray200); -$bit-color-neutrals-gray210: var(--bit-clr-ntr-gray210); -$bit-color-neutrals-gray220: var(--bit-clr-ntr-gray220); - -//shadows-callout -$bit-box-shadow-callout: var(--bit-shd-cal); - -//shadows -$bit-box-shadow-1: var(--bit-shd-1); -$bit-box-shadow-2: var(--bit-shd-2); -$bit-box-shadow-3: var(--bit-shd-3); -$bit-box-shadow-4: var(--bit-shd-4); -$bit-box-shadow-5: var(--bit-shd-5); -$bit-box-shadow-6: var(--bit-shd-6); -$bit-box-shadow-7: var(--bit-shd-7); -$bit-box-shadow-8: var(--bit-shd-8); -$bit-box-shadow-9: var(--bit-shd-9); -$bit-box-shadow-10: var(--bit-shd-10); -$bit-box-shadow-11: var(--bit-shd-11); -$bit-box-shadow-12: var(--bit-shd-12); -$bit-box-shadow-13: var(--bit-shd-13); -$bit-box-shadow-14: var(--bit-shd-14); -$bit-box-shadow-15: var(--bit-shd-15); -$bit-box-shadow-16: var(--bit-shd-16); -$bit-box-shadow-17: var(--bit-shd-17); -$bit-box-shadow-18: var(--bit-shd-18); -$bit-box-shadow-19: var(--bit-shd-19); -$bit-box-shadow-20: var(--bit-shd-20); -$bit-box-shadow-21: var(--bit-shd-21); -$bit-box-shadow-22: var(--bit-shd-22); -$bit-box-shadow-23: var(--bit-shd-23); -$bit-box-shadow-24: var(--bit-shd-24); diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_colors.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_colors.scss deleted file mode 100644 index 52996f01..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_colors.scss +++ /dev/null @@ -1,18 +0,0 @@ -$PrimaryColor: #0078D4; -$SecondaryColor: #0D2960; -$S1Color: #183977; -$S2Color: #204383; -$S3Color: #7186B4; -$S4Color: #C1CADF; - -$Black: #201F1E; -$Black3: #323130; -$White: #FFFFFF; -$Red: #A4262C; - -$Gray1: #8A8886; -$Gray2: #A19F9D; -$Gray3: #DDDDDD; -$Gray4: #EDEBE9; -$Gray5: #F2F2F2; -$Gray6: #FCFCFC; \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_functions.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_functions.scss deleted file mode 100644 index 0165dde1..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_functions.scss +++ /dev/null @@ -1,21 +0,0 @@ -$html-font-size: 16px; - -/// stripUnit(10px) -> 10 -/// stripUnit(2em) -> 2 -/// stripUnit(3) -> 3 -@function stripUnit($value) { - @if type-of($value) == 'number' and not unitless($value) { - @return $value / ($value * 0 + 1); - } - @return $value; -} - -/// Convert px to rem. -@function rem($pxValue) { - @return #{stripUnit($pxValue) / stripUnit($html-font-size)}rem; -} - -/// Convert px to em. -@function em($size, $base-font-size: 16px) { - @return stripUnit($size) / stripUnit($base-font-size) * 1em; -} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_media-queries.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_media-queries.scss deleted file mode 100644 index 51c4e9b9..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_media-queries.scss +++ /dev/null @@ -1,78 +0,0 @@ -@import '_functions.scss'; - -/// https://github.com/Necromancerx/media-queries-scss-mixins - -// media aliases and breakpoints -$screen-xl-min: em(1441px); -$screen-xl-max: em(5000px); - -$screen-lg-min: em(835px); -$screen-lg-max: em(1440px); - -$screen-md-min: em(361px); -$screen-md-max: em(834px); - -$screen-sm-max: em(360px); - -// media devices -@mixin sm { - @media screen and (max-width: #{$screen-sm-max}) { - @content; - } -} - -@mixin md { - @media screen and (min-width: #{$screen-md-min}) and (max-width: #{$screen-md-max}) { - @content; - } -} - -@mixin lg { - @media screen and (min-width: #{$screen-lg-min}) and (max-width: #{$screen-lg-max}) { - @content; - } -} - -@mixin xl { - @media screen and (min-width: #{$screen-xl-min}) and (max-width: #{$screen-xl-max}) { - @content; - } -} - -// media lt queries -@mixin lt-md { - @media screen and (max-width: #{$screen-sm-max}) { - @content; - } -} - -@mixin lt-lg { - @media screen and (max-width: #{$screen-md-max}) { - @content; - } -} - -@mixin lt-xl { - @media screen and (max-width: #{$screen-lg-max}) { - @content; - } -} - -// media gt queries -@mixin gt-sm { - @media screen and (min-width: #{$screen-md-min}) { - @content; - } -} - -@mixin gt-md { - @media screen and (min-width: #{$screen-lg-min}) { - @content; - } -} - -@mixin gt-lg { - @media screen and (min-width: #{$screen-xl-min}) { - @content; - } -} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_mixins.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_mixins.scss deleted file mode 100644 index 5f282702..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_mixins.scss +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_vars.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_vars.scss deleted file mode 100644 index e7c04cc6..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/abstracts/_vars.scss +++ /dev/null @@ -1 +0,0 @@ -$navMenuWidth: 240px; diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/app.scss b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/app.scss deleted file mode 100644 index c5448427..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/Styles/app.scss +++ /dev/null @@ -1,62 +0,0 @@ -:root { - --bit-status-bar-height: 0px; -} - -* { - box-sizing: border-box; - font-family: "Segoe UI"; - -webkit-text-size-adjust: none; - -webkit-font-smoothing: antialiased; - -webkit-tap-highlight-color: transparent; -} - -html, body, #app-container { - margin: 0; - padding: 0; - width: 100%; - height: 100%; - scroll-behavior: smooth; -} - -h1, h2, h3, h4, h5 { - margin: 0; -} - -p { - margin: 0; -} - -.bit-blazor-hybrid { - *:not(input) { - -webkit-user-select: none; - user-select: none; - } - - &.bit-windows * { - -webkit-user-drag: none; - } -} - -::-webkit-scrollbar { - height: 4px; - width: 4px; -} - -::-webkit-scrollbar-track { - background: #f5f5f5; - margin: 3px 0; -} - -::-webkit-scrollbar-thumb { - background: #dbdbdb; - border-radius: 4px; - cursor: context-menu; -} - -::-webkit-scrollbar-thumb:hover { - background: #C1C1C1; -} - -::-webkit-scrollbar-thumb:active { - background: #949494; -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/_Imports.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/_Imports.razor deleted file mode 100644 index 843308bb..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/_Imports.razor +++ /dev/null @@ -1,24 +0,0 @@ -@using System.Reflection -@using System.Runtime.Loader -@using System.Globalization -@using Microsoft.JSInterop -@using Microsoft.Extensions.Logging -@using Microsoft.AspNetCore.Components -@using Microsoft.AspNetCore.Authorization -@using Microsoft.Extensions.Configuration -@using Microsoft.AspNetCore.Components.Web -@using Microsoft.AspNetCore.Components.Forms -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Authorization -@using Microsoft.AspNetCore.Components.Web.Virtualization -@using Bit.Butil -@using Bit.BlazorUI -@using CrystallineSociety -@using CrystallineSociety.Shared.Enums -@using CrystallineSociety.Client.Core -@using CrystallineSociety.Client.Core.Components.Layout -@using CrystallineSociety.Client.Core.Components.Pages -@using CrystallineSociety.Client.Core.Services.Contracts -@using CrystallineSociety.Client.Core.Services -@using CrystallineSociety.Client.Core.Components -@using CrystallineSociety.Client.Core.Controllers \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/appsettings.Development.json b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/appsettings.Development.json deleted file mode 100644 index d27da63c..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information", - "Microsoft.EntityFrameworkCore.Database.Command": "Information" - } - } -} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/appsettings.json b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/appsettings.json deleted file mode 100644 index 75ab306e..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/appsettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Microsoft": "Warning" - } - }, - "ApiServerAddress": "http://localhost:5030/" // You can also use relative urls such as / for Blazor Server and WebAssembly -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/compilerconfig.json b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/compilerconfig.json deleted file mode 100644 index 4c497175..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/compilerconfig.json +++ /dev/null @@ -1,122 +0,0 @@ -[ - { - "outputFile": "wwwroot/styles/app.css", - "inputFile": "Styles/app.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Layout/AppErrorBoundary.razor.css", - "inputFile": "Components/Layout/AppErrorBoundary.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Layout/ConfirmMessageBox.razor.css", - "inputFile": "Components/Layout/ConfirmMessageBox.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Layout/Footer.razor.css", - "inputFile": "Components/Layout/Footer.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Layout/Header.razor.css", - "inputFile": "Components/Layout/Header.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Layout/MainLayout.razor.css", - "inputFile": "Components/Layout/MainLayout.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Layout/MessageBox.razor.css", - "inputFile": "Components/Layout/MessageBox.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Layout/NavMenu.razor.css", - "inputFile": "Components/Layout/NavMenu.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Layout/SignOutConfirmModal.razor.css", - "inputFile": "Components/Layout/SignOutConfirmModal.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/HomePage.razor.css", - "inputFile": "Components/Pages/HomePage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/NotAuthorizedPage.razor.css", - "inputFile": "Components/Pages/NotAuthorizedPage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/NotFoundPage.razor.css", - "inputFile": "Components/Pages/NotFoundPage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/TermsPage.razor.css", - "inputFile": "Components/Pages/TermsPage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/Identity/DeleteAccountConfirmModal.razor.css", - "inputFile": "Components/Pages/Identity/DeleteAccountConfirmModal.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/Identity/EditProfilePage.razor.css", - "inputFile": "Components/Pages/Identity/EditProfilePage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/Identity/EmailConfirmationPage.razor.css", - "inputFile": "Components/Pages/Identity/EmailConfirmationPage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/Identity/ForgotPasswordPage.razor.css", - "inputFile": "Components/Pages/Identity/ForgotPasswordPage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/Identity/ResetPasswordPage.razor.css", - "inputFile": "Components/Pages/Identity/ResetPasswordPage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/Identity/SignInPage.razor.css", - "inputFile": "Components/Pages/Identity/SignInPage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, - { - "outputFile": "Components/Pages/Identity/SignUpPage.razor.css", - "inputFile": "Components/Pages/Identity/SignUpPage.razor.scss", - "minify": { "enabled": false }, - "options": { "sourceMap": false } - }, -] \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/tsconfig.json b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/tsconfig.json deleted file mode 100644 index 1e38659c..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compileOnSave": true, - "compilerOptions": { - "strict": true, - "noImplicitAny": true, - "lib": [ "DOM", "ESNext" ], - "outFile": "wwwroot/scripts/app.js" - } -} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/backgrounds/empty-todo-list-bg.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/backgrounds/empty-todo-list-bg.svg deleted file mode 100644 index 37028dea..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/backgrounds/empty-todo-list-bg.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/bit-logo.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/bit-logo.svg deleted file mode 100644 index 731f817a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/bit-logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/bit-white-logo.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/bit-white-logo.svg deleted file mode 100644 index 7fd6d5fd..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/bit-white-logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/bronze.png b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/bronze.png deleted file mode 100644 index afd1df98..00000000 Binary files a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/bronze.png and /dev/null differ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/checkmark-icon.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/checkmark-icon.svg deleted file mode 100644 index c947578b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/checkmark-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/chevron-bottom-icon.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/chevron-bottom-icon.svg deleted file mode 100644 index acaac8a1..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/chevron-bottom-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/down-arrow.png b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/down-arrow.png deleted file mode 100644 index 9e1307f3..00000000 Binary files a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/down-arrow.png and /dev/null differ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/error-triangle.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/error-triangle.svg deleted file mode 100644 index ca7f27fc..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/error-triangle.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/github-icon.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/github-icon.svg deleted file mode 100644 index 017e500b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/github-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/gold-icon.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/gold-icon.svg deleted file mode 100644 index 4cb3987c..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/gold-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/gold.png b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/gold.png deleted file mode 100644 index bf0794f7..00000000 Binary files a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/gold.png and /dev/null differ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/linkedin-icon.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/linkedin-icon.svg deleted file mode 100644 index 46dbbae4..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/linkedin-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/right-arrow.png b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/right-arrow.png deleted file mode 100644 index 80173ddb..00000000 Binary files a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/right-arrow.png and /dev/null differ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/silver-icon.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/silver-icon.svg deleted file mode 100644 index 079979b4..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/silver-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/silver.png b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/silver.png deleted file mode 100644 index 838785e9..00000000 Binary files a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/silver.png and /dev/null differ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/twitter-icon.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/twitter-icon.svg deleted file mode 100644 index 27f2d611..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/twitter-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/youtube-icon.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/youtube-icon.svg deleted file mode 100644 index 7e4cbaa6..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/icons/youtube-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/menu-banner.webp b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/menu-banner.webp deleted file mode 100644 index 0df2ac5d..00000000 Binary files a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/menu-banner.webp and /dev/null differ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/sign-in-up-bg.webp b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/sign-in-up-bg.webp deleted file mode 100644 index ce8e620a..00000000 Binary files a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/sign-in-up-bg.webp and /dev/null differ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/stat-card-bg-hover.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/stat-card-bg-hover.svg deleted file mode 100644 index d2f96f2b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/stat-card-bg-hover.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/stat-card-bg.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/stat-card-bg.svg deleted file mode 100644 index bf570971..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/images/stat-card-bg.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/scripts/app.js b/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/scripts/app.js deleted file mode 100644 index 30e46247..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Core/wwwroot/scripts/app.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -var App = /** @class */ (function () { - function App() { - } - App.applyBodyElementClasses = function (cssClasses, cssVariables) { - cssClasses === null || cssClasses === void 0 ? void 0 : cssClasses.forEach(function (c) { return document.body.classList.add(c); }); - Object.keys(cssVariables).forEach(function (key) { return document.body.style.setProperty(key, cssVariables[key]); }); - }; - App.goBack = function () { - window.history.back(); - }; - App.removeParametersOfUrl = function (url) { - window.history.pushState(null, '', url); - }; - return App; -}()); -; -BitTheme.init({ - system: true, - onChange: function (newTheme, oldThem) { - if (newTheme === 'dark') { - document.body.classList.add('theme-dark'); - document.body.classList.remove('theme-light'); - document.querySelector("meta[name=theme-color]").setAttribute('content', '#0d1117'); - } - else { - document.body.classList.add('theme-light'); - document.body.classList.remove('theme-dark'); - document.querySelector("meta[name=theme-color]").setAttribute('content', '#ffffff'); - } - } -}); diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/App.xaml b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/App.xaml deleted file mode 100644 index eeb7883a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/App.xaml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/App.xaml.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/App.xaml.cs deleted file mode 100644 index c07f92d3..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/App.xaml.cs +++ /dev/null @@ -1,13 +0,0 @@ -[assembly: XamlCompilation(XamlCompilationOptions.Compile)] - -namespace CrystallineSociety.Client.Maui; - -public partial class App -{ - public App(MainPage mainPage) - { - InitializeComponent(); - - MainPage = new NavigationPage(mainPage); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/CrystallineSociety.Client.Maui.csproj b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/CrystallineSociety.Client.Maui.csproj deleted file mode 100644 index b21c8cd6..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/CrystallineSociety.Client.Maui.csproj +++ /dev/null @@ -1,117 +0,0 @@ - - - - net8.0-android;net8.0-ios;net8.0-maccatalyst - $(TargetFrameworks);net8.0-windows10.0.19041.0 - net8.0-android - - - Exe - true - true - false - - - CrystallineSociety - - - com.bitplatform.BP.Template - 2C30E62F-E50F-46A9-8F2D-B00913E30CAF - - - 1.0 - 1 - - - True - - $(NoWarn);ClassWithoutModifierAnalyzer - - - - true - apk - android-arm - false - true - - - - true - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - Platforms/MacCatalyst/Entitlements.Debug.plist - - - - Platforms/MacCatalyst/Entitlements.Release.plist - true - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Extensions/IServiceCollectionExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Extensions/IServiceCollectionExtensions.cs deleted file mode 100644 index 539ca902..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Extensions/IServiceCollectionExtensions.cs +++ /dev/null @@ -1,31 +0,0 @@ -using CrystallineSociety.Client.Maui; -using CrystallineSociety.Client.Maui.Services; - -namespace Microsoft.Extensions.DependencyInjection; - -public static class IServiceCollectionExtensions -{ - public static IServiceCollection AddClientMauiServices(this IServiceCollection services) - { - // Services registered in this class can be injected in Android, iOS, Windows, and macOS. - - services.TryAddTransient(); - services.TryAddTransient(); - services.TryAddSingleton(); - services.TryAddTransient(); - -#if ANDROID - services.AddClientAndroidServices(); -#elif iOS - services.AddClientiOSServices(); -#elif Mac - services.AddClientMacServices(); -#elif Windows - services.AddClientWindowsServices(); -#endif - - services.AddClientSharedServices(); - - return services; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/MainPage.xaml b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/MainPage.xaml deleted file mode 100644 index d3aceb39..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/MainPage.xaml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/MainPage.xaml.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/MainPage.xaml.cs deleted file mode 100644 index 8b14c155..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/MainPage.xaml.cs +++ /dev/null @@ -1,104 +0,0 @@ -namespace CrystallineSociety.Client.Maui; - -public partial class MainPage -{ - private readonly IExceptionHandler exceptionHandler; - private readonly IBitDeviceCoordinator deviceCoordinator; - - public MainPage(IExceptionHandler exceptionHandler, IBitDeviceCoordinator deviceCoordinator) - { - this.exceptionHandler = exceptionHandler; - this.deviceCoordinator = deviceCoordinator; - - InitializeComponent(); - - SetupBlazorWebView(); - SetupStatusBar(); - } - - private void SetupBlazorWebView() - { - BlazorWebViewHandler.BlazorWebViewMapper.AppendToMapping("CustomBlazorWebViewMapper", (handler, view) => - { -#if WINDOWS - if (AppInfo.Current.RequestedTheme == AppTheme.Dark) - { - handler.PlatformView.DefaultBackgroundColor = Microsoft.UI.Colors.Black; - } -#elif IOS || MACCATALYST - handler.PlatformView.Configuration.AllowsInlineMediaPlayback = true; - - handler.PlatformView.ScrollView.Bounces = false; - - handler.PlatformView.BackgroundColor = UIKit.UIColor.Clear; - handler.PlatformView.Opaque = false; - if (BuildConfiguration.IsDebug()) - { - if ((DeviceInfo.Current.Platform == DevicePlatform.MacCatalyst && DeviceInfo.Current.Version >= new Version(13, 3)) - || (DeviceInfo.Current.Platform == DevicePlatform.iOS && DeviceInfo.Current.Version >= new Version(16, 4))) - { - handler.PlatformView.SetValueForKey(Foundation.NSObject.FromObject(true), new Foundation.NSString("inspectable")); - } - } -#elif ANDROID - handler.PlatformView.SetBackgroundColor(Android.Graphics.Color.Transparent); - - handler.PlatformView.OverScrollMode = Android.Views.OverScrollMode.Never; - - Android.Webkit.WebSettings settings = handler.PlatformView.Settings; - - settings.AllowFileAccessFromFileURLs = - settings.AllowUniversalAccessFromFileURLs = - settings.AllowContentAccess = - settings.AllowFileAccess = - settings.DatabaseEnabled = - settings.JavaScriptCanOpenWindowsAutomatically = - settings.DomStorageEnabled = true; - - if (BuildConfiguration.IsDebug()) - { - settings.MixedContentMode = Android.Webkit.MixedContentHandling.AlwaysAllow; - } - - settings.BlockNetworkLoads = - settings.BlockNetworkImage = false; -#endif - }); - - Loaded += async delegate - { - try - { -#if WINDOWS - if (BuildConfiguration.IsRelease()) - { - var webView2 = (Microsoft.UI.Xaml.Controls.WebView2)blazorWebView.Handler!.PlatformView!; - await webView2.EnsureCoreWebView2Async(); - var settings = webView2.CoreWebView2.Settings; - settings.IsZoomControlEnabled = false; - settings.AreBrowserAcceleratorKeysEnabled = false; - } -#endif - } - catch (Exception exp) - { - exceptionHandler.Handle(exp); - } - }; - } - - private void SetupStatusBar() - { - Microsoft.Maui.Handlers.WindowHandler.Mapper.AppendToMapping(nameof(IWindow), async (handler, view) => - { - try - { - await deviceCoordinator.ApplyTheme(AppInfo.Current.RequestedTheme is AppTheme.Dark); - } - catch (Exception exp) - { - exceptionHandler.Handle(exp); - } - }); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/MauiProgram.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/MauiProgram.cs deleted file mode 100644 index 9a2d8879..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/MauiProgram.cs +++ /dev/null @@ -1,83 +0,0 @@ -using CrystallineSociety.Client.Core; -using Microsoft.Maui.LifecycleEvents; - -namespace CrystallineSociety.Client.Maui; - -public static class MauiProgram -{ - public static MauiApp CreateMauiApp() - { - AppRenderMode.IsBlazorHybrid = true; - - var builder = MauiApp.CreateBuilder(); - - builder - .UseMauiApp() - .Configuration.AddClientConfigurations(); - - var services = builder.Services; - - services.AddMauiBlazorWebView(); - - if (BuildConfiguration.IsDebug()) - { - services.AddBlazorWebViewDeveloperTools(); - } - - Uri.TryCreate(builder.Configuration.GetApiServerAddress(), UriKind.Absolute, out var apiServerAddress); - - services.AddTransient(sp => - { - var handler = sp.GetRequiredKeyedService("DefaultMessageHandler"); - HttpClient httpClient = new(handler) - { - BaseAddress = apiServerAddress - }; - return httpClient; - }); - - services.AddClientMauiServices(); - - builder.ConfigureLifecycleEvents(lifecycle => - { -#if iOS || Mac - lifecycle.AddiOS(ios => - { - bool HandleAppLink(Foundation.NSUserActivity? userActivity) - { - if (userActivity is not null && userActivity.ActivityType == Foundation.NSUserActivityType.BrowsingWeb && userActivity.WebPageUrl is not null) - { - var url = $"{userActivity.WebPageUrl.Path}?{userActivity.WebPageUrl.Query}"; - - var _ = Routes.OpenUniversalLink(url); - - return true; - } - - return false; - } - - ios.FinishedLaunching((app, data) - => HandleAppLink(app.UserActivity)); - - ios.ContinueUserActivity((app, userActivity, handler) - => HandleAppLink(userActivity)); - - if (OperatingSystem.IsIOSVersionAtLeast(13) || OperatingSystem.IsMacCatalystVersionAtLeast(13)) - { - ios.SceneWillConnect((scene, sceneSession, sceneConnectionOptions) - => HandleAppLink(sceneConnectionOptions.UserActivities.ToArray() - .FirstOrDefault(a => a.ActivityType == Foundation.NSUserActivityType.BrowsingWeb))); - - ios.SceneContinueUserActivity((scene, userActivity) - => HandleAppLink(userActivity)); - } - }); -#endif - }); - - var mauiApp = builder.Build(); - - return mauiApp; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/AndroidManifest.xml b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/AndroidManifest.xml deleted file mode 100644 index 458e80e9..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/Extensions/IServiceCollectionExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/Extensions/IServiceCollectionExtensions.cs deleted file mode 100644 index c669f4f4..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/Extensions/IServiceCollectionExtensions.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Microsoft.Extensions.DependencyInjection; - -public static class IAndroidServiceCollectionExtensions -{ - public static IServiceCollection AddClientAndroidServices(this IServiceCollection services) - { - // Services registered in this class can be injected in Android. - - return services; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/MainActivity.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/MainActivity.cs deleted file mode 100644 index 90d5e24a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/MainActivity.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Android.App; -using Android.Content; -using Android.Content.PM; -using Android.OS; -using CrystallineSociety.Client.Core; -using Java.Net; - -namespace CrystallineSociety.Client.Maui.Platforms.Android; - -[IntentFilter([Intent.ActionView], - DataScheme = "https", - DataHost = "bp.bitplatform.dev", - DataPathPrefix = "/", - AutoVerify = true, - Categories = [Intent.ActionView, Intent.CategoryDefault, Intent.CategoryBrowsable])] - -[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleInstance, - ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] -public class MainActivity : MauiAppCompatActivity -{ - protected override void OnCreate(Bundle? savedInstanceState) - { - base.OnCreate(savedInstanceState); - - var url = Intent?.DataString; - if (string.IsNullOrWhiteSpace(url) is false) - { - var _ = Routes.OpenUniversalLink(new URL(url).File ?? "/"); - } - } - - protected override void OnNewIntent(Intent? intent) - { - base.OnNewIntent(intent); - - var action = intent!.Action; - var url = intent.DataString; - if (action is Intent.ActionView && string.IsNullOrWhiteSpace(url) is false) - { - var _ = Routes.OpenUniversalLink(new URL(url).File ?? "/"); - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/MainApplication.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/MainApplication.cs deleted file mode 100644 index 38dbdf1a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/MainApplication.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Android.App; -using Android.Runtime; - -[assembly: UsesPermission(Android.Manifest.Permission.Internet)] -[assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)] - -namespace CrystallineSociety.Client.Maui.Platforms.Android; - -[Application( -#if DEBUG - UsesCleartextTraffic = true, -#endif - AllowBackup = true, - SupportsRtl = true -)] -public class MainApplication : MauiApplication -{ - public MainApplication(IntPtr handle, JniHandleOwnership ownership) - : base(handle, ownership) - { - } - - protected override MauiApp CreateMauiApp() => MauiProgram - .CreateMauiApp(); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/Resources/values/colors.xml b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/Resources/values/colors.xml deleted file mode 100644 index ac846130..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Android/Resources/values/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - #0D2960 - #0D2960 - #0D2960 - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/AppDelegate.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/AppDelegate.cs deleted file mode 100644 index ff6cd94a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/AppDelegate.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Foundation; - -namespace CrystallineSociety.Client.Maui.Platforms.MacCatalyst; - -[Register(nameof(AppDelegate))] -public class AppDelegate : MauiUIApplicationDelegate -{ - protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Entitlements.Debug.plist b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Entitlements.Debug.plist deleted file mode 100644 index 674d08a5..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Entitlements.Debug.plist +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - com.apple.security.get-task-allow - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Entitlements.Release.plist b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Entitlements.Release.plist deleted file mode 100644 index 9117d79d..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Entitlements.Release.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Extensions/IServiceCollectionExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Extensions/IServiceCollectionExtensions.cs deleted file mode 100644 index 0cc5d4fd..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Extensions/IServiceCollectionExtensions.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Microsoft.Extensions.DependencyInjection; - -public static class IMacServiceCollectionExtensions -{ - public static IServiceCollection AddClientMacServices(this IServiceCollection services) - { - // Services registered in this class can be injected in macOS. - - return services; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Info.plist b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Info.plist deleted file mode 100644 index 57bad79b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - UIDeviceFamily - - - 1 - - 2 - - 6 - - UIRequiredDeviceCapabilities - - arm64 - - NSCameraUsageDescription - This app uses camera for uploading profile photo using FileUpload component - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - XSAppIconAssets - Assets.xcassets/appicon.appiconset - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Program.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Program.cs deleted file mode 100644 index 602303fe..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/MacCatalyst/Program.cs +++ /dev/null @@ -1,11 +0,0 @@ -using UIKit; - -namespace CrystallineSociety.Client.Maui.Platforms.MacCatalyst; - -public class Program -{ - static void Main(string[] args) - { - UIApplication.Main(args, null, typeof(AppDelegate)); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Tizen/Main.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Tizen/Main.cs deleted file mode 100644 index da5991fd..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Tizen/Main.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace CrystallineSociety.Client.Maui; - -class Program : MauiApplication -{ - protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); - - static void Main(string[] args) - { - var app = new Program(); - app.Run(args); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Tizen/tizen-manifest.xml b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Tizen/tizen-manifest.xml deleted file mode 100644 index f103d6a2..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Tizen/tizen-manifest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - appicon.xhigh.png - - - - - http://tizen.org/privilege/internet - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/App.xaml b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/App.xaml deleted file mode 100644 index 522d57f9..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/App.xaml +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/App.xaml.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/App.xaml.cs deleted file mode 100644 index 5b776461..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/App.xaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace CrystallineSociety.Client.Maui.Platforms.Windows; - -public partial class App -{ - public App() - { - InitializeComponent(); - } - - protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/Extensions/IServiceCollectionExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/Extensions/IServiceCollectionExtensions.cs deleted file mode 100644 index 27419a22..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/Extensions/IServiceCollectionExtensions.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Microsoft.Extensions.DependencyInjection; - -public static class IWindowsServiceCollectionExtensions -{ - public static IServiceCollection AddClientWindowsServices(this IServiceCollection services) - { - // Services registered in this class can be injected in Windows. - - return services; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/Package.appxmanifest b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/Package.appxmanifest deleted file mode 100644 index dd1ba9aa..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/Package.appxmanifest +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - $placeholder$ - User Name - $placeholder$.png - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/app.manifest b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/app.manifest deleted file mode 100644 index c8eb10b5..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/Windows/app.manifest +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - true/PM - PerMonitorV2, PerMonitor - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/AppDelegate.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/AppDelegate.cs deleted file mode 100644 index bb514f2a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/AppDelegate.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Foundation; - -namespace CrystallineSociety.Client.Maui.Platforms.iOS; - -[Register(nameof(AppDelegate))] -public class AppDelegate : MauiUIApplicationDelegate -{ - protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Entitlements.plist b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Entitlements.plist deleted file mode 100644 index f0ee3ac2..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Entitlements.plist +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.developer.associated-domains - - applinks:bp.bitplatform.dev - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Extensions/IServiceCollectionExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Extensions/IServiceCollectionExtensions.cs deleted file mode 100644 index 16886245..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Extensions/IServiceCollectionExtensions.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Microsoft.Extensions.DependencyInjection; - -public static class IiOSServiceCollectionExtensions -{ - public static IServiceCollection AddClientiOSServices(this IServiceCollection services) - { - // Services registered in this class can be injected in iOS. - - return services; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Info.plist b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Info.plist deleted file mode 100644 index 4b84a0f5..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - LSRequiresIPhoneOS - - UIDeviceFamily - - 1 - 2 - - UIViewControllerBasedStatusBarAppearance - - UIRequiredDeviceCapabilities - - arm64 - - NSCameraUsageDescription - This app uses camera for uploading profile photo using FileUpload component - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - XSAppIconAssets - Assets.xcassets/appicon.appiconset - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Program.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Program.cs deleted file mode 100644 index c714d84a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Platforms/iOS/Program.cs +++ /dev/null @@ -1,11 +0,0 @@ -using UIKit; - -namespace CrystallineSociety.Client.Maui.Platforms.iOS; - -public class Program -{ - static void Main(string[] args) - { - UIApplication.Main(args, null, typeof(AppDelegate)); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Properties/launchSettings.json b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Properties/launchSettings.json deleted file mode 100644 index edf8aadc..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Properties/launchSettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "profiles": { - "Windows Machine": { - "commandName": "MsixPackage", - "nativeDebugging": false - } - } -} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Resources/AppIcon/appicon.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Resources/AppIcon/appicon.svg deleted file mode 100644 index cef77f74..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Resources/AppIcon/appicon.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Resources/Raw/AboutAssets.txt b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Resources/Raw/AboutAssets.txt deleted file mode 100644 index 15d62448..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Resources/Raw/AboutAssets.txt +++ /dev/null @@ -1,15 +0,0 @@ -Any raw assets you want to be deployed with your application can be placed in -this directory (and child directories). Deployment of the asset to your application -is automatically handled by the following `MauiAsset` Build Action within your `.csproj`. - - - -These files will be deployed with you package and will be accessible using Essentials: - - async Task LoadMauiAsset() - { - using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt"); - using var reader = new StreamReader(stream); - - var contents = reader.ReadToEnd(); - } diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Resources/Splash/splash.svg b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Resources/Splash/splash.svg deleted file mode 100644 index 1b166f39..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Resources/Splash/splash.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Services/MauiDeviceCoordinator.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Services/MauiDeviceCoordinator.cs deleted file mode 100644 index b6949021..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Services/MauiDeviceCoordinator.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace CrystallineSociety.Client.Maui.Services; - -/// -/// More info at -/// -public class MauiDeviceCoordinator : IBitDeviceCoordinator -{ - public double GetStatusBarHeight() - { -#if ANDROID - var resourceId = MauiApplication.Current.Resources!.GetIdentifier("status_bar_height", "dimen", "android"); - var dimensionPixelSize = MauiApplication.Current.Resources.GetDimensionPixelSize(resourceId); - var density = (double)DeviceDisplay.Current.MainDisplayInfo.Density; - return dimensionPixelSize / density; -#elif IOS - var window = UIKit.UIApplication.SharedApplication.Windows.First().WindowScene; - return window!.StatusBarManager!.StatusBarFrame.Height; -#elif WINDOWS - return 30; -#elif MACCATALYST - return 25; -#else - return 0; -#endif - } - - public async Task ApplyTheme(bool isDark) - { - Application.Current!.UserAppTheme = isDark ? AppTheme.Dark : AppTheme.Light; -#if ANDROID - var window = Platform.CurrentActivity?.Window; - window!.DecorView!.SystemUiFlags = Android.Views.SystemUiFlags.LightStatusBar; - if (isDark) - { - window!.DecorView!.SystemUiFlags &= ~Android.Views.SystemUiFlags.LightStatusBar; - } - - window.SetStatusBarColor(isDark ? Android.Graphics.Color.ParseColor("#0D1117") : Android.Graphics.Color.White); -#elif IOS - var statusBarStyle = isDark ? UIKit.UIStatusBarStyle.LightContent : UIKit.UIStatusBarStyle.DarkContent; - await Device.InvokeOnMainThreadAsync(() => - { - UIKit.UIApplication.SharedApplication.SetStatusBarStyle(statusBarStyle, false); - Platform.GetCurrentUIViewController().SetNeedsStatusBarAppearanceUpdate(); - }); -#elif MACCATALYST - var window = UIKit.UIApplication.SharedApplication.Windows[0].WindowScene; - if (window != null) - { - window.Titlebar!.TitleVisibility = UIKit.UITitlebarTitleVisibility.Hidden; - } -#endif - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Services/MauiExceptionHandler.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Services/MauiExceptionHandler.cs deleted file mode 100644 index f1d43795..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Services/MauiExceptionHandler.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace CrystallineSociety.Client.Maui.Services; - -/// -/// You can easily install AppCenter, Firebase Crashlytics, and other exception tracking libraries in your Client.Maui project. -/// Then, you can use their APIs to monitor all exceptions across Android, iOS, Windows, and macOS. -/// -public partial class MauiExceptionHandler : ExceptionHandlerBase -{ - public override void Handle(Exception exception, IDictionary? parameters = null) - { - if (exception is TaskCanceledException) - { - return; - } - - base.Handle(exception, parameters); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Services/MauiStorageService.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Services/MauiStorageService.cs deleted file mode 100644 index 3fa5f007..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/Services/MauiStorageService.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace CrystallineSociety.Client.Maui.Services; - -public class MauiStorageService : IStorageService -{ - private readonly Dictionary tempStorage = []; - - public async ValueTask GetItem(string key) - { - tempStorage.TryGetValue(key, out string? value); - return Preferences.Get(key, value); - } - - public async ValueTask IsPersistent(string key) - { - return Preferences.ContainsKey(key); - } - - public async ValueTask RemoveItem(string key) - { - Preferences.Remove(key); - tempStorage.Remove(key); - } - - public async ValueTask SetItem(string key, string? value, bool persistent = true) - { - if (persistent) - { - Preferences.Set(key, value); - } - else - { - if (tempStorage.TryAdd(key, value) is false) - { - tempStorage[key] = value; - } - } - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/wwwroot/index.html b/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/wwwroot/index.html deleted file mode 100644 index 03fc94c4..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Maui/wwwroot/index.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Components/AppBswupProgressBar.razor b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Components/AppBswupProgressBar.razor deleted file mode 100644 index 26d0b641..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Components/AppBswupProgressBar.razor +++ /dev/null @@ -1,74 +0,0 @@ -@using Bit.Bswup -@using Bit.BlazorUI -@using CrystallineSociety.Client.Core.Components - -@inherits AppComponentBase - - - -
- -
- - - - - - @* *@ -
\ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/CrystallineSociety.Client.Web.csproj b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/CrystallineSociety.Client.Web.csproj deleted file mode 100644 index 81f548a7..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/CrystallineSociety.Client.Web.csproj +++ /dev/null @@ -1,46 +0,0 @@ - - - - net8.0 - - true - false - - true - true - - false - service-worker-assets.js - false - true - Default - true - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Extensions/IServiceCollectionExtensions.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Extensions/IServiceCollectionExtensions.cs deleted file mode 100644 index 86b28a29..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Extensions/IServiceCollectionExtensions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CrystallineSociety.Client.Web.Services; - -namespace Microsoft.Extensions.DependencyInjection; - -public static class IServiceCollectionExtensions -{ - public static IServiceCollection AddClientWebServices(this IServiceCollection services) - { - // Services being registered here can get injected in web (blazor web assembly & blazor server) - - services.AddTransient(); - services.AddTransient(); - - services.AddClientSharedServices(); - - return services; - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Program.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Program.cs deleted file mode 100644 index e2e88642..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; - -var builder = WebAssemblyHostBuilder.CreateDefault(args); - -builder.Configuration.AddClientConfigurations(); - -Uri.TryCreate(builder.Configuration.GetApiServerAddress(), UriKind.RelativeOrAbsolute, out var apiServerAddress); - -if (apiServerAddress!.IsAbsoluteUri is false) -{ - apiServerAddress = new Uri($"{builder.HostEnvironment.BaseAddress}{apiServerAddress}"); -} - -builder.Services.AddTransient(sp => new HttpClient(sp.GetRequiredKeyedService("DefaultMessageHandler")) { BaseAddress = apiServerAddress }); - -builder.Services.AddClientWebServices(); - -var host = builder.Build(); - -if (AppRenderMode.MultilingualEnabled) -{ - var culture = await host.Services.GetRequiredService().GetItem("Culture"); - CultureInfoManager.SetCurrentCulture(culture); -} - -await host.RunAsync(); diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Services/WebDeviceCoordinator.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Services/WebDeviceCoordinator.cs deleted file mode 100644 index e33115a0..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Services/WebDeviceCoordinator.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace CrystallineSociety.Client.Web.Services; - -public class WebDeviceCoordinator : IBitDeviceCoordinator -{ -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Services/WebExceptionHandler.cs b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Services/WebExceptionHandler.cs deleted file mode 100644 index 84705956..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/Services/WebExceptionHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace CrystallineSociety.Client.Web.Services; - -public partial class WebExceptionHandler : ExceptionHandlerBase -{ - public override void Handle(Exception exception, IDictionary? parameters = null) - { - if (exception is TaskCanceledException) - { - return; - } - - base.Handle(exception, parameters); - } -} diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/favicon.ico b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/favicon.ico deleted file mode 100644 index 0890544d..00000000 Binary files a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/favicon.ico and /dev/null differ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/images/icons/bit-icon-512.png b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/images/icons/bit-icon-512.png deleted file mode 100644 index b9809b15..00000000 Binary files a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/images/icons/bit-icon-512.png and /dev/null differ diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.css b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.css deleted file mode 100644 index 411dbb8a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.css +++ /dev/null @@ -1,4085 +0,0 @@ -/*! - * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -.container, -.container-fluid, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - width: 100%; - padding-right: calc(var(--bs-gutter-x) * 0.5); - padding-left: calc(var(--bs-gutter-x) * 0.5); - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; - } -} -@media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1320px; - } -} -:root { - --bs-breakpoint-xs: 0; - --bs-breakpoint-sm: 576px; - --bs-breakpoint-md: 768px; - --bs-breakpoint-lg: 992px; - --bs-breakpoint-xl: 1200px; - --bs-breakpoint-xxl: 1400px; -} - -.row { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - display: flex; - flex-wrap: wrap; - margin-top: calc(-1 * var(--bs-gutter-y)); - margin-right: calc(-0.5 * var(--bs-gutter-x)); - margin-left: calc(-0.5 * var(--bs-gutter-x)); -} -.row > * { - box-sizing: border-box; - flex-shrink: 0; - width: 100%; - max-width: 100%; - padding-right: calc(var(--bs-gutter-x) * 0.5); - padding-left: calc(var(--bs-gutter-x) * 0.5); - margin-top: var(--bs-gutter-y); -} - -.col { - flex: 1 0 0%; -} - -.row-cols-auto > * { - flex: 0 0 auto; - width: auto; -} - -.row-cols-1 > * { - flex: 0 0 auto; - width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 auto; - width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 auto; - width: 33.33333333%; -} - -.row-cols-4 > * { - flex: 0 0 auto; - width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 auto; - width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; -} - -.col-1 { - flex: 0 0 auto; - width: 8.33333333%; -} - -.col-2 { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-3 { - flex: 0 0 auto; - width: 25%; -} - -.col-4 { - flex: 0 0 auto; - width: 33.33333333%; -} - -.col-5 { - flex: 0 0 auto; - width: 41.66666667%; -} - -.col-6 { - flex: 0 0 auto; - width: 50%; -} - -.col-7 { - flex: 0 0 auto; - width: 58.33333333%; -} - -.col-8 { - flex: 0 0 auto; - width: 66.66666667%; -} - -.col-9 { - flex: 0 0 auto; - width: 75%; -} - -.col-10 { - flex: 0 0 auto; - width: 83.33333333%; -} - -.col-11 { - flex: 0 0 auto; - width: 91.66666667%; -} - -.col-12 { - flex: 0 0 auto; - width: 100%; -} - -.offset-1 { - margin-left: 8.33333333%; -} - -.offset-2 { - margin-left: 16.66666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.33333333%; -} - -.offset-5 { - margin-left: 41.66666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.33333333%; -} - -.offset-8 { - margin-left: 66.66666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.33333333%; -} - -.offset-11 { - margin-left: 91.66666667%; -} - -.g-0, -.gx-0 { - --bs-gutter-x: 0; -} - -.g-0, -.gy-0 { - --bs-gutter-y: 0; -} - -.g-1, -.gx-1 { - --bs-gutter-x: 0.25rem; -} - -.g-1, -.gy-1 { - --bs-gutter-y: 0.25rem; -} - -.g-2, -.gx-2 { - --bs-gutter-x: 0.5rem; -} - -.g-2, -.gy-2 { - --bs-gutter-y: 0.5rem; -} - -.g-3, -.gx-3 { - --bs-gutter-x: 1rem; -} - -.g-3, -.gy-3 { - --bs-gutter-y: 1rem; -} - -.g-4, -.gx-4 { - --bs-gutter-x: 1.5rem; -} - -.g-4, -.gy-4 { - --bs-gutter-y: 1.5rem; -} - -.g-5, -.gx-5 { - --bs-gutter-x: 3rem; -} - -.g-5, -.gy-5 { - --bs-gutter-y: 3rem; -} - -@media (min-width: 576px) { - .col-sm { - flex: 1 0 0%; - } - .row-cols-sm-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-sm-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-sm-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-sm-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-sm-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-sm-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-sm-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-auto { - flex: 0 0 auto; - width: auto; - } - .col-sm-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-sm-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-3 { - flex: 0 0 auto; - width: 25%; - } - .col-sm-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-sm-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-sm-6 { - flex: 0 0 auto; - width: 50%; - } - .col-sm-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-sm-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-sm-9 { - flex: 0 0 auto; - width: 75%; - } - .col-sm-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-sm-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-sm-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.33333333%; - } - .offset-sm-2 { - margin-left: 16.66666667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.33333333%; - } - .offset-sm-5 { - margin-left: 41.66666667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.33333333%; - } - .offset-sm-8 { - margin-left: 66.66666667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.33333333%; - } - .offset-sm-11 { - margin-left: 91.66666667%; - } - .g-sm-0, - .gx-sm-0 { - --bs-gutter-x: 0; - } - .g-sm-0, - .gy-sm-0 { - --bs-gutter-y: 0; - } - .g-sm-1, - .gx-sm-1 { - --bs-gutter-x: 0.25rem; - } - .g-sm-1, - .gy-sm-1 { - --bs-gutter-y: 0.25rem; - } - .g-sm-2, - .gx-sm-2 { - --bs-gutter-x: 0.5rem; - } - .g-sm-2, - .gy-sm-2 { - --bs-gutter-y: 0.5rem; - } - .g-sm-3, - .gx-sm-3 { - --bs-gutter-x: 1rem; - } - .g-sm-3, - .gy-sm-3 { - --bs-gutter-y: 1rem; - } - .g-sm-4, - .gx-sm-4 { - --bs-gutter-x: 1.5rem; - } - .g-sm-4, - .gy-sm-4 { - --bs-gutter-y: 1.5rem; - } - .g-sm-5, - .gx-sm-5 { - --bs-gutter-x: 3rem; - } - .g-sm-5, - .gy-sm-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 768px) { - .col-md { - flex: 1 0 0%; - } - .row-cols-md-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-md-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-md-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-md-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-md-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-md-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-md-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-auto { - flex: 0 0 auto; - width: auto; - } - .col-md-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-md-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-3 { - flex: 0 0 auto; - width: 25%; - } - .col-md-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-md-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-md-6 { - flex: 0 0 auto; - width: 50%; - } - .col-md-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-md-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-md-9 { - flex: 0 0 auto; - width: 75%; - } - .col-md-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-md-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-md-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.33333333%; - } - .offset-md-2 { - margin-left: 16.66666667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.33333333%; - } - .offset-md-5 { - margin-left: 41.66666667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.33333333%; - } - .offset-md-8 { - margin-left: 66.66666667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.33333333%; - } - .offset-md-11 { - margin-left: 91.66666667%; - } - .g-md-0, - .gx-md-0 { - --bs-gutter-x: 0; - } - .g-md-0, - .gy-md-0 { - --bs-gutter-y: 0; - } - .g-md-1, - .gx-md-1 { - --bs-gutter-x: 0.25rem; - } - .g-md-1, - .gy-md-1 { - --bs-gutter-y: 0.25rem; - } - .g-md-2, - .gx-md-2 { - --bs-gutter-x: 0.5rem; - } - .g-md-2, - .gy-md-2 { - --bs-gutter-y: 0.5rem; - } - .g-md-3, - .gx-md-3 { - --bs-gutter-x: 1rem; - } - .g-md-3, - .gy-md-3 { - --bs-gutter-y: 1rem; - } - .g-md-4, - .gx-md-4 { - --bs-gutter-x: 1.5rem; - } - .g-md-4, - .gy-md-4 { - --bs-gutter-y: 1.5rem; - } - .g-md-5, - .gx-md-5 { - --bs-gutter-x: 3rem; - } - .g-md-5, - .gy-md-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 992px) { - .col-lg { - flex: 1 0 0%; - } - .row-cols-lg-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-lg-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-lg-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-lg-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-lg-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-lg-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-lg-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-auto { - flex: 0 0 auto; - width: auto; - } - .col-lg-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-lg-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-3 { - flex: 0 0 auto; - width: 25%; - } - .col-lg-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-lg-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-lg-6 { - flex: 0 0 auto; - width: 50%; - } - .col-lg-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-lg-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-lg-9 { - flex: 0 0 auto; - width: 75%; - } - .col-lg-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-lg-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-lg-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.33333333%; - } - .offset-lg-2 { - margin-left: 16.66666667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.33333333%; - } - .offset-lg-5 { - margin-left: 41.66666667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.33333333%; - } - .offset-lg-8 { - margin-left: 66.66666667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.33333333%; - } - .offset-lg-11 { - margin-left: 91.66666667%; - } - .g-lg-0, - .gx-lg-0 { - --bs-gutter-x: 0; - } - .g-lg-0, - .gy-lg-0 { - --bs-gutter-y: 0; - } - .g-lg-1, - .gx-lg-1 { - --bs-gutter-x: 0.25rem; - } - .g-lg-1, - .gy-lg-1 { - --bs-gutter-y: 0.25rem; - } - .g-lg-2, - .gx-lg-2 { - --bs-gutter-x: 0.5rem; - } - .g-lg-2, - .gy-lg-2 { - --bs-gutter-y: 0.5rem; - } - .g-lg-3, - .gx-lg-3 { - --bs-gutter-x: 1rem; - } - .g-lg-3, - .gy-lg-3 { - --bs-gutter-y: 1rem; - } - .g-lg-4, - .gx-lg-4 { - --bs-gutter-x: 1.5rem; - } - .g-lg-4, - .gy-lg-4 { - --bs-gutter-y: 1.5rem; - } - .g-lg-5, - .gx-lg-5 { - --bs-gutter-x: 3rem; - } - .g-lg-5, - .gy-lg-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1200px) { - .col-xl { - flex: 1 0 0%; - } - .row-cols-xl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.33333333%; - } - .offset-xl-2 { - margin-left: 16.66666667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.33333333%; - } - .offset-xl-5 { - margin-left: 41.66666667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.33333333%; - } - .offset-xl-8 { - margin-left: 66.66666667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.33333333%; - } - .offset-xl-11 { - margin-left: 91.66666667%; - } - .g-xl-0, - .gx-xl-0 { - --bs-gutter-x: 0; - } - .g-xl-0, - .gy-xl-0 { - --bs-gutter-y: 0; - } - .g-xl-1, - .gx-xl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xl-1, - .gy-xl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xl-2, - .gx-xl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xl-2, - .gy-xl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xl-3, - .gx-xl-3 { - --bs-gutter-x: 1rem; - } - .g-xl-3, - .gy-xl-3 { - --bs-gutter-y: 1rem; - } - .g-xl-4, - .gx-xl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xl-4, - .gy-xl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xl-5, - .gx-xl-5 { - --bs-gutter-x: 3rem; - } - .g-xl-5, - .gy-xl-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1400px) { - .col-xxl { - flex: 1 0 0%; - } - .row-cols-xxl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xxl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xxl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xxl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xxl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xxl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xxl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xxl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xxl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xxl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xxl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xxl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xxl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xxl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xxl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xxl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xxl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xxl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xxl-0 { - margin-left: 0; - } - .offset-xxl-1 { - margin-left: 8.33333333%; - } - .offset-xxl-2 { - margin-left: 16.66666667%; - } - .offset-xxl-3 { - margin-left: 25%; - } - .offset-xxl-4 { - margin-left: 33.33333333%; - } - .offset-xxl-5 { - margin-left: 41.66666667%; - } - .offset-xxl-6 { - margin-left: 50%; - } - .offset-xxl-7 { - margin-left: 58.33333333%; - } - .offset-xxl-8 { - margin-left: 66.66666667%; - } - .offset-xxl-9 { - margin-left: 75%; - } - .offset-xxl-10 { - margin-left: 83.33333333%; - } - .offset-xxl-11 { - margin-left: 91.66666667%; - } - .g-xxl-0, - .gx-xxl-0 { - --bs-gutter-x: 0; - } - .g-xxl-0, - .gy-xxl-0 { - --bs-gutter-y: 0; - } - .g-xxl-1, - .gx-xxl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xxl-1, - .gy-xxl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xxl-2, - .gx-xxl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xxl-2, - .gy-xxl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xxl-3, - .gx-xxl-3 { - --bs-gutter-x: 1rem; - } - .g-xxl-3, - .gy-xxl-3 { - --bs-gutter-y: 1rem; - } - .g-xxl-4, - .gx-xxl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xxl-4, - .gy-xxl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xxl-5, - .gx-xxl-5 { - --bs-gutter-x: 3rem; - } - .g-xxl-5, - .gy-xxl-5 { - --bs-gutter-y: 3rem; - } -} -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-grid { - display: grid !important; -} - -.d-inline-grid { - display: inline-grid !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; -} - -.d-none { - display: none !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.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-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; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !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; -} - -.justify-content-evenly { - justify-content: space-evenly !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; -} - -.order-first { - order: -1 !important; -} - -.order-0 { - order: 0 !important; -} - -.order-1 { - order: 1 !important; -} - -.order-2 { - order: 2 !important; -} - -.order-3 { - order: 3 !important; -} - -.order-4 { - order: 4 !important; -} - -.order-5 { - order: 5 !important; -} - -.order-last { - order: 6 !important; -} - -.m-0 { - margin: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mx-0 { - margin-right: 0 !important; - margin-left: 0 !important; -} - -.mx-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; -} - -.mx-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; -} - -.mx-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; -} - -.mx-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; -} - -.mx-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; -} - -.mx-auto { - margin-right: auto !important; - margin-left: auto !important; -} - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; -} - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; -} - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; -} - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; -} - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; -} - -.mt-0 { - margin-top: 0 !important; -} - -.mt-1 { - margin-top: 0.25rem !important; -} - -.mt-2 { - margin-top: 0.5rem !important; -} - -.mt-3 { - margin-top: 1rem !important; -} - -.mt-4 { - margin-top: 1.5rem !important; -} - -.mt-5 { - margin-top: 3rem !important; -} - -.mt-auto { - margin-top: auto !important; -} - -.me-0 { - margin-right: 0 !important; -} - -.me-1 { - margin-right: 0.25rem !important; -} - -.me-2 { - margin-right: 0.5rem !important; -} - -.me-3 { - margin-right: 1rem !important; -} - -.me-4 { - margin-right: 1.5rem !important; -} - -.me-5 { - margin-right: 3rem !important; -} - -.me-auto { - margin-right: auto !important; -} - -.mb-0 { - margin-bottom: 0 !important; -} - -.mb-1 { - margin-bottom: 0.25rem !important; -} - -.mb-2 { - margin-bottom: 0.5rem !important; -} - -.mb-3 { - margin-bottom: 1rem !important; -} - -.mb-4 { - margin-bottom: 1.5rem !important; -} - -.mb-5 { - margin-bottom: 3rem !important; -} - -.mb-auto { - margin-bottom: auto !important; -} - -.ms-0 { - margin-left: 0 !important; -} - -.ms-1 { - margin-left: 0.25rem !important; -} - -.ms-2 { - margin-left: 0.5rem !important; -} - -.ms-3 { - margin-left: 1rem !important; -} - -.ms-4 { - margin-left: 1.5rem !important; -} - -.ms-5 { - margin-left: 3rem !important; -} - -.ms-auto { - margin-left: auto !important; -} - -.p-0 { - padding: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.px-0 { - padding-right: 0 !important; - padding-left: 0 !important; -} - -.px-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; -} - -.px-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; -} - -.px-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; -} - -.px-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; -} - -.px-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; -} - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; -} - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; -} - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; -} - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; -} - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; -} - -.pt-0 { - padding-top: 0 !important; -} - -.pt-1 { - padding-top: 0.25rem !important; -} - -.pt-2 { - padding-top: 0.5rem !important; -} - -.pt-3 { - padding-top: 1rem !important; -} - -.pt-4 { - padding-top: 1.5rem !important; -} - -.pt-5 { - padding-top: 3rem !important; -} - -.pe-0 { - padding-right: 0 !important; -} - -.pe-1 { - padding-right: 0.25rem !important; -} - -.pe-2 { - padding-right: 0.5rem !important; -} - -.pe-3 { - padding-right: 1rem !important; -} - -.pe-4 { - padding-right: 1.5rem !important; -} - -.pe-5 { - padding-right: 3rem !important; -} - -.pb-0 { - padding-bottom: 0 !important; -} - -.pb-1 { - padding-bottom: 0.25rem !important; -} - -.pb-2 { - padding-bottom: 0.5rem !important; -} - -.pb-3 { - padding-bottom: 1rem !important; -} - -.pb-4 { - padding-bottom: 1.5rem !important; -} - -.pb-5 { - padding-bottom: 3rem !important; -} - -.ps-0 { - padding-left: 0 !important; -} - -.ps-1 { - padding-left: 0.25rem !important; -} - -.ps-2 { - padding-left: 0.5rem !important; -} - -.ps-3 { - padding-left: 1rem !important; -} - -.ps-4 { - padding-left: 1.5rem !important; -} - -.ps-5 { - padding-left: 3rem !important; -} - -@media (min-width: 576px) { - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-grid { - display: grid !important; - } - .d-sm-inline-grid { - display: inline-grid !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; - } - .d-sm-none { - display: none !important; - } - .flex-sm-fill { - flex: 1 1 auto !important; - } - .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-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; - } - .flex-sm-wrap { - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !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; - } - .justify-content-sm-evenly { - justify-content: space-evenly !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; - } - .order-sm-first { - order: -1 !important; - } - .order-sm-0 { - order: 0 !important; - } - .order-sm-1 { - order: 1 !important; - } - .order-sm-2 { - order: 2 !important; - } - .order-sm-3 { - order: 3 !important; - } - .order-sm-4 { - order: 4 !important; - } - .order-sm-5 { - order: 5 !important; - } - .order-sm-last { - order: 6 !important; - } - .m-sm-0 { - margin: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mx-sm-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-sm-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-sm-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-sm-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-sm-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-sm-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-sm-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-sm-0 { - margin-top: 0 !important; - } - .mt-sm-1 { - margin-top: 0.25rem !important; - } - .mt-sm-2 { - margin-top: 0.5rem !important; - } - .mt-sm-3 { - margin-top: 1rem !important; - } - .mt-sm-4 { - margin-top: 1.5rem !important; - } - .mt-sm-5 { - margin-top: 3rem !important; - } - .mt-sm-auto { - margin-top: auto !important; - } - .me-sm-0 { - margin-right: 0 !important; - } - .me-sm-1 { - margin-right: 0.25rem !important; - } - .me-sm-2 { - margin-right: 0.5rem !important; - } - .me-sm-3 { - margin-right: 1rem !important; - } - .me-sm-4 { - margin-right: 1.5rem !important; - } - .me-sm-5 { - margin-right: 3rem !important; - } - .me-sm-auto { - margin-right: auto !important; - } - .mb-sm-0 { - margin-bottom: 0 !important; - } - .mb-sm-1 { - margin-bottom: 0.25rem !important; - } - .mb-sm-2 { - margin-bottom: 0.5rem !important; - } - .mb-sm-3 { - margin-bottom: 1rem !important; - } - .mb-sm-4 { - margin-bottom: 1.5rem !important; - } - .mb-sm-5 { - margin-bottom: 3rem !important; - } - .mb-sm-auto { - margin-bottom: auto !important; - } - .ms-sm-0 { - margin-left: 0 !important; - } - .ms-sm-1 { - margin-left: 0.25rem !important; - } - .ms-sm-2 { - margin-left: 0.5rem !important; - } - .ms-sm-3 { - margin-left: 1rem !important; - } - .ms-sm-4 { - margin-left: 1.5rem !important; - } - .ms-sm-5 { - margin-left: 3rem !important; - } - .ms-sm-auto { - margin-left: auto !important; - } - .p-sm-0 { - padding: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .px-sm-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-sm-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-sm-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-sm-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-sm-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-sm-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-sm-0 { - padding-top: 0 !important; - } - .pt-sm-1 { - padding-top: 0.25rem !important; - } - .pt-sm-2 { - padding-top: 0.5rem !important; - } - .pt-sm-3 { - padding-top: 1rem !important; - } - .pt-sm-4 { - padding-top: 1.5rem !important; - } - .pt-sm-5 { - padding-top: 3rem !important; - } - .pe-sm-0 { - padding-right: 0 !important; - } - .pe-sm-1 { - padding-right: 0.25rem !important; - } - .pe-sm-2 { - padding-right: 0.5rem !important; - } - .pe-sm-3 { - padding-right: 1rem !important; - } - .pe-sm-4 { - padding-right: 1.5rem !important; - } - .pe-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-0 { - padding-bottom: 0 !important; - } - .pb-sm-1 { - padding-bottom: 0.25rem !important; - } - .pb-sm-2 { - padding-bottom: 0.5rem !important; - } - .pb-sm-3 { - padding-bottom: 1rem !important; - } - .pb-sm-4 { - padding-bottom: 1.5rem !important; - } - .pb-sm-5 { - padding-bottom: 3rem !important; - } - .ps-sm-0 { - padding-left: 0 !important; - } - .ps-sm-1 { - padding-left: 0.25rem !important; - } - .ps-sm-2 { - padding-left: 0.5rem !important; - } - .ps-sm-3 { - padding-left: 1rem !important; - } - .ps-sm-4 { - padding-left: 1.5rem !important; - } - .ps-sm-5 { - padding-left: 3rem !important; - } -} -@media (min-width: 768px) { - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-grid { - display: grid !important; - } - .d-md-inline-grid { - display: inline-grid !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; - } - .d-md-none { - display: none !important; - } - .flex-md-fill { - flex: 1 1 auto !important; - } - .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-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; - } - .flex-md-wrap { - flex-wrap: wrap !important; - } - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !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; - } - .justify-content-md-evenly { - justify-content: space-evenly !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; - } - .order-md-first { - order: -1 !important; - } - .order-md-0 { - order: 0 !important; - } - .order-md-1 { - order: 1 !important; - } - .order-md-2 { - order: 2 !important; - } - .order-md-3 { - order: 3 !important; - } - .order-md-4 { - order: 4 !important; - } - .order-md-5 { - order: 5 !important; - } - .order-md-last { - order: 6 !important; - } - .m-md-0 { - margin: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mx-md-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-md-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-md-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-md-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-md-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-md-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-md-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-md-0 { - margin-top: 0 !important; - } - .mt-md-1 { - margin-top: 0.25rem !important; - } - .mt-md-2 { - margin-top: 0.5rem !important; - } - .mt-md-3 { - margin-top: 1rem !important; - } - .mt-md-4 { - margin-top: 1.5rem !important; - } - .mt-md-5 { - margin-top: 3rem !important; - } - .mt-md-auto { - margin-top: auto !important; - } - .me-md-0 { - margin-right: 0 !important; - } - .me-md-1 { - margin-right: 0.25rem !important; - } - .me-md-2 { - margin-right: 0.5rem !important; - } - .me-md-3 { - margin-right: 1rem !important; - } - .me-md-4 { - margin-right: 1.5rem !important; - } - .me-md-5 { - margin-right: 3rem !important; - } - .me-md-auto { - margin-right: auto !important; - } - .mb-md-0 { - margin-bottom: 0 !important; - } - .mb-md-1 { - margin-bottom: 0.25rem !important; - } - .mb-md-2 { - margin-bottom: 0.5rem !important; - } - .mb-md-3 { - margin-bottom: 1rem !important; - } - .mb-md-4 { - margin-bottom: 1.5rem !important; - } - .mb-md-5 { - margin-bottom: 3rem !important; - } - .mb-md-auto { - margin-bottom: auto !important; - } - .ms-md-0 { - margin-left: 0 !important; - } - .ms-md-1 { - margin-left: 0.25rem !important; - } - .ms-md-2 { - margin-left: 0.5rem !important; - } - .ms-md-3 { - margin-left: 1rem !important; - } - .ms-md-4 { - margin-left: 1.5rem !important; - } - .ms-md-5 { - margin-left: 3rem !important; - } - .ms-md-auto { - margin-left: auto !important; - } - .p-md-0 { - padding: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .px-md-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-md-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-md-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-md-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-md-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-md-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-md-0 { - padding-top: 0 !important; - } - .pt-md-1 { - padding-top: 0.25rem !important; - } - .pt-md-2 { - padding-top: 0.5rem !important; - } - .pt-md-3 { - padding-top: 1rem !important; - } - .pt-md-4 { - padding-top: 1.5rem !important; - } - .pt-md-5 { - padding-top: 3rem !important; - } - .pe-md-0 { - padding-right: 0 !important; - } - .pe-md-1 { - padding-right: 0.25rem !important; - } - .pe-md-2 { - padding-right: 0.5rem !important; - } - .pe-md-3 { - padding-right: 1rem !important; - } - .pe-md-4 { - padding-right: 1.5rem !important; - } - .pe-md-5 { - padding-right: 3rem !important; - } - .pb-md-0 { - padding-bottom: 0 !important; - } - .pb-md-1 { - padding-bottom: 0.25rem !important; - } - .pb-md-2 { - padding-bottom: 0.5rem !important; - } - .pb-md-3 { - padding-bottom: 1rem !important; - } - .pb-md-4 { - padding-bottom: 1.5rem !important; - } - .pb-md-5 { - padding-bottom: 3rem !important; - } - .ps-md-0 { - padding-left: 0 !important; - } - .ps-md-1 { - padding-left: 0.25rem !important; - } - .ps-md-2 { - padding-left: 0.5rem !important; - } - .ps-md-3 { - padding-left: 1rem !important; - } - .ps-md-4 { - padding-left: 1.5rem !important; - } - .ps-md-5 { - padding-left: 3rem !important; - } -} -@media (min-width: 992px) { - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-grid { - display: grid !important; - } - .d-lg-inline-grid { - display: inline-grid !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; - } - .d-lg-none { - display: none !important; - } - .flex-lg-fill { - flex: 1 1 auto !important; - } - .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-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; - } - .flex-lg-wrap { - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !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; - } - .justify-content-lg-evenly { - justify-content: space-evenly !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; - } - .order-lg-first { - order: -1 !important; - } - .order-lg-0 { - order: 0 !important; - } - .order-lg-1 { - order: 1 !important; - } - .order-lg-2 { - order: 2 !important; - } - .order-lg-3 { - order: 3 !important; - } - .order-lg-4 { - order: 4 !important; - } - .order-lg-5 { - order: 5 !important; - } - .order-lg-last { - order: 6 !important; - } - .m-lg-0 { - margin: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mx-lg-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-lg-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-lg-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-lg-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-lg-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-lg-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-lg-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-lg-0 { - margin-top: 0 !important; - } - .mt-lg-1 { - margin-top: 0.25rem !important; - } - .mt-lg-2 { - margin-top: 0.5rem !important; - } - .mt-lg-3 { - margin-top: 1rem !important; - } - .mt-lg-4 { - margin-top: 1.5rem !important; - } - .mt-lg-5 { - margin-top: 3rem !important; - } - .mt-lg-auto { - margin-top: auto !important; - } - .me-lg-0 { - margin-right: 0 !important; - } - .me-lg-1 { - margin-right: 0.25rem !important; - } - .me-lg-2 { - margin-right: 0.5rem !important; - } - .me-lg-3 { - margin-right: 1rem !important; - } - .me-lg-4 { - margin-right: 1.5rem !important; - } - .me-lg-5 { - margin-right: 3rem !important; - } - .me-lg-auto { - margin-right: auto !important; - } - .mb-lg-0 { - margin-bottom: 0 !important; - } - .mb-lg-1 { - margin-bottom: 0.25rem !important; - } - .mb-lg-2 { - margin-bottom: 0.5rem !important; - } - .mb-lg-3 { - margin-bottom: 1rem !important; - } - .mb-lg-4 { - margin-bottom: 1.5rem !important; - } - .mb-lg-5 { - margin-bottom: 3rem !important; - } - .mb-lg-auto { - margin-bottom: auto !important; - } - .ms-lg-0 { - margin-left: 0 !important; - } - .ms-lg-1 { - margin-left: 0.25rem !important; - } - .ms-lg-2 { - margin-left: 0.5rem !important; - } - .ms-lg-3 { - margin-left: 1rem !important; - } - .ms-lg-4 { - margin-left: 1.5rem !important; - } - .ms-lg-5 { - margin-left: 3rem !important; - } - .ms-lg-auto { - margin-left: auto !important; - } - .p-lg-0 { - padding: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .px-lg-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-lg-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-lg-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-lg-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-lg-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-lg-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-lg-0 { - padding-top: 0 !important; - } - .pt-lg-1 { - padding-top: 0.25rem !important; - } - .pt-lg-2 { - padding-top: 0.5rem !important; - } - .pt-lg-3 { - padding-top: 1rem !important; - } - .pt-lg-4 { - padding-top: 1.5rem !important; - } - .pt-lg-5 { - padding-top: 3rem !important; - } - .pe-lg-0 { - padding-right: 0 !important; - } - .pe-lg-1 { - padding-right: 0.25rem !important; - } - .pe-lg-2 { - padding-right: 0.5rem !important; - } - .pe-lg-3 { - padding-right: 1rem !important; - } - .pe-lg-4 { - padding-right: 1.5rem !important; - } - .pe-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-0 { - padding-bottom: 0 !important; - } - .pb-lg-1 { - padding-bottom: 0.25rem !important; - } - .pb-lg-2 { - padding-bottom: 0.5rem !important; - } - .pb-lg-3 { - padding-bottom: 1rem !important; - } - .pb-lg-4 { - padding-bottom: 1.5rem !important; - } - .pb-lg-5 { - padding-bottom: 3rem !important; - } - .ps-lg-0 { - padding-left: 0 !important; - } - .ps-lg-1 { - padding-left: 0.25rem !important; - } - .ps-lg-2 { - padding-left: 0.5rem !important; - } - .ps-lg-3 { - padding-left: 1rem !important; - } - .ps-lg-4 { - padding-left: 1.5rem !important; - } - .ps-lg-5 { - padding-left: 3rem !important; - } -} -@media (min-width: 1200px) { - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-grid { - display: grid !important; - } - .d-xl-inline-grid { - display: inline-grid !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; - } - .d-xl-none { - display: none !important; - } - .flex-xl-fill { - flex: 1 1 auto !important; - } - .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-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; - } - .flex-xl-wrap { - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !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; - } - .justify-content-xl-evenly { - justify-content: space-evenly !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; - } - .order-xl-first { - order: -1 !important; - } - .order-xl-0 { - order: 0 !important; - } - .order-xl-1 { - order: 1 !important; - } - .order-xl-2 { - order: 2 !important; - } - .order-xl-3 { - order: 3 !important; - } - .order-xl-4 { - order: 4 !important; - } - .order-xl-5 { - order: 5 !important; - } - .order-xl-last { - order: 6 !important; - } - .m-xl-0 { - margin: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mx-xl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-xl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-xl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-xl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-xl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-xl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-xl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xl-0 { - margin-top: 0 !important; - } - .mt-xl-1 { - margin-top: 0.25rem !important; - } - .mt-xl-2 { - margin-top: 0.5rem !important; - } - .mt-xl-3 { - margin-top: 1rem !important; - } - .mt-xl-4 { - margin-top: 1.5rem !important; - } - .mt-xl-5 { - margin-top: 3rem !important; - } - .mt-xl-auto { - margin-top: auto !important; - } - .me-xl-0 { - margin-right: 0 !important; - } - .me-xl-1 { - margin-right: 0.25rem !important; - } - .me-xl-2 { - margin-right: 0.5rem !important; - } - .me-xl-3 { - margin-right: 1rem !important; - } - .me-xl-4 { - margin-right: 1.5rem !important; - } - .me-xl-5 { - margin-right: 3rem !important; - } - .me-xl-auto { - margin-right: auto !important; - } - .mb-xl-0 { - margin-bottom: 0 !important; - } - .mb-xl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xl-3 { - margin-bottom: 1rem !important; - } - .mb-xl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xl-5 { - margin-bottom: 3rem !important; - } - .mb-xl-auto { - margin-bottom: auto !important; - } - .ms-xl-0 { - margin-left: 0 !important; - } - .ms-xl-1 { - margin-left: 0.25rem !important; - } - .ms-xl-2 { - margin-left: 0.5rem !important; - } - .ms-xl-3 { - margin-left: 1rem !important; - } - .ms-xl-4 { - margin-left: 1.5rem !important; - } - .ms-xl-5 { - margin-left: 3rem !important; - } - .ms-xl-auto { - margin-left: auto !important; - } - .p-xl-0 { - padding: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .px-xl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-xl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-xl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-xl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-xl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-xl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xl-0 { - padding-top: 0 !important; - } - .pt-xl-1 { - padding-top: 0.25rem !important; - } - .pt-xl-2 { - padding-top: 0.5rem !important; - } - .pt-xl-3 { - padding-top: 1rem !important; - } - .pt-xl-4 { - padding-top: 1.5rem !important; - } - .pt-xl-5 { - padding-top: 3rem !important; - } - .pe-xl-0 { - padding-right: 0 !important; - } - .pe-xl-1 { - padding-right: 0.25rem !important; - } - .pe-xl-2 { - padding-right: 0.5rem !important; - } - .pe-xl-3 { - padding-right: 1rem !important; - } - .pe-xl-4 { - padding-right: 1.5rem !important; - } - .pe-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-0 { - padding-bottom: 0 !important; - } - .pb-xl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xl-3 { - padding-bottom: 1rem !important; - } - .pb-xl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xl-5 { - padding-bottom: 3rem !important; - } - .ps-xl-0 { - padding-left: 0 !important; - } - .ps-xl-1 { - padding-left: 0.25rem !important; - } - .ps-xl-2 { - padding-left: 0.5rem !important; - } - .ps-xl-3 { - padding-left: 1rem !important; - } - .ps-xl-4 { - padding-left: 1.5rem !important; - } - .ps-xl-5 { - padding-left: 3rem !important; - } -} -@media (min-width: 1400px) { - .d-xxl-inline { - display: inline !important; - } - .d-xxl-inline-block { - display: inline-block !important; - } - .d-xxl-block { - display: block !important; - } - .d-xxl-grid { - display: grid !important; - } - .d-xxl-inline-grid { - display: inline-grid !important; - } - .d-xxl-table { - display: table !important; - } - .d-xxl-table-row { - display: table-row !important; - } - .d-xxl-table-cell { - display: table-cell !important; - } - .d-xxl-flex { - display: flex !important; - } - .d-xxl-inline-flex { - display: inline-flex !important; - } - .d-xxl-none { - display: none !important; - } - .flex-xxl-fill { - flex: 1 1 auto !important; - } - .flex-xxl-row { - flex-direction: row !important; - } - .flex-xxl-column { - flex-direction: column !important; - } - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xxl-grow-0 { - flex-grow: 0 !important; - } - .flex-xxl-grow-1 { - flex-grow: 1 !important; - } - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xxl-wrap { - flex-wrap: wrap !important; - } - .flex-xxl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xxl-start { - justify-content: flex-start !important; - } - .justify-content-xxl-end { - justify-content: flex-end !important; - } - .justify-content-xxl-center { - justify-content: center !important; - } - .justify-content-xxl-between { - justify-content: space-between !important; - } - .justify-content-xxl-around { - justify-content: space-around !important; - } - .justify-content-xxl-evenly { - justify-content: space-evenly !important; - } - .align-items-xxl-start { - align-items: flex-start !important; - } - .align-items-xxl-end { - align-items: flex-end !important; - } - .align-items-xxl-center { - align-items: center !important; - } - .align-items-xxl-baseline { - align-items: baseline !important; - } - .align-items-xxl-stretch { - align-items: stretch !important; - } - .align-content-xxl-start { - align-content: flex-start !important; - } - .align-content-xxl-end { - align-content: flex-end !important; - } - .align-content-xxl-center { - align-content: center !important; - } - .align-content-xxl-between { - align-content: space-between !important; - } - .align-content-xxl-around { - align-content: space-around !important; - } - .align-content-xxl-stretch { - align-content: stretch !important; - } - .align-self-xxl-auto { - align-self: auto !important; - } - .align-self-xxl-start { - align-self: flex-start !important; - } - .align-self-xxl-end { - align-self: flex-end !important; - } - .align-self-xxl-center { - align-self: center !important; - } - .align-self-xxl-baseline { - align-self: baseline !important; - } - .align-self-xxl-stretch { - align-self: stretch !important; - } - .order-xxl-first { - order: -1 !important; - } - .order-xxl-0 { - order: 0 !important; - } - .order-xxl-1 { - order: 1 !important; - } - .order-xxl-2 { - order: 2 !important; - } - .order-xxl-3 { - order: 3 !important; - } - .order-xxl-4 { - order: 4 !important; - } - .order-xxl-5 { - order: 5 !important; - } - .order-xxl-last { - order: 6 !important; - } - .m-xxl-0 { - margin: 0 !important; - } - .m-xxl-1 { - margin: 0.25rem !important; - } - .m-xxl-2 { - margin: 0.5rem !important; - } - .m-xxl-3 { - margin: 1rem !important; - } - .m-xxl-4 { - margin: 1.5rem !important; - } - .m-xxl-5 { - margin: 3rem !important; - } - .m-xxl-auto { - margin: auto !important; - } - .mx-xxl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - .mx-xxl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - .mx-xxl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - .mx-xxl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - .mx-xxl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - .mx-xxl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - .mx-xxl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - .my-xxl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xxl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xxl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xxl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xxl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xxl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xxl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xxl-0 { - margin-top: 0 !important; - } - .mt-xxl-1 { - margin-top: 0.25rem !important; - } - .mt-xxl-2 { - margin-top: 0.5rem !important; - } - .mt-xxl-3 { - margin-top: 1rem !important; - } - .mt-xxl-4 { - margin-top: 1.5rem !important; - } - .mt-xxl-5 { - margin-top: 3rem !important; - } - .mt-xxl-auto { - margin-top: auto !important; - } - .me-xxl-0 { - margin-right: 0 !important; - } - .me-xxl-1 { - margin-right: 0.25rem !important; - } - .me-xxl-2 { - margin-right: 0.5rem !important; - } - .me-xxl-3 { - margin-right: 1rem !important; - } - .me-xxl-4 { - margin-right: 1.5rem !important; - } - .me-xxl-5 { - margin-right: 3rem !important; - } - .me-xxl-auto { - margin-right: auto !important; - } - .mb-xxl-0 { - margin-bottom: 0 !important; - } - .mb-xxl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xxl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xxl-3 { - margin-bottom: 1rem !important; - } - .mb-xxl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xxl-5 { - margin-bottom: 3rem !important; - } - .mb-xxl-auto { - margin-bottom: auto !important; - } - .ms-xxl-0 { - margin-left: 0 !important; - } - .ms-xxl-1 { - margin-left: 0.25rem !important; - } - .ms-xxl-2 { - margin-left: 0.5rem !important; - } - .ms-xxl-3 { - margin-left: 1rem !important; - } - .ms-xxl-4 { - margin-left: 1.5rem !important; - } - .ms-xxl-5 { - margin-left: 3rem !important; - } - .ms-xxl-auto { - margin-left: auto !important; - } - .p-xxl-0 { - padding: 0 !important; - } - .p-xxl-1 { - padding: 0.25rem !important; - } - .p-xxl-2 { - padding: 0.5rem !important; - } - .p-xxl-3 { - padding: 1rem !important; - } - .p-xxl-4 { - padding: 1.5rem !important; - } - .p-xxl-5 { - padding: 3rem !important; - } - .px-xxl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - .px-xxl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - .px-xxl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - .px-xxl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - .px-xxl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - .px-xxl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - .py-xxl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xxl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xxl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xxl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xxl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xxl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xxl-0 { - padding-top: 0 !important; - } - .pt-xxl-1 { - padding-top: 0.25rem !important; - } - .pt-xxl-2 { - padding-top: 0.5rem !important; - } - .pt-xxl-3 { - padding-top: 1rem !important; - } - .pt-xxl-4 { - padding-top: 1.5rem !important; - } - .pt-xxl-5 { - padding-top: 3rem !important; - } - .pe-xxl-0 { - padding-right: 0 !important; - } - .pe-xxl-1 { - padding-right: 0.25rem !important; - } - .pe-xxl-2 { - padding-right: 0.5rem !important; - } - .pe-xxl-3 { - padding-right: 1rem !important; - } - .pe-xxl-4 { - padding-right: 1.5rem !important; - } - .pe-xxl-5 { - padding-right: 3rem !important; - } - .pb-xxl-0 { - padding-bottom: 0 !important; - } - .pb-xxl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xxl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xxl-3 { - padding-bottom: 1rem !important; - } - .pb-xxl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xxl-5 { - padding-bottom: 3rem !important; - } - .ps-xxl-0 { - padding-left: 0 !important; - } - .ps-xxl-1 { - padding-left: 0.25rem !important; - } - .ps-xxl-2 { - padding-left: 0.5rem !important; - } - .ps-xxl-3 { - padding-left: 1rem !important; - } - .ps-xxl-4 { - padding-left: 1.5rem !important; - } - .ps-xxl-5 { - padding-left: 3rem !important; - } -} -@media print { - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-grid { - display: grid !important; - } - .d-print-inline-grid { - display: inline-grid !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; - } - .d-print-none { - display: none !important; - } -} - -/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.css.map b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.css.map deleted file mode 100644 index 76a689ac..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","bootstrap-grid.css","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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EE,mBAAA;EJ6+BR;EI1+BM;;IAEE,mBAAA;EJ4+BR;AACF;AKpiCQ;EAOI,0BAAA;ALgiCZ;;AKviCQ;EAOI,gCAAA;ALoiCZ;;AK3iCQ;EAOI,yBAAA;ALwiCZ;;AK/iCQ;EAOI,wBAAA;AL4iCZ;;AKnjCQ;EAOI,+BAAA;ALgjCZ;;AKvjCQ;EAOI,yBAAA;ALojCZ;;AK3jCQ;EAOI,6BAAA;ALwjCZ;;AK/jCQ;EAOI,8BAAA;AL4jCZ;;AKnkCQ;EAOI,wBAAA;ALgkCZ;;AKvkCQ;EAOI,+BAAA;ALokCZ;;AK3kCQ;EAOI,wBAAA;ALwkCZ;;AK/kCQ;EAOI,yBAAA;AL4kCZ;;AKnlCQ;EAOI,8BAAA;ALglCZ;;AKvlCQ;EAOI,iCAAA;ALolCZ;;AK3lCQ;EAOI,sCAAA;ALwlCZ;;AK/lCQ;EAOI,yCAAA;AL4lCZ;;AKnmCQ;EAOI,uBAAA;ALgmCZ;;AKvmCQ;EAOI,uBAAA;ALomCZ;;AK3mCQ;EAOI,yBAAA;ALwmCZ;;AK/mCQ;EAOI,yBAAA;AL4mCZ;;AKnnCQ;EAOI,0BAAA;ALgnCZ;;AKvnCQ;EAOI,4BAAA;ALonCZ;;AK3nCQ;EAOI,kCAAA;ALwnCZ;;AK/nCQ;EAOI,sCAAA;AL4nCZ;;AKnoCQ;EAOI,oCAAA;ALgoCZ;;AKvoCQ;EAOI,kCAAA;ALooCZ;;AK3oCQ;EAOI,yCAAA;ALwoCZ;;AK/oCQ;EAOI,wCAAA;AL4oCZ;;AKnpCQ;EAOI,wCAAA;ALgpCZ;;AKvpCQ;EAOI,kCAAA;ALopCZ;;AK3pCQ;EAOI,gCAAA;ALwpCZ;;AK/pCQ;EAOI,8BAAA;AL4pCZ;;AKnqCQ;EAOI,gCAAA;ALgqCZ;;AKvqCQ;EAOI,+BAAA;ALoqCZ;;AK3qCQ;EAOI,oCAAA;ALwqCZ;;AK/qCQ;EAOI,kCAAA;AL4qCZ;;AKnrCQ;EAOI,gCAAA;ALgrCZ;;AKvrCQ;EAOI,uCAAA;ALorCZ;;AK3rCQ;EAOI,sCAAA;ALwrCZ;;AK/rCQ;EAOI,iCAAA;AL4rCZ;;AKnsCQ;EAOI,2BAAA;ALgsCZ;;AKvsCQ;EAOI,iCAAA;ALosCZ;;AK3sCQ;EAOI,+BAAA;ALwsCZ;;AK/sCQ;EAOI,6BAAA;AL4sCZ;;AKntCQ;EA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;AL8iDZ;;AKrjDQ;EAOI,4BAAA;ALkjDZ;;AKzjDQ;EAOI,2BAAA;ALsjDZ;;AK7jDQ;EAOI,iCAAA;AL0jDZ;;AKjkDQ;EAOI,gCAAA;AL8jDZ;;AKrkDQ;EAOI,8BAAA;ALkkDZ;;AKzkDQ;EAOI,gCAAA;ALskDZ;;AK7kDQ;EAOI,8BAAA;AL0kDZ;;AKjlDQ;EAOI,4BAAA;AL8kDZ;;AKrlDQ;EAOI,kCAAA;ALklDZ;;AKzlDQ;EAOI,iCAAA;ALslDZ;;AK7lDQ;EAOI,+BAAA;AL0lDZ;;AKjmDQ;EAOI,iCAAA;AL8lDZ;;AKrmDQ;EAOI,+BAAA;ALkmDZ;;AKzmDQ;EAOI,0BAAA;ALsmDZ;;AK7mDQ;EAOI,gCAAA;AL0mDZ;;AKjnDQ;EAOI,+BAAA;AL8mDZ;;AKrnDQ;EAOI,6BAAA;ALknDZ;;AKznDQ;EAOI,+BAAA;ALsnDZ;;AK7nDQ;EAOI,6BAAA;AL0nDZ;;ACpoDI;EIGI;IAOI,0BAAA;EL+nDV;EKtoDM;IAOI,gCAAA;ELkoDV;EKzoDM;IAOI,yBAAA;ELqoDV;EK5oDM;IAOI,wBAAA;ELwoDV;EK/oDM;IAOI,+BAAA;EL2oDV;EKlpDM;IAOI,yBAAA;EL8oDV;EKrpDM;IAOI,6BAAA;ELipDV;EKxpDM;IAOI,8BAAA;ELopDV;EK3pDM;IAOI,wBAAA;ELupDV;EK9pDM;IAOI,+BAAA;EL0pDV;EKjqDM;IAOI,wBAAA;EL6pDV;EKpqDM;IAOI,yBAAA;ELgqDV;EKvqDM;IAOI,8BAAA;ELmqDV;EK1qDM;IAOI,iCAAA;ELsqDV;EK7qDM;IAOI,sCAAA;ELyqDV;EKhrDM;IAOI,yCAAA;EL4qDV;EKnrDM;IAOI,uBAAA;EL+qDV;EKtrDM;IAOI,uBAAA;ELkrDV;EKzrDM;IAOI,yBAAA;ELqrDV;EK5rDM;IAOI,yBAAA;ELwrDV;EK/rDM;IAOI,0BAAA;EL2rDV;EKlsDM;IAOI,4BAAA;EL8rDV;EKrsDM;IAOI,kCAAA;ELisDV;EKxsDM;IAOI,sCAAA;ELosDV;EK3sDM;IAOI,oCAAA;ELusDV;EK9sDM;IAOI,kCAAA;EL0sDV;EKjtDM;IAOI,yCAAA;EL6sDV;EKptDM;IAOI,wCAAA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nEV;EK/nEM;IAOI,yCAAA;EL2nEV;EKloEM;IAOI,uBAAA;EL8nEV;EKroEM;IAOI,uBAAA;ELioEV;EKxoEM;IAOI,yBAAA;ELooEV;EK3oEM;IAOI,yBAAA;ELuoEV;EK9oEM;IAOI,0BAAA;EL0oEV;EKjpEM;IAOI,4BAAA;EL6oEV;EKppEM;IAOI,kCAAA;ELgpEV;EKvpEM;IAOI,sCAAA;ELmpEV;EK1pEM;IAOI,oCAAA;ELspEV;EK7pEM;IAOI,kCAAA;ELypEV;EKhqEM;IAOI,yCAAA;EL4pEV;EKnqEM;IAOI,wCAAA;EL+pEV;EKtqEM;IAOI,wCAAA;ELkqEV;EKzqEM;IAOI,kCAAA;ELqqEV;EK5qEM;IAOI,gCAAA;ELwqEV;EK/qEM;IAOI,8BAAA;EL2qEV;EKlrEM;IAOI,gCAAA;EL8qEV;EKrrEM;IAOI,+BAAA;ELirEV;EKxrEM;IAOI,oCAAA;ELorEV;EK3rEM;IAOI,kCAAA;ELurEV;EK9rEM;IAOI,gCAAA;EL0rEV;EKjsEM;IAOI,uCAAA;EL6rEV;EKpsEM;IAOI,sCAAA;ELgsEV;EKvsEM;IAOI,iCAAA;ELmsEV;EK1sEM;IAOI,2BAAA;ELssEV;EK7sEM;IAOI,iCAAA;ELysEV;EKhtEM;IAOI,+BAAA;EL4sEV;EKntEM;IAOI,6BAAA;EL+sEV;EKttEM;IAOI,+BAAA;ELktEV;EKztEM;IAOI,8BAAA;ELqtEV;EK5tEM;IAOI,oBAAA;ELwtEV;EK/tEM;IAOI,mBAAA;EL2tEV;EKluEM;IAOI,mBAAA;EL8tEV;EKruEM;IAOI,mBAAA;ELiuEV;EKxuEM;IAOI,mBAAA;ELouEV;EK3uEM;IAOI,mBAAA;ELuuEV;EK9uEM;IAOI,mBAAA;EL0uEV;EKjvEM;IAOI,mBAAA;EL6uEV;EKpvEM;IAOI,oBAAA;ELgvEV;EKvvEM;IAOI,0BAAA;ELmvEV;EK1vEM;IAOI,yBAAA;ELsvEV;EK7vEM;IAOI,uBAAA;ELyvEV;EKhwEM;IAOI,yBAAA;EL4vEV;EKnwEM;IAOI,uBAAA;EL+vEV;EKtwEM;IAOI,uBAAA;ELkwEV;EKzwEM;IAOI,0BAAA;IAAA,yBAAA;ELswEV;EK7wEM;IAO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EKviFM;IAOI,yBAAA;ELmiFV;EK1iFM;IAOI,wBAAA;ELsiFV;EK7iFM;IAOI,+BAAA;ELyiFV;EKhjFM;IAOI,yBAAA;EL4iFV;EKnjFM;IAOI,6BAAA;EL+iFV;EKtjFM;IAOI,8BAAA;ELkjFV;EKzjFM;IAOI,wBAAA;ELqjFV;EK5jFM;IAOI,+BAAA;ELwjFV;EK/jFM;IAOI,wBAAA;EL2jFV;EKlkFM;IAOI,yBAAA;EL8jFV;EKrkFM;IAOI,8BAAA;ELikFV;EKxkFM;IAOI,iCAAA;ELokFV;EK3kFM;IAOI,sCAAA;ELukFV;EK9kFM;IAOI,yCAAA;EL0kFV;EKjlFM;IAOI,uBAAA;EL6kFV;EKplFM;IAOI,uBAAA;ELglFV;EKvlFM;IAOI,yBAAA;ELmlFV;EK1lFM;IAOI,yBAAA;ELslFV;EK7lFM;IAOI,0BAAA;ELylFV;EKhmFM;IAOI,4BAAA;EL4lFV;EKnmFM;IAOI,kCAAA;EL+lFV;EKtmFM;IAOI,sCAAA;ELkmFV;EKzmFM;IAOI,oCAAA;ELqmFV;EK5mFM;IAOI,kCAAA;ELwmFV;EK/mFM;IAOI,yCAAA;EL2mFV;EKlnFM;IAOI,wCAAA;EL8mFV;EKrnFM;IAOI,wCAAA;ELinFV;EKxnFM;IAOI,kCAAA;ELonFV;EK3nFM;IAOI,gCAAA;ELunFV;EK9nFM;IAOI,8BAAA;EL0nFV;EKjoFM;IAOI,gCAAA;EL6nFV;EKpoFM;IAOI,+BAAA;ELgoFV;EKvoFM;IAOI,oCAAA;ELmoFV;EK1oFM;IAOI,kCAAA;ELsoFV;EK7oFM;IAOI,gCAAA;ELyoFV;EKhpFM;IAOI,uCAAA;EL4oFV;EKnpFM;IAOI,sCAAA;EL+oFV;EKtpFM;IAOI,iCAAA;ELkpFV;EKzpFM;IAOI,2BAAA;ELqpFV;EK5pFM;IAOI,iCAAA;ELwpFV;EK/pFM;IAOI,+BAAA;EL2pFV;EKlqFM;IAOI,6BAAA;EL8pFV;EKrqFM;IAOI,+BAAA;ELiqFV;EKxqFM;IAOI,8BAAA;ELoqFV;EK3qFM;IAOI,oBAAA;ELuqFV;EK9qFM;IAOI,mBAAA;EL0qFV;EKjrFM;IAOI,mBAAA;EL6qFV;EKprFM;IAOI,mBAAA;ELgrFV;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AAA;ELy8FV;EKh9FM;IAOI,iCAAA;EL48FV;EKn9FM;IAOI,+BAAA;EL+8FV;EKt9FM;IAOI,iCAAA;ELk9FV;EKz9FM;IAOI,+BAAA;ELq9FV;EK59FM;IAOI,0BAAA;ELw9FV;EK/9FM;IAOI,gCAAA;EL29FV;EKl+FM;IAOI,+BAAA;EL89FV;EKr+FM;IAOI,6BAAA;ELi+FV;EKx+FM;IAOI,+BAAA;ELo+FV;EK3+FM;IAOI,6BAAA;ELu+FV;AACF;ACl/FI;EIGI;IAOI,0BAAA;EL4+FV;EKn/FM;IAOI,gCAAA;EL++FV;EKt/FM;IAOI,yBAAA;ELk/FV;EKz/FM;IAOI,wBAAA;ELq/FV;EK5/FM;IAOI,+BAAA;ELw/FV;EK//FM;IAOI,yBAAA;EL2/FV;EKlgGM;IAOI,6BAAA;EL8/FV;EKrgGM;IAOI,8BAAA;ELigGV;EKxgGM;IAOI,wBAAA;ELogGV;EK3gGM;IAOI,+BAAA;ELugGV;EK9gGM;IAOI,wBAAA;EL0gGV;EKjhGM;IAOI,yBAAA;EL6gGV;EKphGM;IAOI,8BAAA;ELghGV;EKvhGM;IAOI,iCAAA;ELmhGV;EK1hGM;IAOI,sCAAA;ELshGV;EK7hGM;IAOI,yCAAA;ELyhGV;EKhiGM;IAOI,uBAAA;EL4hGV;EKniGM;IAOI,uBAAA;EL+hGV;EKtiGM;IAOI,yBAAA;ELkiGV;EKziGM;IAOI,yBAAA;ELqiGV;EK5iGM;IAOI,0BAAA;ELwiGV;EK/iGM;IAOI,4BAAA;EL2iGV;EKljGM;IAOI,kCAAA;EL8iGV;EKrjGM;IAOI,sCAAA;ELijGV;EKxjGM;IAOI,oCAAA;ELojGV;EK3jGM;IAOI,kCAAA;ELujGV;EK9jGM;IAOI,yCAAA;EL0jGV;EKjkGM;IAOI,wCAAA;EL6jGV;EKpkGM;IAOI,wCAAA;ELgkGV;EKvkGM;IAOI,kCAAA;ELmkGV;EK1kGM;IAOI,gCAAA;ELskGV;EK7kGM;IAOI,8BAAA;ELykGV;EKhlGM;IAOI,gCAAA;EL4kGV;EKnlGM;IAOI,+BAAA;EL+kGV;EKtlGM;IAOI,oCAAA;ELklGV;EKzlGM;IAOI,kCAAA;ELqlGV;EK5lGM;IAOI,gCAAA;ELwlGV;EK/l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ELi3GV;EKx3GM;IAOI,+BAAA;ELo3GV;EK33GM;IAOI,8BAAA;ELu3GV;EK93GM;IAOI,4BAAA;EL03GV;EKj4GM;IAOI,8BAAA;EL63GV;EKp4GM;IAOI,4BAAA;ELg4GV;EKv4GM;IAOI,2BAAA;ELm4GV;EK14GM;IAOI,iCAAA;ELs4GV;EK74GM;IAOI,gCAAA;ELy4GV;EKh5GM;IAOI,8BAAA;EL44GV;EKn5GM;IAOI,gCAAA;EL+4GV;EKt5GM;IAOI,8BAAA;ELk5GV;EKz5GM;IAOI,4BAAA;ELq5GV;EK55GM;IAOI,kCAAA;ELw5GV;EK/5GM;IAOI,iCAAA;EL25GV;EKl6GM;IAOI,+BAAA;EL85GV;EKr6GM;IAOI,iCAAA;ELi6GV;EKx6GM;IAOI,+BAAA;ELo6GV;EK36GM;IAOI,0BAAA;ELu6GV;EK96GM;IAOI,gCAAA;EL06GV;EKj7GM;IAOI,+BAAA;EL66GV;EKp7GM;IAOI,6BAAA;ELg7GV;EKv7GM;IAOI,+BAAA;ELm7GV;EK17GM;IAOI,6BAAA;ELs7GV;AACF;ACj8GI;EIGI;IAOI,0BAAA;EL27GV;EKl8GM;IAOI,gCAAA;EL87GV;EKr8GM;IAOI,yBAAA;ELi8GV;EKx8GM;IAOI,wBAAA;ELo8GV;EK38GM;IAOI,+BAAA;ELu8GV;EK98GM;IAOI,yBAAA;EL08GV;EKj9GM;IAOI,6BAAA;EL68GV;EKp9GM;IAOI,8BAAA;ELg9GV;EKv9GM;IAOI,wBAAA;ELm9GV;EK19GM;IAOI,+BAAA;ELs9GV;EK79GM;IAOI,wBAAA;ELy9GV;EKh+GM;IAOI,yBAAA;EL49GV;EKn+GM;IAOI,8BAAA;EL+9GV;EKt+GM;IAOI,iCAAA;ELk+GV;EKz+GM;IAOI,sCAAA;ELq+GV;EK5+GM;IAOI,yCAAA;ELw+GV;EK/+GM;IAOI,uBAAA;EL2+GV;EKl/GM;IAOI,uBAAA;EL8+GV;EKr/GM;IAOI,yBAAA;ELi/GV;EKx/GM;IAOI,yBAAA;ELo/GV;EK3/GM;IAOI,0BAAA;ELu/GV;EK9/GM;IAOI,4BAAA;EL0/GV;EKjgHM;IAOI,kCAAA;EL6/GV;EKpgHM;IAOI,sCAAA;ELggHV;EKvgHM;I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","file":"bootstrap-grid.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.min.css b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.min.css deleted file mode 100644 index 46f0a449..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!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}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.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-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}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-evenly{justify-content:space-evenly!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}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!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}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.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-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}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-sm-evenly{justify-content:space-evenly!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}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!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}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.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-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}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-md-evenly{justify-content:space-evenly!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}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!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}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.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-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}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-lg-evenly{justify-content:space-evenly!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}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!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}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.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-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}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-xl-evenly{justify-content:space-evenly!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}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!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}.d-print-none{display:none!important}} -/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.min.css.map b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.min.css.map deleted file mode 100644 index c88c6c5d..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","dist/css/bootstrap-grid.css","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.css b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.css deleted file mode 100644 index fa3ec34a..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.css +++ /dev/null @@ -1,4084 +0,0 @@ -/*! - * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -.container, -.container-fluid, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - width: 100%; - padding-left: calc(var(--bs-gutter-x) * 0.5); - padding-right: calc(var(--bs-gutter-x) * 0.5); - margin-left: auto; - margin-right: auto; -} - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; - } -} -@media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1320px; - } -} -:root { - --bs-breakpoint-xs: 0; - --bs-breakpoint-sm: 576px; - --bs-breakpoint-md: 768px; - --bs-breakpoint-lg: 992px; - --bs-breakpoint-xl: 1200px; - --bs-breakpoint-xxl: 1400px; -} - -.row { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - display: flex; - flex-wrap: wrap; - margin-top: calc(-1 * var(--bs-gutter-y)); - margin-left: calc(-0.5 * var(--bs-gutter-x)); - margin-right: calc(-0.5 * var(--bs-gutter-x)); -} -.row > * { - box-sizing: border-box; - flex-shrink: 0; - width: 100%; - max-width: 100%; - padding-left: calc(var(--bs-gutter-x) * 0.5); - padding-right: calc(var(--bs-gutter-x) * 0.5); - margin-top: var(--bs-gutter-y); -} - -.col { - flex: 1 0 0%; -} - -.row-cols-auto > * { - flex: 0 0 auto; - width: auto; -} - -.row-cols-1 > * { - flex: 0 0 auto; - width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 auto; - width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 auto; - width: 33.33333333%; -} - -.row-cols-4 > * { - flex: 0 0 auto; - width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 auto; - width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; -} - -.col-1 { - flex: 0 0 auto; - width: 8.33333333%; -} - -.col-2 { - flex: 0 0 auto; - width: 16.66666667%; -} - -.col-3 { - flex: 0 0 auto; - width: 25%; -} - -.col-4 { - flex: 0 0 auto; - width: 33.33333333%; -} - -.col-5 { - flex: 0 0 auto; - width: 41.66666667%; -} - -.col-6 { - flex: 0 0 auto; - width: 50%; -} - -.col-7 { - flex: 0 0 auto; - width: 58.33333333%; -} - -.col-8 { - flex: 0 0 auto; - width: 66.66666667%; -} - -.col-9 { - flex: 0 0 auto; - width: 75%; -} - -.col-10 { - flex: 0 0 auto; - width: 83.33333333%; -} - -.col-11 { - flex: 0 0 auto; - width: 91.66666667%; -} - -.col-12 { - flex: 0 0 auto; - width: 100%; -} - -.offset-1 { - margin-right: 8.33333333%; -} - -.offset-2 { - margin-right: 16.66666667%; -} - -.offset-3 { - margin-right: 25%; -} - -.offset-4 { - margin-right: 33.33333333%; -} - -.offset-5 { - margin-right: 41.66666667%; -} - -.offset-6 { - margin-right: 50%; -} - -.offset-7 { - margin-right: 58.33333333%; -} - -.offset-8 { - margin-right: 66.66666667%; -} - -.offset-9 { - margin-right: 75%; -} - -.offset-10 { - margin-right: 83.33333333%; -} - -.offset-11 { - margin-right: 91.66666667%; -} - -.g-0, -.gx-0 { - --bs-gutter-x: 0; -} - -.g-0, -.gy-0 { - --bs-gutter-y: 0; -} - -.g-1, -.gx-1 { - --bs-gutter-x: 0.25rem; -} - -.g-1, -.gy-1 { - --bs-gutter-y: 0.25rem; -} - -.g-2, -.gx-2 { - --bs-gutter-x: 0.5rem; -} - -.g-2, -.gy-2 { - --bs-gutter-y: 0.5rem; -} - -.g-3, -.gx-3 { - --bs-gutter-x: 1rem; -} - -.g-3, -.gy-3 { - --bs-gutter-y: 1rem; -} - -.g-4, -.gx-4 { - --bs-gutter-x: 1.5rem; -} - -.g-4, -.gy-4 { - --bs-gutter-y: 1.5rem; -} - -.g-5, -.gx-5 { - --bs-gutter-x: 3rem; -} - -.g-5, -.gy-5 { - --bs-gutter-y: 3rem; -} - -@media (min-width: 576px) { - .col-sm { - flex: 1 0 0%; - } - .row-cols-sm-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-sm-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-sm-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-sm-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-sm-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-sm-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-sm-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-auto { - flex: 0 0 auto; - width: auto; - } - .col-sm-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-sm-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-sm-3 { - flex: 0 0 auto; - width: 25%; - } - .col-sm-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-sm-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-sm-6 { - flex: 0 0 auto; - width: 50%; - } - .col-sm-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-sm-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-sm-9 { - flex: 0 0 auto; - width: 75%; - } - .col-sm-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-sm-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-sm-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-sm-0 { - margin-right: 0; - } - .offset-sm-1 { - margin-right: 8.33333333%; - } - .offset-sm-2 { - margin-right: 16.66666667%; - } - .offset-sm-3 { - margin-right: 25%; - } - .offset-sm-4 { - margin-right: 33.33333333%; - } - .offset-sm-5 { - margin-right: 41.66666667%; - } - .offset-sm-6 { - margin-right: 50%; - } - .offset-sm-7 { - margin-right: 58.33333333%; - } - .offset-sm-8 { - margin-right: 66.66666667%; - } - .offset-sm-9 { - margin-right: 75%; - } - .offset-sm-10 { - margin-right: 83.33333333%; - } - .offset-sm-11 { - margin-right: 91.66666667%; - } - .g-sm-0, - .gx-sm-0 { - --bs-gutter-x: 0; - } - .g-sm-0, - .gy-sm-0 { - --bs-gutter-y: 0; - } - .g-sm-1, - .gx-sm-1 { - --bs-gutter-x: 0.25rem; - } - .g-sm-1, - .gy-sm-1 { - --bs-gutter-y: 0.25rem; - } - .g-sm-2, - .gx-sm-2 { - --bs-gutter-x: 0.5rem; - } - .g-sm-2, - .gy-sm-2 { - --bs-gutter-y: 0.5rem; - } - .g-sm-3, - .gx-sm-3 { - --bs-gutter-x: 1rem; - } - .g-sm-3, - .gy-sm-3 { - --bs-gutter-y: 1rem; - } - .g-sm-4, - .gx-sm-4 { - --bs-gutter-x: 1.5rem; - } - .g-sm-4, - .gy-sm-4 { - --bs-gutter-y: 1.5rem; - } - .g-sm-5, - .gx-sm-5 { - --bs-gutter-x: 3rem; - } - .g-sm-5, - .gy-sm-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 768px) { - .col-md { - flex: 1 0 0%; - } - .row-cols-md-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-md-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-md-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-md-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-md-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-md-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-md-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-auto { - flex: 0 0 auto; - width: auto; - } - .col-md-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-md-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-md-3 { - flex: 0 0 auto; - width: 25%; - } - .col-md-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-md-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-md-6 { - flex: 0 0 auto; - width: 50%; - } - .col-md-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-md-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-md-9 { - flex: 0 0 auto; - width: 75%; - } - .col-md-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-md-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-md-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-md-0 { - margin-right: 0; - } - .offset-md-1 { - margin-right: 8.33333333%; - } - .offset-md-2 { - margin-right: 16.66666667%; - } - .offset-md-3 { - margin-right: 25%; - } - .offset-md-4 { - margin-right: 33.33333333%; - } - .offset-md-5 { - margin-right: 41.66666667%; - } - .offset-md-6 { - margin-right: 50%; - } - .offset-md-7 { - margin-right: 58.33333333%; - } - .offset-md-8 { - margin-right: 66.66666667%; - } - .offset-md-9 { - margin-right: 75%; - } - .offset-md-10 { - margin-right: 83.33333333%; - } - .offset-md-11 { - margin-right: 91.66666667%; - } - .g-md-0, - .gx-md-0 { - --bs-gutter-x: 0; - } - .g-md-0, - .gy-md-0 { - --bs-gutter-y: 0; - } - .g-md-1, - .gx-md-1 { - --bs-gutter-x: 0.25rem; - } - .g-md-1, - .gy-md-1 { - --bs-gutter-y: 0.25rem; - } - .g-md-2, - .gx-md-2 { - --bs-gutter-x: 0.5rem; - } - .g-md-2, - .gy-md-2 { - --bs-gutter-y: 0.5rem; - } - .g-md-3, - .gx-md-3 { - --bs-gutter-x: 1rem; - } - .g-md-3, - .gy-md-3 { - --bs-gutter-y: 1rem; - } - .g-md-4, - .gx-md-4 { - --bs-gutter-x: 1.5rem; - } - .g-md-4, - .gy-md-4 { - --bs-gutter-y: 1.5rem; - } - .g-md-5, - .gx-md-5 { - --bs-gutter-x: 3rem; - } - .g-md-5, - .gy-md-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 992px) { - .col-lg { - flex: 1 0 0%; - } - .row-cols-lg-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-lg-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-lg-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-lg-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-lg-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-lg-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-lg-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-auto { - flex: 0 0 auto; - width: auto; - } - .col-lg-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-lg-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-lg-3 { - flex: 0 0 auto; - width: 25%; - } - .col-lg-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-lg-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-lg-6 { - flex: 0 0 auto; - width: 50%; - } - .col-lg-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-lg-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-lg-9 { - flex: 0 0 auto; - width: 75%; - } - .col-lg-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-lg-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-lg-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-lg-0 { - margin-right: 0; - } - .offset-lg-1 { - margin-right: 8.33333333%; - } - .offset-lg-2 { - margin-right: 16.66666667%; - } - .offset-lg-3 { - margin-right: 25%; - } - .offset-lg-4 { - margin-right: 33.33333333%; - } - .offset-lg-5 { - margin-right: 41.66666667%; - } - .offset-lg-6 { - margin-right: 50%; - } - .offset-lg-7 { - margin-right: 58.33333333%; - } - .offset-lg-8 { - margin-right: 66.66666667%; - } - .offset-lg-9 { - margin-right: 75%; - } - .offset-lg-10 { - margin-right: 83.33333333%; - } - .offset-lg-11 { - margin-right: 91.66666667%; - } - .g-lg-0, - .gx-lg-0 { - --bs-gutter-x: 0; - } - .g-lg-0, - .gy-lg-0 { - --bs-gutter-y: 0; - } - .g-lg-1, - .gx-lg-1 { - --bs-gutter-x: 0.25rem; - } - .g-lg-1, - .gy-lg-1 { - --bs-gutter-y: 0.25rem; - } - .g-lg-2, - .gx-lg-2 { - --bs-gutter-x: 0.5rem; - } - .g-lg-2, - .gy-lg-2 { - --bs-gutter-y: 0.5rem; - } - .g-lg-3, - .gx-lg-3 { - --bs-gutter-x: 1rem; - } - .g-lg-3, - .gy-lg-3 { - --bs-gutter-y: 1rem; - } - .g-lg-4, - .gx-lg-4 { - --bs-gutter-x: 1.5rem; - } - .g-lg-4, - .gy-lg-4 { - --bs-gutter-y: 1.5rem; - } - .g-lg-5, - .gx-lg-5 { - --bs-gutter-x: 3rem; - } - .g-lg-5, - .gy-lg-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1200px) { - .col-xl { - flex: 1 0 0%; - } - .row-cols-xl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xl-0 { - margin-right: 0; - } - .offset-xl-1 { - margin-right: 8.33333333%; - } - .offset-xl-2 { - margin-right: 16.66666667%; - } - .offset-xl-3 { - margin-right: 25%; - } - .offset-xl-4 { - margin-right: 33.33333333%; - } - .offset-xl-5 { - margin-right: 41.66666667%; - } - .offset-xl-6 { - margin-right: 50%; - } - .offset-xl-7 { - margin-right: 58.33333333%; - } - .offset-xl-8 { - margin-right: 66.66666667%; - } - .offset-xl-9 { - margin-right: 75%; - } - .offset-xl-10 { - margin-right: 83.33333333%; - } - .offset-xl-11 { - margin-right: 91.66666667%; - } - .g-xl-0, - .gx-xl-0 { - --bs-gutter-x: 0; - } - .g-xl-0, - .gy-xl-0 { - --bs-gutter-y: 0; - } - .g-xl-1, - .gx-xl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xl-1, - .gy-xl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xl-2, - .gx-xl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xl-2, - .gy-xl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xl-3, - .gx-xl-3 { - --bs-gutter-x: 1rem; - } - .g-xl-3, - .gy-xl-3 { - --bs-gutter-y: 1rem; - } - .g-xl-4, - .gx-xl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xl-4, - .gy-xl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xl-5, - .gx-xl-5 { - --bs-gutter-x: 3rem; - } - .g-xl-5, - .gy-xl-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1400px) { - .col-xxl { - flex: 1 0 0%; - } - .row-cols-xxl-auto > * { - flex: 0 0 auto; - width: auto; - } - .row-cols-xxl-1 > * { - flex: 0 0 auto; - width: 100%; - } - .row-cols-xxl-2 > * { - flex: 0 0 auto; - width: 50%; - } - .row-cols-xxl-3 > * { - flex: 0 0 auto; - width: 33.33333333%; - } - .row-cols-xxl-4 > * { - flex: 0 0 auto; - width: 25%; - } - .row-cols-xxl-5 > * { - flex: 0 0 auto; - width: 20%; - } - .row-cols-xxl-6 > * { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-auto { - flex: 0 0 auto; - width: auto; - } - .col-xxl-1 { - flex: 0 0 auto; - width: 8.33333333%; - } - .col-xxl-2 { - flex: 0 0 auto; - width: 16.66666667%; - } - .col-xxl-3 { - flex: 0 0 auto; - width: 25%; - } - .col-xxl-4 { - flex: 0 0 auto; - width: 33.33333333%; - } - .col-xxl-5 { - flex: 0 0 auto; - width: 41.66666667%; - } - .col-xxl-6 { - flex: 0 0 auto; - width: 50%; - } - .col-xxl-7 { - flex: 0 0 auto; - width: 58.33333333%; - } - .col-xxl-8 { - flex: 0 0 auto; - width: 66.66666667%; - } - .col-xxl-9 { - flex: 0 0 auto; - width: 75%; - } - .col-xxl-10 { - flex: 0 0 auto; - width: 83.33333333%; - } - .col-xxl-11 { - flex: 0 0 auto; - width: 91.66666667%; - } - .col-xxl-12 { - flex: 0 0 auto; - width: 100%; - } - .offset-xxl-0 { - margin-right: 0; - } - .offset-xxl-1 { - margin-right: 8.33333333%; - } - .offset-xxl-2 { - margin-right: 16.66666667%; - } - .offset-xxl-3 { - margin-right: 25%; - } - .offset-xxl-4 { - margin-right: 33.33333333%; - } - .offset-xxl-5 { - margin-right: 41.66666667%; - } - .offset-xxl-6 { - margin-right: 50%; - } - .offset-xxl-7 { - margin-right: 58.33333333%; - } - .offset-xxl-8 { - margin-right: 66.66666667%; - } - .offset-xxl-9 { - margin-right: 75%; - } - .offset-xxl-10 { - margin-right: 83.33333333%; - } - .offset-xxl-11 { - margin-right: 91.66666667%; - } - .g-xxl-0, - .gx-xxl-0 { - --bs-gutter-x: 0; - } - .g-xxl-0, - .gy-xxl-0 { - --bs-gutter-y: 0; - } - .g-xxl-1, - .gx-xxl-1 { - --bs-gutter-x: 0.25rem; - } - .g-xxl-1, - .gy-xxl-1 { - --bs-gutter-y: 0.25rem; - } - .g-xxl-2, - .gx-xxl-2 { - --bs-gutter-x: 0.5rem; - } - .g-xxl-2, - .gy-xxl-2 { - --bs-gutter-y: 0.5rem; - } - .g-xxl-3, - .gx-xxl-3 { - --bs-gutter-x: 1rem; - } - .g-xxl-3, - .gy-xxl-3 { - --bs-gutter-y: 1rem; - } - .g-xxl-4, - .gx-xxl-4 { - --bs-gutter-x: 1.5rem; - } - .g-xxl-4, - .gy-xxl-4 { - --bs-gutter-y: 1.5rem; - } - .g-xxl-5, - .gx-xxl-5 { - --bs-gutter-x: 3rem; - } - .g-xxl-5, - .gy-xxl-5 { - --bs-gutter-y: 3rem; - } -} -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-grid { - display: grid !important; -} - -.d-inline-grid { - display: inline-grid !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; -} - -.d-none { - display: none !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.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-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; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !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; -} - -.justify-content-evenly { - justify-content: space-evenly !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; -} - -.order-first { - order: -1 !important; -} - -.order-0 { - order: 0 !important; -} - -.order-1 { - order: 1 !important; -} - -.order-2 { - order: 2 !important; -} - -.order-3 { - order: 3 !important; -} - -.order-4 { - order: 4 !important; -} - -.order-5 { - order: 5 !important; -} - -.order-last { - order: 6 !important; -} - -.m-0 { - margin: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mx-0 { - margin-left: 0 !important; - margin-right: 0 !important; -} - -.mx-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; -} - -.mx-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; -} - -.mx-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; -} - -.mx-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; -} - -.mx-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; -} - -.mx-auto { - margin-left: auto !important; - margin-right: auto !important; -} - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; -} - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; -} - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; -} - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; -} - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; -} - -.mt-0 { - margin-top: 0 !important; -} - -.mt-1 { - margin-top: 0.25rem !important; -} - -.mt-2 { - margin-top: 0.5rem !important; -} - -.mt-3 { - margin-top: 1rem !important; -} - -.mt-4 { - margin-top: 1.5rem !important; -} - -.mt-5 { - margin-top: 3rem !important; -} - -.mt-auto { - margin-top: auto !important; -} - -.me-0 { - margin-left: 0 !important; -} - -.me-1 { - margin-left: 0.25rem !important; -} - -.me-2 { - margin-left: 0.5rem !important; -} - -.me-3 { - margin-left: 1rem !important; -} - -.me-4 { - margin-left: 1.5rem !important; -} - -.me-5 { - margin-left: 3rem !important; -} - -.me-auto { - margin-left: auto !important; -} - -.mb-0 { - margin-bottom: 0 !important; -} - -.mb-1 { - margin-bottom: 0.25rem !important; -} - -.mb-2 { - margin-bottom: 0.5rem !important; -} - -.mb-3 { - margin-bottom: 1rem !important; -} - -.mb-4 { - margin-bottom: 1.5rem !important; -} - -.mb-5 { - margin-bottom: 3rem !important; -} - -.mb-auto { - margin-bottom: auto !important; -} - -.ms-0 { - margin-right: 0 !important; -} - -.ms-1 { - margin-right: 0.25rem !important; -} - -.ms-2 { - margin-right: 0.5rem !important; -} - -.ms-3 { - margin-right: 1rem !important; -} - -.ms-4 { - margin-right: 1.5rem !important; -} - -.ms-5 { - margin-right: 3rem !important; -} - -.ms-auto { - margin-right: auto !important; -} - -.p-0 { - padding: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.px-0 { - padding-left: 0 !important; - padding-right: 0 !important; -} - -.px-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; -} - -.px-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; -} - -.px-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; -} - -.px-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; -} - -.px-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; -} - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; -} - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; -} - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; -} - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; -} - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; -} - -.pt-0 { - padding-top: 0 !important; -} - -.pt-1 { - padding-top: 0.25rem !important; -} - -.pt-2 { - padding-top: 0.5rem !important; -} - -.pt-3 { - padding-top: 1rem !important; -} - -.pt-4 { - padding-top: 1.5rem !important; -} - -.pt-5 { - padding-top: 3rem !important; -} - -.pe-0 { - padding-left: 0 !important; -} - -.pe-1 { - padding-left: 0.25rem !important; -} - -.pe-2 { - padding-left: 0.5rem !important; -} - -.pe-3 { - padding-left: 1rem !important; -} - -.pe-4 { - padding-left: 1.5rem !important; -} - -.pe-5 { - padding-left: 3rem !important; -} - -.pb-0 { - padding-bottom: 0 !important; -} - -.pb-1 { - padding-bottom: 0.25rem !important; -} - -.pb-2 { - padding-bottom: 0.5rem !important; -} - -.pb-3 { - padding-bottom: 1rem !important; -} - -.pb-4 { - padding-bottom: 1.5rem !important; -} - -.pb-5 { - padding-bottom: 3rem !important; -} - -.ps-0 { - padding-right: 0 !important; -} - -.ps-1 { - padding-right: 0.25rem !important; -} - -.ps-2 { - padding-right: 0.5rem !important; -} - -.ps-3 { - padding-right: 1rem !important; -} - -.ps-4 { - padding-right: 1.5rem !important; -} - -.ps-5 { - padding-right: 3rem !important; -} - -@media (min-width: 576px) { - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-grid { - display: grid !important; - } - .d-sm-inline-grid { - display: inline-grid !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; - } - .d-sm-none { - display: none !important; - } - .flex-sm-fill { - flex: 1 1 auto !important; - } - .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-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; - } - .flex-sm-wrap { - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !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; - } - .justify-content-sm-evenly { - justify-content: space-evenly !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; - } - .order-sm-first { - order: -1 !important; - } - .order-sm-0 { - order: 0 !important; - } - .order-sm-1 { - order: 1 !important; - } - .order-sm-2 { - order: 2 !important; - } - .order-sm-3 { - order: 3 !important; - } - .order-sm-4 { - order: 4 !important; - } - .order-sm-5 { - order: 5 !important; - } - .order-sm-last { - order: 6 !important; - } - .m-sm-0 { - margin: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mx-sm-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-sm-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-sm-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-sm-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-sm-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-sm-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-sm-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-sm-0 { - margin-top: 0 !important; - } - .mt-sm-1 { - margin-top: 0.25rem !important; - } - .mt-sm-2 { - margin-top: 0.5rem !important; - } - .mt-sm-3 { - margin-top: 1rem !important; - } - .mt-sm-4 { - margin-top: 1.5rem !important; - } - .mt-sm-5 { - margin-top: 3rem !important; - } - .mt-sm-auto { - margin-top: auto !important; - } - .me-sm-0 { - margin-left: 0 !important; - } - .me-sm-1 { - margin-left: 0.25rem !important; - } - .me-sm-2 { - margin-left: 0.5rem !important; - } - .me-sm-3 { - margin-left: 1rem !important; - } - .me-sm-4 { - margin-left: 1.5rem !important; - } - .me-sm-5 { - margin-left: 3rem !important; - } - .me-sm-auto { - margin-left: auto !important; - } - .mb-sm-0 { - margin-bottom: 0 !important; - } - .mb-sm-1 { - margin-bottom: 0.25rem !important; - } - .mb-sm-2 { - margin-bottom: 0.5rem !important; - } - .mb-sm-3 { - margin-bottom: 1rem !important; - } - .mb-sm-4 { - margin-bottom: 1.5rem !important; - } - .mb-sm-5 { - margin-bottom: 3rem !important; - } - .mb-sm-auto { - margin-bottom: auto !important; - } - .ms-sm-0 { - margin-right: 0 !important; - } - .ms-sm-1 { - margin-right: 0.25rem !important; - } - .ms-sm-2 { - margin-right: 0.5rem !important; - } - .ms-sm-3 { - margin-right: 1rem !important; - } - .ms-sm-4 { - margin-right: 1.5rem !important; - } - .ms-sm-5 { - margin-right: 3rem !important; - } - .ms-sm-auto { - margin-right: auto !important; - } - .p-sm-0 { - padding: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .px-sm-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-sm-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-sm-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-sm-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-sm-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-sm-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-sm-0 { - padding-top: 0 !important; - } - .pt-sm-1 { - padding-top: 0.25rem !important; - } - .pt-sm-2 { - padding-top: 0.5rem !important; - } - .pt-sm-3 { - padding-top: 1rem !important; - } - .pt-sm-4 { - padding-top: 1.5rem !important; - } - .pt-sm-5 { - padding-top: 3rem !important; - } - .pe-sm-0 { - padding-left: 0 !important; - } - .pe-sm-1 { - padding-left: 0.25rem !important; - } - .pe-sm-2 { - padding-left: 0.5rem !important; - } - .pe-sm-3 { - padding-left: 1rem !important; - } - .pe-sm-4 { - padding-left: 1.5rem !important; - } - .pe-sm-5 { - padding-left: 3rem !important; - } - .pb-sm-0 { - padding-bottom: 0 !important; - } - .pb-sm-1 { - padding-bottom: 0.25rem !important; - } - .pb-sm-2 { - padding-bottom: 0.5rem !important; - } - .pb-sm-3 { - padding-bottom: 1rem !important; - } - .pb-sm-4 { - padding-bottom: 1.5rem !important; - } - .pb-sm-5 { - padding-bottom: 3rem !important; - } - .ps-sm-0 { - padding-right: 0 !important; - } - .ps-sm-1 { - padding-right: 0.25rem !important; - } - .ps-sm-2 { - padding-right: 0.5rem !important; - } - .ps-sm-3 { - padding-right: 1rem !important; - } - .ps-sm-4 { - padding-right: 1.5rem !important; - } - .ps-sm-5 { - padding-right: 3rem !important; - } -} -@media (min-width: 768px) { - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-grid { - display: grid !important; - } - .d-md-inline-grid { - display: inline-grid !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; - } - .d-md-none { - display: none !important; - } - .flex-md-fill { - flex: 1 1 auto !important; - } - .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-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; - } - .flex-md-wrap { - flex-wrap: wrap !important; - } - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !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; - } - .justify-content-md-evenly { - justify-content: space-evenly !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; - } - .order-md-first { - order: -1 !important; - } - .order-md-0 { - order: 0 !important; - } - .order-md-1 { - order: 1 !important; - } - .order-md-2 { - order: 2 !important; - } - .order-md-3 { - order: 3 !important; - } - .order-md-4 { - order: 4 !important; - } - .order-md-5 { - order: 5 !important; - } - .order-md-last { - order: 6 !important; - } - .m-md-0 { - margin: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mx-md-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-md-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-md-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-md-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-md-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-md-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-md-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-md-0 { - margin-top: 0 !important; - } - .mt-md-1 { - margin-top: 0.25rem !important; - } - .mt-md-2 { - margin-top: 0.5rem !important; - } - .mt-md-3 { - margin-top: 1rem !important; - } - .mt-md-4 { - margin-top: 1.5rem !important; - } - .mt-md-5 { - margin-top: 3rem !important; - } - .mt-md-auto { - margin-top: auto !important; - } - .me-md-0 { - margin-left: 0 !important; - } - .me-md-1 { - margin-left: 0.25rem !important; - } - .me-md-2 { - margin-left: 0.5rem !important; - } - .me-md-3 { - margin-left: 1rem !important; - } - .me-md-4 { - margin-left: 1.5rem !important; - } - .me-md-5 { - margin-left: 3rem !important; - } - .me-md-auto { - margin-left: auto !important; - } - .mb-md-0 { - margin-bottom: 0 !important; - } - .mb-md-1 { - margin-bottom: 0.25rem !important; - } - .mb-md-2 { - margin-bottom: 0.5rem !important; - } - .mb-md-3 { - margin-bottom: 1rem !important; - } - .mb-md-4 { - margin-bottom: 1.5rem !important; - } - .mb-md-5 { - margin-bottom: 3rem !important; - } - .mb-md-auto { - margin-bottom: auto !important; - } - .ms-md-0 { - margin-right: 0 !important; - } - .ms-md-1 { - margin-right: 0.25rem !important; - } - .ms-md-2 { - margin-right: 0.5rem !important; - } - .ms-md-3 { - margin-right: 1rem !important; - } - .ms-md-4 { - margin-right: 1.5rem !important; - } - .ms-md-5 { - margin-right: 3rem !important; - } - .ms-md-auto { - margin-right: auto !important; - } - .p-md-0 { - padding: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .px-md-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-md-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-md-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-md-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-md-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-md-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-md-0 { - padding-top: 0 !important; - } - .pt-md-1 { - padding-top: 0.25rem !important; - } - .pt-md-2 { - padding-top: 0.5rem !important; - } - .pt-md-3 { - padding-top: 1rem !important; - } - .pt-md-4 { - padding-top: 1.5rem !important; - } - .pt-md-5 { - padding-top: 3rem !important; - } - .pe-md-0 { - padding-left: 0 !important; - } - .pe-md-1 { - padding-left: 0.25rem !important; - } - .pe-md-2 { - padding-left: 0.5rem !important; - } - .pe-md-3 { - padding-left: 1rem !important; - } - .pe-md-4 { - padding-left: 1.5rem !important; - } - .pe-md-5 { - padding-left: 3rem !important; - } - .pb-md-0 { - padding-bottom: 0 !important; - } - .pb-md-1 { - padding-bottom: 0.25rem !important; - } - .pb-md-2 { - padding-bottom: 0.5rem !important; - } - .pb-md-3 { - padding-bottom: 1rem !important; - } - .pb-md-4 { - padding-bottom: 1.5rem !important; - } - .pb-md-5 { - padding-bottom: 3rem !important; - } - .ps-md-0 { - padding-right: 0 !important; - } - .ps-md-1 { - padding-right: 0.25rem !important; - } - .ps-md-2 { - padding-right: 0.5rem !important; - } - .ps-md-3 { - padding-right: 1rem !important; - } - .ps-md-4 { - padding-right: 1.5rem !important; - } - .ps-md-5 { - padding-right: 3rem !important; - } -} -@media (min-width: 992px) { - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-grid { - display: grid !important; - } - .d-lg-inline-grid { - display: inline-grid !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; - } - .d-lg-none { - display: none !important; - } - .flex-lg-fill { - flex: 1 1 auto !important; - } - .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-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; - } - .flex-lg-wrap { - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !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; - } - .justify-content-lg-evenly { - justify-content: space-evenly !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; - } - .order-lg-first { - order: -1 !important; - } - .order-lg-0 { - order: 0 !important; - } - .order-lg-1 { - order: 1 !important; - } - .order-lg-2 { - order: 2 !important; - } - .order-lg-3 { - order: 3 !important; - } - .order-lg-4 { - order: 4 !important; - } - .order-lg-5 { - order: 5 !important; - } - .order-lg-last { - order: 6 !important; - } - .m-lg-0 { - margin: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mx-lg-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-lg-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-lg-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-lg-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-lg-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-lg-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-lg-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-lg-0 { - margin-top: 0 !important; - } - .mt-lg-1 { - margin-top: 0.25rem !important; - } - .mt-lg-2 { - margin-top: 0.5rem !important; - } - .mt-lg-3 { - margin-top: 1rem !important; - } - .mt-lg-4 { - margin-top: 1.5rem !important; - } - .mt-lg-5 { - margin-top: 3rem !important; - } - .mt-lg-auto { - margin-top: auto !important; - } - .me-lg-0 { - margin-left: 0 !important; - } - .me-lg-1 { - margin-left: 0.25rem !important; - } - .me-lg-2 { - margin-left: 0.5rem !important; - } - .me-lg-3 { - margin-left: 1rem !important; - } - .me-lg-4 { - margin-left: 1.5rem !important; - } - .me-lg-5 { - margin-left: 3rem !important; - } - .me-lg-auto { - margin-left: auto !important; - } - .mb-lg-0 { - margin-bottom: 0 !important; - } - .mb-lg-1 { - margin-bottom: 0.25rem !important; - } - .mb-lg-2 { - margin-bottom: 0.5rem !important; - } - .mb-lg-3 { - margin-bottom: 1rem !important; - } - .mb-lg-4 { - margin-bottom: 1.5rem !important; - } - .mb-lg-5 { - margin-bottom: 3rem !important; - } - .mb-lg-auto { - margin-bottom: auto !important; - } - .ms-lg-0 { - margin-right: 0 !important; - } - .ms-lg-1 { - margin-right: 0.25rem !important; - } - .ms-lg-2 { - margin-right: 0.5rem !important; - } - .ms-lg-3 { - margin-right: 1rem !important; - } - .ms-lg-4 { - margin-right: 1.5rem !important; - } - .ms-lg-5 { - margin-right: 3rem !important; - } - .ms-lg-auto { - margin-right: auto !important; - } - .p-lg-0 { - padding: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .px-lg-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-lg-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-lg-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-lg-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-lg-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-lg-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-lg-0 { - padding-top: 0 !important; - } - .pt-lg-1 { - padding-top: 0.25rem !important; - } - .pt-lg-2 { - padding-top: 0.5rem !important; - } - .pt-lg-3 { - padding-top: 1rem !important; - } - .pt-lg-4 { - padding-top: 1.5rem !important; - } - .pt-lg-5 { - padding-top: 3rem !important; - } - .pe-lg-0 { - padding-left: 0 !important; - } - .pe-lg-1 { - padding-left: 0.25rem !important; - } - .pe-lg-2 { - padding-left: 0.5rem !important; - } - .pe-lg-3 { - padding-left: 1rem !important; - } - .pe-lg-4 { - padding-left: 1.5rem !important; - } - .pe-lg-5 { - padding-left: 3rem !important; - } - .pb-lg-0 { - padding-bottom: 0 !important; - } - .pb-lg-1 { - padding-bottom: 0.25rem !important; - } - .pb-lg-2 { - padding-bottom: 0.5rem !important; - } - .pb-lg-3 { - padding-bottom: 1rem !important; - } - .pb-lg-4 { - padding-bottom: 1.5rem !important; - } - .pb-lg-5 { - padding-bottom: 3rem !important; - } - .ps-lg-0 { - padding-right: 0 !important; - } - .ps-lg-1 { - padding-right: 0.25rem !important; - } - .ps-lg-2 { - padding-right: 0.5rem !important; - } - .ps-lg-3 { - padding-right: 1rem !important; - } - .ps-lg-4 { - padding-right: 1.5rem !important; - } - .ps-lg-5 { - padding-right: 3rem !important; - } -} -@media (min-width: 1200px) { - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-grid { - display: grid !important; - } - .d-xl-inline-grid { - display: inline-grid !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; - } - .d-xl-none { - display: none !important; - } - .flex-xl-fill { - flex: 1 1 auto !important; - } - .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-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; - } - .flex-xl-wrap { - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !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; - } - .justify-content-xl-evenly { - justify-content: space-evenly !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; - } - .order-xl-first { - order: -1 !important; - } - .order-xl-0 { - order: 0 !important; - } - .order-xl-1 { - order: 1 !important; - } - .order-xl-2 { - order: 2 !important; - } - .order-xl-3 { - order: 3 !important; - } - .order-xl-4 { - order: 4 !important; - } - .order-xl-5 { - order: 5 !important; - } - .order-xl-last { - order: 6 !important; - } - .m-xl-0 { - margin: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mx-xl-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-xl-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-xl-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-xl-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-xl-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-xl-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-xl-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xl-0 { - margin-top: 0 !important; - } - .mt-xl-1 { - margin-top: 0.25rem !important; - } - .mt-xl-2 { - margin-top: 0.5rem !important; - } - .mt-xl-3 { - margin-top: 1rem !important; - } - .mt-xl-4 { - margin-top: 1.5rem !important; - } - .mt-xl-5 { - margin-top: 3rem !important; - } - .mt-xl-auto { - margin-top: auto !important; - } - .me-xl-0 { - margin-left: 0 !important; - } - .me-xl-1 { - margin-left: 0.25rem !important; - } - .me-xl-2 { - margin-left: 0.5rem !important; - } - .me-xl-3 { - margin-left: 1rem !important; - } - .me-xl-4 { - margin-left: 1.5rem !important; - } - .me-xl-5 { - margin-left: 3rem !important; - } - .me-xl-auto { - margin-left: auto !important; - } - .mb-xl-0 { - margin-bottom: 0 !important; - } - .mb-xl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xl-3 { - margin-bottom: 1rem !important; - } - .mb-xl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xl-5 { - margin-bottom: 3rem !important; - } - .mb-xl-auto { - margin-bottom: auto !important; - } - .ms-xl-0 { - margin-right: 0 !important; - } - .ms-xl-1 { - margin-right: 0.25rem !important; - } - .ms-xl-2 { - margin-right: 0.5rem !important; - } - .ms-xl-3 { - margin-right: 1rem !important; - } - .ms-xl-4 { - margin-right: 1.5rem !important; - } - .ms-xl-5 { - margin-right: 3rem !important; - } - .ms-xl-auto { - margin-right: auto !important; - } - .p-xl-0 { - padding: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .px-xl-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-xl-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-xl-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-xl-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-xl-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-xl-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xl-0 { - padding-top: 0 !important; - } - .pt-xl-1 { - padding-top: 0.25rem !important; - } - .pt-xl-2 { - padding-top: 0.5rem !important; - } - .pt-xl-3 { - padding-top: 1rem !important; - } - .pt-xl-4 { - padding-top: 1.5rem !important; - } - .pt-xl-5 { - padding-top: 3rem !important; - } - .pe-xl-0 { - padding-left: 0 !important; - } - .pe-xl-1 { - padding-left: 0.25rem !important; - } - .pe-xl-2 { - padding-left: 0.5rem !important; - } - .pe-xl-3 { - padding-left: 1rem !important; - } - .pe-xl-4 { - padding-left: 1.5rem !important; - } - .pe-xl-5 { - padding-left: 3rem !important; - } - .pb-xl-0 { - padding-bottom: 0 !important; - } - .pb-xl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xl-3 { - padding-bottom: 1rem !important; - } - .pb-xl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xl-5 { - padding-bottom: 3rem !important; - } - .ps-xl-0 { - padding-right: 0 !important; - } - .ps-xl-1 { - padding-right: 0.25rem !important; - } - .ps-xl-2 { - padding-right: 0.5rem !important; - } - .ps-xl-3 { - padding-right: 1rem !important; - } - .ps-xl-4 { - padding-right: 1.5rem !important; - } - .ps-xl-5 { - padding-right: 3rem !important; - } -} -@media (min-width: 1400px) { - .d-xxl-inline { - display: inline !important; - } - .d-xxl-inline-block { - display: inline-block !important; - } - .d-xxl-block { - display: block !important; - } - .d-xxl-grid { - display: grid !important; - } - .d-xxl-inline-grid { - display: inline-grid !important; - } - .d-xxl-table { - display: table !important; - } - .d-xxl-table-row { - display: table-row !important; - } - .d-xxl-table-cell { - display: table-cell !important; - } - .d-xxl-flex { - display: flex !important; - } - .d-xxl-inline-flex { - display: inline-flex !important; - } - .d-xxl-none { - display: none !important; - } - .flex-xxl-fill { - flex: 1 1 auto !important; - } - .flex-xxl-row { - flex-direction: row !important; - } - .flex-xxl-column { - flex-direction: column !important; - } - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; - } - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; - } - .flex-xxl-grow-0 { - flex-grow: 0 !important; - } - .flex-xxl-grow-1 { - flex-grow: 1 !important; - } - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; - } - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; - } - .flex-xxl-wrap { - flex-wrap: wrap !important; - } - .flex-xxl-nowrap { - flex-wrap: nowrap !important; - } - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .justify-content-xxl-start { - justify-content: flex-start !important; - } - .justify-content-xxl-end { - justify-content: flex-end !important; - } - .justify-content-xxl-center { - justify-content: center !important; - } - .justify-content-xxl-between { - justify-content: space-between !important; - } - .justify-content-xxl-around { - justify-content: space-around !important; - } - .justify-content-xxl-evenly { - justify-content: space-evenly !important; - } - .align-items-xxl-start { - align-items: flex-start !important; - } - .align-items-xxl-end { - align-items: flex-end !important; - } - .align-items-xxl-center { - align-items: center !important; - } - .align-items-xxl-baseline { - align-items: baseline !important; - } - .align-items-xxl-stretch { - align-items: stretch !important; - } - .align-content-xxl-start { - align-content: flex-start !important; - } - .align-content-xxl-end { - align-content: flex-end !important; - } - .align-content-xxl-center { - align-content: center !important; - } - .align-content-xxl-between { - align-content: space-between !important; - } - .align-content-xxl-around { - align-content: space-around !important; - } - .align-content-xxl-stretch { - align-content: stretch !important; - } - .align-self-xxl-auto { - align-self: auto !important; - } - .align-self-xxl-start { - align-self: flex-start !important; - } - .align-self-xxl-end { - align-self: flex-end !important; - } - .align-self-xxl-center { - align-self: center !important; - } - .align-self-xxl-baseline { - align-self: baseline !important; - } - .align-self-xxl-stretch { - align-self: stretch !important; - } - .order-xxl-first { - order: -1 !important; - } - .order-xxl-0 { - order: 0 !important; - } - .order-xxl-1 { - order: 1 !important; - } - .order-xxl-2 { - order: 2 !important; - } - .order-xxl-3 { - order: 3 !important; - } - .order-xxl-4 { - order: 4 !important; - } - .order-xxl-5 { - order: 5 !important; - } - .order-xxl-last { - order: 6 !important; - } - .m-xxl-0 { - margin: 0 !important; - } - .m-xxl-1 { - margin: 0.25rem !important; - } - .m-xxl-2 { - margin: 0.5rem !important; - } - .m-xxl-3 { - margin: 1rem !important; - } - .m-xxl-4 { - margin: 1.5rem !important; - } - .m-xxl-5 { - margin: 3rem !important; - } - .m-xxl-auto { - margin: auto !important; - } - .mx-xxl-0 { - margin-left: 0 !important; - margin-right: 0 !important; - } - .mx-xxl-1 { - margin-left: 0.25rem !important; - margin-right: 0.25rem !important; - } - .mx-xxl-2 { - margin-left: 0.5rem !important; - margin-right: 0.5rem !important; - } - .mx-xxl-3 { - margin-left: 1rem !important; - margin-right: 1rem !important; - } - .mx-xxl-4 { - margin-left: 1.5rem !important; - margin-right: 1.5rem !important; - } - .mx-xxl-5 { - margin-left: 3rem !important; - margin-right: 3rem !important; - } - .mx-xxl-auto { - margin-left: auto !important; - margin-right: auto !important; - } - .my-xxl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - .my-xxl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - .my-xxl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - .my-xxl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - .my-xxl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - .my-xxl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - .my-xxl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - .mt-xxl-0 { - margin-top: 0 !important; - } - .mt-xxl-1 { - margin-top: 0.25rem !important; - } - .mt-xxl-2 { - margin-top: 0.5rem !important; - } - .mt-xxl-3 { - margin-top: 1rem !important; - } - .mt-xxl-4 { - margin-top: 1.5rem !important; - } - .mt-xxl-5 { - margin-top: 3rem !important; - } - .mt-xxl-auto { - margin-top: auto !important; - } - .me-xxl-0 { - margin-left: 0 !important; - } - .me-xxl-1 { - margin-left: 0.25rem !important; - } - .me-xxl-2 { - margin-left: 0.5rem !important; - } - .me-xxl-3 { - margin-left: 1rem !important; - } - .me-xxl-4 { - margin-left: 1.5rem !important; - } - .me-xxl-5 { - margin-left: 3rem !important; - } - .me-xxl-auto { - margin-left: auto !important; - } - .mb-xxl-0 { - margin-bottom: 0 !important; - } - .mb-xxl-1 { - margin-bottom: 0.25rem !important; - } - .mb-xxl-2 { - margin-bottom: 0.5rem !important; - } - .mb-xxl-3 { - margin-bottom: 1rem !important; - } - .mb-xxl-4 { - margin-bottom: 1.5rem !important; - } - .mb-xxl-5 { - margin-bottom: 3rem !important; - } - .mb-xxl-auto { - margin-bottom: auto !important; - } - .ms-xxl-0 { - margin-right: 0 !important; - } - .ms-xxl-1 { - margin-right: 0.25rem !important; - } - .ms-xxl-2 { - margin-right: 0.5rem !important; - } - .ms-xxl-3 { - margin-right: 1rem !important; - } - .ms-xxl-4 { - margin-right: 1.5rem !important; - } - .ms-xxl-5 { - margin-right: 3rem !important; - } - .ms-xxl-auto { - margin-right: auto !important; - } - .p-xxl-0 { - padding: 0 !important; - } - .p-xxl-1 { - padding: 0.25rem !important; - } - .p-xxl-2 { - padding: 0.5rem !important; - } - .p-xxl-3 { - padding: 1rem !important; - } - .p-xxl-4 { - padding: 1.5rem !important; - } - .p-xxl-5 { - padding: 3rem !important; - } - .px-xxl-0 { - padding-left: 0 !important; - padding-right: 0 !important; - } - .px-xxl-1 { - padding-left: 0.25rem !important; - padding-right: 0.25rem !important; - } - .px-xxl-2 { - padding-left: 0.5rem !important; - padding-right: 0.5rem !important; - } - .px-xxl-3 { - padding-left: 1rem !important; - padding-right: 1rem !important; - } - .px-xxl-4 { - padding-left: 1.5rem !important; - padding-right: 1.5rem !important; - } - .px-xxl-5 { - padding-left: 3rem !important; - padding-right: 3rem !important; - } - .py-xxl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - .py-xxl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - .py-xxl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - .py-xxl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - .py-xxl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - .py-xxl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - .pt-xxl-0 { - padding-top: 0 !important; - } - .pt-xxl-1 { - padding-top: 0.25rem !important; - } - .pt-xxl-2 { - padding-top: 0.5rem !important; - } - .pt-xxl-3 { - padding-top: 1rem !important; - } - .pt-xxl-4 { - padding-top: 1.5rem !important; - } - .pt-xxl-5 { - padding-top: 3rem !important; - } - .pe-xxl-0 { - padding-left: 0 !important; - } - .pe-xxl-1 { - padding-left: 0.25rem !important; - } - .pe-xxl-2 { - padding-left: 0.5rem !important; - } - .pe-xxl-3 { - padding-left: 1rem !important; - } - .pe-xxl-4 { - padding-left: 1.5rem !important; - } - .pe-xxl-5 { - padding-left: 3rem !important; - } - .pb-xxl-0 { - padding-bottom: 0 !important; - } - .pb-xxl-1 { - padding-bottom: 0.25rem !important; - } - .pb-xxl-2 { - padding-bottom: 0.5rem !important; - } - .pb-xxl-3 { - padding-bottom: 1rem !important; - } - .pb-xxl-4 { - padding-bottom: 1.5rem !important; - } - .pb-xxl-5 { - padding-bottom: 3rem !important; - } - .ps-xxl-0 { - padding-right: 0 !important; - } - .ps-xxl-1 { - padding-right: 0.25rem !important; - } - .ps-xxl-2 { - padding-right: 0.5rem !important; - } - .ps-xxl-3 { - padding-right: 1rem !important; - } - .ps-xxl-4 { - padding-right: 1.5rem !important; - } - .ps-xxl-5 { - padding-right: 3rem !important; - } -} -@media print { - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-grid { - display: grid !important; - } - .d-print-inline-grid { - display: inline-grid !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; - } - .d-print-none { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap-grid.rtl.css.map */ \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.css.map b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.css.map deleted file mode 100644 index 08430325..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","bootstrap-grid.css","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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EE,mBAAA;EJ6+BR;EI1+BM;;IAEE,mBAAA;EJ4+BR;AACF;AKpiCQ;EAOI,0BAAA;ALgiCZ;;AKviCQ;EAOI,gCAAA;ALoiCZ;;AK3iCQ;EAOI,yBAAA;ALwiCZ;;AK/iCQ;EAOI,wBAAA;AL4iCZ;;AKnjCQ;EAOI,+BAAA;ALgjCZ;;AKvjCQ;EAOI,yBAAA;ALojCZ;;AK3jCQ;EAOI,6BAAA;ALwjCZ;;AK/jCQ;EAOI,8BAAA;AL4jCZ;;AKnkCQ;EAOI,wBAAA;ALgkCZ;;AKvkCQ;EAOI,+BAAA;ALokCZ;;AK3kCQ;EAOI,wBAAA;ALwkCZ;;AK/kCQ;EAOI,yBAAA;AL4kCZ;;AKnlCQ;EAOI,8BAAA;ALglCZ;;AKvlCQ;EAOI,iCAAA;ALolCZ;;AK3lCQ;EAOI,sCAAA;ALwlCZ;;AK/lCQ;EAOI,yCAAA;AL4lCZ;;AKnmCQ;EAOI,uBAAA;ALgmCZ;;AKvmCQ;EAOI,uBAAA;ALomCZ;;AK3mCQ;EAOI,yBAAA;ALwmCZ;;AK/mCQ;EAOI,yBAAA;AL4mCZ;;AKnnCQ;EAOI,0BAAA;ALgnCZ;;AKvnCQ;EAOI,4BAAA;ALonCZ;;AK3nCQ;EAOI,kCAAA;ALwnCZ;;AK/nCQ;EAOI,sCAAA;AL4nCZ;;AKnoCQ;EAOI,oCAAA;ALgoCZ;;AKvoCQ;EAOI,kCAAA;ALooCZ;;AK3oCQ;EAOI,yCAAA;ALwoCZ;;AK/oCQ;EAOI,wCAAA;AL4oCZ;;AKnpCQ;EAOI,wCAAA;ALgpCZ;;AKvpCQ;EAOI,kCAAA;ALopCZ;;AK3pCQ;EAOI,gCAAA;ALwpCZ;;AK/pCQ;EAOI,8BAAA;AL4pCZ;;AKnqCQ;EAOI,gCAAA;ALgqCZ;;AKvqCQ;EAOI,+BAAA;ALoqCZ;;AK3qCQ;EAOI,oCAAA;ALwqCZ;;AK/qCQ;EAOI,kCAAA;AL4qCZ;;AKnrCQ;EAOI,gCAAA;ALgrCZ;;AKvrCQ;EAOI,uCAAA;ALorCZ;;AK3rCQ;EAOI,sCAAA;ALwrCZ;;AK/rCQ;EAOI,iCAAA;AL4rCZ;;AKnsCQ;EAOI,2BAAA;ALgsCZ;;AKvsCQ;EAOI,iCAAA;ALosCZ;;AK3sCQ;EAOI,+BAAA;ALwsCZ;;AK/sCQ;EAOI,6BAAA;AL4sCZ;;AKntCQ;EA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;AL8iDZ;;AKrjDQ;EAOI,4BAAA;ALkjDZ;;AKzjDQ;EAOI,0BAAA;ALsjDZ;;AK7jDQ;EAOI,gCAAA;AL0jDZ;;AKjkDQ;EAOI,+BAAA;AL8jDZ;;AKrkDQ;EAOI,6BAAA;ALkkDZ;;AKzkDQ;EAOI,+BAAA;ALskDZ;;AK7kDQ;EAOI,6BAAA;AL0kDZ;;AKjlDQ;EAOI,4BAAA;AL8kDZ;;AKrlDQ;EAOI,kCAAA;ALklDZ;;AKzlDQ;EAOI,iCAAA;ALslDZ;;AK7lDQ;EAOI,+BAAA;AL0lDZ;;AKjmDQ;EAOI,iCAAA;AL8lDZ;;AKrmDQ;EAOI,+BAAA;ALkmDZ;;AKzmDQ;EAOI,2BAAA;ALsmDZ;;AK7mDQ;EAOI,iCAAA;AL0mDZ;;AKjnDQ;EAOI,gCAAA;AL8mDZ;;AKrnDQ;EAOI,8BAAA;ALknDZ;;AKznDQ;EAOI,gCAAA;ALsnDZ;;AK7nDQ;EAOI,8BAAA;AL0nDZ;;ACpoDI;EIGI;IAOI,0BAAA;EL+nDV;EKtoDM;IAOI,gCAAA;ELkoDV;EKzoDM;IAOI,yBAAA;ELqoDV;EK5oDM;IAOI,wBAAA;ELwoDV;EK/oDM;IAOI,+BAAA;EL2oDV;EKlpDM;IAOI,yBAAA;EL8oDV;EKrpDM;IAOI,6BAAA;ELipDV;EKxpDM;IAOI,8BAAA;ELopDV;EK3pDM;IAOI,wBAAA;ELupDV;EK9pDM;IAOI,+BAAA;EL0pDV;EKjqDM;IAOI,wBAAA;EL6pDV;EKpqDM;IAOI,yBAAA;ELgqDV;EKvqDM;IAOI,8BAAA;ELmqDV;EK1qDM;IAOI,iCAAA;ELsqDV;EK7qDM;IAOI,sCAAA;ELyqDV;EKhrDM;IAOI,yCAAA;EL4qDV;EKnrDM;IAOI,uBAAA;EL+qDV;EKtrDM;IAOI,uBAAA;ELkrDV;EKzrDM;IAOI,yBAAA;ELqrDV;EK5rDM;IAOI,yBAAA;ELwrDV;EK/rDM;IAOI,0BAAA;EL2rDV;EKlsDM;IAOI,4BAAA;EL8rDV;EKrsDM;IAOI,kCAAA;ELisDV;EKxsDM;IAOI,sCAAA;ELosDV;EK3sDM;IAOI,oCAAA;ELusDV;EK9sDM;IAOI,kCAAA;EL0sDV;EKjtDM;IAOI,yCAAA;EL6sDV;EKptDM;IAOI,wCAAA;ELgtDV;EKvtDM;IAOI,wCAAA;ELmtDV;EK1tDM;IAOI,kCAAA;ELstDV;EK7tDM;IAOI,gCAAA;ELytDV;EKhuDM;IAOI,8BAAA;EL4tDV;EKnuDM;IAOI,gCAAA;EL+tDV;EKtuDM;IAOI,+BAAA;ELkuDV;EKzuDM;IAOI,oCAAA;ELquDV;EK5uDM;IAOI,kCAAA;ELwuDV;EK/uDM;IAOI,gCAAA;EL2uDV;EKlvDM;IAOI,uCAAA;EL8uDV;EKrvDM;IAOI,sCAAA;ELivDV;EKxvDM;IAOI,iCAAA;ELovDV;EK3vDM;IAOI,2BAAA;ELuvDV;EK9vDM;IAOI,iCAAA;EL0vDV;EKjwDM;IAOI,+BAAA;EL6vDV;EKpwDM;IAOI,6BAAA;ELgwDV;EKvwDM;IAOI,+BAAA;ELmwDV;EK1wDM;IAOI,8BAAA;ELswDV;EK7wDM;IAOI,oBAAA;ELywDV;EKhxDM;IAOI,mBAAA;EL4wDV;EKnxDM;IAOI,mBAAA;EL+wDV;EKtxDM;IAOI,mBAAA;ELkxDV;EKzxDM;IAOI,mBAAA;ELqxDV;EK5xDM;IAOI,mBAAA;ELwxDV;EK/xDM;IAOI,mBAAA;EL2xDV;EKlyDM;IAOI,mBAAA;EL8xDV;EKryDM;IAOI,oBAAA;ELiyDV;EKxyDM;IAOI,0BAAA;ELoyDV;EK3yDM;IAOI,yBAAA;ELuyDV;EK9yDM;IAOI,uBAAA;EL0yDV;EKjzDM;IAOI,yBAAA;EL6yDV;EKpzDM;IAOI,uBAAA;ELgzDV;EKvzDM;IAOI,uBAAA;ELmzDV;EK1zDM;IAOI,yBAAA;IAAA,0BAAA;ELuzDV;EK9zDM;IAOI,+BAAA;IAAA,gCAAA;EL2zDV;EKl0DM;IAOI,8BAAA;IAAA,+BAAA;EL+zDV;EKt0DM;IAOI,4BAAA;IAAA,6BAAA;ELm0DV;EK10DM;IAOI,8BAAA;IAAA,+BAAA;ELu0DV;EK90DM;IAOI,4BAAA;IAAA,6BAAA;EL20DV;EKl1DM;IAOI,4BAAA;IAAA,6BAAA;EL+0DV;EKt1DM;IAOI,wBAAA;IAAA,2BAAA;ELm1DV;EK11DM;IAOI,8BAAA;IAAA,iCAAA;ELu1DV;EK91DM;IAOI,6BAAA;IAAA,gCAAA;EL21DV;EKl2DM;IAOI,2BAAA;IAAA,8BAAA;EL+1DV;EKt2DM;IAOI,6BAAA;IAAA,gCAAA;ELm2DV;EK12DM;IAOI,2BAAA;IAAA,8BAAA;ELu2DV;EK92DM;IAOI,2BAAA;IAAA,8BAAA;EL22DV;EKl3DM;IAOI,wBAAA;EL82DV;EKr3DM;IAOI,8BAAA;ELi3DV;EKx3DM;IAOI,6BAAA;ELo3DV;EK33DM;IAOI,2BAAA;ELu3DV;EK93DM;IAOI,6BAAA;EL03DV;EKj4DM;IAOI,2BAAA;EL63DV;EKp4DM;IAOI,2BAAA;ELg4DV;EKv4DM;IAOI,yBAAA;ELm4DV;EK14DM;IAOI,+BAAA;ELs4DV;EK74DM;IAOI,8BAAA;ELy4DV;EKh5DM;IAOI,4BAAA;EL44DV;EKn5DM;IAOI,8BAAA;EL+4DV;EKt5DM;IAOI,4BAAA;ELk5DV;EKz5DM;IAOI,4BAAA;ELq5DV;EK55DM;IAOI,2BAAA;ELw5DV;EK/5DM;IAOI,iCAAA;EL25DV;EKl6DM;IAOI,gCAAA;EL85DV;EKr6DM;IAOI,8BAAA;ELi6DV;EKx6DM;IAOI,gCAAA;ELo6DV;EK36DM;IAOI,8BAAA;ELu6DV;EK96DM;IAOI,8BAAA;EL06DV;EKj7DM;IAOI,0BAAA;EL66DV;EKp7DM;IAOI,gCAAA;ELg7DV;EKv7DM;IAOI,+BAAA;ELm7DV;EK17DM;IAOI,6BAAA;ELs7DV;EK77DM;IAOI,+BAAA;ELy7DV;EKh8DM;IAOI,6BAAA;EL47DV;EKn8DM;IAOI,6BAAA;EL+7DV;EKt8DM;IAOI,qBAAA;ELk8DV;EKz8DM;IAOI,2BAAA;ELq8DV;EK58DM;IAOI,0BAAA;ELw8DV;EK/8DM;IAOI,wBAAA;EL28DV;EKl9DM;IAOI,0BAAA;EL88DV;EKr9DM;IAOI,wBAAA;ELi9DV;EKx9DM;IAOI,0BAAA;IAAA,2BAAA;ELq9DV;EK59DM;IAOI,gCAAA;IAAA,iCAAA;ELy9DV;EKh+DM;IAOI,+BAAA;IAAA,gCAAA;EL69DV;EKp+DM;IAOI,6BAAA;IAAA,8BAAA;ELi+DV;EKx+DM;IAOI,+BAAA;IAAA,gCAAA;ELq+DV;EK5+DM;IAOI,6BAAA;IAAA,8BAAA;ELy+DV;EKh/DM;IAOI,yBAAA;IAAA,4BAAA;EL6+DV;EKp/DM;IAOI,+BAAA;IAAA,kCAAA;ELi/DV;EKx/DM;IAOI,8BAAA;IAAA,iCAAA;ELq/DV;EK5/DM;IAOI,4BAAA;IAAA,+BAAA;ELy/DV;EKhgEM;IAOI,8BAAA;IAAA,iCAAA;EL6/DV;EKpgEM;IAOI,4BAAA;IAAA,+BAAA;ELigEV;EKxgEM;IAOI,yBAAA;ELogEV;EK3gEM;IAOI,+BAAA;ELugEV;EK9gEM;IAOI,8BAAA;EL0gEV;EKjhEM;IAOI,4BAAA;EL6gEV;EKphEM;IAOI,8BAAA;ELghEV;EKvhEM;IAOI,4BAAA;ELmhEV;EK1hEM;IAOI,0BAAA;ELshEV;EK7hEM;IAOI,gCAAA;ELyhEV;EKhiEM;IAOI,+BAAA;EL4hEV;EKniEM;IAOI,6BAAA;EL+hEV;EKtiEM;IAOI,+BAAA;ELkiEV;EKziEM;IAOI,6BAAA;ELqiEV;EK5iEM;IAOI,4BAAA;ELwiEV;EK/iEM;IAOI,kCAAA;EL2iEV;EKljEM;IAOI,iCAAA;EL8iEV;EKrjEM;IAOI,+BAAA;ELijEV;EKxjEM;IAOI,iCAAA;ELojEV;EK3jEM;IAOI,+BAAA;ELujEV;EK9jEM;IAOI,2BAAA;EL0jEV;EKjkEM;IAOI,iCAAA;EL6jEV;EKpkEM;IAOI,gCAAA;ELgkEV;EKvkEM;IAOI,8BAAA;ELmkEV;EK1kEM;IAOI,gCAAA;ELskEV;EK7kEM;IAOI,8BAAA;ELykEV;AACF;ACplEI;EIGI;IAOI,0BAAA;EL8kEV;EKrlEM;IAOI,gCAAA;ELilEV;EKxlEM;IAOI,yBAAA;ELolEV;EK3lEM;IAOI,wBAAA;ELulEV;EK9lEM;IAOI,+BAAA;EL0lEV;EKjmEM;IAOI,yBAAA;EL6lEV;EKpmEM;IAOI,6BAAA;ELgmEV;EKvmEM;IAOI,8BAAA;ELmmEV;EK1mEM;IAOI,wBAAA;ELsmEV;EK7mEM;IAOI,+BAAA;ELymEV;EKhnEM;IAOI,wBAAA;EL4mEV;EKnnEM;IAOI,yBAAA;EL+mEV;EKtnEM;IAOI,8BAAA;ELknEV;EKznEM;IAOI,iCAAA;ELqnEV;EK5nEM;IAOI,sCAAA;ELwnEV;EK/nEM;IAOI,yCAAA;EL2nEV;EKloEM;IAOI,uBAAA;EL8nEV;EKroEM;IAOI,uBAAA;ELioEV;EKxoEM;IAOI,yBAAA;ELooEV;EK3oEM;IAOI,yBAAA;ELuoEV;EK9oEM;IAOI,0BAAA;EL0oEV;EKjpEM;IAOI,4BAAA;EL6oEV;EKppEM;IAOI,kCAAA;ELgpEV;EKvpEM;IAOI,sCAAA;ELmpEV;EK1pEM;IAOI,oCAAA;ELspEV;EK7pEM;IAOI,kCAAA;ELypEV;EKhqEM;IAOI,yCAAA;EL4pEV;EKnqEM;IAOI,wCAAA;EL+pEV;EKtqEM;IAOI,wCAAA;ELkqEV;EKzqEM;IAOI,kCAAA;ELqqEV;EK5qEM;IAOI,gCAAA;ELwqEV;EK/qEM;IAOI,8BAAA;EL2qEV;EKlrEM;IAOI,gCAAA;EL8qEV;EKrrEM;IAOI,+BAAA;ELirEV;EKxrEM;IAOI,oCAAA;ELorEV;EK3rEM;IAOI,kCAAA;ELurEV;EK9rEM;IAOI,gCAAA;EL0rEV;EKjsEM;IAOI,uCAAA;EL6rEV;EKpsEM;IAOI,sCAAA;ELgsEV;EKvsEM;IAOI,iCAAA;ELmsEV;EK1sEM;IAOI,2BAAA;ELssEV;EK7sEM;IAOI,iCAAA;ELysEV;EKhtEM;IAOI,+BAAA;EL4sEV;EKntEM;IAOI,6BAAA;EL+sEV;EKttEM;IAOI,+BAAA;ELktEV;EKztEM;IAOI,8BAAA;ELqtEV;EK5tEM;IAOI,oBAAA;ELwtEV;EK/tEM;IAOI,mBAAA;EL2tEV;EKluEM;IAOI,mBAAA;EL8tEV;EKruEM;IAOI,mBAAA;ELiuEV;EKxuEM;IAOI,mBAAA;ELouEV;EK3uEM;IAOI,mBAAA;ELuuEV;EK9uEM;IAOI,mBAAA;EL0uEV;EKjvEM;IAOI,mBAAA;EL6uEV;EKpvEM;IAOI,oBAAA;ELgvEV;EKvvEM;IAOI,0BAAA;ELmvEV;EK1vEM;IAOI,yBAAA;ELsvEV;EK7vEM;IAOI,uBAAA;ELyvEV;EKhwEM;IAOI,yBAAA;EL4vEV;EKnwEM;IAOI,uBAAA;EL+vEV;EKtwEM;IAOI,uBAAA;ELkwEV;EKzwEM;IAOI,yBAAA;IAAA,0BAAA;ELswEV;EK7wEM;IAO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EKviFM;IAOI,yBAAA;ELmiFV;EK1iFM;IAOI,wBAAA;ELsiFV;EK7iFM;IAOI,+BAAA;ELyiFV;EKhjFM;IAOI,yBAAA;EL4iFV;EKnjFM;IAOI,6BAAA;EL+iFV;EKtjFM;IAOI,8BAAA;ELkjFV;EKzjFM;IAOI,wBAAA;ELqjFV;EK5jFM;IAOI,+BAAA;ELwjFV;EK/jFM;IAOI,wBAAA;EL2jFV;EKlkFM;IAOI,yBAAA;EL8jFV;EKrkFM;IAOI,8BAAA;ELikFV;EKxkFM;IAOI,iCAAA;ELokFV;EK3kFM;IAOI,sCAAA;ELukFV;EK9kFM;IAOI,yCAAA;EL0kFV;EKjlFM;IAOI,uBAAA;EL6kFV;EKplFM;IAOI,uBAAA;ELglFV;EKvlFM;IAOI,yBAAA;ELmlFV;EK1lFM;IAOI,yBAAA;ELslFV;EK7lFM;IAOI,0BAAA;ELylFV;EKhmFM;IAOI,4BAAA;EL4lFV;EKnmFM;IAOI,kCAAA;EL+lFV;EKtmFM;IAOI,sCAAA;ELkmFV;EKzmFM;IAOI,oCAAA;ELqmFV;EK5mFM;IAOI,kCAAA;ELwmFV;EK/mFM;IAOI,yCAAA;EL2mFV;EKlnFM;IAOI,wCAAA;EL8mFV;EKrnFM;IAOI,wCAAA;ELinFV;EKxnFM;IAOI,kCAAA;ELonFV;EK3nFM;IAOI,gCAAA;ELunFV;EK9nFM;IAOI,8BAAA;EL0nFV;EKjoFM;IAOI,gCAAA;EL6nFV;EKpoFM;IAOI,+BAAA;ELgoFV;EKvoFM;IAOI,oCAAA;ELmoFV;EK1oFM;IAOI,kCAAA;ELsoFV;EK7oFM;IAOI,gCAAA;ELyoFV;EKhpFM;IAOI,uCAAA;EL4oFV;EKnpFM;IAOI,sCAAA;EL+oFV;EKtpFM;IAOI,iCAAA;ELkpFV;EKzpFM;IAOI,2BAAA;ELqpFV;EK5pFM;IAOI,iCAAA;ELwpFV;EK/pFM;IAOI,+BAAA;EL2pFV;EKlqFM;IAOI,6BAAA;EL8pFV;EKrqFM;IAOI,+BAAA;ELiqFV;EKxqFM;IAOI,8BAAA;ELoqFV;EK3qFM;IAOI,oBAAA;ELuqFV;EK9qFM;IAOI,mBAAA;EL0qFV;EKjrFM;IAOI,mBAAA;EL6qFV;EKprFM;IAOI,mBAAA;ELgrFV;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AAA;ELy8FV;EKh9FM;IAOI,iCAAA;EL48FV;EKn9FM;IAOI,+BAAA;EL+8FV;EKt9FM;IAOI,iCAAA;ELk9FV;EKz9FM;IAOI,+BAAA;ELq9FV;EK59FM;IAOI,2BAAA;ELw9FV;EK/9FM;IAOI,iCAAA;EL29FV;EKl+FM;IAOI,gCAAA;EL89FV;EKr+FM;IAOI,8BAAA;ELi+FV;EKx+FM;IAOI,gCAAA;ELo+FV;EK3+FM;IAOI,8BAAA;ELu+FV;AACF;ACl/FI;EIGI;IAOI,0BAAA;EL4+FV;EKn/FM;IAOI,gCAAA;EL++FV;EKt/FM;IAOI,yBAAA;ELk/FV;EKz/FM;IAOI,wBAAA;ELq/FV;EK5/FM;IAOI,+BAAA;ELw/FV;EK//FM;IAOI,yBAAA;EL2/FV;EKlgGM;IAOI,6BAAA;EL8/FV;EKrgGM;IAOI,8BAAA;ELigGV;EKxgGM;IAOI,wBAAA;ELogGV;EK3gGM;IAOI,+BAAA;ELugGV;EK9gGM;IAOI,wBAAA;EL0gGV;EKjhGM;IAOI,yBAAA;EL6gGV;EKphGM;IAOI,8BAAA;ELghGV;EKvhGM;IAOI,iCAAA;ELmhGV;EK1hGM;IAOI,sCAAA;ELshGV;EK7hGM;IAOI,yCAAA;ELyhGV;EKhiGM;IAOI,uBAAA;EL4hGV;EKniGM;IAOI,uBAAA;EL+hGV;EKtiGM;IAOI,yBAAA;ELkiGV;EKziGM;IAOI,yBAAA;ELqiGV;EK5iGM;IAOI,0BAAA;ELwiGV;EK/iGM;IAOI,4BAAA;EL2iGV;EKljGM;IAOI,kCAAA;EL8iGV;EKrjGM;IAOI,sCAAA;ELijGV;EKxjGM;IAOI,oCAAA;ELojGV;EK3jGM;IAOI,kCAAA;ELujGV;EK9jGM;IAOI,yCAAA;EL0jGV;EKjkGM;IAOI,wCAAA;EL6jGV;EKpkGM;IAOI,wCAAA;ELgkGV;EKvkGM;IAOI,kCAAA;ELmkGV;EK1kGM;IAOI,gCAAA;ELskGV;EK7kGM;IAOI,8BAAA;ELykGV;EKhlGM;IAOI,gCAAA;EL4kGV;EKnlGM;IAOI,+BAAA;EL+kGV;EKtlGM;IAOI,oCAAA;ELklGV;EKzlGM;IAOI,kCAAA;ELqlGV;EK5lGM;IAOI,gCAAA;ELwlGV;EK/l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ELi3GV;EKx3GM;IAOI,+BAAA;ELo3GV;EK33GM;IAOI,8BAAA;ELu3GV;EK93GM;IAOI,4BAAA;EL03GV;EKj4GM;IAOI,8BAAA;EL63GV;EKp4GM;IAOI,4BAAA;ELg4GV;EKv4GM;IAOI,0BAAA;ELm4GV;EK14GM;IAOI,gCAAA;ELs4GV;EK74GM;IAOI,+BAAA;ELy4GV;EKh5GM;IAOI,6BAAA;EL44GV;EKn5GM;IAOI,+BAAA;EL+4GV;EKt5GM;IAOI,6BAAA;ELk5GV;EKz5GM;IAOI,4BAAA;ELq5GV;EK55GM;IAOI,kCAAA;ELw5GV;EK/5GM;IAOI,iCAAA;EL25GV;EKl6GM;IAOI,+BAAA;EL85GV;EKr6GM;IAOI,iCAAA;ELi6GV;EKx6GM;IAOI,+BAAA;ELo6GV;EK36GM;IAOI,2BAAA;ELu6GV;EK96GM;IAOI,iCAAA;EL06GV;EKj7GM;IAOI,gCAAA;EL66GV;EKp7GM;IAOI,8BAAA;ELg7GV;EKv7GM;IAOI,gCAAA;ELm7GV;EK17GM;IAOI,8BAAA;ELs7GV;AACF;ACj8GI;EIGI;IAOI,0BAAA;EL27GV;EKl8GM;IAOI,gCAAA;EL87GV;EKr8GM;IAOI,yBAAA;ELi8GV;EKx8GM;IAOI,wBAAA;ELo8GV;EK38GM;IAOI,+BAAA;ELu8GV;EK98GM;IAOI,yBAAA;EL08GV;EKj9GM;IAOI,6BAAA;EL68GV;EKp9GM;IAOI,8BAAA;ELg9GV;EKv9GM;IAOI,wBAAA;ELm9GV;EK19GM;IAOI,+BAAA;ELs9GV;EK79GM;IAOI,wBAAA;ELy9GV;EKh+GM;IAOI,yBAAA;EL49GV;EKn+GM;IAOI,8BAAA;EL+9GV;EKt+GM;IAOI,iCAAA;ELk+GV;EKz+GM;IAOI,sCAAA;ELq+GV;EK5+GM;IAOI,yCAAA;ELw+GV;EK/+GM;IAOI,uBAAA;EL2+GV;EKl/GM;IAOI,uBAAA;EL8+GV;EKr/GM;IAOI,yBAAA;ELi/GV;EKx/GM;IAOI,yBAAA;ELo/GV;EK3/GM;IAOI,0BAAA;ELu/GV;EK9/GM;IAOI,4BAAA;EL0/GV;EKjgHM;IAOI,kCAAA;EL6/GV;EKpgHM;IAOI,sCAAA;ELggHV;EKvgHM;I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","file":"bootstrap-grid.rtl.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.min.css b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.min.css deleted file mode 100644 index d678024b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-left:auto;margin-right:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-left:calc(-.5 * var(--bs-gutter-x));margin-right:calc(-.5 * var(--bs-gutter-x))}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-right:8.33333333%}.offset-2{margin-right:16.66666667%}.offset-3{margin-right:25%}.offset-4{margin-right:33.33333333%}.offset-5{margin-right:41.66666667%}.offset-6{margin-right:50%}.offset-7{margin-right:58.33333333%}.offset-8{margin-right:66.66666667%}.offset-9{margin-right:75%}.offset-10{margin-right:83.33333333%}.offset-11{margin-right:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-right:0}.offset-sm-1{margin-right:8.33333333%}.offset-sm-2{margin-right:16.66666667%}.offset-sm-3{margin-right:25%}.offset-sm-4{margin-right:33.33333333%}.offset-sm-5{margin-right:41.66666667%}.offset-sm-6{margin-right:50%}.offset-sm-7{margin-right:58.33333333%}.offset-sm-8{margin-right:66.66666667%}.offset-sm-9{margin-right:75%}.offset-sm-10{margin-right:83.33333333%}.offset-sm-11{margin-right:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-right:0}.offset-md-1{margin-right:8.33333333%}.offset-md-2{margin-right:16.66666667%}.offset-md-3{margin-right:25%}.offset-md-4{margin-right:33.33333333%}.offset-md-5{margin-right:41.66666667%}.offset-md-6{margin-right:50%}.offset-md-7{margin-right:58.33333333%}.offset-md-8{margin-right:66.66666667%}.offset-md-9{margin-right:75%}.offset-md-10{margin-right:83.33333333%}.offset-md-11{margin-right:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-right:0}.offset-lg-1{margin-right:8.33333333%}.offset-lg-2{margin-right:16.66666667%}.offset-lg-3{margin-right:25%}.offset-lg-4{margin-right:33.33333333%}.offset-lg-5{margin-right:41.66666667%}.offset-lg-6{margin-right:50%}.offset-lg-7{margin-right:58.33333333%}.offset-lg-8{margin-right:66.66666667%}.offset-lg-9{margin-right:75%}.offset-lg-10{margin-right:83.33333333%}.offset-lg-11{margin-right:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-right:0}.offset-xl-1{margin-right:8.33333333%}.offset-xl-2{margin-right:16.66666667%}.offset-xl-3{margin-right:25%}.offset-xl-4{margin-right:33.33333333%}.offset-xl-5{margin-right:41.66666667%}.offset-xl-6{margin-right:50%}.offset-xl-7{margin-right:58.33333333%}.offset-xl-8{margin-right:66.66666667%}.offset-xl-9{margin-right:75%}.offset-xl-10{margin-right:83.33333333%}.offset-xl-11{margin-right:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-right:0}.offset-xxl-1{margin-right:8.33333333%}.offset-xxl-2{margin-right:16.66666667%}.offset-xxl-3{margin-right:25%}.offset-xxl-4{margin-right:33.33333333%}.offset-xxl-5{margin-right:41.66666667%}.offset-xxl-6{margin-right:50%}.offset-xxl-7{margin-right:58.33333333%}.offset-xxl-8{margin-right:66.66666667%}.offset-xxl-9{margin-right:75%}.offset-xxl-10{margin-right:83.33333333%}.offset-xxl-11{margin-right:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!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}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.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-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}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-evenly{justify-content:space-evenly!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}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-left:0!important}.me-1{margin-left:.25rem!important}.me-2{margin-left:.5rem!important}.me-3{margin-left:1rem!important}.me-4{margin-left:1.5rem!important}.me-5{margin-left:3rem!important}.me-auto{margin-left:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-right:0!important}.ms-1{margin-right:.25rem!important}.ms-2{margin-right:.5rem!important}.ms-3{margin-right:1rem!important}.ms-4{margin-right:1.5rem!important}.ms-5{margin-right:3rem!important}.ms-auto{margin-right:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-left:0!important}.pe-1{padding-left:.25rem!important}.pe-2{padding-left:.5rem!important}.pe-3{padding-left:1rem!important}.pe-4{padding-left:1.5rem!important}.pe-5{padding-left:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-right:0!important}.ps-1{padding-right:.25rem!important}.ps-2{padding-right:.5rem!important}.ps-3{padding-right:1rem!important}.ps-4{padding-right:1.5rem!important}.ps-5{padding-right:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!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}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.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-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}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-sm-evenly{justify-content:space-evenly!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}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-left:0!important}.me-sm-1{margin-left:.25rem!important}.me-sm-2{margin-left:.5rem!important}.me-sm-3{margin-left:1rem!important}.me-sm-4{margin-left:1.5rem!important}.me-sm-5{margin-left:3rem!important}.me-sm-auto{margin-left:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-right:0!important}.ms-sm-1{margin-right:.25rem!important}.ms-sm-2{margin-right:.5rem!important}.ms-sm-3{margin-right:1rem!important}.ms-sm-4{margin-right:1.5rem!important}.ms-sm-5{margin-right:3rem!important}.ms-sm-auto{margin-right:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-left:0!important}.pe-sm-1{padding-left:.25rem!important}.pe-sm-2{padding-left:.5rem!important}.pe-sm-3{padding-left:1rem!important}.pe-sm-4{padding-left:1.5rem!important}.pe-sm-5{padding-left:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-right:0!important}.ps-sm-1{padding-right:.25rem!important}.ps-sm-2{padding-right:.5rem!important}.ps-sm-3{padding-right:1rem!important}.ps-sm-4{padding-right:1.5rem!important}.ps-sm-5{padding-right:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!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}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.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-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}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-md-evenly{justify-content:space-evenly!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}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-left:0!important}.me-md-1{margin-left:.25rem!important}.me-md-2{margin-left:.5rem!important}.me-md-3{margin-left:1rem!important}.me-md-4{margin-left:1.5rem!important}.me-md-5{margin-left:3rem!important}.me-md-auto{margin-left:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-right:0!important}.ms-md-1{margin-right:.25rem!important}.ms-md-2{margin-right:.5rem!important}.ms-md-3{margin-right:1rem!important}.ms-md-4{margin-right:1.5rem!important}.ms-md-5{margin-right:3rem!important}.ms-md-auto{margin-right:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-left:0!important}.pe-md-1{padding-left:.25rem!important}.pe-md-2{padding-left:.5rem!important}.pe-md-3{padding-left:1rem!important}.pe-md-4{padding-left:1.5rem!important}.pe-md-5{padding-left:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-right:0!important}.ps-md-1{padding-right:.25rem!important}.ps-md-2{padding-right:.5rem!important}.ps-md-3{padding-right:1rem!important}.ps-md-4{padding-right:1.5rem!important}.ps-md-5{padding-right:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!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}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.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-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}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-lg-evenly{justify-content:space-evenly!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}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-left:0!important}.me-lg-1{margin-left:.25rem!important}.me-lg-2{margin-left:.5rem!important}.me-lg-3{margin-left:1rem!important}.me-lg-4{margin-left:1.5rem!important}.me-lg-5{margin-left:3rem!important}.me-lg-auto{margin-left:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-right:0!important}.ms-lg-1{margin-right:.25rem!important}.ms-lg-2{margin-right:.5rem!important}.ms-lg-3{margin-right:1rem!important}.ms-lg-4{margin-right:1.5rem!important}.ms-lg-5{margin-right:3rem!important}.ms-lg-auto{margin-right:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-left:0!important}.pe-lg-1{padding-left:.25rem!important}.pe-lg-2{padding-left:.5rem!important}.pe-lg-3{padding-left:1rem!important}.pe-lg-4{padding-left:1.5rem!important}.pe-lg-5{padding-left:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-right:0!important}.ps-lg-1{padding-right:.25rem!important}.ps-lg-2{padding-right:.5rem!important}.ps-lg-3{padding-right:1rem!important}.ps-lg-4{padding-right:1.5rem!important}.ps-lg-5{padding-right:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!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}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.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-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}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-xl-evenly{justify-content:space-evenly!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}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-left:0!important}.me-xl-1{margin-left:.25rem!important}.me-xl-2{margin-left:.5rem!important}.me-xl-3{margin-left:1rem!important}.me-xl-4{margin-left:1.5rem!important}.me-xl-5{margin-left:3rem!important}.me-xl-auto{margin-left:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-right:0!important}.ms-xl-1{margin-right:.25rem!important}.ms-xl-2{margin-right:.5rem!important}.ms-xl-3{margin-right:1rem!important}.ms-xl-4{margin-right:1.5rem!important}.ms-xl-5{margin-right:3rem!important}.ms-xl-auto{margin-right:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-left:0!important}.pe-xl-1{padding-left:.25rem!important}.pe-xl-2{padding-left:.5rem!important}.pe-xl-3{padding-left:1rem!important}.pe-xl-4{padding-left:1.5rem!important}.pe-xl-5{padding-left:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-right:0!important}.ps-xl-1{padding-right:.25rem!important}.ps-xl-2{padding-right:.5rem!important}.ps-xl-3{padding-right:1rem!important}.ps-xl-4{padding-right:1.5rem!important}.ps-xl-5{padding-right:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-left:0!important}.me-xxl-1{margin-left:.25rem!important}.me-xxl-2{margin-left:.5rem!important}.me-xxl-3{margin-left:1rem!important}.me-xxl-4{margin-left:1.5rem!important}.me-xxl-5{margin-left:3rem!important}.me-xxl-auto{margin-left:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-right:0!important}.ms-xxl-1{margin-right:.25rem!important}.ms-xxl-2{margin-right:.5rem!important}.ms-xxl-3{margin-right:1rem!important}.ms-xxl-4{margin-right:1.5rem!important}.ms-xxl-5{margin-right:3rem!important}.ms-xxl-auto{margin-right:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-left:0!important}.pe-xxl-1{padding-left:.25rem!important}.pe-xxl-2{padding-left:.5rem!important}.pe-xxl-3{padding-left:1rem!important}.pe-xxl-4{padding-left:1.5rem!important}.pe-xxl-5{padding-left:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-right:0!important}.ps-xxl-1{padding-right:.25rem!important}.ps-xxl-2{padding-right:.5rem!important}.ps-xxl-3{padding-right:1rem!important}.ps-xxl-4{padding-right:1.5rem!important}.ps-xxl-5{padding-right:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!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}.d-print-none{display:none!important}} -/*# sourceMappingURL=bootstrap-grid.rtl.min.css.map */ \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.min.css.map b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.min.css.map deleted file mode 100644 index 1fa11dda..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-grid.rtl.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","dist/css/bootstrap-grid.rtl.css","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-right: 8.33333333%;\n}\n\n.offset-2 {\n margin-right: 16.66666667%;\n}\n\n.offset-3 {\n margin-right: 25%;\n}\n\n.offset-4 {\n margin-right: 33.33333333%;\n}\n\n.offset-5 {\n margin-right: 41.66666667%;\n}\n\n.offset-6 {\n margin-right: 50%;\n}\n\n.offset-7 {\n margin-right: 58.33333333%;\n}\n\n.offset-8 {\n margin-right: 66.66666667%;\n}\n\n.offset-9 {\n margin-right: 75%;\n}\n\n.offset-10 {\n margin-right: 83.33333333%;\n}\n\n.offset-11 {\n margin-right: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-right: 0;\n }\n .offset-sm-1 {\n margin-right: 8.33333333%;\n }\n .offset-sm-2 {\n margin-right: 16.66666667%;\n }\n .offset-sm-3 {\n margin-right: 25%;\n }\n .offset-sm-4 {\n margin-right: 33.33333333%;\n }\n .offset-sm-5 {\n margin-right: 41.66666667%;\n }\n .offset-sm-6 {\n margin-right: 50%;\n }\n .offset-sm-7 {\n margin-right: 58.33333333%;\n }\n .offset-sm-8 {\n margin-right: 66.66666667%;\n }\n .offset-sm-9 {\n margin-right: 75%;\n }\n .offset-sm-10 {\n margin-right: 83.33333333%;\n }\n .offset-sm-11 {\n margin-right: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-right: 0;\n }\n .offset-md-1 {\n margin-right: 8.33333333%;\n }\n .offset-md-2 {\n margin-right: 16.66666667%;\n }\n .offset-md-3 {\n margin-right: 25%;\n }\n .offset-md-4 {\n margin-right: 33.33333333%;\n }\n .offset-md-5 {\n margin-right: 41.66666667%;\n }\n .offset-md-6 {\n margin-right: 50%;\n }\n .offset-md-7 {\n margin-right: 58.33333333%;\n }\n .offset-md-8 {\n margin-right: 66.66666667%;\n }\n .offset-md-9 {\n margin-right: 75%;\n }\n .offset-md-10 {\n margin-right: 83.33333333%;\n }\n .offset-md-11 {\n margin-right: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-right: 0;\n }\n .offset-lg-1 {\n margin-right: 8.33333333%;\n }\n .offset-lg-2 {\n margin-right: 16.66666667%;\n }\n .offset-lg-3 {\n margin-right: 25%;\n }\n .offset-lg-4 {\n margin-right: 33.33333333%;\n }\n .offset-lg-5 {\n margin-right: 41.66666667%;\n }\n .offset-lg-6 {\n margin-right: 50%;\n }\n .offset-lg-7 {\n margin-right: 58.33333333%;\n }\n .offset-lg-8 {\n margin-right: 66.66666667%;\n }\n .offset-lg-9 {\n margin-right: 75%;\n }\n .offset-lg-10 {\n margin-right: 83.33333333%;\n }\n .offset-lg-11 {\n margin-right: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-right: 0;\n }\n .offset-xl-1 {\n margin-right: 8.33333333%;\n }\n .offset-xl-2 {\n margin-right: 16.66666667%;\n }\n .offset-xl-3 {\n margin-right: 25%;\n }\n .offset-xl-4 {\n margin-right: 33.33333333%;\n }\n .offset-xl-5 {\n margin-right: 41.66666667%;\n }\n .offset-xl-6 {\n margin-right: 50%;\n }\n .offset-xl-7 {\n margin-right: 58.33333333%;\n }\n .offset-xl-8 {\n margin-right: 66.66666667%;\n }\n .offset-xl-9 {\n margin-right: 75%;\n }\n .offset-xl-10 {\n margin-right: 83.33333333%;\n }\n .offset-xl-11 {\n margin-right: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-right: 0;\n }\n .offset-xxl-1 {\n margin-right: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-right: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-right: 25%;\n }\n .offset-xxl-4 {\n margin-right: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-right: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-right: 50%;\n }\n .offset-xxl-7 {\n margin-right: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-right: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-right: 75%;\n }\n .offset-xxl-10 {\n margin-right: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-right: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.mx-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n}\n\n.mx-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n}\n\n.mx-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-left: 0 !important;\n}\n\n.me-1 {\n margin-left: 0.25rem !important;\n}\n\n.me-2 {\n margin-left: 0.5rem !important;\n}\n\n.me-3 {\n margin-left: 1rem !important;\n}\n\n.me-4 {\n margin-left: 1.5rem !important;\n}\n\n.me-5 {\n margin-left: 3rem !important;\n}\n\n.me-auto {\n margin-left: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-right: 0 !important;\n}\n\n.ms-1 {\n margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n margin-right: 1rem !important;\n}\n\n.ms-4 {\n margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n margin-right: 3rem !important;\n}\n\n.ms-auto {\n margin-right: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n.px-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n}\n\n.px-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n}\n\n.px-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n}\n\n.px-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n}\n\n.px-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-left: 0 !important;\n}\n\n.pe-1 {\n padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n padding-left: 1rem !important;\n}\n\n.pe-4 {\n padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n padding-left: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-right: 0 !important;\n}\n\n.ps-1 {\n padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n padding-right: 1rem !important;\n}\n\n.ps-4 {\n padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n padding-right: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-sm-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-left: 0 !important;\n }\n .me-sm-1 {\n margin-left: 0.25rem !important;\n }\n .me-sm-2 {\n margin-left: 0.5rem !important;\n }\n .me-sm-3 {\n margin-left: 1rem !important;\n }\n .me-sm-4 {\n margin-left: 1.5rem !important;\n }\n .me-sm-5 {\n margin-left: 3rem !important;\n }\n .me-sm-auto {\n margin-left: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-right: 0 !important;\n }\n .ms-sm-1 {\n margin-right: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-right: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-right: 1rem !important;\n }\n .ms-sm-4 {\n margin-right: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-right: 3rem !important;\n }\n .ms-sm-auto {\n margin-right: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-sm-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-sm-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-sm-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-sm-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-sm-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-left: 0 !important;\n }\n .pe-sm-1 {\n padding-left: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-left: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-left: 1rem !important;\n }\n .pe-sm-4 {\n padding-left: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-left: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-right: 0 !important;\n }\n .ps-sm-1 {\n padding-right: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-right: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-right: 1rem !important;\n }\n .ps-sm-4 {\n padding-right: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-md-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-md-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-md-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-md-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-md-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-md-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-left: 0 !important;\n }\n .me-md-1 {\n margin-left: 0.25rem !important;\n }\n .me-md-2 {\n margin-left: 0.5rem !important;\n }\n .me-md-3 {\n margin-left: 1rem !important;\n }\n .me-md-4 {\n margin-left: 1.5rem !important;\n }\n .me-md-5 {\n margin-left: 3rem !important;\n }\n .me-md-auto {\n margin-left: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-right: 0 !important;\n }\n .ms-md-1 {\n margin-right: 0.25rem !important;\n }\n .ms-md-2 {\n margin-right: 0.5rem !important;\n }\n .ms-md-3 {\n margin-right: 1rem !important;\n }\n .ms-md-4 {\n margin-right: 1.5rem !important;\n }\n .ms-md-5 {\n margin-right: 3rem !important;\n }\n .ms-md-auto {\n margin-right: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-md-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-md-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-md-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-md-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-md-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-left: 0 !important;\n }\n .pe-md-1 {\n padding-left: 0.25rem !important;\n }\n .pe-md-2 {\n padding-left: 0.5rem !important;\n }\n .pe-md-3 {\n padding-left: 1rem !important;\n }\n .pe-md-4 {\n padding-left: 1.5rem !important;\n }\n .pe-md-5 {\n padding-left: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-right: 0 !important;\n }\n .ps-md-1 {\n padding-right: 0.25rem !important;\n }\n .ps-md-2 {\n padding-right: 0.5rem !important;\n }\n .ps-md-3 {\n padding-right: 1rem !important;\n }\n .ps-md-4 {\n padding-right: 1.5rem !important;\n }\n .ps-md-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-lg-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-left: 0 !important;\n }\n .me-lg-1 {\n margin-left: 0.25rem !important;\n }\n .me-lg-2 {\n margin-left: 0.5rem !important;\n }\n .me-lg-3 {\n margin-left: 1rem !important;\n }\n .me-lg-4 {\n margin-left: 1.5rem !important;\n }\n .me-lg-5 {\n margin-left: 3rem !important;\n }\n .me-lg-auto {\n margin-left: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-right: 0 !important;\n }\n .ms-lg-1 {\n margin-right: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-right: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-right: 1rem !important;\n }\n .ms-lg-4 {\n margin-right: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-right: 3rem !important;\n }\n .ms-lg-auto {\n margin-right: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-lg-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-lg-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-lg-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-lg-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-lg-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-left: 0 !important;\n }\n .pe-lg-1 {\n padding-left: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-left: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-left: 1rem !important;\n }\n .pe-lg-4 {\n padding-left: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-left: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-right: 0 !important;\n }\n .ps-lg-1 {\n padding-right: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-right: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-right: 1rem !important;\n }\n .ps-lg-4 {\n padding-right: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-xl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-left: 0 !important;\n }\n .me-xl-1 {\n margin-left: 0.25rem !important;\n }\n .me-xl-2 {\n margin-left: 0.5rem !important;\n }\n .me-xl-3 {\n margin-left: 1rem !important;\n }\n .me-xl-4 {\n margin-left: 1.5rem !important;\n }\n .me-xl-5 {\n margin-left: 3rem !important;\n }\n .me-xl-auto {\n margin-left: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-right: 0 !important;\n }\n .ms-xl-1 {\n margin-right: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-right: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-right: 1rem !important;\n }\n .ms-xl-4 {\n margin-right: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-right: 3rem !important;\n }\n .ms-xl-auto {\n margin-right: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-xl-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-xl-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-xl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-xl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-xl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-left: 0 !important;\n }\n .pe-xl-1 {\n padding-left: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-left: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-left: 1rem !important;\n }\n .pe-xl-4 {\n padding-left: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-left: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-right: 0 !important;\n }\n .ps-xl-1 {\n padding-right: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-right: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-right: 1rem !important;\n }\n .ps-xl-4 {\n padding-right: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-xxl-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-xxl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-xxl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-left: 0 !important;\n }\n .me-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-left: 1rem !important;\n }\n .me-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-left: 3rem !important;\n }\n .me-xxl-auto {\n margin-left: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-right: 0 !important;\n }\n .ms-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-right: 1rem !important;\n }\n .ms-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-right: 3rem !important;\n }\n .ms-xxl-auto {\n margin-right: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-xxl-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-xxl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-left: 0 !important;\n }\n .pe-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-left: 1rem !important;\n }\n .pe-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-left: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-right: 0 !important;\n }\n .ps-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-right: 1rem !important;\n }\n .ps-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-right: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap-grid.rtl.css.map */","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-reboot.css b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-reboot.css deleted file mode 100644 index 47a70f01..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-reboot.css +++ /dev/null @@ -1,597 +0,0 @@ -/*! - * Bootstrap Reboot v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root, -[data-bs-theme=light] { - --bs-blue: #0d6efd; - --bs-indigo: #6610f2; - --bs-purple: #6f42c1; - --bs-pink: #d63384; - --bs-red: #dc3545; - --bs-orange: #fd7e14; - --bs-yellow: #ffc107; - --bs-green: #198754; - --bs-teal: #20c997; - --bs-cyan: #0dcaf0; - --bs-black: #000; - --bs-white: #fff; - --bs-gray: #6c757d; - --bs-gray-dark: #343a40; - --bs-gray-100: #f8f9fa; - --bs-gray-200: #e9ecef; - --bs-gray-300: #dee2e6; - --bs-gray-400: #ced4da; - --bs-gray-500: #adb5bd; - --bs-gray-600: #6c757d; - --bs-gray-700: #495057; - --bs-gray-800: #343a40; - --bs-gray-900: #212529; - --bs-primary: #0d6efd; - --bs-secondary: #6c757d; - --bs-success: #198754; - --bs-info: #0dcaf0; - --bs-warning: #ffc107; - --bs-danger: #dc3545; - --bs-light: #f8f9fa; - --bs-dark: #212529; - --bs-primary-rgb: 13, 110, 253; - --bs-secondary-rgb: 108, 117, 125; - --bs-success-rgb: 25, 135, 84; - --bs-info-rgb: 13, 202, 240; - --bs-warning-rgb: 255, 193, 7; - --bs-danger-rgb: 220, 53, 69; - --bs-light-rgb: 248, 249, 250; - --bs-dark-rgb: 33, 37, 41; - --bs-primary-text-emphasis: #052c65; - --bs-secondary-text-emphasis: #2b2f32; - --bs-success-text-emphasis: #0a3622; - --bs-info-text-emphasis: #055160; - --bs-warning-text-emphasis: #664d03; - --bs-danger-text-emphasis: #58151c; - --bs-light-text-emphasis: #495057; - --bs-dark-text-emphasis: #495057; - --bs-primary-bg-subtle: #cfe2ff; - --bs-secondary-bg-subtle: #e2e3e5; - --bs-success-bg-subtle: #d1e7dd; - --bs-info-bg-subtle: #cff4fc; - --bs-warning-bg-subtle: #fff3cd; - --bs-danger-bg-subtle: #f8d7da; - --bs-light-bg-subtle: #fcfcfd; - --bs-dark-bg-subtle: #ced4da; - --bs-primary-border-subtle: #9ec5fe; - --bs-secondary-border-subtle: #c4c8cb; - --bs-success-border-subtle: #a3cfbb; - --bs-info-border-subtle: #9eeaf9; - --bs-warning-border-subtle: #ffe69c; - --bs-danger-border-subtle: #f1aeb5; - --bs-light-border-subtle: #e9ecef; - --bs-dark-border-subtle: #adb5bd; - --bs-white-rgb: 255, 255, 255; - --bs-black-rgb: 0, 0, 0; - --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); - --bs-body-font-family: var(--bs-font-sans-serif); - --bs-body-font-size: 1rem; - --bs-body-font-weight: 400; - --bs-body-line-height: 1.5; - --bs-body-color: #212529; - --bs-body-color-rgb: 33, 37, 41; - --bs-body-bg: #fff; - --bs-body-bg-rgb: 255, 255, 255; - --bs-emphasis-color: #000; - --bs-emphasis-color-rgb: 0, 0, 0; - --bs-secondary-color: rgba(33, 37, 41, 0.75); - --bs-secondary-color-rgb: 33, 37, 41; - --bs-secondary-bg: #e9ecef; - --bs-secondary-bg-rgb: 233, 236, 239; - --bs-tertiary-color: rgba(33, 37, 41, 0.5); - --bs-tertiary-color-rgb: 33, 37, 41; - --bs-tertiary-bg: #f8f9fa; - --bs-tertiary-bg-rgb: 248, 249, 250; - --bs-heading-color: inherit; - --bs-link-color: #0d6efd; - --bs-link-color-rgb: 13, 110, 253; - --bs-link-decoration: underline; - --bs-link-hover-color: #0a58ca; - --bs-link-hover-color-rgb: 10, 88, 202; - --bs-code-color: #d63384; - --bs-highlight-color: #212529; - --bs-highlight-bg: #fff3cd; - --bs-border-width: 1px; - --bs-border-style: solid; - --bs-border-color: #dee2e6; - --bs-border-color-translucent: rgba(0, 0, 0, 0.175); - --bs-border-radius: 0.375rem; - --bs-border-radius-sm: 0.25rem; - --bs-border-radius-lg: 0.5rem; - --bs-border-radius-xl: 1rem; - --bs-border-radius-xxl: 2rem; - --bs-border-radius-2xl: var(--bs-border-radius-xxl); - --bs-border-radius-pill: 50rem; - --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); - --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); - --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); - --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); - --bs-focus-ring-width: 0.25rem; - --bs-focus-ring-opacity: 0.25; - --bs-focus-ring-color: rgba(13, 110, 253, 0.25); - --bs-form-valid-color: #198754; - --bs-form-valid-border-color: #198754; - --bs-form-invalid-color: #dc3545; - --bs-form-invalid-border-color: #dc3545; -} - -[data-bs-theme=dark] { - color-scheme: dark; - --bs-body-color: #dee2e6; - --bs-body-color-rgb: 222, 226, 230; - --bs-body-bg: #212529; - --bs-body-bg-rgb: 33, 37, 41; - --bs-emphasis-color: #fff; - --bs-emphasis-color-rgb: 255, 255, 255; - --bs-secondary-color: rgba(222, 226, 230, 0.75); - --bs-secondary-color-rgb: 222, 226, 230; - --bs-secondary-bg: #343a40; - --bs-secondary-bg-rgb: 52, 58, 64; - --bs-tertiary-color: rgba(222, 226, 230, 0.5); - --bs-tertiary-color-rgb: 222, 226, 230; - --bs-tertiary-bg: #2b3035; - --bs-tertiary-bg-rgb: 43, 48, 53; - --bs-primary-text-emphasis: #6ea8fe; - --bs-secondary-text-emphasis: #a7acb1; - --bs-success-text-emphasis: #75b798; - --bs-info-text-emphasis: #6edff6; - --bs-warning-text-emphasis: #ffda6a; - --bs-danger-text-emphasis: #ea868f; - --bs-light-text-emphasis: #f8f9fa; - --bs-dark-text-emphasis: #dee2e6; - --bs-primary-bg-subtle: #031633; - --bs-secondary-bg-subtle: #161719; - --bs-success-bg-subtle: #051b11; - --bs-info-bg-subtle: #032830; - --bs-warning-bg-subtle: #332701; - --bs-danger-bg-subtle: #2c0b0e; - --bs-light-bg-subtle: #343a40; - --bs-dark-bg-subtle: #1a1d20; - --bs-primary-border-subtle: #084298; - --bs-secondary-border-subtle: #41464b; - --bs-success-border-subtle: #0f5132; - --bs-info-border-subtle: #087990; - --bs-warning-border-subtle: #997404; - --bs-danger-border-subtle: #842029; - --bs-light-border-subtle: #495057; - --bs-dark-border-subtle: #343a40; - --bs-heading-color: inherit; - --bs-link-color: #6ea8fe; - --bs-link-hover-color: #8bb9fe; - --bs-link-color-rgb: 110, 168, 254; - --bs-link-hover-color-rgb: 139, 185, 254; - --bs-code-color: #e685b5; - --bs-highlight-color: #dee2e6; - --bs-highlight-bg: #664d03; - --bs-border-color: #495057; - --bs-border-color-translucent: rgba(255, 255, 255, 0.15); - --bs-form-valid-color: #75b798; - --bs-form-valid-border-color: #75b798; - --bs-form-invalid-color: #ea868f; - --bs-form-invalid-border-color: #ea868f; -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -@media (prefers-reduced-motion: no-preference) { - :root { - scroll-behavior: smooth; - } -} - -body { - margin: 0; - font-family: var(--bs-body-font-family); - font-size: var(--bs-body-font-size); - font-weight: var(--bs-body-font-weight); - line-height: var(--bs-body-line-height); - color: var(--bs-body-color); - text-align: var(--bs-body-text-align); - background-color: var(--bs-body-bg); - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -hr { - margin: 1rem 0; - color: inherit; - border: 0; - border-top: var(--bs-border-width) solid; - opacity: 0.25; -} - -h6, h5, h4, h3, h2, h1 { - margin-top: 0; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; - color: var(--bs-heading-color); -} - -h1 { - font-size: calc(1.375rem + 1.5vw); -} -@media (min-width: 1200px) { - h1 { - font-size: 2.5rem; - } -} - -h2 { - font-size: calc(1.325rem + 0.9vw); -} -@media (min-width: 1200px) { - h2 { - font-size: 2rem; - } -} - -h3 { - font-size: calc(1.3rem + 0.6vw); -} -@media (min-width: 1200px) { - h3 { - font-size: 1.75rem; - } -} - -h4 { - font-size: calc(1.275rem + 0.3vw); -} -@media (min-width: 1200px) { - h4 { - font-size: 1.5rem; - } -} - -h5 { - font-size: 1.25rem; -} - -h6 { - font-size: 1rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title] { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - -webkit-text-decoration-skip-ink: none; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul { - padding-left: 2rem; -} - -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: 0.875em; -} - -mark { - padding: 0.1875em; - color: var(--bs-highlight-color); - background-color: var(--bs-highlight-bg); -} - -sub, -sup { - position: relative; - font-size: 0.75em; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -a { - color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); - text-decoration: underline; -} -a:hover { - --bs-link-color-rgb: var(--bs-link-hover-color-rgb); -} - -a:not([href]):not([class]), a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: var(--bs-font-monospace); - font-size: 1em; -} - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - font-size: 0.875em; -} -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -code { - font-size: 0.875em; - color: var(--bs-code-color); - word-wrap: break-word; -} -a > code { - color: inherit; -} - -kbd { - padding: 0.1875rem 0.375rem; - font-size: 0.875em; - color: var(--bs-body-bg); - background-color: var(--bs-body-color); - border-radius: 0.25rem; -} -kbd kbd { - padding: 0; - font-size: 1em; -} - -figure { - margin: 0 0 1rem; -} - -img, -svg { - vertical-align: middle; -} - -table { - caption-side: bottom; - border-collapse: collapse; -} - -caption { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: var(--bs-secondary-color); - text-align: left; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - -label { - display: inline-block; -} - -button { - border-radius: 0; -} - -button:focus:not(:focus-visible) { - outline: 0; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -select { - text-transform: none; -} - -[role=button] { - cursor: pointer; -} - -select { - word-wrap: normal; -} -select:disabled { - opacity: 1; -} - -[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { - display: none !important; -} - -button, -[type=button], -[type=reset], -[type=submit] { - -webkit-appearance: button; -} -button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled) { - cursor: pointer; -} - -::-moz-focus-inner { - padding: 0; - border-style: none; -} - -textarea { - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - float: left; - width: 100%; - padding: 0; - margin-bottom: 0.5rem; - font-size: calc(1.275rem + 0.3vw); - line-height: inherit; -} -@media (min-width: 1200px) { - legend { - font-size: 1.5rem; - } -} -legend + * { - clear: left; -} - -::-webkit-datetime-edit-fields-wrapper, -::-webkit-datetime-edit-text, -::-webkit-datetime-edit-minute, -::-webkit-datetime-edit-hour-field, -::-webkit-datetime-edit-day-field, -::-webkit-datetime-edit-month-field, -::-webkit-datetime-edit-year-field { - padding: 0; -} - -::-webkit-inner-spin-button { - height: auto; -} - -[type=search] { - -webkit-appearance: textfield; - outline-offset: -2px; -} - -/* rtl:raw: -[type="tel"], -[type="url"], -[type="email"], -[type="number"] { - direction: ltr; -} -*/ -::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-color-swatch-wrapper { - padding: 0; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -::file-selector-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -iframe { - border: 0; -} - -summary { - display: list-item; - cursor: pointer; -} - -progress { - vertical-align: baseline; -} - -[hidden] { - display: none !important; -} - -/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file diff --git a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-reboot.css.map b/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-reboot.css.map deleted file mode 100644 index 8a9aab3b..00000000 --- a/src/CrystallineSociety/Client/CrystallineSociety.Client.Web/wwwroot/lib/bootstrap-5.3.2-dist/css/bootstrap-reboot.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_root.scss","../../scss/vendor/_rfs.scss","bootstrap-reboot.css","../../scss/mixins/_color-mode.scss","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_border-radius.scss"],"names":[],"mappings":"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","file":"bootstrap-reboot.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","/*!\n * Bootstrap Reboot v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-primary-text-emphasis: #052c65;\n --bs-secondary-text-emphasis: #2b2f32;\n --bs-success-text-emphasis: #0a3622;\n --bs-info-text-emphasis: #055160;\n --bs-warning-text-emphasis: #664d03;\n --bs-danger-text-emphasis: #58151c;\n --bs-light-text-emphasis: #495057;\n --bs-dark-text-emphasis: #495057;\n --bs-primary-bg-subtle: #cfe2ff;\n --bs-secondary-bg-subtle: #e2e3e5;\n --bs-success-bg-subtle: #d1e7dd;\n --bs-info-bg-subtle: #cff4fc;\n --bs-warning-bg-subtle: #fff3cd;\n --bs-danger-bg-subtle: #f8d7da;\n --bs-light-bg-subtle: #fcfcfd;\n --bs-dark-bg-subtle: #ced4da;\n --bs-primary-border-subtle: #9ec5fe;\n --bs-secondary-border-subtle: #c4c8cb;\n --bs-success-border-subtle: #a3cfbb;\n --bs-info-border-subtle: #9eeaf9;\n --bs-warning-border-subtle: #ffe69c;\n --bs-danger-border-subtle: #f1aeb5;\n --bs-light-border-subtle: #e9ecef;\n --bs-dark-border-subtle: #adb5bd;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg: #fff;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-emphasis-color: #000;\n --bs-emphasis-color-rgb: 0, 0, 0;\n --bs-secondary-color: rgba(33, 37, 41, 0.75);\n --bs-secondary-color-rgb: 33, 37, 41;\n --bs-secondary-bg: #e9ecef;\n --bs-secondary-bg-rgb: 233, 236, 239;\n --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n --bs-tertiary-color-rgb: 33, 37, 41;\n --bs-tertiary-bg: #f8f9fa;\n --bs-tertiary-bg-rgb: 248, 249, 250;\n --bs-heading-color: inherit;\n --bs-link-color: #0d6efd;\n --bs-link-color-rgb: 13, 110, 253;\n --bs-link-decoration: underline;\n --bs-link-hover-color: #0a58ca;\n --bs-link-hover-color-rgb: 10, 88, 202;\n --bs-code-color: #d63384;\n --bs-highlight-color: #212529;\n --bs-highlight-bg: #fff3cd;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-xxl: 2rem;\n --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n --bs-border-radius-pill: 50rem;\n --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n --bs-focus-ring-width: 0.25rem;\n --bs-focus-ring-opacity: 0.25;\n --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n --bs-form-valid-color: #198754;\n --bs-form-valid-border-color: #198754;\n --bs-form-invalid-color: #dc3545;\n --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n color-scheme: dark;\n --bs-body-color: #dee2e6;\n --bs-body-color-rgb: 222, 226, 230;\n --bs-body-bg: #212529;\n --bs-body-bg-rgb: 33, 37, 41;\n --bs-emphasis-color: #fff;\n --bs-emphasis-color-rgb: 255, 255, 255;\n --bs-secondary-color: rgba(222, 226, 230, 0.75);\n --bs-secondary-color-rgb: 222, 226, 230;\n --bs-secondary-bg: #343a40;\n --bs-secondary-bg-rgb: 52, 58, 64;\n --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n --bs-tertiary-color-rgb: 222, 226, 230;\n --bs-tertiary-bg: #2b3035;\n --bs-tertiary-bg-rgb: 43, 48, 53;\n --bs-primary-text-emphasis: #6ea8fe;\n --bs-secondary-text-emphasis: #a7acb1;\n --bs-success-text-emphasis: #75b798;\n --bs-info-text-emphasis: #6edff6;\n --bs-warning-text-emphasis: #ffda6a;\n --bs-danger-text-emphasis: #ea868f;\n --bs-light-text-emphasis: #f8f9fa;\n --bs-dark-text-emphasis: #dee2e6;\n --bs-primary-bg-subtle: #031633;\n --bs-secondary-bg-subtle: #161719;\n --bs-success-bg-subtle: #051b11;\n --bs-info-bg-subtle: #032830;\n --bs-warning-bg-subtle: #332701;\n --bs-danger-bg-subtle: #2c0b0e;\n --bs-light-bg-subtle: #343a40;\n --bs-dark-bg-subtle: #1a1d20;\n --bs-primary-border-subtle: #084298;\n --bs-secondary-border-subtle: #41464b;\n --bs-success-border-subtle: #0f5132;\n --bs-info-border-subtle: #087990;\n --bs-warning-border-subtle: #997404;\n --bs-danger-border-subtle: #842029;\n --bs-light-border-subtle: #495057;\n --bs-dark-border-subtle: #343a40;\n --bs-heading-color: inherit;\n --bs-link-color: #6ea8fe;\n --bs-link-hover-color: #8bb9fe;\n --bs-link-color-rgb: 110, 168, 254;\n --bs-link-hover-color-rgb: 139, 185, 254;\n --bs-code-color: #e685b5;\n --bs-highlight-color: #dee2e6;\n --bs-highlight-bg: #664d03;\n --bs-border-color: #495057;\n --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n --bs-form-valid-color: #75b798;\n --bs-form-valid-border-color: #75b798;\n --bs-form-invalid-color: #ea868f;\n --bs-form-invalid-border-color: #ea868f;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n border: 0;\n border-top: var(--bs-border-width) solid;\n opacity: 0.25;\n}\n\nh6, h5, h4, h3, h2, h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n color: var(--bs-heading-color);\n}\n\nh1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1 {\n font-size: 2.5rem;\n }\n}\n\nh2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2 {\n font-size: 2rem;\n }\n}\n\nh3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3 {\n font-size: 1.75rem;\n }\n}\n\nh4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4 {\n font-size: 1.5rem;\n }\n}\n\nh5 {\n font-size: 1.25rem;\n}\n\nh6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title] {\n text-decoration: underline dotted;\n cursor: help;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 0.875em;\n}\n\nmark {\n padding: 0.1875em;\n color: var(--bs-highlight-color);\n background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n text-decoration: underline;\n}\na:hover {\n --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: var(--bs-code-color);\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.1875rem 0.375rem;\n font-size: 0.875em;\n color: var(--bs-body-bg);\n background-color: var(--bs-body-color);\n border-radius: 0.25rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: var(--bs-secondary-color);\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit;\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n -webkit-appearance: textfield;\n outline-offset: -2px;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::file-selector-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`